On 02/26/2017 03:43 PM, Markus Armbruster wrote:
> Demonstrates a design flaw: there is no way to for input visitors to
> report that a list visit didn't visit the complete input list.  The
> generated list visits always do, but manual visits needn't.
> 
> Signed-off-by: Markus Armbruster <arm...@redhat.com>
> ---
>  tests/test-opts-visitor.c          | 41 +++++++++++++++++++++++++++++++++++
>  tests/test-qobject-input-visitor.c | 44 
> ++++++++++++++++++++++++++++++++++++++
>  tests/test-string-input-visitor.c  | 22 +++++++++++++++++++
>  3 files changed, 107 insertions(+)
> 

>  
> +static void
> +test_opts_range_unvisited(void)
> +{
> +    intList *list = NULL;
> +    intList *tail;
> +    QemuOpts *opts;
> +    Visitor *v;
> +
> +    opts = qemu_opts_parse(qemu_find_opts("userdef"), "ilist=0-2", 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);

Although the complexity of adding virtual walks to the string visitor
may not be worth the effort.

> +++ b/tests/test-qobject-input-visitor.c
> @@ -923,6 +923,46 @@ static void 
> test_visitor_in_fail_struct_missing(TestInputVisitorData *data,
>      visit_end_struct(v, NULL);
>  }
>  
> +static void test_visitor_in_fail_list(TestInputVisitorData *data,
> +                                      const void *unused)
> +{
> +    int64_t i64 = -1;
> +    Visitor *v;
> +
> +    /* Unvisited list tail */
> +
> +    v = visitor_input_test_init(data, "[ 1, 2, 3 ]");
> +
> +    visit_start_list(v, NULL, NULL, 0, &error_abort);
> +    visit_type_int(v, NULL, &i64, &error_abort);
> +    g_assert_cmpint(i64, ==, 1);
> +    visit_type_int(v, NULL, &i64, &error_abort);
> +    g_assert_cmpint(i64, ==, 2);
> +    visit_end_list(v, NULL);
> +    /* BUG: unvisited tail not reported; actually not reportable by design */

Indeed - the virtual walk is easier. At any rate, good testsuite
addition, and sets the stage for why the next patches fix the design flaw.

> +}
> +
> +static void test_visitor_in_fail_list_nested(TestInputVisitorData *data,
> +                                             const void *unused)
> +{
> +    int64_t i64 = -1;
> +    Visitor *v;
> +
> +    /* Unvisited nested list tail */
> +
> +    v = visitor_input_test_init(data, "[ 0, [ 1, 2, 3 ] ]");

In fact, QAPI does not (currently) allow the creation of one list nested
inside another (at least, not without an intervening struct), so this
particular input can only be walked virtually.

Reviewed-by: Eric Blake <ebl...@redhat.com>

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to