1586ca6baSMarc-André Lureau #include "qemu/osdep.h" 2586ca6baSMarc-André Lureau #include <glib/gstdio.h> 3586ca6baSMarc-André Lureau #include <gio/gio.h> 4*907b5105SMarc-André Lureau #include "libqtest.h" 5586ca6baSMarc-André Lureau #include "dbus-vmstate1.h" 6586ca6baSMarc-André Lureau #include "migration-helpers.h" 7586ca6baSMarc-André Lureau 8586ca6baSMarc-André Lureau static char *workdir; 9586ca6baSMarc-André Lureau 10586ca6baSMarc-André Lureau typedef struct TestServerId { 11586ca6baSMarc-André Lureau const char *name; 12586ca6baSMarc-André Lureau const char *data; 13586ca6baSMarc-André Lureau size_t size; 14586ca6baSMarc-André Lureau } TestServerId; 15586ca6baSMarc-André Lureau 16586ca6baSMarc-André Lureau static const TestServerId idA = { 17586ca6baSMarc-André Lureau "idA", "I'am\0idA!", sizeof("I'am\0idA!") 18586ca6baSMarc-André Lureau }; 19586ca6baSMarc-André Lureau 20586ca6baSMarc-André Lureau static const TestServerId idB = { 21586ca6baSMarc-André Lureau "idB", "I'am\0idB!", sizeof("I'am\0idB!") 22586ca6baSMarc-André Lureau }; 23586ca6baSMarc-André Lureau 24586ca6baSMarc-André Lureau typedef struct TestServer { 25586ca6baSMarc-André Lureau const TestServerId *id; 26586ca6baSMarc-André Lureau bool save_called; 27586ca6baSMarc-André Lureau bool load_called; 28586ca6baSMarc-André Lureau } TestServer; 29586ca6baSMarc-André Lureau 30586ca6baSMarc-André Lureau typedef struct Test { 31586ca6baSMarc-André Lureau const char *id_list; 32586ca6baSMarc-André Lureau bool migrate_fail; 33586ca6baSMarc-André Lureau bool without_dst_b; 34586ca6baSMarc-André Lureau TestServer srcA; 35586ca6baSMarc-André Lureau TestServer dstA; 36586ca6baSMarc-André Lureau TestServer srcB; 37586ca6baSMarc-André Lureau TestServer dstB; 38586ca6baSMarc-André Lureau GMainLoop *loop; 39586ca6baSMarc-André Lureau QTestState *src_qemu; 40586ca6baSMarc-André Lureau } Test; 41586ca6baSMarc-André Lureau 42586ca6baSMarc-André Lureau static gboolean 43586ca6baSMarc-André Lureau vmstate_load(VMState1 *object, GDBusMethodInvocation *invocation, 44586ca6baSMarc-André Lureau const gchar *arg_data, gpointer user_data) 45586ca6baSMarc-André Lureau { 46586ca6baSMarc-André Lureau TestServer *h = user_data; 47586ca6baSMarc-André Lureau g_autoptr(GVariant) var = NULL; 48586ca6baSMarc-André Lureau GVariant *args; 49586ca6baSMarc-André Lureau const uint8_t *data; 50586ca6baSMarc-André Lureau size_t size; 51586ca6baSMarc-André Lureau 52586ca6baSMarc-André Lureau args = g_dbus_method_invocation_get_parameters(invocation); 53586ca6baSMarc-André Lureau var = g_variant_get_child_value(args, 0); 54586ca6baSMarc-André Lureau data = g_variant_get_fixed_array(var, &size, sizeof(char)); 55586ca6baSMarc-André Lureau g_assert_cmpuint(size, ==, h->id->size); 56586ca6baSMarc-André Lureau g_assert(!memcmp(data, h->id->data, h->id->size)); 57586ca6baSMarc-André Lureau h->load_called = true; 58586ca6baSMarc-André Lureau 59586ca6baSMarc-André Lureau g_dbus_method_invocation_return_value(invocation, g_variant_new("()")); 60586ca6baSMarc-André Lureau return TRUE; 61586ca6baSMarc-André Lureau } 62586ca6baSMarc-André Lureau 63586ca6baSMarc-André Lureau static gboolean 64586ca6baSMarc-André Lureau vmstate_save(VMState1 *object, GDBusMethodInvocation *invocation, 65586ca6baSMarc-André Lureau gpointer user_data) 66586ca6baSMarc-André Lureau { 67586ca6baSMarc-André Lureau TestServer *h = user_data; 68586ca6baSMarc-André Lureau GVariant *var; 69586ca6baSMarc-André Lureau 70586ca6baSMarc-André Lureau var = g_variant_new_fixed_array(G_VARIANT_TYPE_BYTE, 71586ca6baSMarc-André Lureau h->id->data, h->id->size, sizeof(char)); 72586ca6baSMarc-André Lureau g_dbus_method_invocation_return_value(invocation, 73586ca6baSMarc-André Lureau g_variant_new("(@ay)", var)); 74586ca6baSMarc-André Lureau h->save_called = true; 75586ca6baSMarc-André Lureau 76586ca6baSMarc-André Lureau return TRUE; 77586ca6baSMarc-André Lureau } 78586ca6baSMarc-André Lureau 79586ca6baSMarc-André Lureau typedef struct WaitNamed { 80586ca6baSMarc-André Lureau GMainLoop *loop; 81586ca6baSMarc-André Lureau bool named; 82586ca6baSMarc-André Lureau } WaitNamed; 83586ca6baSMarc-André Lureau 84586ca6baSMarc-André Lureau static void 85586ca6baSMarc-André Lureau named_cb(GDBusConnection *connection, 86586ca6baSMarc-André Lureau const gchar *name, 87586ca6baSMarc-André Lureau gpointer user_data) 88586ca6baSMarc-André Lureau { 89586ca6baSMarc-André Lureau WaitNamed *t = user_data; 90586ca6baSMarc-André Lureau 91586ca6baSMarc-André Lureau t->named = true; 92586ca6baSMarc-André Lureau g_main_loop_quit(t->loop); 93586ca6baSMarc-André Lureau } 94586ca6baSMarc-André Lureau 95586ca6baSMarc-André Lureau static GDBusConnection * 96586ca6baSMarc-André Lureau get_connection(Test *test, guint *ownid) 97586ca6baSMarc-André Lureau { 98586ca6baSMarc-André Lureau g_autofree gchar *addr = NULL; 99586ca6baSMarc-André Lureau WaitNamed *wait; 100586ca6baSMarc-André Lureau GError *err = NULL; 101586ca6baSMarc-André Lureau GDBusConnection *c; 102586ca6baSMarc-André Lureau 103586ca6baSMarc-André Lureau wait = g_new0(WaitNamed, 1); 104586ca6baSMarc-André Lureau wait->loop = test->loop; 105586ca6baSMarc-André Lureau addr = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SESSION, NULL, &err); 106586ca6baSMarc-André Lureau g_assert_no_error(err); 107586ca6baSMarc-André Lureau 108586ca6baSMarc-André Lureau c = g_dbus_connection_new_for_address_sync( 109586ca6baSMarc-André Lureau addr, 110586ca6baSMarc-André Lureau G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION | 111586ca6baSMarc-André Lureau G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, 112586ca6baSMarc-André Lureau NULL, NULL, &err); 113586ca6baSMarc-André Lureau g_assert_no_error(err); 114586ca6baSMarc-André Lureau *ownid = g_bus_own_name_on_connection(c, "org.qemu.VMState1", 115586ca6baSMarc-André Lureau G_BUS_NAME_OWNER_FLAGS_NONE, 116586ca6baSMarc-André Lureau named_cb, named_cb, wait, g_free); 117586ca6baSMarc-André Lureau if (!wait->named) { 118586ca6baSMarc-André Lureau g_main_loop_run(wait->loop); 119586ca6baSMarc-André Lureau } 120586ca6baSMarc-André Lureau 121586ca6baSMarc-André Lureau return c; 122586ca6baSMarc-André Lureau } 123586ca6baSMarc-André Lureau 124586ca6baSMarc-André Lureau static GDBusObjectManagerServer * 125586ca6baSMarc-André Lureau get_server(GDBusConnection *conn, TestServer *s, const TestServerId *id) 126586ca6baSMarc-André Lureau { 127586ca6baSMarc-André Lureau g_autoptr(GDBusObjectSkeleton) sk = NULL; 128586ca6baSMarc-André Lureau g_autoptr(VMState1Skeleton) v = NULL; 129586ca6baSMarc-André Lureau GDBusObjectManagerServer *os; 130586ca6baSMarc-André Lureau 131586ca6baSMarc-André Lureau s->id = id; 132586ca6baSMarc-André Lureau os = g_dbus_object_manager_server_new("/org/qemu"); 133586ca6baSMarc-André Lureau sk = g_dbus_object_skeleton_new("/org/qemu/VMState1"); 134586ca6baSMarc-André Lureau 135586ca6baSMarc-André Lureau v = VMSTATE1_SKELETON(vmstate1_skeleton_new()); 136586ca6baSMarc-André Lureau g_object_set(v, "id", id->name, NULL); 137586ca6baSMarc-André Lureau 138586ca6baSMarc-André Lureau g_signal_connect(v, "handle-load", G_CALLBACK(vmstate_load), s); 139586ca6baSMarc-André Lureau g_signal_connect(v, "handle-save", G_CALLBACK(vmstate_save), s); 140586ca6baSMarc-André Lureau 141586ca6baSMarc-André Lureau g_dbus_object_skeleton_add_interface(sk, G_DBUS_INTERFACE_SKELETON(v)); 142586ca6baSMarc-André Lureau g_dbus_object_manager_server_export(os, sk); 143586ca6baSMarc-André Lureau g_dbus_object_manager_server_set_connection(os, conn); 144586ca6baSMarc-André Lureau 145586ca6baSMarc-André Lureau return os; 146586ca6baSMarc-André Lureau } 147586ca6baSMarc-André Lureau 148586ca6baSMarc-André Lureau static void 149586ca6baSMarc-André Lureau set_id_list(Test *test, QTestState *s) 150586ca6baSMarc-André Lureau { 151586ca6baSMarc-André Lureau if (!test->id_list) { 152586ca6baSMarc-André Lureau return; 153586ca6baSMarc-André Lureau } 154586ca6baSMarc-André Lureau 155586ca6baSMarc-André Lureau g_assert(!qmp_rsp_is_err(qtest_qmp(s, 156586ca6baSMarc-André Lureau "{ 'execute': 'qom-set', 'arguments': " 157586ca6baSMarc-André Lureau "{ 'path': '/objects/dv', 'property': 'id-list', 'value': %s } }", 158586ca6baSMarc-André Lureau test->id_list))); 159586ca6baSMarc-André Lureau } 160586ca6baSMarc-André Lureau 161586ca6baSMarc-André Lureau static gpointer 162586ca6baSMarc-André Lureau dbus_vmstate_thread(gpointer data) 163586ca6baSMarc-André Lureau { 164586ca6baSMarc-André Lureau GMainLoop *loop = data; 165586ca6baSMarc-André Lureau 166586ca6baSMarc-André Lureau g_main_loop_run(loop); 167586ca6baSMarc-André Lureau 168586ca6baSMarc-André Lureau return NULL; 169586ca6baSMarc-André Lureau } 170586ca6baSMarc-André Lureau 171586ca6baSMarc-André Lureau static void 172586ca6baSMarc-André Lureau test_dbus_vmstate(Test *test) 173586ca6baSMarc-André Lureau { 174586ca6baSMarc-André Lureau g_autofree char *src_qemu_args = NULL; 175586ca6baSMarc-André Lureau g_autofree char *dst_qemu_args = NULL; 176586ca6baSMarc-André Lureau g_autoptr(GTestDBus) srcbus = NULL; 177586ca6baSMarc-André Lureau g_autoptr(GTestDBus) dstbus = NULL; 178586ca6baSMarc-André Lureau g_autoptr(GDBusConnection) srcconnA = NULL; 179586ca6baSMarc-André Lureau g_autoptr(GDBusConnection) srcconnB = NULL; 180586ca6baSMarc-André Lureau g_autoptr(GDBusConnection) dstconnA = NULL; 181586ca6baSMarc-André Lureau g_autoptr(GDBusConnection) dstconnB = NULL; 182586ca6baSMarc-André Lureau g_autoptr(GDBusObjectManagerServer) srcserverA = NULL; 183586ca6baSMarc-André Lureau g_autoptr(GDBusObjectManagerServer) srcserverB = NULL; 184586ca6baSMarc-André Lureau g_autoptr(GDBusObjectManagerServer) dstserverA = NULL; 185586ca6baSMarc-André Lureau g_autoptr(GDBusObjectManagerServer) dstserverB = NULL; 186586ca6baSMarc-André Lureau g_auto(GStrv) srcaddr = NULL; 187586ca6baSMarc-André Lureau g_auto(GStrv) dstaddr = NULL; 188586ca6baSMarc-André Lureau g_autoptr(GThread) thread = NULL; 189586ca6baSMarc-André Lureau g_autoptr(GMainLoop) loop = NULL; 190586ca6baSMarc-André Lureau g_autofree char *uri = NULL; 191586ca6baSMarc-André Lureau QTestState *src_qemu = NULL, *dst_qemu = NULL; 192586ca6baSMarc-André Lureau guint ownsrcA, ownsrcB, owndstA, owndstB; 193586ca6baSMarc-André Lureau 194586ca6baSMarc-André Lureau uri = g_strdup_printf("unix:%s/migsocket", workdir); 195586ca6baSMarc-André Lureau 196586ca6baSMarc-André Lureau loop = g_main_loop_new(NULL, FALSE); 197586ca6baSMarc-André Lureau test->loop = loop; 198586ca6baSMarc-André Lureau 199586ca6baSMarc-André Lureau srcbus = g_test_dbus_new(G_TEST_DBUS_NONE); 200586ca6baSMarc-André Lureau g_test_dbus_up(srcbus); 201586ca6baSMarc-André Lureau srcconnA = get_connection(test, &ownsrcA); 202586ca6baSMarc-André Lureau srcserverA = get_server(srcconnA, &test->srcA, &idA); 203586ca6baSMarc-André Lureau srcconnB = get_connection(test, &ownsrcB); 204586ca6baSMarc-André Lureau srcserverB = get_server(srcconnB, &test->srcB, &idB); 205586ca6baSMarc-André Lureau 206586ca6baSMarc-André Lureau /* remove ,guid=foo part */ 207586ca6baSMarc-André Lureau srcaddr = g_strsplit(g_test_dbus_get_bus_address(srcbus), ",", 2); 208586ca6baSMarc-André Lureau src_qemu_args = 209586ca6baSMarc-André Lureau g_strdup_printf("-object dbus-vmstate,id=dv,addr=%s", srcaddr[0]); 210586ca6baSMarc-André Lureau 211586ca6baSMarc-André Lureau dstbus = g_test_dbus_new(G_TEST_DBUS_NONE); 212586ca6baSMarc-André Lureau g_test_dbus_up(dstbus); 213586ca6baSMarc-André Lureau dstconnA = get_connection(test, &owndstA); 214586ca6baSMarc-André Lureau dstserverA = get_server(dstconnA, &test->dstA, &idA); 215586ca6baSMarc-André Lureau if (!test->without_dst_b) { 216586ca6baSMarc-André Lureau dstconnB = get_connection(test, &owndstB); 217586ca6baSMarc-André Lureau dstserverB = get_server(dstconnB, &test->dstB, &idB); 218586ca6baSMarc-André Lureau } 219586ca6baSMarc-André Lureau 220586ca6baSMarc-André Lureau dstaddr = g_strsplit(g_test_dbus_get_bus_address(dstbus), ",", 2); 221586ca6baSMarc-André Lureau dst_qemu_args = 222586ca6baSMarc-André Lureau g_strdup_printf("-object dbus-vmstate,id=dv,addr=%s -incoming %s", 223586ca6baSMarc-André Lureau dstaddr[0], uri); 224586ca6baSMarc-André Lureau 225586ca6baSMarc-André Lureau src_qemu = qtest_init(src_qemu_args); 226586ca6baSMarc-André Lureau dst_qemu = qtest_init(dst_qemu_args); 227586ca6baSMarc-André Lureau set_id_list(test, src_qemu); 228586ca6baSMarc-André Lureau set_id_list(test, dst_qemu); 229586ca6baSMarc-André Lureau 230586ca6baSMarc-André Lureau thread = g_thread_new("dbus-vmstate-thread", dbus_vmstate_thread, loop); 231586ca6baSMarc-André Lureau 232586ca6baSMarc-André Lureau migrate_qmp(src_qemu, uri, "{}"); 233586ca6baSMarc-André Lureau test->src_qemu = src_qemu; 234586ca6baSMarc-André Lureau if (test->migrate_fail) { 235586ca6baSMarc-André Lureau wait_for_migration_fail(src_qemu, true); 236586ca6baSMarc-André Lureau qtest_set_expected_status(dst_qemu, 1); 237586ca6baSMarc-André Lureau } else { 238586ca6baSMarc-André Lureau wait_for_migration_complete(src_qemu); 239586ca6baSMarc-André Lureau } 240586ca6baSMarc-André Lureau 241586ca6baSMarc-André Lureau qtest_quit(dst_qemu); 242586ca6baSMarc-André Lureau qtest_quit(src_qemu); 243586ca6baSMarc-André Lureau g_bus_unown_name(ownsrcA); 244586ca6baSMarc-André Lureau g_bus_unown_name(ownsrcB); 245586ca6baSMarc-André Lureau g_bus_unown_name(owndstA); 246586ca6baSMarc-André Lureau if (!test->without_dst_b) { 247586ca6baSMarc-André Lureau g_bus_unown_name(owndstB); 248586ca6baSMarc-André Lureau } 249586ca6baSMarc-André Lureau 250586ca6baSMarc-André Lureau g_main_loop_quit(test->loop); 251586ca6baSMarc-André Lureau } 252586ca6baSMarc-André Lureau 253586ca6baSMarc-André Lureau static void 254586ca6baSMarc-André Lureau check_not_migrated(TestServer *s, TestServer *d) 255586ca6baSMarc-André Lureau { 256586ca6baSMarc-André Lureau assert(!s->save_called); 257586ca6baSMarc-André Lureau assert(!s->load_called); 258586ca6baSMarc-André Lureau assert(!d->save_called); 259586ca6baSMarc-André Lureau assert(!d->load_called); 260586ca6baSMarc-André Lureau } 261586ca6baSMarc-André Lureau 262586ca6baSMarc-André Lureau static void 263586ca6baSMarc-André Lureau check_migrated(TestServer *s, TestServer *d) 264586ca6baSMarc-André Lureau { 265586ca6baSMarc-André Lureau assert(s->save_called); 266586ca6baSMarc-André Lureau assert(!s->load_called); 267586ca6baSMarc-André Lureau assert(!d->save_called); 268586ca6baSMarc-André Lureau assert(d->load_called); 269586ca6baSMarc-André Lureau } 270586ca6baSMarc-André Lureau 271586ca6baSMarc-André Lureau static void 272586ca6baSMarc-André Lureau test_dbus_vmstate_without_list(void) 273586ca6baSMarc-André Lureau { 274586ca6baSMarc-André Lureau Test test = { 0, }; 275586ca6baSMarc-André Lureau 276586ca6baSMarc-André Lureau test_dbus_vmstate(&test); 277586ca6baSMarc-André Lureau 278586ca6baSMarc-André Lureau check_migrated(&test.srcA, &test.dstA); 279586ca6baSMarc-André Lureau check_migrated(&test.srcB, &test.dstB); 280586ca6baSMarc-André Lureau } 281586ca6baSMarc-André Lureau 282586ca6baSMarc-André Lureau static void 283586ca6baSMarc-André Lureau test_dbus_vmstate_with_list(void) 284586ca6baSMarc-André Lureau { 285586ca6baSMarc-André Lureau Test test = { .id_list = "idA,idB" }; 286586ca6baSMarc-André Lureau 287586ca6baSMarc-André Lureau test_dbus_vmstate(&test); 288586ca6baSMarc-André Lureau 289586ca6baSMarc-André Lureau check_migrated(&test.srcA, &test.dstA); 290586ca6baSMarc-André Lureau check_migrated(&test.srcB, &test.dstB); 291586ca6baSMarc-André Lureau } 292586ca6baSMarc-André Lureau 293586ca6baSMarc-André Lureau static void 294586ca6baSMarc-André Lureau test_dbus_vmstate_only_a(void) 295586ca6baSMarc-André Lureau { 296586ca6baSMarc-André Lureau Test test = { .id_list = "idA" }; 297586ca6baSMarc-André Lureau 298586ca6baSMarc-André Lureau test_dbus_vmstate(&test); 299586ca6baSMarc-André Lureau 300586ca6baSMarc-André Lureau check_migrated(&test.srcA, &test.dstA); 301586ca6baSMarc-André Lureau check_not_migrated(&test.srcB, &test.dstB); 302586ca6baSMarc-André Lureau } 303586ca6baSMarc-André Lureau 304586ca6baSMarc-André Lureau static void 305586ca6baSMarc-André Lureau test_dbus_vmstate_missing_src(void) 306586ca6baSMarc-André Lureau { 307586ca6baSMarc-André Lureau Test test = { .id_list = "idA,idC", .migrate_fail = true }; 308586ca6baSMarc-André Lureau 309586ca6baSMarc-André Lureau /* run in subprocess to silence QEMU error reporting */ 310586ca6baSMarc-André Lureau if (g_test_subprocess()) { 311586ca6baSMarc-André Lureau test_dbus_vmstate(&test); 312586ca6baSMarc-André Lureau check_not_migrated(&test.srcA, &test.dstA); 313586ca6baSMarc-André Lureau check_not_migrated(&test.srcB, &test.dstB); 314586ca6baSMarc-André Lureau return; 315586ca6baSMarc-André Lureau } 316586ca6baSMarc-André Lureau 317586ca6baSMarc-André Lureau g_test_trap_subprocess(NULL, 0, 0); 318586ca6baSMarc-André Lureau g_test_trap_assert_passed(); 319586ca6baSMarc-André Lureau } 320586ca6baSMarc-André Lureau 321586ca6baSMarc-André Lureau static void 322586ca6baSMarc-André Lureau test_dbus_vmstate_missing_dst(void) 323586ca6baSMarc-André Lureau { 324586ca6baSMarc-André Lureau Test test = { .id_list = "idA,idB", 325586ca6baSMarc-André Lureau .without_dst_b = true, 326586ca6baSMarc-André Lureau .migrate_fail = true }; 327586ca6baSMarc-André Lureau 328586ca6baSMarc-André Lureau /* run in subprocess to silence QEMU error reporting */ 329586ca6baSMarc-André Lureau if (g_test_subprocess()) { 330586ca6baSMarc-André Lureau test_dbus_vmstate(&test); 331586ca6baSMarc-André Lureau assert(test.srcA.save_called); 332586ca6baSMarc-André Lureau assert(test.srcB.save_called); 333586ca6baSMarc-André Lureau assert(!test.dstB.save_called); 334586ca6baSMarc-André Lureau return; 335586ca6baSMarc-André Lureau } 336586ca6baSMarc-André Lureau 337586ca6baSMarc-André Lureau g_test_trap_subprocess(NULL, 0, 0); 338586ca6baSMarc-André Lureau g_test_trap_assert_passed(); 339586ca6baSMarc-André Lureau } 340586ca6baSMarc-André Lureau 341586ca6baSMarc-André Lureau int 342586ca6baSMarc-André Lureau main(int argc, char **argv) 343586ca6baSMarc-André Lureau { 344586ca6baSMarc-André Lureau GError *err = NULL; 345586ca6baSMarc-André Lureau g_autofree char *dbus_daemon = NULL; 346586ca6baSMarc-André Lureau int ret; 347586ca6baSMarc-André Lureau 348586ca6baSMarc-André Lureau dbus_daemon = g_build_filename(G_STRINGIFY(SRCDIR), 349586ca6baSMarc-André Lureau "tests", 350586ca6baSMarc-André Lureau "dbus-vmstate-daemon.sh", 351586ca6baSMarc-André Lureau NULL); 352586ca6baSMarc-André Lureau g_setenv("G_TEST_DBUS_DAEMON", dbus_daemon, true); 353586ca6baSMarc-André Lureau 354586ca6baSMarc-André Lureau g_test_init(&argc, &argv, NULL); 355586ca6baSMarc-André Lureau 356586ca6baSMarc-André Lureau workdir = g_dir_make_tmp("dbus-vmstate-test-XXXXXX", &err); 357586ca6baSMarc-André Lureau if (!workdir) { 358586ca6baSMarc-André Lureau g_error("Unable to create temporary dir: %s\n", err->message); 359586ca6baSMarc-André Lureau exit(1); 360586ca6baSMarc-André Lureau } 361586ca6baSMarc-André Lureau 362586ca6baSMarc-André Lureau g_setenv("DBUS_VMSTATE_TEST_TMPDIR", workdir, true); 363586ca6baSMarc-André Lureau 364586ca6baSMarc-André Lureau qtest_add_func("/dbus-vmstate/without-list", 365586ca6baSMarc-André Lureau test_dbus_vmstate_without_list); 366586ca6baSMarc-André Lureau qtest_add_func("/dbus-vmstate/with-list", 367586ca6baSMarc-André Lureau test_dbus_vmstate_with_list); 368586ca6baSMarc-André Lureau qtest_add_func("/dbus-vmstate/only-a", 369586ca6baSMarc-André Lureau test_dbus_vmstate_only_a); 370586ca6baSMarc-André Lureau qtest_add_func("/dbus-vmstate/missing-src", 371586ca6baSMarc-André Lureau test_dbus_vmstate_missing_src); 372586ca6baSMarc-André Lureau qtest_add_func("/dbus-vmstate/missing-dst", 373586ca6baSMarc-André Lureau test_dbus_vmstate_missing_dst); 374586ca6baSMarc-André Lureau 375586ca6baSMarc-André Lureau ret = g_test_run(); 376586ca6baSMarc-André Lureau 377586ca6baSMarc-André Lureau rmdir(workdir); 378586ca6baSMarc-André Lureau g_free(workdir); 379586ca6baSMarc-André Lureau 380586ca6baSMarc-André Lureau return ret; 381586ca6baSMarc-André Lureau } 382