libpurple/tests/test_file_transfer_manager.c

changeset 42560
dcdf8a9a686b
child 42866
4b201e18638f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_file_transfer_manager.c	Sun Dec 31 23:24:05 2023 -0600
@@ -0,0 +1,177 @@
+/*
+ * Purple - Internet Messaging Library
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <glib.h>
+
+#include <purple.h>
+
+#include "test_ui.h"
+
+/******************************************************************************
+ * Add/Remove Test
+ *****************************************************************************/
+static void
+test_purple_file_transfer_manager_add_remove_cb(PurpleFileTransferManager *manager,
+                                                PurpleFileTransfer *transfer,
+                                                gpointer data)
+{
+	guint *counter = data;
+
+	g_assert_true(PURPLE_IS_FILE_TRANSFER_MANAGER(manager));
+	g_assert_true(PURPLE_IS_FILE_TRANSFER(transfer));
+
+	*counter = *counter + 1;
+}
+
+static void
+test_purple_file_transfer_manager_add_remove(void) {
+	PurpleAccount *account = NULL;
+	PurpleContactInfo *remote = NULL;
+	PurpleFileTransfer *transfer = NULL;
+	PurpleFileTransferManager *manager = NULL;
+	guint added = 0;
+	guint removed = 0;
+
+	account = purple_account_new("test", "test");
+	remote = purple_contact_info_new(NULL);
+
+	manager = g_object_new(PURPLE_TYPE_FILE_TRANSFER_MANAGER, NULL);
+	g_signal_connect(manager, "added",
+	                 G_CALLBACK(test_purple_file_transfer_manager_add_remove_cb),
+	                 &added);
+	g_signal_connect(manager, "removed",
+	                 G_CALLBACK(test_purple_file_transfer_manager_add_remove_cb),
+	                 &removed);
+
+	g_assert_cmpuint(g_list_model_get_n_items(G_LIST_MODEL(manager)), ==, 0);
+
+	/* Add the transfer, verify that it was added, and that the signal was
+	 * emitted.
+	 */
+	transfer = purple_file_transfer_new_receive(account, remote, "foo.bar", 0);
+	purple_file_transfer_manager_add(manager, transfer);
+	g_assert_cmpuint(g_list_model_get_n_items(G_LIST_MODEL(manager)), ==, 1);
+	g_assert_cmpuint(added, ==, 1);
+	g_assert_cmpuint(removed, ==, 0);
+
+	/* Remove the transfer, verify that it was removed, and that the signal
+	 * was emitted.
+	 */
+	purple_file_transfer_manager_remove(manager, transfer);
+	g_assert_cmpuint(g_list_model_get_n_items(G_LIST_MODEL(manager)), ==, 0);
+	g_assert_cmpuint(added, ==, 1);
+	g_assert_cmpuint(removed, ==, 1);
+
+	/* Cleanup */
+	g_clear_object(&transfer);
+	g_clear_object(&manager);
+	g_clear_object(&remote);
+	g_clear_object(&account);
+}
+
+/******************************************************************************
+ * Signal Propagation Tests
+ *****************************************************************************/
+static void
+test_purple_file_transfer_manager_transfer_changed_cb(PurpleFileTransferManager *manager,
+                                                      PurpleFileTransfer *transfer,
+                                                      GParamSpec *pspec,
+                                                      gpointer data)
+{
+	guint *counter = data;
+
+	g_assert_true(PURPLE_IS_FILE_TRANSFER_MANAGER(manager));
+	g_assert_true(PURPLE_IS_FILE_TRANSFER(transfer));
+	g_assert_true(G_IS_PARAM_SPEC(pspec));
+
+	*counter = *counter + 1;
+}
+
+static void
+test_purple_file_transfer_manager_propagates_notify(void) {
+	PurpleAccount *account = NULL;
+	PurpleContactInfo *remote = NULL;
+	PurpleFileTransferManager *manager = NULL;
+	PurpleFileTransfer *transfer = NULL;
+	guint generic_counter = 0;
+	guint specific_counter = 0;
+
+	account = purple_account_new("test", "test");
+	remote = purple_contact_info_new(NULL);
+
+	manager = g_object_new(PURPLE_TYPE_FILE_TRANSFER_MANAGER, NULL);
+	g_signal_connect(manager, "transfer-changed",
+	                 G_CALLBACK(test_purple_file_transfer_manager_transfer_changed_cb),
+	                 &generic_counter);
+	g_signal_connect(manager, "transfer-changed::state",
+	                 G_CALLBACK(test_purple_file_transfer_manager_transfer_changed_cb),
+	                 &specific_counter);
+
+	transfer = purple_file_transfer_new_receive(account, remote, "foo.bar", 0);
+	purple_file_transfer_manager_add(manager, transfer);
+
+	/* Verify our counters are still 0. */
+	g_assert_cmpuint(generic_counter, ==, 0);
+	g_assert_cmpuint(specific_counter, ==, 0);
+
+	/* Change the state property and verify that each counter was incremented
+	 * by 1.
+	 */
+	purple_file_transfer_set_state(transfer,
+	                               PURPLE_FILE_TRANSFER_STATE_NEGOTIATING);
+	g_assert_cmpuint(generic_counter, ==, 1);
+	g_assert_cmpuint(specific_counter, ==, 1);
+
+	/* Now set another property and verify that only the generic counter was
+	 * incremented.
+	 */
+	purple_file_transfer_set_message(transfer, "heyo");
+	g_assert_cmpuint(generic_counter, ==, 2);
+	g_assert_cmpuint(specific_counter, ==, 1);
+
+	g_clear_object(&transfer);
+	g_clear_object(&manager);
+	g_clear_object(&remote);
+	g_clear_object(&account);
+}
+
+/******************************************************************************
+ * Main
+ *****************************************************************************/
+gint
+main(gint argc, gchar *argv[]) {
+	gint ret = 0;
+
+	g_test_init(&argc, &argv, NULL);
+
+	g_test_set_nonfatal_assertions();
+
+	test_ui_purple_init();
+
+	g_test_add_func("/file-transfer-manager/add-remove",
+	                test_purple_file_transfer_manager_add_remove);
+
+	g_test_add_func("/file-transfer-manager/propagates-notify",
+	                test_purple_file_transfer_manager_propagates_notify);
+
+	ret = g_test_run();
+
+	test_ui_purple_uninit();
+
+	return ret;
+}

mercurial