16
14
static const char *uri = NULL;
17
15
static gboolean server_test = FALSE;
17
#ifdef HAVE_PHP_XMLRPC
18
#define SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER
20
#define SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER \
23
g_test_skip ("php-xmlrpc is not available"); \
19
29
static const char *const value_type[] = {
39
49
body, strlen (body));
40
50
soup_session_send_message (session, msg);
42
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
43
debug_printf (1, "ERROR: %d %s\n", msg->status_code,
52
soup_test_assert_message_status (msg, SOUP_STATUS_OK);
49
54
if (!soup_xmlrpc_parse_method_response (msg->response_body->data,
50
55
msg->response_body->length,
53
debug_printf (1, "FAULT: %d %s\n", err->code, err->message);
58
soup_test_assert (FALSE, "FAULT: %d %s\n", err->code, err->message);
54
59
g_error_free (err);
56
debug_printf (1, "ERROR: could not parse response\n");
61
soup_test_assert (FALSE, "ERROR: could not parse response\n");
57
62
g_object_unref (msg);
114
debug_printf (1, "sum (array of int -> int): ");
118
SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER;
120
debug_printf (2, "sum (array of int -> int): ");
116
122
ints = g_value_array_new (10);
117
123
for (i = sum = 0; i < 10; i++) {
129
135
g_value_array_free (ints);
134
debug_printf (2, "%d: ", result);
135
debug_printf (1, "%s\n", result == sum ? "OK!" : "WRONG!");
136
return result == sum;
140
debug_printf (2, "%d\n", result);
141
g_assert_cmpint (result, ==, sum);
140
145
test_countBools (void)
142
147
GValueArray *bools;
146
151
gboolean val, ok;
147
152
GHashTable *result;
149
debug_printf (1, "countBools (array of boolean -> struct of ints): ");
154
SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER;
156
debug_printf (2, "countBools (array of boolean -> struct of ints): ");
151
158
bools = g_value_array_new (10);
152
159
for (i = trues = falses = 0; i < 10; i++) {
166
173
check_xmlrpc (&retval, G_TYPE_HASH_TABLE, &result));
167
174
g_value_array_free (bools);
171
if (!soup_value_hash_lookup (result, "true", G_TYPE_INT, &ret_trues)) {
172
debug_printf (1, "NO 'true' value in response\n");
175
if (!soup_value_hash_lookup (result, "false", G_TYPE_INT, &ret_falses)) {
176
debug_printf (1, "NO 'false' value in response\n");
178
g_assert_true (soup_value_hash_lookup (result, "true", G_TYPE_INT, &ret_trues));
179
g_assert_true (soup_value_hash_lookup (result, "false", G_TYPE_INT, &ret_falses));
179
181
g_hash_table_destroy (result);
181
debug_printf (2, "{ true: %d, false: %d } ", ret_trues, ret_falses);
182
ok = (trues == ret_trues) && (falses == ret_falses);
183
debug_printf (1, "%s\n", ok ? "OK!" : "WRONG!");
183
debug_printf (2, "{ true: %d, false: %d }\n", ret_trues, ret_falses);
184
g_assert_cmpint (trues, ==, ret_trues);
185
g_assert_cmpint (falses, ==, ret_falses);
188
189
test_md5sum (void)
190
191
GByteArray *data, *result;
198
debug_printf (1, "md5sum (base64 -> base64): ");
199
SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER;
201
debug_printf (2, "md5sum (base64 -> base64)\n");
200
203
data = g_byte_array_new ();
201
204
g_byte_array_set_size (data, 256);
213
216
check_xmlrpc (&retval, SOUP_TYPE_BYTE_ARRAY, &result));
214
217
g_byte_array_free (data, TRUE);
218
if (result->len != digest_len) {
219
debug_printf (1, "result has WRONG length (%d)\n", result->len);
220
g_byte_array_free (result, TRUE);
224
ok = (memcmp (digest, result->data, digest_len) == 0);
225
debug_printf (1, "%s\n", ok ? "OK!" : "WRONG!");
221
soup_assert_cmpmem (result->data, result->len,
226
223
g_byte_array_free (result, TRUE);
231
227
test_dateChange (void)
233
229
GHashTable *structval;
239
debug_printf (1, "dateChange (date, struct of ints -> time): ");
235
SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER;
237
debug_printf (2, "dateChange (date, struct of ints -> time)\n");
241
239
date = soup_date_new (1970 + (g_random_int_range (0, 50)),
242
240
1 + g_random_int_range (0, 12),
301
299
g_hash_table_destroy (structval);
303
301
soup_date_free (date);
307
305
if (debug_level >= 2) {
308
306
timestamp = soup_date_to_string (result, SOUP_DATE_ISO8601_XMLRPC);
309
debug_printf (2, "%s: ", timestamp);
307
debug_printf (2, "%s\n", timestamp);
310
308
g_free (timestamp);
313
ok = ((date->year == result->year) &&
314
(date->month == result->month) &&
315
(date->day == result->day) &&
316
(date->hour == result->hour) &&
317
(date->minute == result->minute) &&
318
(date->second == result->second));
311
g_assert_cmpint (date->year, ==, result->year);
312
g_assert_cmpint (date->month, ==, result->month);
313
g_assert_cmpint (date->day, ==, result->day);
314
g_assert_cmpint (date->hour, ==, result->hour);
315
g_assert_cmpint (date->minute, ==, result->minute);
316
g_assert_cmpint (date->second, ==, result->second);
319
318
soup_date_free (date);
320
319
soup_date_free (result);
322
debug_printf (1, "%s\n", ok ? "OK!" : "WRONG!");
326
322
static const char *const echo_strings[] = {
338
334
"amp; so is lt;thisgt;"
344
340
GValueArray *originals, *echoes;
347
gboolean php_bug = FALSE;
349
debug_printf (1, "echo (array of string -> array of string): ");
344
SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER;
346
debug_printf (2, "echo (array of string -> array of string):\n");
351
348
originals = g_value_array_new (N_ECHO_STRINGS);
352
349
for (i = 0; i < N_ECHO_STRINGS; i++) {
369
366
debug_printf (2, "%s\"%s\"", i == 0 ? "[" : ", ",
370
367
g_value_get_string (&echoes->values[i]));
372
debug_printf (2, "] -> ");
369
debug_printf (2, "]\n");
375
if (echoes->n_values != N_ECHO_STRINGS) {
376
debug_printf (1, " WRONG! Wrong number of return strings");
377
g_value_array_free (echoes);
372
g_assert_cmpint (echoes->n_values, ==, N_ECHO_STRINGS);
381
374
for (i = 0; i < echoes->n_values; i++) {
382
if (strcmp (echo_strings[i], g_value_get_string (&echoes->values[i])) != 0) {
383
if (!server_test && strcmp (echo_strings_broken[i], g_value_get_string (&echoes->values[i])) == 0)
386
debug_printf (1, " WRONG! Mismatch at %d\n", i + 1);
387
g_value_array_free (echoes);
375
if (!server_test && strcmp (echo_strings_broken[i], g_value_get_string (&echoes->values[i])) == 0) {
376
g_test_skip ("PHP bug");
377
g_value_array_free (echoes);
381
g_assert_cmpstr (echo_strings[i], ==, g_value_get_string (&echoes->values[i]));
394
debug_printf (1, "WRONG, but it's php's fault\n");
396
debug_printf (1, "OK!\n");
397
384
g_value_array_free (echoes);
402
test_ping (gboolean include_params)
388
test_ping (gconstpointer include_params)
404
390
GValueArray *params;
410
debug_printf (1, "ping (void (%s) -> string): ",
396
g_test_bug ("671661");
398
SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER;
400
debug_printf (2, "ping (void (%s) -> string)\n",
411
401
include_params ? "empty <params>" : "no <params>");
413
403
params = soup_value_array_new ();
415
405
params->n_values);
416
406
g_value_array_free (params);
420
410
if (!include_params) {
421
411
char *params, *end;
423
413
params = strstr (request, "<params/>");
425
debug_printf (1, "ERROR: XML did not contain <params/>!");
415
soup_test_assert (FALSE, "ERROR: XML did not contain <params/>!");
428
418
end = params + strlen ("<params/>");
429
419
memmove (params, end, strlen (end) + 1);
433
423
g_free (request);
435
425
if (!ret || !check_xmlrpc (&retval, G_TYPE_STRING, &out))
438
if (!strcmp (out, "pong")) {
439
debug_printf (1, "OK!\n");
442
debug_printf (1, "WRONG! Bad response '%s'", out);
428
g_assert_cmpstr (out, ==, "pong");
451
434
do_bad_xmlrpc (const char *body)
453
436
SoupMessage *msg;
459
442
body, strlen (body));
460
443
soup_session_send_message (session, msg);
462
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
463
debug_printf (1, "ERROR: %d %s\n", msg->status_code,
465
g_object_unref (msg);
445
soup_test_assert_message_status (msg, SOUP_STATUS_OK);
469
447
if (!soup_xmlrpc_parse_method_response (msg->response_body->data,
470
448
msg->response_body->length,
474
452
err->code, err->message);
475
453
g_error_free (err);
476
454
g_object_unref (msg);
479
debug_printf (1, "ERROR: could not parse response\n");
457
soup_test_assert (FALSE, "ERROR: could not parse response\n");
481
debug_printf (1, "Unexpectedly got successful response!\n");
459
soup_test_assert (FALSE, "Unexpectedly got successful response!\n");
483
461
g_object_unref (msg);
488
465
test_fault_malformed (void)
490
debug_printf (1, "malformed request: ");
467
SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER;
492
return do_bad_xmlrpc ("<methodCall/>");
469
do_bad_xmlrpc ("<methodCall/>");
496
473
test_fault_method (void)
498
debug_printf (1, "request to non-existent method: ");
475
SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER;
500
return do_bad_xmlrpc ("<methodCall><methodName>no_such_method</methodName><params><param><value><int>1</int></value></param></params></methodCall>");
477
do_bad_xmlrpc ("<methodCall><methodName>no_such_method</methodName><params><param><value><int>1</int></value></param></params></methodCall>");
504
481
test_fault_args (void)
506
debug_printf (1, "request with invalid args: ");
483
SOUP_TEST_SKIP_IF_NO_XMLRPC_SERVER;
508
return do_bad_xmlrpc ("<methodCall><methodName>sum</methodName><params><param><value><int>1</int></value></param></params></methodCall>");
485
do_bad_xmlrpc ("<methodCall><methodName>sum</methodName><params><param><value><int>1</int></value></param></params></methodCall>");
511
488
static GOptionEntry xmlrpc_entries[] = {
512
{ "uri", 'u', 0, G_OPTION_ARG_STRING, &uri,
489
{ "uri", 'U', 0, G_OPTION_ARG_STRING, &uri,
513
490
"Alternate URI for server", NULL },
514
{ "server-test", 's', 0, G_OPTION_ARG_NONE, &server_test,
491
{ "server-test", 'S', 0, G_OPTION_ARG_NONE, &server_test,
515
492
"If this is being run from xmlrpc-server-test", NULL },
520
497
main (int argc, char **argv)
522
501
test_init (argc, argv, xmlrpc_entries);
503
if (!uri && !server_test) {
526
505
uri = default_uri;
529
508
session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, NULL);
533
if (!test_countBools ())
537
if (!test_dateChange ())
541
if (!test_ping (TRUE))
543
if (!test_ping (FALSE))
545
if (!test_fault_malformed ())
547
if (!test_fault_method ())
549
if (!test_fault_args ())
510
g_test_add_func ("/xmlrpc/sum", test_sum);
511
g_test_add_func ("/xmlrpc/countBools", test_countBools);
512
g_test_add_func ("/xmlrpc/md5sum", test_md5sum);
513
g_test_add_func ("/xmlrpc/dateChange", test_dateChange);
514
g_test_add_func ("/xmlrpc/echo", test_echo);
515
g_test_add_data_func ("/xmlrpc/ping/empty-params", GINT_TO_POINTER (TRUE), test_ping);
516
g_test_add_data_func ("/xmlrpc/ping/no-params", GINT_TO_POINTER (FALSE), test_ping);
517
g_test_add_func ("/xmlrpc/fault/malformed", test_fault_malformed);
518
g_test_add_func ("/xmlrpc/fault/method", test_fault_method);
519
g_test_add_func ("/xmlrpc/fault/args", test_fault_args);
552
523
soup_test_session_abort_unref (session);
558
#else /* HAVE_PHP_XMLRPC */
561
main (int argc, char **argv)
563
return 77; /* SKIP */