view libpurple/tests/check_libpurple.c @ 24425:7cf760f3560e

Don't try to free NULL xmlnodes stolen by jabber-receiving-xmlnode handlers Handlers get a (xmlnode **) that they're meant to set to NULL if they steal the node for their own nefarious purposes, signalling to the prpl that it should forget about that node. But the prpl still tried to free the xmlnode* even if it had been NULLified, triggering g_return_if_fail warnings. Fixes the issue discussed by Arne Knig in http://pidgin.im/pipermail/devel/2008-November/007035.html and the following messages.
author Will Thompson <will.thompson@collabora.co.uk>
date Fri, 21 Nov 2008 12:12:31 +0000
parents 6c015d2764d3
children 42359a734696
line wrap: on
line source

#include <glib.h>
#include <stdlib.h>

#include "tests.h"

#include "../core.h"
#include "../eventloop.h"
#include "../util.h"


/******************************************************************************
 * libpurple goodies
 *****************************************************************************/
static guint
purple_check_input_add(gint fd, PurpleInputCondition condition,
                     PurpleInputFunction function, gpointer data)
{
	/* this is a no-op for now, feel free to implement it */
	return 0;
}

static PurpleEventLoopUiOps eventloop_ui_ops = {
	g_timeout_add,
	g_source_remove,
	purple_check_input_add,
	g_source_remove,
	NULL, /* input_get_error */
#if GLIB_CHECK_VERSION(2,14,0)
	g_timeout_add_seconds,
#else
	NULL,
#endif
	NULL,
	NULL,
	NULL
};

static void
purple_check_init(void) {
	gchar *home_dir;

	g_type_init();

	purple_eventloop_set_ui_ops(&eventloop_ui_ops);

	/* build our fake home directory */
	home_dir = g_build_path(BUILDDIR, "libpurple", "tests", "home", NULL);
	purple_util_set_user_dir(home_dir);
	g_free(home_dir);

	purple_core_init("check");
}

/******************************************************************************
 * Check meat and potatoes
 *****************************************************************************/
Suite*
master_suite(void)
{
	Suite *s = suite_create("Master Suite");

	return s;
}

int main(void)
{
	int number_failed;
	SRunner *sr;

	/* Make g_return_... functions fatal, ALWAYS.
	 * As this is the test code, this is NOT controlled
	 * by PURPLE_FATAL_ASSERTS. */
	g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL);

	sr = srunner_create (master_suite());

	srunner_add_suite(sr, cipher_suite());
	srunner_add_suite(sr, jabber_jutil_suite());
	srunner_add_suite(sr, util_suite());

	/* make this a libpurple "ui" */
	purple_check_init();

	srunner_run_all (sr, CK_NORMAL);
	number_failed = srunner_ntests_failed (sr);
	srunner_free (sr);

	purple_core_quit();

	return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}