1*586ca6baSMarc-André Lureau #include "qemu/osdep.h" 2*586ca6baSMarc-André Lureau #include <glib/gstdio.h> 3*586ca6baSMarc-André Lureau #include <gio/gio.h> 4*586ca6baSMarc-André Lureau #include "libqtest.h" 5*586ca6baSMarc-André Lureau #include "qemu-common.h" 6*586ca6baSMarc-André Lureau #include "dbus-vmstate1.h" 7*586ca6baSMarc-André Lureau #include "migration-helpers.h" 8*586ca6baSMarc-André Lureau 9*586ca6baSMarc-André Lureau static char *workdir; 10*586ca6baSMarc-André Lureau 11*586ca6baSMarc-André Lureau typedef struct TestServerId { 12*586ca6baSMarc-André Lureau const char *name; 13*586ca6baSMarc-André Lureau const char *data; 14*586ca6baSMarc-André Lureau size_t size; 15*586ca6baSMarc-André Lureau } TestServerId; 16*586ca6baSMarc-André Lureau 17*586ca6baSMarc-André Lureau static const TestServerId idA = { 18*586ca6baSMarc-André Lureau "idA", "I'am\0idA!", sizeof("I'am\0idA!") 19*586ca6baSMarc-André Lureau }; 20*586ca6baSMarc-André Lureau 21*586ca6baSMarc-André Lureau static const TestServerId idB = { 22*586ca6baSMarc-André Lureau "idB", "I'am\0idB!", sizeof("I'am\0idB!") 23*586ca6baSMarc-André Lureau }; 24*586ca6baSMarc-André Lureau 25*586ca6baSMarc-André Lureau typedef struct TestServer { 26*586ca6baSMarc-André Lureau const TestServerId *id; 27*586ca6baSMarc-André Lureau bool save_called; 28*586ca6baSMarc-André Lureau bool load_called; 29*586ca6baSMarc-André Lureau } TestServer; 30*586ca6baSMarc-André Lureau 31*586ca6baSMarc-André Lureau typedef struct Test { 32*586ca6baSMarc-André Lureau const char *id_list; 33*586ca6baSMarc-André Lureau bool migrate_fail; 34*586ca6baSMarc-André Lureau bool without_dst_b; 35*586ca6baSMarc-André Lureau TestServer srcA; 36*586ca6baSMarc-André Lureau TestServer dstA; 37*586ca6baSMarc-André Lureau TestServer srcB; 38*586ca6baSMarc-André Lureau TestServer dstB; 39*586ca6baSMarc-André Lureau GMainLoop *loop; 40*586ca6baSMarc-André Lureau QTestState *src_qemu; 41*586ca6baSMarc-André Lureau } Test; 42*586ca6baSMarc-André Lureau 43*586ca6baSMarc-André Lureau static gboolean 44*586ca6baSMarc-André Lureau vmstate_load(VMState1 *object, GDBusMethodInvocation *invocation, 45*586ca6baSMarc-André Lureau const gchar *arg_data, gpointer user_data) 46*586ca6baSMarc-André Lureau { 47*586ca6baSMarc-André Lureau TestServer *h = user_data; 48*586ca6baSMarc-André Lureau g_autoptr(GVariant) var = NULL; 49*586ca6baSMarc-André Lureau GVariant *args; 50*586ca6baSMarc-André Lureau const uint8_t *data; 51*586ca6baSMarc-André Lureau size_t size; 52*586ca6baSMarc-André Lureau 53*586ca6baSMarc-André Lureau args = g_dbus_method_invocation_get_parameters(invocation); 54*586ca6baSMarc-André Lureau var = g_variant_get_child_value(args, 0); 55*586ca6baSMarc-André Lureau data = g_variant_get_fixed_array(var, &size, sizeof(char)); 56*586ca6baSMarc-André Lureau g_assert_cmpuint(size, ==, h->id->size); 57*586ca6baSMarc-André Lureau g_assert(!memcmp(data, h->id->data, h->id->size)); 58*586ca6baSMarc-André Lureau h->load_called = true; 59*586ca6baSMarc-André Lureau 60*586ca6baSMarc-André Lureau g_dbus_method_invocation_return_value(invocation, g_variant_new("()")); 61*586ca6baSMarc-André Lureau return TRUE; 62*586ca6baSMarc-André Lureau } 63*586ca6baSMarc-André Lureau 64*586ca6baSMarc-André Lureau static gboolean 65*586ca6baSMarc-André Lureau vmstate_save(VMState1 *object, GDBusMethodInvocation *invocation, 66*586ca6baSMarc-André Lureau gpointer user_data) 67*586ca6baSMarc-André Lureau { 68*586ca6baSMarc-André Lureau TestServer *h = user_data; 69*586ca6baSMarc-André Lureau GVariant *var; 70*586ca6baSMarc-André Lureau 71*586ca6baSMarc-André Lureau var = g_variant_new_fixed_array(G_VARIANT_TYPE_BYTE, 72*586ca6baSMarc-André Lureau h->id->data, h->id->size, sizeof(char)); 73*586ca6baSMarc-André Lureau g_dbus_method_invocation_return_value(invocation, 74*586ca6baSMarc-André Lureau g_variant_new("(@ay)", var)); 75*586ca6baSMarc-André Lureau h->save_called = true; 76*586ca6baSMarc-André Lureau 77*586ca6baSMarc-André Lureau return TRUE; 78*586ca6baSMarc-André Lureau } 79*586ca6baSMarc-André Lureau 80*586ca6baSMarc-André Lureau typedef struct WaitNamed { 81*586ca6baSMarc-André Lureau GMainLoop *loop; 82*586ca6baSMarc-André Lureau bool named; 83*586ca6baSMarc-André Lureau } WaitNamed; 84*586ca6baSMarc-André Lureau 85*586ca6baSMarc-André Lureau static void 86*586ca6baSMarc-André Lureau named_cb(GDBusConnection *connection, 87*586ca6baSMarc-André Lureau const gchar *name, 88*586ca6baSMarc-André Lureau gpointer user_data) 89*586ca6baSMarc-André Lureau { 90*586ca6baSMarc-André Lureau WaitNamed *t = user_data; 91*586ca6baSMarc-André Lureau 92*586ca6baSMarc-André Lureau t->named = true; 93*586ca6baSMarc-André Lureau g_main_loop_quit(t->loop); 94*586ca6baSMarc-André Lureau } 95*586ca6baSMarc-André Lureau 96*586ca6baSMarc-André Lureau static GDBusConnection * 97*586ca6baSMarc-André Lureau get_connection(Test *test, guint *ownid) 98*586ca6baSMarc-André Lureau { 99*586ca6baSMarc-André Lureau g_autofree gchar *addr = NULL; 100*586ca6baSMarc-André Lureau WaitNamed *wait; 101*586ca6baSMarc-André Lureau GError *err = NULL; 102*586ca6baSMarc-André Lureau GDBusConnection *c; 103*586ca6baSMarc-André Lureau 104*586ca6baSMarc-André Lureau wait = g_new0(WaitNamed, 1); 105*586ca6baSMarc-André Lureau wait->loop = test->loop; 106*586ca6baSMarc-André Lureau addr = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SESSION, NULL, &err); 107*586ca6baSMarc-André Lureau g_assert_no_error(err); 108*586ca6baSMarc-André Lureau 109*586ca6baSMarc-André Lureau c = g_dbus_connection_new_for_address_sync( 110*586ca6baSMarc-André Lureau addr, 111*586ca6baSMarc-André Lureau G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION | 112*586ca6baSMarc-André Lureau G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, 113*586ca6baSMarc-André Lureau NULL, NULL, &err); 114*586ca6baSMarc-André Lureau g_assert_no_error(err); 115*586ca6baSMarc-André Lureau *ownid = g_bus_own_name_on_connection(c, "org.qemu.VMState1", 116*586ca6baSMarc-André Lureau G_BUS_NAME_OWNER_FLAGS_NONE, 117*586ca6baSMarc-André Lureau named_cb, named_cb, wait, g_free); 118*586ca6baSMarc-André Lureau if (!wait->named) { 119*586ca6baSMarc-André Lureau g_main_loop_run(wait->loop); 120*586ca6baSMarc-André Lureau } 121*586ca6baSMarc-André Lureau 122*586ca6baSMarc-André Lureau return c; 123*586ca6baSMarc-André Lureau } 124*586ca6baSMarc-André Lureau 125*586ca6baSMarc-André Lureau static GDBusObjectManagerServer * 126*586ca6baSMarc-André Lureau get_server(GDBusConnection *conn, TestServer *s, const TestServerId *id) 127*586ca6baSMarc-André Lureau { 128*586ca6baSMarc-André Lureau g_autoptr(GDBusObjectSkeleton) sk = NULL; 129*586ca6baSMarc-André Lureau g_autoptr(VMState1Skeleton) v = NULL; 130*586ca6baSMarc-André Lureau GDBusObjectManagerServer *os; 131*586ca6baSMarc-André Lureau 132*586ca6baSMarc-André Lureau s->id = id; 133*586ca6baSMarc-André Lureau os = g_dbus_object_manager_server_new("/org/qemu"); 134*586ca6baSMarc-André Lureau sk = g_dbus_object_skeleton_new("/org/qemu/VMState1"); 135*586ca6baSMarc-André Lureau 136*586ca6baSMarc-André Lureau v = VMSTATE1_SKELETON(vmstate1_skeleton_new()); 137*586ca6baSMarc-André Lureau g_object_set(v, "id", id->name, NULL); 138*586ca6baSMarc-André Lureau 139*586ca6baSMarc-André Lureau g_signal_connect(v, "handle-load", G_CALLBACK(vmstate_load), s); 140*586ca6baSMarc-André Lureau g_signal_connect(v, "handle-save", G_CALLBACK(vmstate_save), s); 141*586ca6baSMarc-André Lureau 142*586ca6baSMarc-André Lureau g_dbus_object_skeleton_add_interface(sk, G_DBUS_INTERFACE_SKELETON(v)); 143*586ca6baSMarc-André Lureau g_dbus_object_manager_server_export(os, sk); 144*586ca6baSMarc-André Lureau g_dbus_object_manager_server_set_connection(os, conn); 145*586ca6baSMarc-André Lureau 146*586ca6baSMarc-André Lureau return os; 147*586ca6baSMarc-André Lureau } 148*586ca6baSMarc-André Lureau 149*586ca6baSMarc-André Lureau static void 150*586ca6baSMarc-André Lureau set_id_list(Test *test, QTestState *s) 151*586ca6baSMarc-André Lureau { 152*586ca6baSMarc-André Lureau if (!test->id_list) { 153*586ca6baSMarc-André Lureau return; 154*586ca6baSMarc-André Lureau } 155*586ca6baSMarc-André Lureau 156*586ca6baSMarc-André Lureau g_assert(!qmp_rsp_is_err(qtest_qmp(s, 157*586ca6baSMarc-André Lureau "{ 'execute': 'qom-set', 'arguments': " 158*586ca6baSMarc-André Lureau "{ 'path': '/objects/dv', 'property': 'id-list', 'value': %s } }", 159*586ca6baSMarc-André Lureau test->id_list))); 160*586ca6baSMarc-André Lureau } 161*586ca6baSMarc-André Lureau 162*586ca6baSMarc-André Lureau static gpointer 163*586ca6baSMarc-André Lureau dbus_vmstate_thread(gpointer data) 164*586ca6baSMarc-André Lureau { 165*586ca6baSMarc-André Lureau GMainLoop *loop = data; 166*586ca6baSMarc-André Lureau 167*586ca6baSMarc-André Lureau g_main_loop_run(loop); 168*586ca6baSMarc-André Lureau 169*586ca6baSMarc-André Lureau return NULL; 170*586ca6baSMarc-André Lureau } 171*586ca6baSMarc-André Lureau 172*586ca6baSMarc-André Lureau static void 173*586ca6baSMarc-André Lureau test_dbus_vmstate(Test *test) 174*586ca6baSMarc-André Lureau { 175*586ca6baSMarc-André Lureau g_autofree char *src_qemu_args = NULL; 176*586ca6baSMarc-André Lureau g_autofree char *dst_qemu_args = NULL; 177*586ca6baSMarc-André Lureau g_autoptr(GTestDBus) srcbus = NULL; 178*586ca6baSMarc-André Lureau g_autoptr(GTestDBus) dstbus = NULL; 179*586ca6baSMarc-André Lureau g_autoptr(GDBusConnection) srcconnA = NULL; 180*586ca6baSMarc-André Lureau g_autoptr(GDBusConnection) srcconnB = NULL; 181*586ca6baSMarc-André Lureau g_autoptr(GDBusConnection) dstconnA = NULL; 182*586ca6baSMarc-André Lureau g_autoptr(GDBusConnection) dstconnB = NULL; 183*586ca6baSMarc-André Lureau g_autoptr(GDBusObjectManagerServer) srcserverA = NULL; 184*586ca6baSMarc-André Lureau g_autoptr(GDBusObjectManagerServer) srcserverB = NULL; 185*586ca6baSMarc-André Lureau g_autoptr(GDBusObjectManagerServer) dstserverA = NULL; 186*586ca6baSMarc-André Lureau g_autoptr(GDBusObjectManagerServer) dstserverB = NULL; 187*586ca6baSMarc-André Lureau g_auto(GStrv) srcaddr = NULL; 188*586ca6baSMarc-André Lureau g_auto(GStrv) dstaddr = NULL; 189*586ca6baSMarc-André Lureau g_autoptr(GThread) thread = NULL; 190*586ca6baSMarc-André Lureau g_autoptr(GMainLoop) loop = NULL; 191*586ca6baSMarc-André Lureau g_autofree char *uri = NULL; 192*586ca6baSMarc-André Lureau QTestState *src_qemu = NULL, *dst_qemu = NULL; 193*586ca6baSMarc-André Lureau guint ownsrcA, ownsrcB, owndstA, owndstB; 194*586ca6baSMarc-André Lureau 195*586ca6baSMarc-André Lureau uri = g_strdup_printf("unix:%s/migsocket", workdir); 196*586ca6baSMarc-André Lureau 197*586ca6baSMarc-André Lureau loop = g_main_loop_new(NULL, FALSE); 198*586ca6baSMarc-André Lureau test->loop = loop; 199*586ca6baSMarc-André Lureau 200*586ca6baSMarc-André Lureau srcbus = g_test_dbus_new(G_TEST_DBUS_NONE); 201*586ca6baSMarc-André Lureau g_test_dbus_up(srcbus); 202*586ca6baSMarc-André Lureau srcconnA = get_connection(test, &ownsrcA); 203*586ca6baSMarc-André Lureau srcserverA = get_server(srcconnA, &test->srcA, &idA); 204*586ca6baSMarc-André Lureau srcconnB = get_connection(test, &ownsrcB); 205*586ca6baSMarc-André Lureau srcserverB = get_server(srcconnB, &test->srcB, &idB); 206*586ca6baSMarc-André Lureau 207*586ca6baSMarc-André Lureau /* remove ,guid=foo part */ 208*586ca6baSMarc-André Lureau srcaddr = g_strsplit(g_test_dbus_get_bus_address(srcbus), ",", 2); 209*586ca6baSMarc-André Lureau src_qemu_args = 210*586ca6baSMarc-André Lureau g_strdup_printf("-object dbus-vmstate,id=dv,addr=%s", srcaddr[0]); 211*586ca6baSMarc-André Lureau 212*586ca6baSMarc-André Lureau dstbus = g_test_dbus_new(G_TEST_DBUS_NONE); 213*586ca6baSMarc-André Lureau g_test_dbus_up(dstbus); 214*586ca6baSMarc-André Lureau dstconnA = get_connection(test, &owndstA); 215*586ca6baSMarc-André Lureau dstserverA = get_server(dstconnA, &test->dstA, &idA); 216*586ca6baSMarc-André Lureau if (!test->without_dst_b) { 217*586ca6baSMarc-André Lureau dstconnB = get_connection(test, &owndstB); 218*586ca6baSMarc-André Lureau dstserverB = get_server(dstconnB, &test->dstB, &idB); 219*586ca6baSMarc-André Lureau } 220*586ca6baSMarc-André Lureau 221*586ca6baSMarc-André Lureau dstaddr = g_strsplit(g_test_dbus_get_bus_address(dstbus), ",", 2); 222*586ca6baSMarc-André Lureau dst_qemu_args = 223*586ca6baSMarc-André Lureau g_strdup_printf("-object dbus-vmstate,id=dv,addr=%s -incoming %s", 224*586ca6baSMarc-André Lureau dstaddr[0], uri); 225*586ca6baSMarc-André Lureau 226*586ca6baSMarc-André Lureau src_qemu = qtest_init(src_qemu_args); 227*586ca6baSMarc-André Lureau dst_qemu = qtest_init(dst_qemu_args); 228*586ca6baSMarc-André Lureau set_id_list(test, src_qemu); 229*586ca6baSMarc-André Lureau set_id_list(test, dst_qemu); 230*586ca6baSMarc-André Lureau 231*586ca6baSMarc-André Lureau thread = g_thread_new("dbus-vmstate-thread", dbus_vmstate_thread, loop); 232*586ca6baSMarc-André Lureau 233*586ca6baSMarc-André Lureau migrate_qmp(src_qemu, uri, "{}"); 234*586ca6baSMarc-André Lureau test->src_qemu = src_qemu; 235*586ca6baSMarc-André Lureau if (test->migrate_fail) { 236*586ca6baSMarc-André Lureau wait_for_migration_fail(src_qemu, true); 237*586ca6baSMarc-André Lureau qtest_set_expected_status(dst_qemu, 1); 238*586ca6baSMarc-André Lureau } else { 239*586ca6baSMarc-André Lureau wait_for_migration_complete(src_qemu); 240*586ca6baSMarc-André Lureau } 241*586ca6baSMarc-André Lureau 242*586ca6baSMarc-André Lureau qtest_quit(dst_qemu); 243*586ca6baSMarc-André Lureau qtest_quit(src_qemu); 244*586ca6baSMarc-André Lureau g_bus_unown_name(ownsrcA); 245*586ca6baSMarc-André Lureau g_bus_unown_name(ownsrcB); 246*586ca6baSMarc-André Lureau g_bus_unown_name(owndstA); 247*586ca6baSMarc-André Lureau if (!test->without_dst_b) { 248*586ca6baSMarc-André Lureau g_bus_unown_name(owndstB); 249*586ca6baSMarc-André Lureau } 250*586ca6baSMarc-André Lureau 251*586ca6baSMarc-André Lureau g_main_loop_quit(test->loop); 252*586ca6baSMarc-André Lureau } 253*586ca6baSMarc-André Lureau 254*586ca6baSMarc-André Lureau static void 255*586ca6baSMarc-André Lureau check_not_migrated(TestServer *s, TestServer *d) 256*586ca6baSMarc-André Lureau { 257*586ca6baSMarc-André Lureau assert(!s->save_called); 258*586ca6baSMarc-André Lureau assert(!s->load_called); 259*586ca6baSMarc-André Lureau assert(!d->save_called); 260*586ca6baSMarc-André Lureau assert(!d->load_called); 261*586ca6baSMarc-André Lureau } 262*586ca6baSMarc-André Lureau 263*586ca6baSMarc-André Lureau static void 264*586ca6baSMarc-André Lureau check_migrated(TestServer *s, TestServer *d) 265*586ca6baSMarc-André Lureau { 266*586ca6baSMarc-André Lureau assert(s->save_called); 267*586ca6baSMarc-André Lureau assert(!s->load_called); 268*586ca6baSMarc-André Lureau assert(!d->save_called); 269*586ca6baSMarc-André Lureau assert(d->load_called); 270*586ca6baSMarc-André Lureau } 271*586ca6baSMarc-André Lureau 272*586ca6baSMarc-André Lureau static void 273*586ca6baSMarc-André Lureau test_dbus_vmstate_without_list(void) 274*586ca6baSMarc-André Lureau { 275*586ca6baSMarc-André Lureau Test test = { 0, }; 276*586ca6baSMarc-André Lureau 277*586ca6baSMarc-André Lureau test_dbus_vmstate(&test); 278*586ca6baSMarc-André Lureau 279*586ca6baSMarc-André Lureau check_migrated(&test.srcA, &test.dstA); 280*586ca6baSMarc-André Lureau check_migrated(&test.srcB, &test.dstB); 281*586ca6baSMarc-André Lureau } 282*586ca6baSMarc-André Lureau 283*586ca6baSMarc-André Lureau static void 284*586ca6baSMarc-André Lureau test_dbus_vmstate_with_list(void) 285*586ca6baSMarc-André Lureau { 286*586ca6baSMarc-André Lureau Test test = { .id_list = "idA,idB" }; 287*586ca6baSMarc-André Lureau 288*586ca6baSMarc-André Lureau test_dbus_vmstate(&test); 289*586ca6baSMarc-André Lureau 290*586ca6baSMarc-André Lureau check_migrated(&test.srcA, &test.dstA); 291*586ca6baSMarc-André Lureau check_migrated(&test.srcB, &test.dstB); 292*586ca6baSMarc-André Lureau } 293*586ca6baSMarc-André Lureau 294*586ca6baSMarc-André Lureau static void 295*586ca6baSMarc-André Lureau test_dbus_vmstate_only_a(void) 296*586ca6baSMarc-André Lureau { 297*586ca6baSMarc-André Lureau Test test = { .id_list = "idA" }; 298*586ca6baSMarc-André Lureau 299*586ca6baSMarc-André Lureau test_dbus_vmstate(&test); 300*586ca6baSMarc-André Lureau 301*586ca6baSMarc-André Lureau check_migrated(&test.srcA, &test.dstA); 302*586ca6baSMarc-André Lureau check_not_migrated(&test.srcB, &test.dstB); 303*586ca6baSMarc-André Lureau } 304*586ca6baSMarc-André Lureau 305*586ca6baSMarc-André Lureau static void 306*586ca6baSMarc-André Lureau test_dbus_vmstate_missing_src(void) 307*586ca6baSMarc-André Lureau { 308*586ca6baSMarc-André Lureau Test test = { .id_list = "idA,idC", .migrate_fail = true }; 309*586ca6baSMarc-André Lureau 310*586ca6baSMarc-André Lureau /* run in subprocess to silence QEMU error reporting */ 311*586ca6baSMarc-André Lureau if (g_test_subprocess()) { 312*586ca6baSMarc-André Lureau test_dbus_vmstate(&test); 313*586ca6baSMarc-André Lureau check_not_migrated(&test.srcA, &test.dstA); 314*586ca6baSMarc-André Lureau check_not_migrated(&test.srcB, &test.dstB); 315*586ca6baSMarc-André Lureau return; 316*586ca6baSMarc-André Lureau } 317*586ca6baSMarc-André Lureau 318*586ca6baSMarc-André Lureau g_test_trap_subprocess(NULL, 0, 0); 319*586ca6baSMarc-André Lureau g_test_trap_assert_passed(); 320*586ca6baSMarc-André Lureau } 321*586ca6baSMarc-André Lureau 322*586ca6baSMarc-André Lureau static void 323*586ca6baSMarc-André Lureau test_dbus_vmstate_missing_dst(void) 324*586ca6baSMarc-André Lureau { 325*586ca6baSMarc-André Lureau Test test = { .id_list = "idA,idB", 326*586ca6baSMarc-André Lureau .without_dst_b = true, 327*586ca6baSMarc-André Lureau .migrate_fail = true }; 328*586ca6baSMarc-André Lureau 329*586ca6baSMarc-André Lureau /* run in subprocess to silence QEMU error reporting */ 330*586ca6baSMarc-André Lureau if (g_test_subprocess()) { 331*586ca6baSMarc-André Lureau test_dbus_vmstate(&test); 332*586ca6baSMarc-André Lureau assert(test.srcA.save_called); 333*586ca6baSMarc-André Lureau assert(test.srcB.save_called); 334*586ca6baSMarc-André Lureau assert(!test.dstB.save_called); 335*586ca6baSMarc-André Lureau return; 336*586ca6baSMarc-André Lureau } 337*586ca6baSMarc-André Lureau 338*586ca6baSMarc-André Lureau g_test_trap_subprocess(NULL, 0, 0); 339*586ca6baSMarc-André Lureau g_test_trap_assert_passed(); 340*586ca6baSMarc-André Lureau } 341*586ca6baSMarc-André Lureau 342*586ca6baSMarc-André Lureau int 343*586ca6baSMarc-André Lureau main(int argc, char **argv) 344*586ca6baSMarc-André Lureau { 345*586ca6baSMarc-André Lureau GError *err = NULL; 346*586ca6baSMarc-André Lureau g_autofree char *dbus_daemon = NULL; 347*586ca6baSMarc-André Lureau int ret; 348*586ca6baSMarc-André Lureau 349*586ca6baSMarc-André Lureau dbus_daemon = g_build_filename(G_STRINGIFY(SRCDIR), 350*586ca6baSMarc-André Lureau "tests", 351*586ca6baSMarc-André Lureau "dbus-vmstate-daemon.sh", 352*586ca6baSMarc-André Lureau NULL); 353*586ca6baSMarc-André Lureau g_setenv("G_TEST_DBUS_DAEMON", dbus_daemon, true); 354*586ca6baSMarc-André Lureau 355*586ca6baSMarc-André Lureau g_test_init(&argc, &argv, NULL); 356*586ca6baSMarc-André Lureau 357*586ca6baSMarc-André Lureau workdir = g_dir_make_tmp("dbus-vmstate-test-XXXXXX", &err); 358*586ca6baSMarc-André Lureau if (!workdir) { 359*586ca6baSMarc-André Lureau g_error("Unable to create temporary dir: %s\n", err->message); 360*586ca6baSMarc-André Lureau exit(1); 361*586ca6baSMarc-André Lureau } 362*586ca6baSMarc-André Lureau 363*586ca6baSMarc-André Lureau g_setenv("DBUS_VMSTATE_TEST_TMPDIR", workdir, true); 364*586ca6baSMarc-André Lureau 365*586ca6baSMarc-André Lureau qtest_add_func("/dbus-vmstate/without-list", 366*586ca6baSMarc-André Lureau test_dbus_vmstate_without_list); 367*586ca6baSMarc-André Lureau qtest_add_func("/dbus-vmstate/with-list", 368*586ca6baSMarc-André Lureau test_dbus_vmstate_with_list); 369*586ca6baSMarc-André Lureau qtest_add_func("/dbus-vmstate/only-a", 370*586ca6baSMarc-André Lureau test_dbus_vmstate_only_a); 371*586ca6baSMarc-André Lureau qtest_add_func("/dbus-vmstate/missing-src", 372*586ca6baSMarc-André Lureau test_dbus_vmstate_missing_src); 373*586ca6baSMarc-André Lureau qtest_add_func("/dbus-vmstate/missing-dst", 374*586ca6baSMarc-André Lureau test_dbus_vmstate_missing_dst); 375*586ca6baSMarc-André Lureau 376*586ca6baSMarc-André Lureau ret = g_test_run(); 377*586ca6baSMarc-André Lureau 378*586ca6baSMarc-André Lureau rmdir(workdir); 379*586ca6baSMarc-André Lureau g_free(workdir); 380*586ca6baSMarc-André Lureau 381*586ca6baSMarc-André Lureau return ret; 382*586ca6baSMarc-André Lureau } 383