X-Git-Url: https://repo.jachan.dev/qemu.git/blobdiff_plain/a4a1c70dc759e5b81627e96564f344ab43ea86eb..aa388ddc36e8032f41cd17bef88cc3ebaeba77c9:/tests/test-opts-visitor.c diff --git a/tests/test-opts-visitor.c b/tests/test-opts-visitor.c index b93fd330a8..23e897061c 100644 --- a/tests/test-opts-visitor.c +++ b/tests/test-opts-visitor.c @@ -175,6 +175,7 @@ expect_u64_max(OptsVisitorFixture *f, gconstpointer test_data) static void test_opts_range_unvisited(void) { + Error *err = NULL; intList *list = NULL; intList *tail; QemuOpts *opts; @@ -199,7 +200,45 @@ test_opts_range_unvisited(void) g_assert_cmpint(tail->value, ==, 1); tail = (intList *)visit_next_list(v, (GenericList *)tail, sizeof(*list)); g_assert(tail); - visit_check_list(v, &error_abort); /* BUG: unvisited tail not reported */ + visit_check_list(v, &error_abort); /* unvisited tail ignored until... */ + visit_end_list(v, (void **)&list); + + visit_check_struct(v, &err); /* ...here */ + error_free_or_abort(&err); + visit_end_struct(v, NULL); + + qapi_free_intList(list); + visit_free(v); + qemu_opts_del(opts); +} + +static void +test_opts_range_beyond(void) +{ + Error *err = NULL; + intList *list = NULL; + intList *tail; + QemuOpts *opts; + Visitor *v; + int64_t val; + + opts = qemu_opts_parse(qemu_find_opts("userdef"), "ilist=0", false, + &error_abort); + + v = opts_visitor_new(opts); + + visit_start_struct(v, NULL, NULL, 0, &error_abort); + + /* Would be simpler if the visitor genuinely supported virtual walks */ + visit_start_list(v, "ilist", (GenericList **)&list, sizeof(*list), + &error_abort); + tail = list; + visit_type_int(v, NULL, &tail->value, &error_abort); + g_assert_cmpint(tail->value, ==, 0); + tail = (intList *)visit_next_list(v, (GenericList *)tail, sizeof(*tail)); + g_assert(!tail); + visit_type_int(v, NULL, &val, &err); + error_free_or_abort(&err); visit_end_list(v, (void **)&list); visit_check_struct(v, &error_abort); @@ -210,6 +249,25 @@ test_opts_range_unvisited(void) qemu_opts_del(opts); } +static void +test_opts_dict_unvisited(void) +{ + Error *err = NULL; + QemuOpts *opts; + Visitor *v; + UserDefOptions *userdef; + + opts = qemu_opts_parse(qemu_find_opts("userdef"), "i64x=0,bogus=1", false, + &error_abort); + + v = opts_visitor_new(opts); + visit_type_UserDefOptions(v, NULL, &userdef, &err); + error_free_or_abort(&err); + visit_free(v); + qemu_opts_del(opts); + g_assert(!userdef); +} + int main(int argc, char **argv) { @@ -303,6 +361,10 @@ main(int argc, char **argv) g_test_add_func("/visitor/opts/range/unvisited", test_opts_range_unvisited); + g_test_add_func("/visitor/opts/range/beyond", + test_opts_range_beyond); + + g_test_add_func("/visitor/opts/dict/unvisited", test_opts_dict_unvisited); g_test_run(); return 0;