libpurple/tests/test_presence_manager.c

Tue, 02 Jan 2024 00:53:02 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 02 Jan 2024 00:53:02 -0600
changeset 42563
25d1b656d792
parent 42384
835faf0ddcb6
child 42571
722be3b1a8aa
permissions
-rw-r--r--

Add default saved presences for available and offline

These will be necessary in the near future so that the account manager has a
known presence to work with when starting up.

Testing Done:
Ran the unit tests under valgrind.

Reviewed at https://reviews.imfreedom.org/r/2907/

/*
 * 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 <glib/gstdio.h>

#include <purple.h>

/******************************************************************************
 * Callbacks
 *****************************************************************************/
static void
test_purple_presence_manager_add_remove_counter(G_GNUC_UNUSED PurplePresenceManager *manager,
                                                G_GNUC_UNUSED PurpleSavedPresence *presence,
                                                gpointer data)
{
	guint *counter = data;

	*counter = *counter + 1;
}

static void
test_purple_presence_manager_list_changed_counter(G_GNUC_UNUSED GListModel *list,
                                                  G_GNUC_UNUSED guint position,
                                                  G_GNUC_UNUSED guint removed,
                                                  G_GNUC_UNUSED guint added,
                                                  gpointer data)
{
	guint *counter = data;

	*counter = *counter + 1;
}

/******************************************************************************
 * Tests
 *****************************************************************************/
static void
test_purple_presence_manager_new(void) {
	PurplePresenceManager *manager = NULL;
	GListModel *model = NULL;

	manager = purple_presence_manager_new(NULL);
	g_assert_true(PURPLE_IS_PRESENCE_MANAGER(manager));

	/* Make sure we have our 2 default saved presences.
	 *
	 * This may change over time, but we should update this for those changes.
	 */
	model = G_LIST_MODEL(manager);
	g_assert_cmpuint(g_list_model_get_n_items(model), ==, 2);

	g_clear_object(&manager);
}

static void
test_purple_presence_manager_add_remove(void) {
	PurplePresenceManager *manager = NULL;
	PurpleSavedPresence *presence = NULL;
	GListModel *model = NULL;
	gboolean success = FALSE;
	guint len = 0;
	guint added = 0;
	guint removed = 0;
	guint changed = 0;
	const char *id = NULL;

	manager = purple_presence_manager_new(NULL);

	/* When a presence manager is created, if there are no saved statuses it
	 * adds some default ones and sets the active presence. We need to clear
	 * all of that to get to a known state.
	 *
	 * The default statuses are checked in test_purple_presence_manager_new.
	 */
	model = G_LIST_MODEL(manager);
	purple_presence_manager_set_active(manager, NULL);
	while(g_list_model_get_n_items(model) > 0) {
		PurpleSavedPresence *presence = NULL;

		/* Since we're removing items, the positions change, so we just always
		 * want to remove the item at position 0.
		 */
		presence = g_list_model_get_item(model, 0);
		purple_presence_manager_remove(manager,
		                               purple_saved_presence_get_id(presence));
		g_assert_finalize_object(presence);
	}

	/* Connect all of our signals to make sure they're being emitted. */
	g_signal_connect(manager, "added",
	                 G_CALLBACK(test_purple_presence_manager_add_remove_counter),
	                 &added);
	g_signal_connect(manager, "removed",
	                 G_CALLBACK(test_purple_presence_manager_add_remove_counter),
	                 &removed);
	g_signal_connect(manager, "items-changed",
	                 G_CALLBACK(test_purple_presence_manager_list_changed_counter),
	                 &changed);

	len = g_list_model_get_n_items(G_LIST_MODEL(manager));
	g_assert_cmpuint(len, ==, 0);

	presence = purple_presence_manager_create(manager);
	g_assert_true(PURPLE_IS_SAVED_PRESENCE(presence));
	purple_saved_presence_set_name(presence, "test presence");
	g_assert_cmpuint(added, ==, 1);
	g_assert_cmpuint(removed, ==, 0);
	g_assert_cmpuint(changed, ==, 1);

	id = purple_saved_presence_get_id(presence);
	g_assert_nonnull(id);

	len = g_list_model_get_n_items(G_LIST_MODEL(manager));
	g_assert_cmpuint(len, ==, 1);

	success = purple_presence_manager_remove(manager, id);
	g_assert_true(success);
	g_assert_cmpuint(added, ==, 1);
	g_assert_cmpuint(removed, ==, 1);
	g_assert_cmpuint(changed, ==, 2);

	len = g_list_model_get_n_items(G_LIST_MODEL(manager));
	g_assert_cmpuint(len, ==, 0);

	g_clear_object(&presence);
	g_clear_object(&manager);
}

static void
test_purple_presence_manager_persistence(void) {
	PurplePresenceManager *manager = NULL;
	PurpleSavedPresence *presence = NULL;
	char *filename = NULL;
	char *old_id = NULL;
	const char *id = NULL;
	const char *id1 = NULL;
	gboolean ret = FALSE;

	filename = g_build_filename(TEST_CACHE_DIR,
	                            "presence_manager_persistence.ini",
	                            NULL);

	/* Remove the file if it exists so we can start from a known state. */
	g_remove(filename);

	/* Create the manager, add a presence, and make it active. */
	manager = purple_presence_manager_new(filename);
	g_assert_true(PURPLE_IS_PRESENCE_MANAGER(manager));

	presence = purple_presence_manager_create(manager);
	g_assert_true(PURPLE_IS_SAVED_PRESENCE(presence));

	/* Save the id of the presence as we need to use it later. */
	id = purple_saved_presence_get_id(presence);
	old_id = g_strdup(id);

	/* Make the presence active. */
	ret = purple_presence_manager_set_active(manager, id);
	g_assert_true(ret);
	g_clear_object(&presence);

	presence = purple_presence_manager_get_active(manager);
	g_assert_true(PURPLE_IS_SAVED_PRESENCE(presence));

	id1 = purple_saved_presence_get_id(presence);
	g_assert_cmpstr(id1, ==, id);

	/* Clean everything up. The last presence was transfer none so we just need
	 * to null it out.
	 */
	presence = NULL;
	g_clear_object(&manager);

	/* Now create the manager again and verify that everything was restored. */
	manager = purple_presence_manager_new(filename);
	g_assert_true(PURPLE_IS_PRESENCE_MANAGER(manager));

	presence = purple_presence_manager_get_active(manager);
	g_assert_true(PURPLE_IS_SAVED_PRESENCE(presence));

	id = purple_saved_presence_get_id(presence);
	g_assert_cmpstr(id, ==, old_id);
	g_clear_pointer(&old_id, g_free);

	/* Cleanup. */
	g_clear_object(&manager);
	g_clear_pointer(&filename, g_free);
}

/******************************************************************************
 * Main
 *****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
	g_test_init(&argc, &argv, NULL);

	g_test_add_func("/presence-manager/new",
	                test_purple_presence_manager_new);
	g_test_add_func("/presence-manager/add-remove",
	                test_purple_presence_manager_add_remove);
	g_test_add_func("/presence-manager/persistence",
	                test_purple_presence_manager_persistence);

	return g_test_run();
}

mercurial