From 68223e0ea3ac501b88a6b8cabfd1f574990f7a55 Mon Sep 17 00:00:00 2001 From: George Kiagiadakis Date: Wed, 13 May 2020 15:21:10 +0300 Subject: [PATCH] tests: add unit test for WpCore disconnection --- tests/common/test-server.h | 9 +-- tests/wp/core.c | 116 +++++++++++++++++++++++++++++++++++++ tests/wp/meson.build | 7 +++ 3 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 tests/wp/core.c diff --git a/tests/common/test-server.h b/tests/common/test-server.h index 366db178..03ee4e61 100644 --- a/tests/common/test-server.h +++ b/tests/common/test-server.h @@ -41,10 +41,11 @@ wp_test_server_setup (WpTestServer *self) static inline void wp_test_server_teardown (WpTestServer *self) { - pw_thread_loop_stop (self->thread_loop); - pw_context_destroy (self->context); - pw_thread_loop_destroy (self->thread_loop); - g_free (self->name); + if (self->thread_loop) + pw_thread_loop_stop (self->thread_loop); + g_clear_pointer (&self->context, pw_context_destroy); + g_clear_pointer (&self->thread_loop, pw_thread_loop_destroy); + g_clear_pointer (&self->name, g_free); } typedef void WpTestServerLocker; diff --git a/tests/wp/core.c b/tests/wp/core.c new file mode 100644 index 00000000..3cee03b4 --- /dev/null +++ b/tests/wp/core.c @@ -0,0 +1,116 @@ +/* WirePlumber + * + * Copyright © 2020 Collabora Ltd. + * @author George Kiagiadakis + * + * SPDX-License-Identifier: MIT + */ + +#include "../common/base-test-fixture.h" +#include + +typedef struct { + WpBaseTestFixture base; + WpObjectManager *om; + gboolean disconnected; +} TestFixture; + +static void +test_core_setup (TestFixture *self, gconstpointer user_data) +{ + wp_base_test_fixture_setup (&self->base, WP_BASE_TEST_FLAG_DONT_CONNECT); + /* remove the "disconnected" handler that fails the test */ + g_signal_handlers_disconnect_by_data (self->base.core, &self->base); + self->om = wp_object_manager_new (); + self->disconnected = FALSE; +} + +static void +test_core_teardown (TestFixture *self, gconstpointer user_data) +{ + g_clear_object (&self->om); + wp_base_test_fixture_teardown (&self->base); +} + +static void +expect_disconnected (WpCore * core, TestFixture * f) +{ + f->disconnected = TRUE; + g_main_loop_quit (f->base.loop); +} + +static void +expect_object_added (WpObjectManager *om, WpProxy *proxy, TestFixture *f) +{ + g_assert_true (WP_IS_CLIENT (proxy)); + g_main_loop_quit (f->base.loop); +} + +static void +test_core_server_disconnected (TestFixture *f, gconstpointer data) +{ + g_signal_connect (f->base.core, "disconnected", + G_CALLBACK (expect_disconnected), f); + g_signal_connect (f->om, "object-added", + G_CALLBACK (expect_object_added), f); + + wp_object_manager_add_interest_1 (f->om, WP_TYPE_CLIENT, NULL); + wp_core_install_object_manager (f->base.core, f->om); + + /* connect */ + g_assert_true (wp_core_connect (f->base.core)); + g_assert_true (wp_core_is_connected (f->base.core)); + + /* wait for the object manager to collect the client proxy */ + g_main_loop_run (f->base.loop); + g_assert_cmpuint (wp_object_manager_get_n_objects (f->om), ==, 1); + + /* destroy the server and wait for the disconnected signal */ + wp_test_server_teardown (&f->base.server); + g_main_loop_run (f->base.loop); + g_assert_true (f->disconnected); + + g_assert_false (wp_core_is_connected (f->base.core)); + g_assert_cmpuint (wp_object_manager_get_n_objects (f->om), ==, 0); +} + +static void +test_core_client_disconnected (TestFixture *f, gconstpointer data) +{ + g_signal_connect (f->base.core, "disconnected", + G_CALLBACK (expect_disconnected), f); + g_signal_connect (f->om, "object-added", + G_CALLBACK (expect_object_added), f); + + wp_object_manager_add_interest_1 (f->om, WP_TYPE_CLIENT, NULL); + wp_core_install_object_manager (f->base.core, f->om); + + /* connect */ + g_assert_true (wp_core_connect (f->base.core)); + g_assert_true (wp_core_is_connected (f->base.core)); + + /* wait for the object manager to collect the client proxy */ + g_main_loop_run (f->base.loop); + g_assert_cmpuint (wp_object_manager_get_n_objects (f->om), ==, 1); + + /* disconnect and expect the disconnected signal */ + wp_core_disconnect (f->base.core); + g_assert_true (f->disconnected); + + g_assert_false (wp_core_is_connected (f->base.core)); + g_assert_cmpuint (wp_object_manager_get_n_objects (f->om), ==, 0); +} + +gint +main (gint argc, gchar *argv[]) +{ + g_test_init (&argc, &argv, NULL); + wp_init (WP_INIT_ALL); + + g_test_add ("/wp/core/server-disconnected", TestFixture, NULL, + test_core_setup, test_core_server_disconnected, test_core_teardown); + g_test_add ("/wp/core/client-disconnected", TestFixture, NULL, + test_core_setup, test_core_client_disconnected, test_core_teardown); + + return g_test_run (); +} diff --git a/tests/wp/meson.build b/tests/wp/meson.build index 61323ee3..ff8f524f 100644 --- a/tests/wp/meson.build +++ b/tests/wp/meson.build @@ -9,6 +9,13 @@ common_args = [ '-DG_LOG_USE_STRUCTURED', ] +test( + 'test-core', + executable('test-core', 'core.c', + dependencies: common_deps, c_args: common_args), + env: common_env, +) + test( 'test-endpoint', executable('test-endpoint', 'endpoint.c',