[{"id":3684927,"web_url":"http://patchwork.ozlabs.org/comment/3684927/","msgid":"<afO9GsCVTZdh2x96@x1.local>","list_archive_url":null,"date":"2026-04-30T20:35:38","subject":"Re: [PATCH v1 1/5] tests/qtest/dbus-vmstate: Bring the test\n up-to-date","submitter":{"id":67717,"url":"http://patchwork.ozlabs.org/api/people/67717/","name":"Peter Xu","email":"peterx@redhat.com"},"content":"On Wed, Apr 29, 2026 at 04:05:46PM -0300, Fabiano Rosas wrote:\n> The dbus-vmstate-test has been disabled for years. Here's the things\n> that have changed in the meantime and how to update the test:\n> \n> - Migration tests got new headers.\n> Update the includes.\n> \n> - migrate_qmp got new parameters.\n> Update the caller.\n> \n> - migrate_incoming_qmp is now used instead of -incoming URL.\n> Use -incoming defer.\n> \n> - Tests expecting failure should not check non-zero return code.\n> Check for failed migration state instead.\n> \n> - The test result enum was introduced.\n> Replace the migration_fail flag with the enum.\n> \n> - The DEVICE state was added.\n> Replace wait_for_migration_complete with migration_event_wait, which\n> won't trip on intermediary states.\n> \n> - Migration completion was reworked.\n> Explicitly wait for the RESUME event before asserting runstate is\n> RUNNING to avoid checking too quickly and seeing FINISH_MIGRATE\n> instead.\n> \n> - The FAILING state was added.\n> Wait for it before waiting for the RESUME event.\n> \n> - Sanity checks were added to migration_get_env().\n> Start calling that function in main.\n> \n> - qtest_add_func now has a wrapper.\n> Replace qtest_add_func with migration_test_add. Update tests'\n> signatures to take MigrationCommon, although it's unused.\n> \n> - meson now sets up G_TEST_DBUS_DAEMON.\n> Remove the logic around it.\n> \n> Signed-off-by: Fabiano Rosas <farosas@suse.de>\n\nI don't think I'm confident reviewing the whole series, but you can take:\n\nAcked-by: Peter Xu <peterx@redhat.com>\n\nOne trivial question below,\n\n> ---\n>  tests/qtest/dbus-vmstate-test.c | 71 +++++++++++++++++++--------------\n>  tests/qtest/meson.build         |  7 +++-\n>  2 files changed, 46 insertions(+), 32 deletions(-)\n> \n> diff --git a/tests/qtest/dbus-vmstate-test.c b/tests/qtest/dbus-vmstate-test.c\n> index 0a82cc9f93..90c050b448 100644\n> --- a/tests/qtest/dbus-vmstate-test.c\n> +++ b/tests/qtest/dbus-vmstate-test.c\n> @@ -2,8 +2,8 @@\n>  #include <glib/gstdio.h>\n>  #include <gio/gio.h>\n>  #include \"libqtest.h\"\n> +#include \"migration/migration-qmp.h\"\n>  #include \"dbus-vmstate1.h\"\n> -#include \"migration-helpers.h\"\n>  \n>  static char *workdir;\n>  \n> @@ -29,7 +29,7 @@ typedef struct TestServer {\n>  \n>  typedef struct Test {\n>      const char *id_list;\n> -    bool migrate_fail;\n> +    int result;\n>      bool without_dst_b;\n>      TestServer srcA;\n>      TestServer dstA;\n> @@ -190,6 +190,7 @@ test_dbus_vmstate(Test *test)\n>      g_autofree char *uri = NULL;\n>      QTestState *src_qemu = NULL, *dst_qemu = NULL;\n>      guint ownsrcA, ownsrcB, owndstA, owndstB;\n> +    QTestMigrationState src_state = { };\n>  \n>      uri = g_strdup_printf(\"unix:%s/migsocket\", workdir);\n>  \n> @@ -224,17 +225,33 @@ test_dbus_vmstate(Test *test)\n>  \n>      src_qemu = qtest_init(src_qemu_args);\n>      dst_qemu = qtest_init(dst_qemu_args);\n> +\n> +    migrate_set_capability(src_qemu, \"events\", true);\n> +    qtest_qmp_set_event_callback(src_qemu, migrate_watch_for_events,\n> +                                 &src_state);\n> +\n>      set_id_list(test, src_qemu);\n>      set_id_list(test, dst_qemu);\n>  \n>      thread = g_thread_new(\"dbus-vmstate-thread\", dbus_vmstate_thread, loop);\n>  \n>      migrate_incoming_qmp(dst_qemu, uri, NULL, \"{}\");\n> -    migrate_qmp(src_qemu, uri, \"{}\");\n> +    migrate_ensure_converge(src_qemu);\n> +    migrate_qmp(src_qemu, NULL, uri, NULL, \"{}\");\n>      test->src_qemu = src_qemu;\n> -    if (test->migrate_fail) {\n> -        wait_for_migration_fail(src_qemu, true);\n> -        qtest_set_expected_status(dst_qemu, EXIT_FAILURE);\n> +\n> +    if (test->result != MIG_TEST_SUCCEED) {\n> +        QDict *rsp;\n> +\n> +        migration_event_wait(src_qemu, \"failing\");\n> +        wait_for_resume(src_qemu, &src_state);\n> +        migration_event_wait(src_qemu, \"failed\");\n\nNot sure if we need such detailed checks over failing, resume, failed\nevents on this one, but it looks ok.\n\nDo you plan to remove wait_for_migration_fail() finally?  We still have a\nfew other users.  IIUC, we could also switch to using events for\nwait_for_migration_fail().\n\n> +\n> +        rsp = qtest_qmp_assert_success_ref(src_qemu,\n> +                                           \"{ 'execute': 'query-status' }\");\n> +        g_assert(qdict_haskey(rsp, \"running\"));\n> +        g_assert(qdict_get_bool(rsp, \"running\"));\n> +        qobject_unref(rsp);\n>      } else {\n>          wait_for_migration_complete(src_qemu);\n>      }\n> @@ -270,7 +287,7 @@ check_migrated(TestServer *s, TestServer *d)\n>  }\n>  \n>  static void\n> -test_dbus_vmstate_without_list(void)\n> +test_dbus_vmstate_without_list(char *name, MigrateCommon *args)\n>  {\n>      Test test = { 0, };\n>  \n> @@ -281,7 +298,7 @@ test_dbus_vmstate_without_list(void)\n>  }\n>  \n>  static void\n> -test_dbus_vmstate_with_list(void)\n> +test_dbus_vmstate_with_list(char *name, MigrateCommon *args)\n>  {\n>      Test test = { .id_list = \"idA,idB\" };\n>  \n> @@ -292,7 +309,7 @@ test_dbus_vmstate_with_list(void)\n>  }\n>  \n>  static void\n> -test_dbus_vmstate_only_a(void)\n> +test_dbus_vmstate_only_a(char *name, MigrateCommon *args)\n>  {\n>      Test test = { .id_list = \"idA\" };\n>  \n> @@ -303,9 +320,10 @@ test_dbus_vmstate_only_a(void)\n>  }\n>  \n>  static void\n> -test_dbus_vmstate_missing_src(void)\n> +test_dbus_vmstate_missing_src(char *name, MigrateCommon *args)\n>  {\n> -    Test test = { .id_list = \"idA,idC\", .migrate_fail = true };\n> +    Test test = { .id_list = \"idA,idC\",\n> +        .result = MIG_TEST_FAIL };\n>  \n>      /* run in subprocess to silence QEMU error reporting */\n>      if (g_test_subprocess()) {\n> @@ -320,11 +338,11 @@ test_dbus_vmstate_missing_src(void)\n>  }\n>  \n>  static void\n> -test_dbus_vmstate_missing_dst(void)\n> +test_dbus_vmstate_missing_dst(char *name, MigrateCommon *args)\n>  {\n>      Test test = { .id_list = \"idA,idB\",\n>                    .without_dst_b = true,\n> -                  .migrate_fail = true };\n> +                  .result = MIG_TEST_FAIL };\n>  \n>      /* run in subprocess to silence QEMU error reporting */\n>      if (g_test_subprocess()) {\n> @@ -343,15 +361,8 @@ int\n>  main(int argc, char **argv)\n>  {\n>      GError *err = NULL;\n> -    g_autofree char *dbus_daemon = NULL;\n>      int ret;\n>  \n> -    dbus_daemon = g_build_filename(G_STRINGIFY(SRCDIR),\n> -                                   \"tests\",\n> -                                   \"dbus-vmstate-daemon.sh\",\n> -                                   NULL);\n> -    g_setenv(\"G_TEST_DBUS_DAEMON\", dbus_daemon, true);\n> -\n>      g_test_init(&argc, &argv, NULL);\n>  \n>      workdir = g_dir_make_tmp(\"dbus-vmstate-test-XXXXXX\", &err);\n> @@ -362,16 +373,16 @@ main(int argc, char **argv)\n>  \n>      g_setenv(\"DBUS_VMSTATE_TEST_TMPDIR\", workdir, true);\n>  \n> -    qtest_add_func(\"/dbus-vmstate/without-list\",\n> -                   test_dbus_vmstate_without_list);\n> -    qtest_add_func(\"/dbus-vmstate/with-list\",\n> -                   test_dbus_vmstate_with_list);\n> -    qtest_add_func(\"/dbus-vmstate/only-a\",\n> -                   test_dbus_vmstate_only_a);\n> -    qtest_add_func(\"/dbus-vmstate/missing-src\",\n> -                   test_dbus_vmstate_missing_src);\n> -    qtest_add_func(\"/dbus-vmstate/missing-dst\",\n> -                   test_dbus_vmstate_missing_dst);\n> +    migration_test_add(\"/dbus-vmstate/without-list\",\n> +                       test_dbus_vmstate_without_list);\n> +    migration_test_add(\"/dbus-vmstate/with-list\",\n> +                       test_dbus_vmstate_with_list);\n> +    migration_test_add(\"/dbus-vmstate/only-a\",\n> +                       test_dbus_vmstate_only_a);\n> +    migration_test_add(\"/dbus-vmstate/missing-src\",\n> +                       test_dbus_vmstate_missing_src);\n> +    migration_test_add(\"/dbus-vmstate/missing-dst\",\n> +                       test_dbus_vmstate_missing_dst);\n>  \n>      ret = g_test_run();\n>  \n> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build\n> index b735f55fc4..0d04e2cbaa 100644\n> --- a/tests/qtest/meson.build\n> +++ b/tests/qtest/meson.build\n> @@ -126,10 +126,12 @@ if dbus_daemon.found() and gdbus_codegen.found()\n>    # Temporarily disabled due to Patchew failures:\n>    #qtests_i386 += ['dbus-vmstate-test']\n>    dbus_vmstate1 = custom_target('dbus-vmstate description',\n> -                                output: ['dbus-vmstate1.h', 'dbus-vmstate1.c'],\n> +                                build_by_default: true,\n> +                                output: [ 'dbus-vmstate1.h', 'dbus-vmstate1.c'],\n>                                  input: meson.project_source_root() / 'backends/dbus-vmstate1.xml',\n>                                  command: [gdbus_codegen, '@INPUT@',\n>                                            '--interface-prefix', 'org.qemu',\n> +                                          '--output-directory', meson.current_build_dir(),\n>                                            '--generate-c-code', '@BASENAME@']).to_list()\n>  else\n>    dbus_vmstate1 = []\n> @@ -385,7 +387,8 @@ qtests = {\n>    'bios-tables-test': [io, 'boot-sector.c', 'acpi-utils.c', 'tpm-emu.c'],\n>    'cdrom-test': files('boot-sector.c'),\n>    'dbus-vmstate-test': files('migration/migration-qmp.c',\n> -                             'migration/migration-util.c') + dbus_vmstate1,\n> +                             'migration/migration-util.c') + dbus_vmstate1 +\n> +                       [gio],\n>    'erst-test': files('erst-test.c'),\n>    'ivshmem-test': [rt, '../../contrib/ivshmem-server/ivshmem-server.c'],\n>    'migration-test': test_migration_files + migration_tls_files + migration_colo_files,\n> -- \n> 2.51.0\n>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=QOJIxY/B;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=google header.b=mSZApo3S;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g65Z30c64z1yHZ\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 01 May 2026 06:36:57 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wIY6y-0001wJ-2d; Thu, 30 Apr 2026 16:35:52 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <peterx@redhat.com>) id 1wIY6v-0001vr-Fq\n for qemu-devel@nongnu.org; Thu, 30 Apr 2026 16:35:49 -0400","from us-smtp-delivery-124.mimecast.com ([170.10.133.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <peterx@redhat.com>) id 1wIY6s-0000L3-TH\n for qemu-devel@nongnu.org; Thu, 30 Apr 2026 16:35:49 -0400","from mail-qt1-f199.google.com (mail-qt1-f199.google.com\n [209.85.160.199]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-288-7BukDfdmNUqS15foqMXRjw-1; Thu, 30 Apr 2026 16:35:43 -0400","by mail-qt1-f199.google.com with SMTP id\n d75a77b69052e-50f817c3240so16923771cf.1\n for <qemu-devel@nongnu.org>; Thu, 30 Apr 2026 13:35:43 -0700 (PDT)","from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id\n d75a77b69052e-5103e3ec5ccsm1087531cf.4.2026.04.30.13.35.40\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 30 Apr 2026 13:35:40 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777581345;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=WsfEaBW91NQY2hmFkVEk2/EcqY3rzpQnH9J9l9NoKpw=;\n b=QOJIxY/BOLftlGaLuO/zH12zU4Jd6qRUpOQ/vd+eqtXpcOYD+fymeNfW4+qe8751odBjiE\n bqx5apq8P/BRwLiuFXPkg5YvZ4of82UtZd94lcgSd7RzgWl7b9jpq3gY6/Wk2IcR2iKudi\n xeFRCnR5azTwq2FHifDLFvVYmdA1fRY=","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=redhat.com; s=google; t=1777581342; x=1778186142; darn=nongnu.org;\n h=in-reply-to:content-disposition:mime-version:references:message-id\n :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to;\n bh=WsfEaBW91NQY2hmFkVEk2/EcqY3rzpQnH9J9l9NoKpw=;\n b=mSZApo3SaOGLl1Tw5pgHKrHBUYVbxqsqUqQ1ySQ5cK9QlzAFgbGynLsl9EHe+bl+LV\n Skats4XsiCa8dexLPdDxQLNq7Zeb/k4PbTqXi4dSqTgXqRmczbnZ/uDXkw61Km01ELO1\n D/kxGYHDTviPGYkpjnMUS/Is0SPypkQHI25vMIzJMEbmWGCBs3rMpC+uZUd0DLXaMn5u\n 0DH69htBLLpCzU4WFexEqml74bj7ZzgkmW2YqnNswnmfg8XrcyQzrQEL0GTsQZAlL3Tr\n 4d7cSq4iolSbBbEQdVtHS5aGBJVYBoMp06gGbNqldZhH9q80oT0xt/z36/DcKUvWKSB3\n 2ELg=="],"X-MC-Unique":"7BukDfdmNUqS15foqMXRjw-1","X-Mimecast-MFC-AGG-ID":"7BukDfdmNUqS15foqMXRjw_1777581342","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777581342; x=1778186142;\n h=in-reply-to:content-disposition:mime-version:references:message-id\n :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc\n :subject:date:message-id:reply-to;\n bh=WsfEaBW91NQY2hmFkVEk2/EcqY3rzpQnH9J9l9NoKpw=;\n b=WC1NYCB8pSzSgcAq0jVjYUuZMggYtPtzlvfeHgQrG1RrwxpP1CK1wCsKFzoj32I1ZQ\n vse6F1wxvshrfkK3KJUlgUTAjNS2GHSjGCgZdpyMXay16ET9WyJkkSQwVcjBEKsZBv83\n +2qmqILqZH1dzBrtNXVXQZXbXV+UR6h2fDlV+nEkYAfx0/dZPyAwqbExGajwDH983UCn\n qinaw0hVCKSXsJxKOGKwxfAXxLd6LqHpdB8lnBMEXBASxqv/3DBtTEqQ8tudb00UkIWd\n oB8kq2qO/PsV0PsrZhx3C+vkbIqPbbhE4amrAzEqjZuVKWwHnbHwHFSJalgUrgcQZojB\n D8Iw==","X-Gm-Message-State":"AOJu0YyfgR3m/RhJmdgxMK00TnHaOOEWR2ixyztZbUz6s4pims5nlnss\n aEx6du9zr9axgvQILzI+rqNyXmAJukdHUCRTmAzTN1W1k5Gl2eE///khof2eqKCR2tROCVlcKSi\n yWE8jE353YQVmD4U65AeFY5IGs8b5vRLICTXkYZ7VjxmPyYBxW59OswFv","X-Gm-Gg":"AeBDieua1/fj2yJLFe7jYhRtbM1D7pK+E+DWrYXvaMcQS8PhDml1qTq+Kxu2BXyJNv2\n IreafcfdQMZgxlTki8rtKuJnTEJLQPKpDfQb0wqDgAmjQ6oVUY92lh2SdpON/BL/GXIFctbj0R2\n dd5epEBuEhC4okdZZVrnehSUfSxWwNaOXwJmmF7E3f6ozFYCPaEv0Du+K0EF+EG0AiSkitBiDqa\n jl1Pk+EGA8sKkm/e4Tyf+E9bT2KfPoNdWQeY+W3KLmlOzml6vB+WWZ0bhZHzAzP2vn7NgCd6Xh0\n C84j71wpCdQwdNXAoXrK+nkrAqUHSGSY6xq7mV25vnRh4PagELTI+G+FBLKHeuUyPu/bhJyK2FE\n ocQpmqR74T6rCq2Mx50wMAYQcTAfkc0kBMyc6H+BDrwvjcU3V+F5N5IPP7A==","X-Received":["by 2002:a05:622a:c3:b0:50d:83d7:686a with SMTP id\n d75a77b69052e-5102ae16055mr62390811cf.40.1777581342150;\n Thu, 30 Apr 2026 13:35:42 -0700 (PDT)","by 2002:a05:622a:c3:b0:50d:83d7:686a with SMTP id\n d75a77b69052e-5102ae16055mr62390181cf.40.1777581341410;\n Thu, 30 Apr 2026 13:35:41 -0700 (PDT)"],"Date":"Thu, 30 Apr 2026 16:35:38 -0400","From":"Peter Xu <peterx@redhat.com>","To":"Fabiano Rosas <farosas@suse.de>","Cc":"qemu-devel@nongnu.org, marcandre.lureau@redhat.com,\n Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>","Subject":"Re: [PATCH v1 1/5] tests/qtest/dbus-vmstate: Bring the test\n up-to-date","Message-ID":"<afO9GsCVTZdh2x96@x1.local>","References":"<20260429190550.20122-1-farosas@suse.de>\n <20260429190550.20122-2-farosas@suse.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20260429190550.20122-2-farosas@suse.de>","Received-SPF":"pass client-ip=170.10.133.124; envelope-from=peterx@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com","X-Spam_score_int":"-20","X-Spam_score":"-2.1","X-Spam_bar":"--","X-Spam_report":"(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"}}]