static gboolean test_sum (void) { GValueArray *ints; int i, val, sum, result; GValue retval; gboolean ok; debug_printf (1, "sum (array of int -> int): "); ints = g_value_array_new (10); for (i = sum = 0; i < 10; i++) { val = rand () % 100; debug_printf (2, "%s%d", i == 0 ? "[" : ", ", val); soup_value_array_append (ints, G_TYPE_INT, val); sum += val; } debug_printf (2, "] -> "); ok = (do_xmlrpc ("sum", &retval, G_TYPE_VALUE_ARRAY, ints, G_TYPE_INVALID) && check_xmlrpc (&retval, G_TYPE_INT, &result)); g_value_array_free (ints); if (!ok) return FALSE; debug_printf (2, "%d: ", result); debug_printf (1, "%s\n", result == sum ? "OK!" : "WRONG!"); return result == sum; }
static gboolean test_echo (void) { GValueArray *originals, *echoes; GValue retval; int i; gboolean php_bug = FALSE; debug_printf (1, "echo (array of string -> array of string): "); originals = g_value_array_new (N_ECHO_STRINGS); for (i = 0; i < N_ECHO_STRINGS; i++) { soup_value_array_append (originals, G_TYPE_STRING, echo_strings[i]); debug_printf (2, "%s\"%s\"", i == 0 ? "[" : ", ", echo_strings[i]); } debug_printf (2, "] -> "); if (!(do_xmlrpc ("echo", &retval, G_TYPE_VALUE_ARRAY, originals, G_TYPE_INVALID) && check_xmlrpc (&retval, G_TYPE_VALUE_ARRAY, &echoes))) { g_value_array_free (originals); return FALSE; } g_value_array_free (originals); if (debug_level >= 2) { for (i = 0; i < echoes->n_values; i++) { debug_printf (2, "%s\"%s\"", i == 0 ? "[" : ", ", g_value_get_string (&echoes->values[i])); } debug_printf (2, "] -> "); } if (echoes->n_values != N_ECHO_STRINGS) { debug_printf (1, " WRONG! Wrong number of return strings"); g_value_array_free (echoes); return FALSE; } for (i = 0; i < echoes->n_values; i++) { if (strcmp (echo_strings[i], g_value_get_string (&echoes->values[i])) != 0) { if (!server_test && strcmp (echo_strings_broken[i], g_value_get_string (&echoes->values[i])) == 0) php_bug = TRUE; else { debug_printf (1, " WRONG! Mismatch at %d\n", i + 1); g_value_array_free (echoes); return FALSE; } } } if (php_bug) debug_printf (1, "WRONG, but it's php's fault\n"); else debug_printf (1, "OK!\n"); g_value_array_free (echoes); return TRUE; }
static gboolean test_countBools (void) { GValueArray *bools; int i, trues, falses; GValue retval; int ret_trues, ret_falses; gboolean val, ok; GHashTable *result; debug_printf (1, "countBools (array of boolean -> struct of ints): "); bools = g_value_array_new (10); for (i = trues = falses = 0; i < 10; i++) { val = rand () > (RAND_MAX / 2); debug_printf (2, "%s%c", i == 0 ? "[" : ", ", val ? 'T' : 'F'); soup_value_array_append (bools, G_TYPE_BOOLEAN, val); if (val) trues++; else falses++; } debug_printf (2, "] -> "); ok = (do_xmlrpc ("countBools", &retval, G_TYPE_VALUE_ARRAY, bools, G_TYPE_INVALID) && check_xmlrpc (&retval, G_TYPE_HASH_TABLE, &result)); g_value_array_free (bools); if (!ok) return FALSE; if (!soup_value_hash_lookup (result, "true", G_TYPE_INT, &ret_trues)) { debug_printf (1, "NO 'true' value in response\n"); return FALSE; } if (!soup_value_hash_lookup (result, "false", G_TYPE_INT, &ret_falses)) { debug_printf (1, "NO 'false' value in response\n"); return FALSE; } g_hash_table_destroy (result); debug_printf (2, "{ true: %d, false: %d } ", ret_trues, ret_falses); ok = (trues == ret_trues) && (falses == ret_falses); debug_printf (1, "%s\n", ok ? "OK!" : "WRONG!"); return ok; }
static gboolean _soup_xmlrpc_call_with_parameters(gchar * method, SyncNetAction * sna, SoupSessionCallback callback, ...) { SoupMessage *msg; GValueArray *parameters; gchar *argument, *body; va_list ap; sna->error = NULL; msg = soup_message_new("POST", XMLRPC_SERVER_URI); DEBUG("calling xmlrpc method %s", method); if (!msg) return FALSE; parameters = g_value_array_new(1); va_start(ap, callback); while ((argument = va_arg(ap, gchar *))) { soup_value_array_append(parameters, G_TYPE_STRING, argument); DEBUG("with parameter: %s", argument); } va_end(ap); body = soup_xmlrpc_build_method_call(method, parameters->values, parameters->n_values); g_value_array_free(parameters); soup_message_set_request(msg, "text/xml", SOUP_MEMORY_TAKE, body, strlen (body)); soup_session_queue_message(session, msg, callback, sna); g_main_run(loop); return TRUE; }
static void do_echo (SoupMessage *msg, GValueArray *params) { int i; const char *val; GValueArray *in, *out; if (!soup_value_array_get_nth (params, 0, G_TYPE_VALUE_ARRAY, &in)) { type_error (msg, G_TYPE_VALUE_ARRAY, params, 0); return; } out = g_value_array_new (in->n_values); for (i = 0; i < in->n_values; i++) { if (!soup_value_array_get_nth (in, i, G_TYPE_STRING, &val)) { type_error (msg, G_TYPE_STRING, in, i); return; } soup_value_array_append (out, G_TYPE_STRING, val); } soup_xmlrpc_set_response (msg, G_TYPE_VALUE_ARRAY, out); g_value_array_free (out); }