/* * * Embedded Linux library * * Copyright (C) 2011-2014 Intel Corporation. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "ell/gvariant-private.h" struct signature_test { bool valid; const char *signature; }; #define SIGNATURE_TEST(v, sig, i) \ static struct signature_test sig_test##i = { \ .valid = v, \ .signature = sig, \ } SIGNATURE_TEST(false, "a", 1); SIGNATURE_TEST(false, "a{vs}", 2); SIGNATURE_TEST(true, "(ss)", 3); SIGNATURE_TEST(true, "(s(ss))", 4); SIGNATURE_TEST(true, "as", 5); SIGNATURE_TEST(true, "ab", 6); SIGNATURE_TEST(true, "aas", 7); SIGNATURE_TEST(true, "a(ss)", 8); SIGNATURE_TEST(true, "asas", 9); SIGNATURE_TEST(true, "av", 10); SIGNATURE_TEST(true, "a{sv}", 11); SIGNATURE_TEST(true, "v", 12); SIGNATURE_TEST(true, "oa{sv}", 13); SIGNATURE_TEST(true, "a(oa{sv})", 14); SIGNATURE_TEST(true, "(sa{sv})sa{ss}us", 15); SIGNATURE_TEST(true, "(bba{ss})", 16); SIGNATURE_TEST(true, "{sv}", 17); SIGNATURE_TEST(false, "{vu}", 18); SIGNATURE_TEST(false, "{uv", 19); SIGNATURE_TEST(false, "(ss", 20); SIGNATURE_TEST(false, "aaaaa", 21); SIGNATURE_TEST(true, "()", 22); SIGNATURE_TEST(false, "", 23); static void test_signature(const void *test_data) { const struct signature_test *test = test_data; bool valid; valid = _gvariant_valid_signature(test->signature); assert(valid == test->valid); } struct alignment_test { int alignment; const char *signature; }; #define ALIGNMENT_TEST(sig, a, i) \ static struct alignment_test align_test##i = { \ .alignment = a, \ .signature = sig, \ } ALIGNMENT_TEST("()", 1, 1); ALIGNMENT_TEST("y", 1, 2); ALIGNMENT_TEST("b", 1, 3); ALIGNMENT_TEST("s", 1, 4); ALIGNMENT_TEST("o", 1, 5); ALIGNMENT_TEST("g", 1, 6); ALIGNMENT_TEST("q", 2, 7); ALIGNMENT_TEST("n", 2, 8); ALIGNMENT_TEST("u", 4, 9); ALIGNMENT_TEST("h", 4, 10); ALIGNMENT_TEST("i", 4, 11); ALIGNMENT_TEST("v", 8, 12); ALIGNMENT_TEST("t", 8, 13); ALIGNMENT_TEST("x", 8, 14); ALIGNMENT_TEST("d", 8, 15); ALIGNMENT_TEST("ay", 1, 16); ALIGNMENT_TEST("as", 1, 17); ALIGNMENT_TEST("au", 4, 18); ALIGNMENT_TEST("an", 2, 19); ALIGNMENT_TEST("ans", 2, 20); ALIGNMENT_TEST("ant", 8, 21); ALIGNMENT_TEST("(ss)", 1, 22); ALIGNMENT_TEST("(ssu)", 4, 23); ALIGNMENT_TEST("a(ssu)", 4, 24); ALIGNMENT_TEST("(u)", 4, 25); ALIGNMENT_TEST("(uuuuy)", 4, 26); ALIGNMENT_TEST("(uusuuy)", 4, 27); ALIGNMENT_TEST("a{ss}", 1, 28); ALIGNMENT_TEST("((u)yyy(b(iiii)))", 4, 29); ALIGNMENT_TEST("((u)yyy(b(iiivi)))", 8, 30); ALIGNMENT_TEST("((b)(t))", 8, 31); ALIGNMENT_TEST("((b)(b)(t))", 8, 32); ALIGNMENT_TEST("(bt)", 8, 33); ALIGNMENT_TEST("((t)(b))", 8, 34); ALIGNMENT_TEST("(tb)", 8, 35); ALIGNMENT_TEST("((b)(b))", 1, 36); ALIGNMENT_TEST("((t)(t))", 8, 37); static void test_alignment(const void *test_data) { const struct alignment_test *test = test_data; int alignment; alignment = _gvariant_get_alignment(test->signature); assert(alignment == test->alignment); } struct is_fixed_size_test { bool fixed_size; const char *signature; }; struct get_fixed_size_test { int size; const char *signature; }; #define IS_FIXED_SIZE_TEST(sig, v, i) \ static struct is_fixed_size_test is_fixed_size_test##i = { \ .fixed_size = v, \ .signature = sig, \ } IS_FIXED_SIZE_TEST("", true, 1); IS_FIXED_SIZE_TEST("()", true, 2); IS_FIXED_SIZE_TEST("y", true, 3); IS_FIXED_SIZE_TEST("u", true, 4); IS_FIXED_SIZE_TEST("b", true, 5); IS_FIXED_SIZE_TEST("n", true, 6); IS_FIXED_SIZE_TEST("q", true, 7); IS_FIXED_SIZE_TEST("i", true, 8); IS_FIXED_SIZE_TEST("t", true, 9); IS_FIXED_SIZE_TEST("d", true, 10); IS_FIXED_SIZE_TEST("s", false, 11); IS_FIXED_SIZE_TEST("o", false, 12); IS_FIXED_SIZE_TEST("g", false, 13); IS_FIXED_SIZE_TEST("h", true, 14); IS_FIXED_SIZE_TEST("ay", false, 15); IS_FIXED_SIZE_TEST("v", false, 16); IS_FIXED_SIZE_TEST("(u)", true, 17); IS_FIXED_SIZE_TEST("(uuuuy)", true, 18); IS_FIXED_SIZE_TEST("(uusuuy)", false, 19); IS_FIXED_SIZE_TEST("a{ss}", false, 20); IS_FIXED_SIZE_TEST("((u)yyy(b(iiii)))", true, 21); IS_FIXED_SIZE_TEST("((u)yyy(b(iiivi)))", false, 22); static void test_is_fixed_size(const void *test_data) { const struct is_fixed_size_test *test = test_data; bool fixed_size; fixed_size = _gvariant_is_fixed_size(test->signature); assert(fixed_size == test->fixed_size); } #define GET_FIXED_SIZE_TEST(sig, n, i) \ static struct get_fixed_size_test size_test##i = { \ .size = n, \ .signature = sig, \ } GET_FIXED_SIZE_TEST("", 0, 1); GET_FIXED_SIZE_TEST("()", 1, 2); GET_FIXED_SIZE_TEST("y", 1, 3); GET_FIXED_SIZE_TEST("u", 4, 4); GET_FIXED_SIZE_TEST("b", 1, 5); GET_FIXED_SIZE_TEST("n", 2, 6); GET_FIXED_SIZE_TEST("q", 2, 7); GET_FIXED_SIZE_TEST("i", 4, 8); GET_FIXED_SIZE_TEST("t", 8, 9); GET_FIXED_SIZE_TEST("d", 8, 10); GET_FIXED_SIZE_TEST("s", 0, 11); GET_FIXED_SIZE_TEST("o", 0, 12); GET_FIXED_SIZE_TEST("g", 0, 13); GET_FIXED_SIZE_TEST("h", 4, 14); GET_FIXED_SIZE_TEST("ay", 0, 15); GET_FIXED_SIZE_TEST("v", 0, 16); GET_FIXED_SIZE_TEST("(u)", 4, 17); GET_FIXED_SIZE_TEST("(uuuuy)", 20, 18); GET_FIXED_SIZE_TEST("(uusuuy)", 0, 19); GET_FIXED_SIZE_TEST("a{ss}", 0, 20); GET_FIXED_SIZE_TEST("((u)yyy(b(iiii)))", 28, 21); GET_FIXED_SIZE_TEST("((u)yyy(b(iiivi)))", 0, 22); GET_FIXED_SIZE_TEST("((b)(t))", 16, 23); GET_FIXED_SIZE_TEST("((b)(b)(t))", 16, 24); GET_FIXED_SIZE_TEST("(bt)", 16, 25); GET_FIXED_SIZE_TEST("((t)(b))", 16, 26); GET_FIXED_SIZE_TEST("(tb)", 16, 27); GET_FIXED_SIZE_TEST("((b)(b))", 2, 28); GET_FIXED_SIZE_TEST("((t)(t))", 16, 29); static void test_get_fixed_size(const void *test_data) { const struct get_fixed_size_test *test = test_data; int size; size = _gvariant_get_fixed_size(test->signature); assert(size == test->size); } struct parser_data { const unsigned char *data; size_t len; const char *signature; }; static const unsigned char basic_data_1[] = { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00, }; static struct parser_data parser_data_1 = { .data = basic_data_1, .len = 13, .signature = "s", }; static void test_iter_basic_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; const char *s; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); assert(_gvariant_iter_next_entry_basic(&iter, 's', &s)); assert(!strcmp(s, "Hello World!")); } static const unsigned char basic_data_2[] = { 0x05, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x00, }; static struct parser_data parser_data_2 = { .data = basic_data_2, .len = 11, .signature = "is", }; static void test_iter_basic_2(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; const char *s; int i; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_next_entry_basic(&iter, 'i', &i); assert(ret); assert(i == 5); ret = _gvariant_iter_next_entry_basic(&iter, 's', &s); assert(ret); assert(!strcmp(s, "foobar")); } static const unsigned char basic_data_3[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x40, 0xdf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xaf, 0x7d, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x21, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x59, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xad, 0x31, 0x00, 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x00, 0x00, 0xfe, 0x52, 0xce, 0xff, 0x3f, }; static struct parser_data parser_data_3 = { .data = basic_data_3, .len = 69, .signature = "bdntqxyusi", }; static void test_iter_basic_3(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; bool b; double d; int16_t n; uint64_t t; uint16_t q; int64_t x; uint8_t y; uint32_t u; const char *s; int32_t i; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_next_entry_basic(&iter, 'd', &b); assert(ret == false); ret = _gvariant_iter_next_entry_basic(&iter, 'b', &b); assert(ret); assert(b == true); ret = _gvariant_iter_next_entry_basic(&iter, 'd', &d); assert(ret); assert(fabs(d - 5.0) < DBL_EPSILON); assert(d == 5.0); ret = _gvariant_iter_next_entry_basic(&iter, 'n', &n); assert(ret); assert(n == -32545); ret = _gvariant_iter_next_entry_basic(&iter, 't', &t); assert(ret); assert(t == 444444444LL); ret = _gvariant_iter_next_entry_basic(&iter, 'q', &q); assert(ret); assert(q == 32545); ret = _gvariant_iter_next_entry_basic(&iter, 'x', &x); assert(ret); assert(x == -44444444LL); ret = _gvariant_iter_next_entry_basic(&iter, 'y', &y); assert(ret); assert(y == 255); ret = _gvariant_iter_next_entry_basic(&iter, 'u', &u); assert(ret); assert(u == 3255554); ret = _gvariant_iter_next_entry_basic(&iter, 's', &s); assert(ret); assert(!strcmp(s, "foobar")); ret = _gvariant_iter_next_entry_basic(&iter, 'i', &i); assert(ret); assert(i == -3255554); } static const unsigned char basic_data_4[] = { 0x66, 0x6f, 0x6f, 0x00, 0x62, 0x61, 0x72, 0x00, 0x62, 0x61, 0x7a, 0x00, 0x08, 0x04, }; static struct parser_data parser_data_4 = { .data = basic_data_4, .len = 14, .signature = "sss", }; static void test_iter_basic_4(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; const char *s; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_next_entry_basic(&iter, 's', &s); assert(ret == true); assert(!strcmp(s, "foo")); ret = _gvariant_iter_next_entry_basic(&iter, 's', &s); assert(ret == true); assert(!strcmp(s, "bar")); ret = _gvariant_iter_next_entry_basic(&iter, 's', &s); assert(ret == true); assert(!strcmp(s, "baz")); } static const unsigned char fixed_struct_data_1[] = { 0x0a, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, }; static struct parser_data fixed_struct_1 = { .data = fixed_struct_data_1, .len = 8, .signature = "i(yy)", }; static void test_iter_fixed_struct_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; int32_t i; uint8_t y; bool ret; struct l_dbus_message_iter structure; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_next_entry_basic(&iter, 'i', &i); assert(ret); assert(i == 10); ret = _gvariant_iter_enter_struct(&iter, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 255); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 1); } static const unsigned char fixed_struct_data_2[] = { 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0xb3, 0x15, 0x00, 0x00, }; static struct parser_data fixed_struct_2 = { .data = fixed_struct_data_2, .len = 24, .signature = "(yyt)(yyu)", }; static void test_iter_fixed_struct_2(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; uint64_t t; uint32_t u; uint8_t y; bool ret; struct l_dbus_message_iter structure; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_struct(&iter, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 1); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 2); ret = _gvariant_iter_next_entry_basic(&structure, 't', &t); assert(ret); assert(t == 5555); ret = _gvariant_iter_enter_struct(&iter, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 1); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 2); ret = _gvariant_iter_next_entry_basic(&structure, 'u', &u); assert(ret); assert(u == 5555); } static const unsigned char nested_struct_data_1[] = { 0x01, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, }; static struct parser_data nested_struct_1 = { .data = nested_struct_data_1, .len = 17, .signature = "((us)yi)", }; static void test_iter_nested_struct_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; uint32_t u; uint8_t y; int32_t i; const char *s; bool ret; struct l_dbus_message_iter outer; struct l_dbus_message_iter inner; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_struct(&iter, &outer); assert(ret); ret = _gvariant_iter_enter_struct(&outer, &inner); assert(ret); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(ret); assert(u == 1); ret = _gvariant_iter_next_entry_basic(&inner, 's', &s); assert(ret); assert(!strcmp(s, "foobar")); ret = _gvariant_iter_next_entry_basic(&outer, 'y', &y); assert(ret); assert(y == 255); ret = _gvariant_iter_next_entry_basic(&outer, 'i', &i); assert(ret); assert(i == -1); } static const unsigned char empty_struct_data_1[] = { 0x00 }; static struct parser_data empty_struct_1 = { .data = empty_struct_data_1, .len = sizeof(empty_struct_data_1), .signature = "()", }; static void test_iter_empty_struct_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; bool ret; struct l_dbus_message_iter str; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_struct(&iter, &str); assert(ret); assert(str.sig_len == 0); } static const unsigned char variant_data_1[] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x19, }; static struct parser_data variant_1 = { .data = variant_data_1, .len = 33, .signature = "(uvu)i", }; static void test_iter_variant_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; struct l_dbus_message_iter structure; struct l_dbus_message_iter variant; int32_t i; uint32_t u; const char *s; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_struct(&iter, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'u', &u); assert(ret); assert(u == 5); ret = _gvariant_iter_enter_variant(&structure, &variant); assert(ret); ret = _gvariant_iter_next_entry_basic(&variant, 's', &s); assert(ret); assert(!strcmp(s, "foobar")); ret = _gvariant_iter_next_entry_basic(&structure, 'u', &u); assert(ret); assert(u == 5); ret = _gvariant_iter_next_entry_basic(&iter, 'i', &i); assert(ret); assert(i == 5); } static const unsigned char variant_data_2[] = { 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xff, 0x07, 0x00, 0x28, 0x73, 0x75, 0x79, 0x29, }; static struct parser_data variant_2 = { .data = variant_data_2, .len = 20, .signature = "v", }; static void test_iter_variant_2(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; struct l_dbus_message_iter variant; struct l_dbus_message_iter structure; uint8_t y; uint32_t u; const char *s; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_variant(&iter, &variant); assert(ret); ret = _gvariant_iter_enter_struct(&variant, &structure); ret = _gvariant_iter_next_entry_basic(&structure, 's', &s); assert(ret); assert(!strcmp(s, "foobar")); ret = _gvariant_iter_next_entry_basic(&structure, 'u', &u); assert(ret); assert(u == 20); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 255); } static const unsigned char fixed_array_data_1[] = { 0x14, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, }; static struct parser_data fixed_array_1 = { .data = fixed_array_data_1, .len = 8, .signature = "au", }; static void test_iter_fixed_array_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; struct l_dbus_message_iter array; uint32_t u; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_array(&iter, &array); assert(ret); ret = _gvariant_iter_next_entry_basic(&array, 'u', &u); assert(ret); assert(u == 20); ret = _gvariant_iter_next_entry_basic(&array, 'u', &u); assert(ret); assert(u == 22); ret = _gvariant_iter_next_entry_basic(&array, 'u', &u); assert(!ret); } static const unsigned char variable_array_data_1[] = { 0x66, 0x6f, 0x6f, 0x00, 0x62, 0x61, 0x72, 0x00, 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x00, 0x04, 0x08, 0x0f, }; static struct parser_data variable_array_1 = { .data = variable_array_data_1, .len = 18, .signature = "as", }; static void test_iter_variable_array_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; struct l_dbus_message_iter array; const char *s; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_array(&iter, &array); assert(ret); ret = _gvariant_iter_next_entry_basic(&array, 's', &s); assert(ret); assert(!strcmp(s, "foo")); ret = _gvariant_iter_next_entry_basic(&array, 's', &s); assert(ret); assert(!strcmp(s, "bar")); ret = _gvariant_iter_next_entry_basic(&array, 's', &s); assert(ret); assert(!strcmp(s, "foobar")); ret = _gvariant_iter_next_entry_basic(&array, 's', &s); assert(!ret); } static const unsigned char variable_array_data_2[] = { 0x66, 0x6f, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x61, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x11, 0x29, 0x49, }; static struct parser_data variable_array_2 = { .data = variable_array_data_2, .len = 76, .signature = "a(st)", }; static void test_iter_variable_array_2(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; struct l_dbus_message_iter array; struct l_dbus_message_iter structure; const char *s; uint64_t t; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_array(&iter, &array); assert(ret); ret = _gvariant_iter_enter_struct(&array, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 's', &s); assert(ret); assert(!strcmp(s, "foo")); ret = _gvariant_iter_next_entry_basic(&structure, 't', &t); assert(ret); assert(t == 15LL); ret = _gvariant_iter_enter_struct(&array, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 's', &s); assert(ret); assert(!strcmp(s, "bar")); ret = _gvariant_iter_next_entry_basic(&structure, 't', &t); assert(ret); assert(t == 16LL); ret = _gvariant_iter_enter_struct(&array, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 's', &s); assert(ret); assert(!strcmp(s, "foobar123")); ret = _gvariant_iter_next_entry_basic(&structure, 't', &t); assert(ret); assert(t == 31LL); } static const unsigned char dict_data_1[] = { 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static struct parser_data dict_1 = { .data = dict_data_1, .len = 16, .signature = "a{ub}", }; static void test_iter_dict_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; struct l_dbus_message_iter array; struct l_dbus_message_iter structure; uint32_t u; bool b; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_array(&iter, &array); assert(ret); ret = _gvariant_iter_enter_struct(&array, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'u', &u); assert(ret); assert(u == 1); ret = _gvariant_iter_next_entry_basic(&structure, 'b', &b); assert(ret); assert(b == true); ret = _gvariant_iter_enter_struct(&array, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'u', &u); assert(ret); assert(u == 2); ret = _gvariant_iter_next_entry_basic(&structure, 'b', &b); assert(ret); assert(b == false); } static const unsigned char aau_data_1[] = { 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x14, 0x18, 0x18, }; static struct parser_data aau_1 = { .data = aau_data_1, .len = 28, .signature = "aau", }; static void test_iter_aau_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; struct l_dbus_message_iter outer; struct l_dbus_message_iter inner; uint32_t u; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_array(&iter, &outer); assert(ret); ret = _gvariant_iter_enter_array(&outer, &inner); assert(ret); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(ret); assert(u == 1); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(ret); assert(u == 2); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(ret); assert(u == 3); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(!ret); ret = _gvariant_iter_enter_array(&outer, &inner); assert(ret); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(ret); assert(u == 1); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(ret); assert(u == 2); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(!ret); ret = _gvariant_iter_enter_array(&outer, &inner); assert(ret); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(ret); assert(u == 1); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(!ret); ret = _gvariant_iter_enter_array(&outer, &inner); assert(ret); ret = _gvariant_iter_next_entry_basic(&inner, 'u', &u); assert(!ret); } static const unsigned char av_data_1[] = { 0x46, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x75, 0x09, 0x16, }; static struct parser_data av_1 = { .data = av_data_1, .len = 24, .signature = "av", }; static void test_iter_av_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; struct l_dbus_message_iter array; struct l_dbus_message_iter variant; uint32_t u; const char *s; bool ret; _gvariant_iter_init(&iter, NULL, test->signature, test->signature + strlen(test->signature), test->data, test->len); ret = _gvariant_iter_enter_array(&iter, &array); assert(ret); ret = _gvariant_iter_enter_variant(&array, &variant); assert(ret); ret = _gvariant_iter_next_entry_basic(&variant, 's', &s); assert(ret); assert(!strcmp(s, "Foobar")); ret = _gvariant_iter_enter_variant(&array, &variant); assert(ret); ret = _gvariant_iter_next_entry_basic(&variant, 'u', &u); assert(ret); assert(u == 10); ret = _gvariant_iter_enter_variant(&array, &variant); assert(!ret); } static const unsigned char header_data_1[] = { 0x6c, 0x01, 0x00, 0x02, 0x28, 0x00, 0x00, 0x00, 0x57, 0x04, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x66, 0x6f, 0x6f, 0x2f, 0x62, 0x61, 0x72, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x6f, 0x2e, 0x62, 0x61, 0x72, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x6f, 0x2e, 0x62, 0x61, 0x72, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x79, 0x6e, 0x71, 0x69, 0x75, 0x78, 0x74, 0x64, 0x00, 0x00, 0x67, 0x13, 0x29, 0x42, 0x5a, 0x74, }; static struct parser_data header_1 = { .data = header_data_1, .len = 137, .signature = "a(yv)", }; static void test_iter_header_1(const void *test_data) { const struct parser_data *test = test_data; struct l_dbus_message_iter iter; struct l_dbus_message_iter array; struct l_dbus_message_iter structure; struct l_dbus_message_iter variant; bool ret; uint8_t y; uint32_t u; const char *o; const char *s; const char *g; ret = _gvariant_iter_init(&iter, NULL, "yyyyuuu", NULL, test->data, 16); assert(ret); ret = _gvariant_iter_next_entry_basic(&iter, 'y', &y); assert(ret); assert(y == 'l'); ret = _gvariant_iter_next_entry_basic(&iter, 'y', &y); assert(ret); assert(y == 1); ret = _gvariant_iter_next_entry_basic(&iter, 'y', &y); assert(ret); assert(y == 0); ret = _gvariant_iter_next_entry_basic(&iter, 'y', &y); assert(ret); assert(y == 2); ret = _gvariant_iter_next_entry_basic(&iter, 'u', &u); assert(ret); assert(u == 40); ret = _gvariant_iter_next_entry_basic(&iter, 'u', &u); assert(ret); assert(u == 1111); ret = _gvariant_iter_next_entry_basic(&iter, 'u', &u); assert(ret); assert(u == 121); ret = _gvariant_iter_init(&iter, NULL, "a(yv)", NULL, test->data + 16, u); ret = _gvariant_iter_enter_array(&iter, &array); assert(ret); ret = _gvariant_iter_enter_struct(&array, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 1); ret = _gvariant_iter_enter_variant(&structure, &variant); assert(ret); ret = _gvariant_iter_next_entry_basic(&variant, 'o', &o); assert(ret); assert(!strcmp(o, "/foo/bar")); ret = _gvariant_iter_enter_struct(&array, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 3); ret = _gvariant_iter_enter_variant(&structure, &variant); assert(ret); ret = _gvariant_iter_next_entry_basic(&variant, 's', &s); assert(ret); assert(!strcmp(s, "Foobar")); ret = _gvariant_iter_enter_struct(&array, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 2); ret = _gvariant_iter_enter_variant(&structure, &variant); assert(ret); ret = _gvariant_iter_next_entry_basic(&variant, 's', &s); assert(ret); assert(!strcmp(s, "foo.bar")); ret = _gvariant_iter_enter_struct(&array, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 6); ret = _gvariant_iter_enter_variant(&structure, &variant); assert(ret); ret = _gvariant_iter_next_entry_basic(&variant, 's', &s); assert(ret); assert(!strcmp(s, "foo.bar")); ret = _gvariant_iter_enter_struct(&array, &structure); assert(ret); ret = _gvariant_iter_next_entry_basic(&structure, 'y', &y); assert(ret); assert(y == 8); ret = _gvariant_iter_enter_variant(&structure, &variant); assert(ret); ret = _gvariant_iter_next_entry_basic(&variant, 'g', &g); assert(ret); assert(!strcmp(g, "bynqiuxtd")); } #define BUILDER_TEST_HEADER()\ void *body;\ size_t body_size;\ char *signature\ #define FINISH_AND_CHECK_BUILT_RESULT()\ signature = _gvariant_builder_finish(builder, &body, &body_size);\ assert(signature);\ assert(!strcmp(signature, test->signature));\ assert(body);\ assert(body_size == test->len);\ assert(!memcmp(test->data, body, body_size));\ l_free(signature);\ l_free(body);\ _gvariant_builder_free(builder)\ static void test_builder_basic_1(const void *test_data) { const struct parser_data *test = test_data; const char *s = "Hello World!"; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_append_basic(builder, 's', s); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_basic_2(const void *test_data) { const struct parser_data *test = test_data; const char *s = "foobar"; int i = 5; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_append_basic(builder, 'i', &i); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_basic_3(const void *test_data) { const struct parser_data *test = test_data; bool b = true; double d = 5.0; int16_t n = -32545; uint64_t t = 444444444LL; uint16_t q = 32545; int64_t x = -44444444LL; uint8_t y = 255; uint32_t u = 3255554; const char *s = "foobar"; int32_t i = -3255554; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_append_basic(builder, 'b', &b); assert(ret); ret = _gvariant_builder_append_basic(builder, 'd', &d); assert(ret); ret = _gvariant_builder_append_basic(builder, 'n', &n); assert(ret); ret = _gvariant_builder_append_basic(builder, 't', &t); assert(ret); ret = _gvariant_builder_append_basic(builder, 'q', &q); assert(ret); ret = _gvariant_builder_append_basic(builder, 'x', &x); assert(ret); ret = _gvariant_builder_append_basic(builder, 'y', &y); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s); assert(ret); ret = _gvariant_builder_append_basic(builder, 'i', &i); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_basic_4(const void *test_data) { const struct parser_data *test = test_data; const char *s1 = "foo"; const char *s2 = "bar"; const char *s3 = "baz"; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_append_basic(builder, 's', s1); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s2); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s3); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_fixed_struct_1(const void *test_data) { const struct parser_data *test = test_data; uint32_t i = 10; uint8_t y1 = 255; uint8_t y2 = 1; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_append_basic(builder, 'i', &i); assert(ret); ret = _gvariant_builder_enter_struct(builder, "yy"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'y', &y1); assert(ret); ret = _gvariant_builder_append_basic(builder, 'y', &y2); assert(ret); ret = _gvariant_builder_leave_struct(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_fixed_struct_2(const void *test_data) { const struct parser_data *test = test_data; uint32_t u = 5555; uint8_t y1 = 1; uint8_t y2 = 2; uint64_t t = 5555; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_struct(builder, "yyt"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'y', &y1); assert(ret); ret = _gvariant_builder_append_basic(builder, 'y', &y2); assert(ret); ret = _gvariant_builder_append_basic(builder, 't', &t); ret = _gvariant_builder_leave_struct(builder); assert(ret); ret = _gvariant_builder_enter_struct(builder, "yyu"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'y', &y1); assert(ret); ret = _gvariant_builder_append_basic(builder, 'y', &y2); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u); assert(ret); ret = _gvariant_builder_leave_struct(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_nested_struct_1(const void *test_data) { const struct parser_data *test = test_data; uint32_t u = 1; const char *s = "foobar"; uint8_t y = 255; int32_t i = -1; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_struct(builder, "(us)yi"); assert(ret); ret = _gvariant_builder_enter_struct(builder, "us"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s); assert(ret); ret = _gvariant_builder_leave_struct(builder); assert(ret); ret = _gvariant_builder_append_basic(builder, 'y', &y); assert(ret); ret = _gvariant_builder_append_basic(builder, 'i', &i); assert(ret); ret = _gvariant_builder_leave_struct(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_empty_struct_1(const void *test_data) { const struct parser_data *test = test_data; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_struct(builder, ""); assert(ret); ret = _gvariant_builder_leave_struct(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_variant_1(const void *test_data) { const struct parser_data *test = test_data; uint32_t u = 5; const char *s = "foobar"; int32_t i = 5; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_struct(builder, "uvu"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u); assert(ret); ret = _gvariant_builder_enter_variant(builder, "s"); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s); assert(ret); ret = _gvariant_builder_leave_variant(builder); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u); assert(ret); ret = _gvariant_builder_leave_struct(builder); assert(ret); ret = _gvariant_builder_append_basic(builder, 'i', &i); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_variant_2(const void *test_data) { const struct parser_data *test = test_data; const char *s = "foobar"; uint32_t u = 20; uint8_t y = 255; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_variant(builder, "(suy)"); assert(ret); ret = _gvariant_builder_enter_struct(builder, "suy"); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u); assert(ret); ret = _gvariant_builder_append_basic(builder, 'y', &y); assert(ret); ret = _gvariant_builder_leave_struct(builder); assert(ret); ret = _gvariant_builder_leave_variant(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_fixed_array_1(const void *test_data) { const struct parser_data *test = test_data; uint32_t u1 = 20; uint32_t u2 = 22; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_array(builder, "u"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u1); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u2); assert(ret); ret = _gvariant_builder_leave_array(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_dict_1(const void *test_data) { const struct parser_data *test = test_data; uint32_t u1 = 1; bool b1 = true; uint32_t u2 = 2; bool b2 = false; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_array(builder, "{ub}"); assert(ret); ret = _gvariant_builder_enter_dict(builder, "ub"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u1); assert(ret); ret = _gvariant_builder_append_basic(builder, 'b', &b1); assert(ret); ret = _gvariant_builder_leave_dict(builder); assert(ret); ret = _gvariant_builder_enter_dict(builder, "ub"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u2); assert(ret); ret = _gvariant_builder_append_basic(builder, 'b', &b2); assert(ret); ret = _gvariant_builder_leave_dict(builder); assert(ret); ret = _gvariant_builder_leave_array(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_variable_array_1(const void *test_data) { const struct parser_data *test = test_data; const char *s1 = "foo"; const char *s2 = "bar"; const char *s3 = "foobar"; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_array(builder, "s"); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s1); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s2); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s3); assert(ret); ret = _gvariant_builder_leave_array(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_variable_array_2(const void *test_data) { const struct parser_data *test = test_data; const char *s1 = "foo"; uint64_t t1 = 15LL; const char *s2 = "bar"; uint64_t t2 = 16LL; const char *s3 = "foobar123"; uint64_t t3 = 31LL; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_array(builder, "(st)"); assert(ret); ret = _gvariant_builder_enter_struct(builder, "st"); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s1); assert(ret); ret = _gvariant_builder_append_basic(builder, 't', &t1); assert(ret); ret = _gvariant_builder_leave_struct(builder); assert(ret); ret = _gvariant_builder_enter_struct(builder, "st"); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s2); assert(ret); ret = _gvariant_builder_append_basic(builder, 't', &t2); assert(ret); ret = _gvariant_builder_leave_struct(builder); assert(ret); ret = _gvariant_builder_enter_struct(builder, "st"); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s3); assert(ret); ret = _gvariant_builder_append_basic(builder, 't', &t3); assert(ret); ret = _gvariant_builder_leave_struct(builder); assert(ret); ret = _gvariant_builder_leave_array(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_aau_1(const void *test_data) { const struct parser_data *test = test_data; uint32_t u1 = 1; uint32_t u2 = 2; uint32_t u3 = 3; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_array(builder, "au"); assert(ret); ret = _gvariant_builder_enter_array(builder, "u"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u1); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u2); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u3); assert(ret); ret = _gvariant_builder_leave_array(builder); assert(ret); ret = _gvariant_builder_enter_array(builder, "u"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u1); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u2); assert(ret); ret = _gvariant_builder_leave_array(builder); assert(ret); ret = _gvariant_builder_enter_array(builder, "u"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u1); assert(ret); ret = _gvariant_builder_leave_array(builder); assert(ret); ret = _gvariant_builder_enter_array(builder, "u"); assert(ret); ret = _gvariant_builder_leave_array(builder); assert(ret); ret = _gvariant_builder_leave_array(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } static void test_builder_av_1(const void *test_data) { const struct parser_data *test = test_data; const char *s = "Foobar"; uint32_t u = 10; struct dbus_builder *builder; bool ret; BUILDER_TEST_HEADER(); builder = _gvariant_builder_new(NULL, 0); assert(builder); ret = _gvariant_builder_enter_array(builder, "v"); assert(ret); ret = _gvariant_builder_enter_variant(builder, "s"); assert(ret); ret = _gvariant_builder_append_basic(builder, 's', s); assert(ret); ret = _gvariant_builder_leave_variant(builder); assert(ret); ret = _gvariant_builder_enter_variant(builder, "u"); assert(ret); ret = _gvariant_builder_append_basic(builder, 'u', &u); assert(ret); ret = _gvariant_builder_leave_variant(builder); assert(ret); ret = _gvariant_builder_leave_array(builder); assert(ret); FINISH_AND_CHECK_BUILT_RESULT(); } int main(int argc, char *argv[]) { l_test_init(&argc, &argv); l_test_add("Signature Test 1", test_signature, &sig_test1); l_test_add("Signature test 2", test_signature, &sig_test2); l_test_add("Signature test 3", test_signature, &sig_test3); l_test_add("Signature test 4", test_signature, &sig_test4); l_test_add("Signature test 5", test_signature, &sig_test5); l_test_add("Signature test 6", test_signature, &sig_test6); l_test_add("Signature test 7", test_signature, &sig_test7); l_test_add("Signature test 8", test_signature, &sig_test8); l_test_add("Signature test 9", test_signature, &sig_test9); l_test_add("Signature test 10", test_signature, &sig_test10); l_test_add("Signature test 11", test_signature, &sig_test11); l_test_add("Signature test 12", test_signature, &sig_test12); l_test_add("Signature test 13", test_signature, &sig_test13); l_test_add("Signature test 14", test_signature, &sig_test14); l_test_add("Signature test 15", test_signature, &sig_test15); l_test_add("Signature test 16", test_signature, &sig_test16); l_test_add("Signature test 17", test_signature, &sig_test17); l_test_add("Signature test 18", test_signature, &sig_test18); l_test_add("Signature test 19", test_signature, &sig_test19); l_test_add("Signature test 20", test_signature, &sig_test20); l_test_add("Signature test 21", test_signature, &sig_test21); l_test_add("Signature test 22", test_signature, &sig_test22); l_test_add("Signature test 23", test_signature, &sig_test23); l_test_add("Alignment test 1", test_alignment, &align_test1); l_test_add("Alignment test 2", test_alignment, &align_test2); l_test_add("Alignment test 3", test_alignment, &align_test3); l_test_add("Alignment test 4", test_alignment, &align_test4); l_test_add("Alignment test 5", test_alignment, &align_test5); l_test_add("Alignment test 6", test_alignment, &align_test6); l_test_add("Alignment test 7", test_alignment, &align_test7); l_test_add("Alignment test 8", test_alignment, &align_test8); l_test_add("Alignment test 9", test_alignment, &align_test9); l_test_add("Alignment test 10", test_alignment, &align_test10); l_test_add("Alignment test 11", test_alignment, &align_test11); l_test_add("Alignment test 12", test_alignment, &align_test12); l_test_add("Alignment test 13", test_alignment, &align_test13); l_test_add("Alignment test 14", test_alignment, &align_test14); l_test_add("Alignment test 15", test_alignment, &align_test15); l_test_add("Alignment test 16", test_alignment, &align_test16); l_test_add("Alignment test 17", test_alignment, &align_test17); l_test_add("Alignment test 18", test_alignment, &align_test18); l_test_add("Alignment test 19", test_alignment, &align_test19); l_test_add("Alignment test 20", test_alignment, &align_test20); l_test_add("Alignment test 21", test_alignment, &align_test21); l_test_add("Alignment test 22", test_alignment, &align_test22); l_test_add("Alignment test 23", test_alignment, &align_test23); l_test_add("Alignment test 24", test_alignment, &align_test24); l_test_add("Alignment test 25", test_alignment, &align_test25); l_test_add("Alignment test 26", test_alignment, &align_test26); l_test_add("Alignment test 27", test_alignment, &align_test27); l_test_add("Alignment test 28", test_alignment, &align_test28); l_test_add("Alignment test 29", test_alignment, &align_test29); l_test_add("Alignment test 30", test_alignment, &align_test30); l_test_add("Alignment test 31", test_alignment, &align_test31); l_test_add("Alignment test 32", test_alignment, &align_test32); l_test_add("Alignment test 33", test_alignment, &align_test33); l_test_add("Alignment test 34", test_alignment, &align_test34); l_test_add("Alignment test 35", test_alignment, &align_test35); l_test_add("Alignment test 36", test_alignment, &align_test36); l_test_add("Alignment test 37", test_alignment, &align_test37); l_test_add("Is Fixed Size test 1", test_is_fixed_size, &is_fixed_size_test1); l_test_add("Is Fixed Size test 2", test_is_fixed_size, &is_fixed_size_test2); l_test_add("Is Fixed Size test 3", test_is_fixed_size, &is_fixed_size_test3); l_test_add("Is Fixed Size test 4", test_is_fixed_size, &is_fixed_size_test4); l_test_add("Is Fixed Size test 4", test_is_fixed_size, &is_fixed_size_test4); l_test_add("Is Fixed Size test 5", test_is_fixed_size, &is_fixed_size_test5); l_test_add("Is Fixed Size test 6", test_is_fixed_size, &is_fixed_size_test6); l_test_add("Is Fixed Size test 7", test_is_fixed_size, &is_fixed_size_test7); l_test_add("Is Fixed Size test 8", test_is_fixed_size, &is_fixed_size_test8); l_test_add("Is Fixed Size test 9", test_is_fixed_size, &is_fixed_size_test9); l_test_add("Is Fixed Size test 10", test_is_fixed_size, &is_fixed_size_test10); l_test_add("Is Fixed Size test 11", test_is_fixed_size, &is_fixed_size_test11); l_test_add("Is Fixed Size test 12", test_is_fixed_size, &is_fixed_size_test12); l_test_add("Is Fixed Size test 13", test_is_fixed_size, &is_fixed_size_test13); l_test_add("Is Fixed Size test 14", test_is_fixed_size, &is_fixed_size_test14); l_test_add("Is Fixed Size test 15", test_is_fixed_size, &is_fixed_size_test15); l_test_add("Is Fixed Size test 16", test_is_fixed_size, &is_fixed_size_test16); l_test_add("Is Fixed Size test 17", test_is_fixed_size, &is_fixed_size_test17); l_test_add("Is Fixed Size test 18", test_is_fixed_size, &is_fixed_size_test18); l_test_add("Is Fixed Size test 19", test_is_fixed_size, &is_fixed_size_test19); l_test_add("Is Fixed Size test 20", test_is_fixed_size, &is_fixed_size_test20); l_test_add("Is Fixed Size test 21", test_is_fixed_size, &is_fixed_size_test21); l_test_add("Is Fixed Size test 22", test_is_fixed_size, &is_fixed_size_test22); l_test_add("Get Fixed Size test 1", test_get_fixed_size, &size_test1); l_test_add("Get Fixed Size test 2", test_get_fixed_size, &size_test2); l_test_add("Get Fixed Size test 3", test_get_fixed_size, &size_test3); l_test_add("Get Fixed Size test 4", test_get_fixed_size, &size_test4); l_test_add("Get Fixed Size test 5", test_get_fixed_size, &size_test5); l_test_add("Get Fixed Size test 6", test_get_fixed_size, &size_test6); l_test_add("Get Fixed Size test 7", test_get_fixed_size, &size_test7); l_test_add("Get Fixed Size test 8", test_get_fixed_size, &size_test8); l_test_add("Get Fixed Size test 9", test_get_fixed_size, &size_test9); l_test_add("Get Fixed Size test 10", test_get_fixed_size, &size_test10); l_test_add("Get Fixed Size test 11", test_get_fixed_size, &size_test11); l_test_add("Get Fixed Size test 12", test_get_fixed_size, &size_test12); l_test_add("Get Fixed Size test 13", test_get_fixed_size, &size_test13); l_test_add("Get Fixed Size test 14", test_get_fixed_size, &size_test14); l_test_add("Get Fixed Size test 15", test_get_fixed_size, &size_test15); l_test_add("Get Fixed Size test 16", test_get_fixed_size, &size_test16); l_test_add("Get Fixed Size test 17", test_get_fixed_size, &size_test17); l_test_add("Get Fixed Size test 18", test_get_fixed_size, &size_test18); l_test_add("Get Fixed Size test 19", test_get_fixed_size, &size_test19); l_test_add("Get Fixed Size test 20", test_get_fixed_size, &size_test20); l_test_add("Get Fixed Size test 21", test_get_fixed_size, &size_test21); l_test_add("Get Fixed Size test 22", test_get_fixed_size, &size_test22); l_test_add("Get Fixed Size test 23", test_get_fixed_size, &size_test23); l_test_add("Get Fixed Size test 24", test_get_fixed_size, &size_test24); l_test_add("Get Fixed Size test 25", test_get_fixed_size, &size_test25); l_test_add("Get Fixed Size test 26", test_get_fixed_size, &size_test26); l_test_add("Get Fixed Size test 27", test_get_fixed_size, &size_test27); l_test_add("Get Fixed Size test 28", test_get_fixed_size, &size_test28); l_test_add("Get Fixed Size test 29", test_get_fixed_size, &size_test29); l_test_add("Iter Test Basic 's'", test_iter_basic_1, &parser_data_1); l_test_add("Iter Test Basic 'is'", test_iter_basic_2, &parser_data_2); l_test_add("Iter Test Basic 'bdntqxyusi'", test_iter_basic_3, &parser_data_3); l_test_add("Iter Test Basic 'sss'", test_iter_basic_4, &parser_data_4); l_test_add("Iter Test Fixed Struct 'i(yy)'", test_iter_fixed_struct_1, &fixed_struct_1); l_test_add("Iter Test Fixed Struct '(yyt)(yyu)'", test_iter_fixed_struct_2, &fixed_struct_2); l_test_add("Iter Test Nested Struct '((us)yi)'", test_iter_nested_struct_1, &nested_struct_1); l_test_add("Iter Test Empty Struct '()'", test_iter_empty_struct_1, &empty_struct_1); l_test_add("Iter Test Variant '(uvu)i'", test_iter_variant_1, &variant_1); l_test_add("Iter Test Variant 'v'", test_iter_variant_2, &variant_2); l_test_add("Iter Test Fixed Array 'au'", test_iter_fixed_array_1, &fixed_array_1); l_test_add("Iter Test Fixed Dict 'a{ub}'", test_iter_dict_1, &dict_1); l_test_add("Iter Test Variable Array 'as'", test_iter_variable_array_1, &variable_array_1); l_test_add("Iter Test Variable Array 'a(st)'", test_iter_variable_array_2, &variable_array_2); l_test_add("Iter Test Array of Array 'aau'", test_iter_aau_1, &aau_1); l_test_add("Iter Test Array of Variant 'av'", test_iter_av_1, &av_1); l_test_add("Iter Test Header 'a(yv)'", test_iter_header_1, &header_1); l_test_add("Builder Test Basic 's'", test_builder_basic_1, &parser_data_1); l_test_add("Builder Test Basic 'is'", test_builder_basic_2, &parser_data_2); l_test_add("Builder Test Basic 'bdntqxyusi'", test_builder_basic_3, &parser_data_3); l_test_add("Builder Test Basic 'sss'", test_builder_basic_4, &parser_data_4); l_test_add("Builder Test Fixed Struct 'i(yy)'", test_builder_fixed_struct_1, &fixed_struct_1); l_test_add("Builder Test Fixed Struct '(yyt)(yyu)'", test_builder_fixed_struct_2, &fixed_struct_2); l_test_add("Builder Test Nested Struct '((us)yi)'", test_builder_nested_struct_1, &nested_struct_1); l_test_add("Builder Test Empty Struct '()'", test_builder_empty_struct_1, &empty_struct_1); l_test_add("Builder Test Variant '(uvu)i'", test_builder_variant_1, &variant_1); l_test_add("Builder Test Variant 'v'", test_builder_variant_2, &variant_2); l_test_add("Builder Test Fixed Array 'au'", test_builder_fixed_array_1, &fixed_array_1); l_test_add("Builder Test Fixed Dict 'a{ub}'", test_builder_dict_1, &dict_1); l_test_add("Builder Test Variable Array 'as'", test_builder_variable_array_1, &variable_array_1); l_test_add("Builder Test Variable Array 'a(st)'", test_builder_variable_array_2, &variable_array_2); l_test_add("Builder Test Array of Array 'aau'", test_builder_aau_1, &aau_1); l_test_add("Builder Test Array of Variant 'av'", test_builder_av_1, &av_1); return l_test_run(); }