From 9fab9ec7a59e7450f3fca6b53117cd53122e453c Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Mon, 13 Oct 2025 10:43:04 +0200 Subject: [PATCH] plugin-manager: Add API to unload all plugins And add tests for it. Signed-off-by: Evangelos Ribeiro Tzaras Part-of: --- src/calls-plugin-manager.c | 22 +++++++++++++++++++++ src/calls-plugin-manager.h | 1 + tests/test-application.c | 3 +++ tests/test-plugins.c | 39 +++++++++++++++++++++++++++++++++++--- 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/calls-plugin-manager.c b/src/calls-plugin-manager.c index 774473b..5f08d49 100644 --- a/src/calls-plugin-manager.c +++ b/src/calls-plugin-manager.c @@ -439,3 +439,25 @@ calls_plugin_manager_get_plugin_names (CallsPluginManager *self, return (const char **) g_ptr_array_free (array, FALSE); } + +gboolean +calls_plugin_manager_unload_all_plugins (CallsPluginManager *self, GError **error) +{ + GListModel *plugins; + uint n_plugins; + gboolean ok = TRUE; + + g_return_val_if_fail (CALLS_IS_PLUGIN_MANAGER (self), FALSE); + + plugins = G_LIST_MODEL (self->plugins); + n_plugins = g_list_model_get_n_items (plugins); + + for (uint i = 0; i < n_plugins; i++) { + g_autoptr (CallsPlugin) plugin = g_list_model_get_item (plugins, i); + + if (calls_plugin_is_loaded (plugin)) + ok = ok && calls_plugin_unload (plugin, error); + } + + return ok; +} diff --git a/src/calls-plugin-manager.h b/src/calls-plugin-manager.h index 1bab668..65b0f63 100644 --- a/src/calls-plugin-manager.h +++ b/src/calls-plugin-manager.h @@ -40,6 +40,7 @@ gboolean calls_plugin_manager_load_plugin (CallsPluginManager *self, gboolean calls_plugin_manager_unload_plugin (CallsPluginManager *self, const char *name, GError **error); +gboolean calls_plugin_manager_unload_all_plugins (CallsPluginManager *self, GError **error); const char **calls_plugin_manager_get_plugin_names (CallsPluginManager *self, guint *length); gboolean calls_plugin_manager_has_plugin (CallsPluginManager *self, diff --git a/tests/test-application.c b/tests/test-application.c index dae9dc4..f638247 100644 --- a/tests/test-application.c +++ b/tests/test-application.c @@ -66,6 +66,9 @@ on_idle_quit (gpointer user_data) g_application_quit (app); g_assert_true (calls_plugin_manager_has_any_plugins (plugins)); + g_assert_true (calls_plugin_manager_unload_all_plugins (plugins, &error)); + g_assert_no_error (error); + g_assert_false (calls_plugin_manager_has_any_plugins (plugins)); return G_SOURCE_REMOVE; } diff --git a/tests/test-plugins.c b/tests/test-plugins.c index 169e80c..6c3c5cb 100644 --- a/tests/test-plugins.c +++ b/tests/test-plugins.c @@ -112,13 +112,46 @@ test_calls_plugin_loading (void) } -gint -main (gint argc, - gchar *argv[]) +static void +test_calls_plugin_unload_all (void) +{ + CallsPluginManager *manager = calls_plugin_manager_get_default (); + g_autoptr (GError) error = NULL; + + g_assert_false (calls_plugin_manager_has_any_plugins (manager)); + + g_assert_true (calls_plugin_manager_load_plugin (manager, "dummy", &error)); + g_assert_no_error (error); + g_assert_true (calls_plugin_manager_has_plugin (manager, "dummy")); + + g_assert_true (calls_plugin_manager_load_plugin (manager, "mm", &error)); + g_assert_no_error (error); + g_assert_true (calls_plugin_manager_has_plugin (manager, "mm")); + + g_assert_true (calls_plugin_manager_load_plugin (manager, "sip", &error)); + g_assert_no_error (error); + g_assert_true (calls_plugin_manager_has_plugin (manager, "sip")); + + g_assert_true (calls_plugin_manager_has_any_plugins (manager)); + g_assert_true (calls_plugin_manager_unload_all_plugins (manager, &error)); + g_assert_no_error (error); + g_assert_false (calls_plugin_manager_has_plugin (manager, "dummy")); + g_assert_false (calls_plugin_manager_has_plugin (manager, "mm")); + g_assert_false (calls_plugin_manager_has_plugin (manager, "sip")); + g_assert_false (calls_plugin_manager_has_any_plugins (manager)); + + g_assert_finalize_object (manager); +} + + +int +main (int argc, + char *argv[]) { g_test_init (&argc, &argv, NULL); g_test_add_func ("/Calls/Plugins/load_plugins", test_calls_plugin_loading); + g_test_add_func ("/Calls/Plugins/unload_all", test_calls_plugin_unload_all); return g_test_run (); }