+ GDBusConnection *connection;
+ ExampleAnimal *animal1, *animal2;
+ GThread *service_thread;
+ GError *error = NULL;
+ GVariant *value;
+ const gchar *s;
+
+ /* bring up a server - we run the server in a different thread to avoid deadlocks */
+ service_thread = g_thread_new ("codegen_test_peer",
+ codegen_service_thread_func,
+ NULL);
+ await_service_loop ();
+ g_assert (codegen_server != NULL);
+
+ /* Get an animal 1 ... */
+ connection = g_dbus_connection_new_for_address_sync (g_dbus_server_get_client_address (codegen_server),
+ G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
+ NULL, /* GDBusAuthObserver */
+ NULL, /* cancellable */
+ &error);
+ g_assert_no_error (error);
+ g_assert (connection != NULL);
+
+ animal1 = example_animal_proxy_new_sync (connection, 0, NULL,
+ "/Example/Animals/000", NULL, &error);
+ g_assert_no_error (error);
+ g_assert (animal1 != NULL);
+ g_object_unref (connection);
+
+ /* Get animal 2 ... */
+ connection = g_dbus_connection_new_for_address_sync (g_dbus_server_get_client_address (codegen_server),
+ G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
+ NULL, /* GDBusAuthObserver */
+ NULL, /* cancellable */
+ &error);
+ g_assert_no_error (error);
+ g_assert (connection != NULL);
+
+ animal2 = example_animal_proxy_new_sync (connection, 0, NULL,
+ "/Example/Animals/000", NULL, &error);
+ g_assert_no_error (error);
+ g_assert (animal2 != NULL);
+ g_object_unref (connection);
+
+ /* Make animal sad via animal1 */
+ example_animal_call_poke_sync (animal1, TRUE, FALSE, NULL, &error);
+ g_assert_no_error (error);
+
+ /* Poke server and make sure animal is updated */
+ value = g_dbus_proxy_call_sync (G_DBUS_PROXY (animal1),
+ "org.freedesktop.DBus.Peer.Ping",
+ NULL, G_DBUS_CALL_FLAGS_NONE, -1,
+ NULL, &error);
+ g_assert_no_error (error);
+ g_assert (value != NULL);
+ g_variant_unref (value);
+
+ /* Give the proxies a chance to refresh in the defaul main loop */
+ g_timeout_add (100, codegen_quit_mainloop_timeout, NULL);
+ g_main_loop_run (loop);
+
+ /* Assert animals are sad */
+ g_assert_cmpstr (example_animal_get_mood (animal1), ==, "Sad");
+ g_assert_cmpstr (example_animal_get_mood (animal2), ==, "Sad");
+
+ /* Make animal happy via animal2 */
+ example_animal_call_poke_sync (animal2, FALSE, TRUE, NULL, &error);
+ g_assert_no_error (error);
+
+ /* Some random unrelated call, just to get some test coverage */
+ value = g_dbus_proxy_call_sync (G_DBUS_PROXY (animal2),
+ "org.freedesktop.DBus.Peer.GetMachineId",
+ NULL, G_DBUS_CALL_FLAGS_NONE, -1,
+ NULL, &error);
+ g_assert_no_error (error);
+ g_variant_get (value, "(&s)", &s);
+ g_assert (g_dbus_is_guid (s));
+ g_variant_unref (value);
+
+ /* Poke server and make sure animal is updated */
+ value = g_dbus_proxy_call_sync (G_DBUS_PROXY (animal2),
+ "org.freedesktop.DBus.Peer.Ping",
+ NULL, G_DBUS_CALL_FLAGS_NONE, -1,
+ NULL, &error);
+ g_assert_no_error (error);
+ g_assert (value != NULL);
+ g_variant_unref (value);
+
+ /* Give the proxies a chance to refresh in the defaul main loop */
+ g_timeout_add (1000, codegen_quit_mainloop_timeout, NULL);
+ g_main_loop_run (loop);
+
+ /* Assert animals are happy */
+ g_assert_cmpstr (example_animal_get_mood (animal1), ==, "Happy");
+ g_assert_cmpstr (example_animal_get_mood (animal2), ==, "Happy");
+
+ /* This final call making the animal happy and sad will cause
+ * the server to quit, when the server quits we dont get property
+ * change notifications anyway because those are done from an idle handler
+ */
+ example_animal_call_poke_sync (animal2, TRUE, TRUE, NULL, &error);
+
+ g_object_unref (animal1);
+ g_object_unref (animal2);
+ g_thread_join (service_thread);