Blame tests/xmlrpc-old-server-test.c

rpm-build 4f3c61
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
rpm-build 4f3c61
/*
rpm-build 4f3c61
 * Copyright (C) 2008 Red Hat, Inc.
rpm-build 4f3c61
 */
rpm-build 4f3c61
rpm-build 4f3c61
#include "test-utils.h"
rpm-build 4f3c61
rpm-build 4f3c61
static char *uri;
rpm-build 4f3c61
rpm-build 4f3c61
#ifdef G_GNUC_BEGIN_IGNORE_DEPRECATIONS
rpm-build 4f3c61
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
rpm-build 4f3c61
#endif
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
type_error (SoupMessage *msg, GType expected, GValueArray *params, int bad_value)
rpm-build 4f3c61
{
rpm-build 4f3c61
	soup_xmlrpc_set_fault (msg,
rpm-build 4f3c61
			       SOUP_XMLRPC_FAULT_SERVER_ERROR_INVALID_METHOD_PARAMETERS,
rpm-build 4f3c61
			       "Bad parameter #%d: expected %s, got %s",
rpm-build 4f3c61
			       bad_value + 1, g_type_name (expected),
rpm-build 4f3c61
			       g_type_name (G_VALUE_TYPE (&params->values[bad_value])));
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
args_error (SoupMessage *msg, GValueArray *params, int expected)
rpm-build 4f3c61
{
rpm-build 4f3c61
	soup_xmlrpc_set_fault (msg,
rpm-build 4f3c61
			       SOUP_XMLRPC_FAULT_SERVER_ERROR_INVALID_METHOD_PARAMETERS,
rpm-build 4f3c61
			       "Wrong number of parameters: expected %d, got %d",
rpm-build 4f3c61
			       expected, params->n_values);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
do_sum (SoupMessage *msg, GValueArray *params)
rpm-build 4f3c61
{
rpm-build 4f3c61
	int i;
rpm-build 4f3c61
	double sum = 0.0, val;
rpm-build 4f3c61
	GValueArray *nums;
rpm-build 4f3c61
rpm-build 4f3c61
	if (params->n_values != 1) {
rpm-build 4f3c61
		args_error (msg, params, 1);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
	if (!soup_value_array_get_nth (params, 0, G_TYPE_VALUE_ARRAY, &nums)) {
rpm-build 4f3c61
		type_error (msg, G_TYPE_VALUE_ARRAY, params, 0);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	for (i = 0; i < nums->n_values; i++) {
rpm-build 4f3c61
		if (!soup_value_array_get_nth (nums, i, G_TYPE_DOUBLE, &val)) {
rpm-build 4f3c61
			type_error (msg, G_TYPE_DOUBLE, nums, i);
rpm-build 4f3c61
			return;
rpm-build 4f3c61
		}
rpm-build 4f3c61
		sum += val;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	soup_xmlrpc_set_response (msg, G_TYPE_DOUBLE, sum);
rpm-build 4f3c61
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
do_countBools (SoupMessage *msg, GValueArray *params)
rpm-build 4f3c61
{
rpm-build 4f3c61
	int i, trues = 0, falses = 0;
rpm-build 4f3c61
	GValueArray *bools;
rpm-build 4f3c61
	GHashTable *ret = soup_value_hash_new ();
rpm-build 4f3c61
	gboolean val;
rpm-build 4f3c61
rpm-build 4f3c61
	if (params->n_values != 1) {
rpm-build 4f3c61
		args_error (msg, params, 1);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
	if (!soup_value_array_get_nth (params, 0, G_TYPE_VALUE_ARRAY, &bools)) {
rpm-build 4f3c61
		type_error (msg, G_TYPE_VALUE_ARRAY, params, 0);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	for (i = 0; i < bools->n_values; i++) {
rpm-build 4f3c61
		if (!soup_value_array_get_nth (bools, i, G_TYPE_BOOLEAN, &val)) {
rpm-build 4f3c61
			type_error (msg, G_TYPE_BOOLEAN, params, i);
rpm-build 4f3c61
			return;
rpm-build 4f3c61
		}
rpm-build 4f3c61
		if (val)
rpm-build 4f3c61
			trues++;
rpm-build 4f3c61
		else
rpm-build 4f3c61
			falses++;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	soup_value_hash_insert (ret, "true", G_TYPE_INT, trues);
rpm-build 4f3c61
	soup_value_hash_insert (ret, "false", G_TYPE_INT, falses);
rpm-build 4f3c61
	soup_xmlrpc_set_response (msg, G_TYPE_HASH_TABLE, ret);
rpm-build 4f3c61
	g_hash_table_destroy (ret);
rpm-build 4f3c61
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
do_md5sum (SoupMessage *msg, GValueArray *params)
rpm-build 4f3c61
{
rpm-build 4f3c61
	GChecksum *checksum;
rpm-build 4f3c61
	GByteArray *data, *digest;
rpm-build 4f3c61
	gsize digest_len = 16;
rpm-build 4f3c61
rpm-build 4f3c61
	if (params->n_values != 1) {
rpm-build 4f3c61
		args_error (msg, params, 1);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	if (!soup_value_array_get_nth (params, 0, SOUP_TYPE_BYTE_ARRAY, &data)) {
rpm-build 4f3c61
		type_error (msg, SOUP_TYPE_BYTE_ARRAY, params, 0);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
	checksum = g_checksum_new (G_CHECKSUM_MD5);
rpm-build 4f3c61
	g_checksum_update (checksum, data->data, data->len);
rpm-build 4f3c61
	digest = g_byte_array_new ();
rpm-build 4f3c61
	g_byte_array_set_size (digest, digest_len);
rpm-build 4f3c61
	g_checksum_get_digest (checksum, digest->data, &digest_len);
rpm-build 4f3c61
	g_checksum_free (checksum);
rpm-build 4f3c61
rpm-build 4f3c61
	soup_xmlrpc_set_response (msg, SOUP_TYPE_BYTE_ARRAY, digest);
rpm-build 4f3c61
	g_byte_array_free (digest, TRUE);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
do_dateChange (SoupMessage *msg, GValueArray *params)
rpm-build 4f3c61
{
rpm-build 4f3c61
	GHashTable *arg;
rpm-build 4f3c61
	SoupDate *date;
rpm-build 4f3c61
	int val;
rpm-build 4f3c61
rpm-build 4f3c61
	if (params->n_values != 2) {
rpm-build 4f3c61
		args_error (msg, params, 2);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	if (!soup_value_array_get_nth (params, 0, SOUP_TYPE_DATE, &date)) {
rpm-build 4f3c61
		type_error (msg, SOUP_TYPE_DATE, params, 0);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
	if (!soup_value_array_get_nth (params, 1, G_TYPE_HASH_TABLE, &arg)) {
rpm-build 4f3c61
		type_error (msg, G_TYPE_HASH_TABLE, params, 1);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	if (soup_value_hash_lookup (arg, "tm_year", G_TYPE_INT, &val))
rpm-build 4f3c61
		date->year = val + 1900;
rpm-build 4f3c61
	if (soup_value_hash_lookup (arg, "tm_mon", G_TYPE_INT, &val))
rpm-build 4f3c61
		date->month = val + 1;
rpm-build 4f3c61
	if (soup_value_hash_lookup (arg, "tm_mday", G_TYPE_INT, &val))
rpm-build 4f3c61
		date->day = val;
rpm-build 4f3c61
	if (soup_value_hash_lookup (arg, "tm_hour", G_TYPE_INT, &val))
rpm-build 4f3c61
		date->hour = val;
rpm-build 4f3c61
	if (soup_value_hash_lookup (arg, "tm_min", G_TYPE_INT, &val))
rpm-build 4f3c61
		date->minute = val;
rpm-build 4f3c61
	if (soup_value_hash_lookup (arg, "tm_sec", G_TYPE_INT, &val))
rpm-build 4f3c61
		date->second = val;
rpm-build 4f3c61
rpm-build 4f3c61
	soup_xmlrpc_set_response (msg, SOUP_TYPE_DATE, date);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
do_echo (SoupMessage *msg, GValueArray *params)
rpm-build 4f3c61
{
rpm-build 4f3c61
	int i;
rpm-build 4f3c61
	const char *val;
rpm-build 4f3c61
	GValueArray *in, *out;
rpm-build 4f3c61
rpm-build 4f3c61
	if (!soup_value_array_get_nth (params, 0, G_TYPE_VALUE_ARRAY, &in)) {
rpm-build 4f3c61
		type_error (msg, G_TYPE_VALUE_ARRAY, params, 0);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	out = g_value_array_new (in->n_values);
rpm-build 4f3c61
	for (i = 0; i < in->n_values; i++) {
rpm-build 4f3c61
		if (!soup_value_array_get_nth (in, i, G_TYPE_STRING, &val)) {
rpm-build 4f3c61
			type_error (msg, G_TYPE_STRING, in, i);
rpm-build 4f3c61
			return;
rpm-build 4f3c61
		}
rpm-build 4f3c61
		soup_value_array_append (out, G_TYPE_STRING, val);
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	soup_xmlrpc_set_response (msg, G_TYPE_VALUE_ARRAY, out);
rpm-build 4f3c61
	g_value_array_free (out);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
do_ping (SoupMessage *msg, GValueArray *params)
rpm-build 4f3c61
{
rpm-build 4f3c61
	if (params->n_values) {
rpm-build 4f3c61
		args_error (msg, params, 0);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	soup_xmlrpc_set_response (msg, G_TYPE_STRING, "pong");
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
server_callback (SoupServer *server, SoupMessage *msg,
rpm-build 4f3c61
		 const char *path, GHashTable *query,
rpm-build 4f3c61
		 SoupClientContext *context, gpointer data)
rpm-build 4f3c61
{
rpm-build 4f3c61
	char *method_name;
rpm-build 4f3c61
	GValueArray *params;
rpm-build 4f3c61
rpm-build 4f3c61
	if (msg->method != SOUP_METHOD_POST) {
rpm-build 4f3c61
		soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED);
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	soup_message_set_status (msg, SOUP_STATUS_OK);
rpm-build 4f3c61
rpm-build 4f3c61
	if (!soup_xmlrpc_parse_method_call (msg->request_body->data,
rpm-build 4f3c61
					    msg->request_body->length,
rpm-build 4f3c61
					    &method_name, &params)) {
rpm-build 4f3c61
		soup_xmlrpc_set_fault (msg, SOUP_XMLRPC_FAULT_PARSE_ERROR_NOT_WELL_FORMED,
rpm-build 4f3c61
				       "Could not parse method call");
rpm-build 4f3c61
		return;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	if (!strcmp (method_name, "sum"))
rpm-build 4f3c61
		do_sum (msg, params);
rpm-build 4f3c61
	else if (!strcmp (method_name, "countBools"))
rpm-build 4f3c61
		do_countBools (msg, params);
rpm-build 4f3c61
	else if (!strcmp (method_name, "md5sum"))
rpm-build 4f3c61
		do_md5sum (msg, params);
rpm-build 4f3c61
	else if (!strcmp (method_name, "dateChange"))
rpm-build 4f3c61
		do_dateChange (msg, params);
rpm-build 4f3c61
	else if (!strcmp (method_name, "echo"))
rpm-build 4f3c61
		do_echo (msg, params);
rpm-build 4f3c61
	else if (!strcmp (method_name, "ping"))
rpm-build 4f3c61
		do_ping (msg, params);
rpm-build 4f3c61
	else {
rpm-build 4f3c61
		soup_xmlrpc_set_fault (msg, SOUP_XMLRPC_FAULT_SERVER_ERROR_REQUESTED_METHOD_NOT_FOUND,
rpm-build 4f3c61
				       "Unknown method %s", method_name);
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	g_free (method_name);
rpm-build 4f3c61
	g_value_array_free (params);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static gboolean
rpm-build 4f3c61
run_xmlrpc_test (char **argv,
rpm-build 4f3c61
		 char **stdout_out,
rpm-build 4f3c61
		 char **stderr_out,
rpm-build 4f3c61
		 GError **error)
rpm-build 4f3c61
{
rpm-build 4f3c61
	gboolean ok;
rpm-build 4f3c61
	int status;
rpm-build 4f3c61
rpm-build 4f3c61
	argv[0] = g_test_build_filename (G_TEST_BUILT, "xmlrpc-old-test", NULL);
rpm-build 4f3c61
	ok = g_spawn_sync (NULL, argv, NULL, 0, NULL, NULL,
rpm-build 4f3c61
			   stdout_out, stderr_out, &status,
rpm-build 4f3c61
			   error);
rpm-build 4f3c61
	g_free (argv[0]);
rpm-build 4f3c61
rpm-build 4f3c61
	if (!ok)
rpm-build 4f3c61
		return FALSE;
rpm-build 4f3c61
rpm-build 4f3c61
	return g_spawn_check_exit_status (status, error);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
static void
rpm-build 4f3c61
do_one_xmlrpc_test (gconstpointer data)
rpm-build 4f3c61
{
rpm-build 4f3c61
	const char *path = data;
rpm-build 4f3c61
	char *argv[12];
rpm-build 4f3c61
	char *stdout_out, *stderr_out;
rpm-build 4f3c61
	GError *error = NULL;
rpm-build 4f3c61
	int arg;
rpm-build 4f3c61
rpm-build 4f3c61
	argv[0] = NULL;
rpm-build 4f3c61
	argv[1] = "-S";
rpm-build 4f3c61
	argv[2] = "-U";
rpm-build 4f3c61
	argv[3] = uri;
rpm-build 4f3c61
	argv[4] = "-q";
rpm-build 4f3c61
	argv[5] = "-p";
rpm-build 4f3c61
	argv[6] = (char *) path;
rpm-build 4f3c61
rpm-build 4f3c61
	for (arg = 0; arg < debug_level && arg < 3; arg++)
rpm-build 4f3c61
		argv[arg + 7] = "-d";
rpm-build 4f3c61
	argv[arg + 7] = NULL;
rpm-build 4f3c61
rpm-build 4f3c61
	run_xmlrpc_test (argv, &stdout_out, &stderr_out, &error);
rpm-build 4f3c61
	if (stdout_out) {
rpm-build 4f3c61
		g_print ("%s", stdout_out);
rpm-build 4f3c61
		g_free (stdout_out);
rpm-build 4f3c61
	}
rpm-build 4f3c61
	if (stderr_out) {
rpm-build 4f3c61
		g_printerr ("%s", stderr_out);
rpm-build 4f3c61
		g_free (stderr_out);
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	if (   g_error_matches (error, G_SPAWN_EXIT_ERROR, 1)
rpm-build 4f3c61
	    || g_error_matches (error, G_SPAWN_EXIT_ERROR, 77))
rpm-build 4f3c61
		g_test_fail ();
rpm-build 4f3c61
	else
rpm-build 4f3c61
		g_assert_no_error (error);
rpm-build 4f3c61
	g_clear_error (&error);
rpm-build 4f3c61
}
rpm-build 4f3c61
rpm-build 4f3c61
gboolean run_tests = TRUE;
rpm-build 4f3c61
rpm-build 4f3c61
static GOptionEntry no_test_entry[] = {
rpm-build 4f3c61
        { "no-tests", 'n', G_OPTION_FLAG_REVERSE,
rpm-build 4f3c61
          G_OPTION_ARG_NONE, &run_tests,
rpm-build 4f3c61
          "Don't run tests, just run the test server", NULL },
rpm-build 4f3c61
        { NULL }
rpm-build 4f3c61
};
rpm-build 4f3c61
rpm-build 4f3c61
int
rpm-build 4f3c61
main (int argc, char **argv)
rpm-build 4f3c61
{
rpm-build 4f3c61
	SoupServer *server;
rpm-build 4f3c61
	SoupURI *server_uri;
rpm-build 4f3c61
	int ret;
rpm-build 4f3c61
rpm-build 4f3c61
	test_init (argc, argv, no_test_entry);
rpm-build 4f3c61
rpm-build 4f3c61
	server = soup_test_server_new (run_tests ? SOUP_TEST_SERVER_IN_THREAD : SOUP_TEST_SERVER_DEFAULT);
rpm-build 4f3c61
	soup_server_add_handler (server, "/xmlrpc-server.php",
rpm-build 4f3c61
				 server_callback, NULL, NULL);
rpm-build 4f3c61
	server_uri = soup_test_server_get_uri (server, "http", NULL);
rpm-build 4f3c61
	soup_uri_set_path (server_uri, "/xmlrpc-server.php");
rpm-build 4f3c61
	uri = soup_uri_to_string (server_uri, FALSE);
rpm-build 4f3c61
rpm-build 4f3c61
	if (run_tests) {
rpm-build 4f3c61
		char *out, **tests, *path;
rpm-build 4f3c61
		char *list_argv[4];
rpm-build 4f3c61
		GError *error = NULL;
rpm-build 4f3c61
		int i;
rpm-build 4f3c61
rpm-build 4f3c61
		list_argv[0] = NULL;
rpm-build 4f3c61
		list_argv[1] = "-S";
rpm-build 4f3c61
		list_argv[2] = "-l";
rpm-build 4f3c61
		list_argv[3] = NULL;
rpm-build 4f3c61
rpm-build 4f3c61
		if (!run_xmlrpc_test (list_argv, &out, NULL, &error)) {
rpm-build 4f3c61
			g_printerr ("'xmlrpc-old-test -l' failed: %s\n", error->message);
rpm-build 4f3c61
			g_error_free (error);
rpm-build 4f3c61
			return 1;
rpm-build 4f3c61
		}
rpm-build 4f3c61
rpm-build 4f3c61
		tests = g_strsplit (out, "\n", -1);
rpm-build 4f3c61
		g_free (out);
rpm-build 4f3c61
rpm-build 4f3c61
		for (i = 0; tests[i] && *tests[i]; i++) {
rpm-build 4f3c61
			g_assert_true (g_str_has_prefix (tests[i], "/xmlrpc-old/"));
rpm-build 4f3c61
			path = g_strdup_printf ("/xmlrpc-old-server/%s", tests[i] + strlen ("/xmlrpc-old/"));
rpm-build 4f3c61
			g_test_add_data_func (path, tests[i], do_one_xmlrpc_test);
rpm-build 4f3c61
			g_free (path);
rpm-build 4f3c61
		}
rpm-build 4f3c61
rpm-build 4f3c61
		ret = g_test_run ();
rpm-build 4f3c61
rpm-build 4f3c61
		g_strfreev (tests);
rpm-build 4f3c61
	} else {
rpm-build 4f3c61
		GMainLoop *loop;
rpm-build 4f3c61
rpm-build 4f3c61
		g_print ("Listening on port %d\n", server_uri->port);
rpm-build 4f3c61
rpm-build 4f3c61
		loop = g_main_loop_new (NULL, TRUE);
rpm-build 4f3c61
		g_main_loop_run (loop);
rpm-build 4f3c61
		g_main_loop_unref (loop);
rpm-build 4f3c61
rpm-build 4f3c61
		ret = 0;
rpm-build 4f3c61
	}
rpm-build 4f3c61
rpm-build 4f3c61
	soup_test_server_quit_unref (server);
rpm-build 4f3c61
	soup_uri_free (server_uri);
rpm-build 4f3c61
	g_free (uri);
rpm-build 4f3c61
	if (run_tests)
rpm-build 4f3c61
		test_cleanup ();
rpm-build 4f3c61
	return ret;
rpm-build 4f3c61
}