1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2007 Novell, Inc.
6 #include "test-utils.h"
8 #define SHORT_BODY "This is a test.\r\n"
9 #define LONG_BODY (SHORT_BODY SHORT_BODY)
11 #define MAX_POST_LENGTH (sizeof (SHORT_BODY))
14 static GSList *events;
17 event (SoupMessage *msg, const char *side, const char *message)
19 char *data = g_strdup_printf ("%s-%s", side, message);
20 gboolean record_status =
21 (!strcmp (data, "server-wrote_headers") ||
22 !strcmp (data, "server-wrote_informational"));
24 debug_printf (2, " %s", data);
26 debug_printf (2, " (%s)", msg->reason_phrase);
27 debug_printf (2, "\n");
29 events = g_slist_append (events, data);
31 events = g_slist_append (events, GUINT_TO_POINTER (msg->status_code));
34 #define EVENT_HANDLER(name) \
36 name (SoupMessage *msg, gpointer side) \
38 event (msg, side, #name); \
41 EVENT_HANDLER (got_informational)
42 EVENT_HANDLER (got_headers)
43 EVENT_HANDLER (got_body)
44 EVENT_HANDLER (wrote_informational)
45 EVENT_HANDLER (wrote_headers)
46 EVENT_HANDLER (wrote_body)
47 EVENT_HANDLER (finished)
50 do_message (const char *path, gboolean long_body,
51 gboolean expect_continue, gboolean auth,
59 const char *expected_event;
61 int expected_status, actual_status;
63 uri = g_strdup_printf ("http://%s127.0.0.1:%d/%s",
64 auth ? "user:pass@" : "",
66 msg = soup_message_new ("POST", uri);
69 body = long_body ? LONG_BODY : SHORT_BODY;
70 soup_message_set_request (msg, "text/plain", SOUP_MEMORY_STATIC,
72 soup_message_headers_append (msg->request_headers, "Connection", "close");
73 if (expect_continue) {
74 soup_message_headers_set_expectations (msg->request_headers,
75 SOUP_EXPECTATION_CONTINUE);
78 g_signal_connect (msg, "got_informational",
79 G_CALLBACK (got_informational), "client");
80 g_signal_connect (msg, "got_headers",
81 G_CALLBACK (got_headers), "client");
82 g_signal_connect (msg, "got_body",
83 G_CALLBACK (got_body), "client");
84 g_signal_connect (msg, "wrote_informational",
85 G_CALLBACK (wrote_informational), "client");
86 g_signal_connect (msg, "wrote_headers",
87 G_CALLBACK (wrote_headers), "client");
88 g_signal_connect (msg, "wrote_body",
89 G_CALLBACK (wrote_body), "client");
90 g_signal_connect (msg, "finished",
91 G_CALLBACK (finished), "client");
94 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
95 soup_session_send_message (session, msg);
96 soup_test_session_abort_unref (session);
99 while ((expected_event = va_arg (ap, const char *))) {
102 soup_test_assert (events != NULL,
103 "Expected '%s', got end of list",
107 actual_event = events->data;
108 g_assert_cmpstr (expected_event, ==, actual_event);
109 events = g_slist_delete_link (events, events);
112 if (!strcmp (expected_event, "server-wrote_headers") ||
113 !strcmp (expected_event, "server-wrote_informational"))
114 expected_status = va_arg (ap, int);
116 expected_status = -1;
117 if (!strcmp (actual_event, "server-wrote_headers") ||
118 !strcmp (actual_event, "server-wrote_informational")) {
119 actual_status = GPOINTER_TO_INT (events->data);
120 events = g_slist_delete_link (events, events);
122 expected_status = -1;
124 if (expected_status != -1 && actual_status != -1 &&
125 expected_status != actual_status) {
126 soup_test_assert (expected_status == actual_status,
127 "Expected status '%s', got '%s'",
128 soup_status_get_phrase (expected_status),
129 soup_status_get_phrase (actual_status));
132 g_free (actual_event);
136 actual_event = events->data;
137 soup_test_assert (events == NULL,
138 "Expected to be done, got '%s'", actual_event);
139 events = g_slist_delete_link (events, events);
141 if (!strcmp (actual_event, "server-wrote_headers") ||
142 !strcmp (actual_event, "server-wrote_informational"))
143 events = g_slist_delete_link (events, events);
145 g_object_unref (msg);
149 do_test_unauth_short_noexpect_nopass (void)
151 do_message ("unauth", FALSE, FALSE, FALSE,
152 "client-wrote_headers",
154 "server-got_headers",
156 "server-wrote_headers", SOUP_STATUS_CREATED,
159 "client-got_headers",
166 do_test_unauth_long_noexpect_nopass (void)
168 do_message ("unauth", TRUE, FALSE, FALSE,
169 "client-wrote_headers",
171 "server-got_headers",
173 "server-wrote_headers", SOUP_STATUS_REQUEST_ENTITY_TOO_LARGE,
176 "client-got_headers",
183 do_test_unauth_short_expect_nopass (void)
185 do_message ("unauth", FALSE, TRUE, FALSE,
186 "client-wrote_headers",
187 "server-got_headers",
188 "server-wrote_informational", SOUP_STATUS_CONTINUE,
189 "client-got_informational",
192 "server-wrote_headers", SOUP_STATUS_CREATED,
195 "client-got_headers",
202 do_test_unauth_long_expect_nopass (void)
204 do_message ("unauth", TRUE, TRUE, FALSE,
205 "client-wrote_headers",
206 "server-got_headers",
207 "server-wrote_headers", SOUP_STATUS_REQUEST_ENTITY_TOO_LARGE,
210 "client-got_headers",
217 do_test_auth_short_noexpect_nopass (void)
219 do_message ("auth", FALSE, FALSE, FALSE,
220 "client-wrote_headers",
222 "server-got_headers",
224 "server-wrote_headers", SOUP_STATUS_UNAUTHORIZED,
227 "client-got_headers",
234 do_test_auth_long_noexpect_nopass (void)
236 do_message ("auth", TRUE, FALSE, FALSE,
237 "client-wrote_headers",
239 "server-got_headers",
241 "server-wrote_headers", SOUP_STATUS_UNAUTHORIZED,
244 "client-got_headers",
251 do_test_auth_short_expect_nopass (void)
253 do_message ("auth", FALSE, TRUE, FALSE,
254 "client-wrote_headers",
255 "server-got_headers",
256 "server-wrote_headers", SOUP_STATUS_UNAUTHORIZED,
259 "client-got_headers",
266 do_test_auth_long_expect_nopass (void)
268 do_message ("auth", TRUE, TRUE, FALSE,
269 "client-wrote_headers",
270 "server-got_headers",
271 "server-wrote_headers", SOUP_STATUS_UNAUTHORIZED,
274 "client-got_headers",
281 do_test_auth_short_noexpect_pass (void)
283 do_message ("auth", FALSE, FALSE, TRUE,
284 "client-wrote_headers",
286 "server-got_headers",
288 "server-wrote_headers", SOUP_STATUS_UNAUTHORIZED,
291 "client-got_headers",
293 "client-wrote_headers",
295 "server-got_headers",
297 "server-wrote_headers", SOUP_STATUS_CREATED,
300 "client-got_headers",
307 do_test_auth_long_noexpect_pass (void)
309 do_message ("auth", TRUE, FALSE, TRUE,
310 "client-wrote_headers",
312 "server-got_headers",
314 "server-wrote_headers", SOUP_STATUS_UNAUTHORIZED,
317 "client-got_headers",
319 "client-wrote_headers",
321 "server-got_headers",
323 "server-wrote_headers", SOUP_STATUS_REQUEST_ENTITY_TOO_LARGE,
326 "client-got_headers",
333 do_test_auth_short_expect_pass (void)
335 do_message ("auth", FALSE, TRUE, TRUE,
336 "client-wrote_headers",
337 "server-got_headers",
338 "server-wrote_headers", SOUP_STATUS_UNAUTHORIZED,
341 "client-got_headers",
343 "client-wrote_headers",
344 "server-got_headers",
345 "server-wrote_informational", SOUP_STATUS_CONTINUE,
346 "client-got_informational",
349 "server-wrote_headers", SOUP_STATUS_CREATED,
352 "client-got_headers",
359 do_test_auth_long_expect_pass (void)
361 do_message ("auth", TRUE, TRUE, TRUE,
362 "client-wrote_headers",
363 "server-got_headers",
364 "server-wrote_headers", SOUP_STATUS_UNAUTHORIZED,
367 "client-got_headers",
369 "client-wrote_headers",
370 "server-got_headers",
371 "server-wrote_headers", SOUP_STATUS_REQUEST_ENTITY_TOO_LARGE,
374 "client-got_headers",
384 server_got_headers (SoupMessage *msg, gpointer server)
387 if (msg->status_code != SOUP_STATUS_CONTINUE &&
388 msg->status_code != 0)
391 if (soup_message_headers_get_expectations (msg->request_headers) &
392 SOUP_EXPECTATION_CONTINUE) {
395 length = soup_message_headers_get_one (msg->request_headers,
397 if (length && atoi (length) > MAX_POST_LENGTH) {
398 soup_message_set_status (msg, SOUP_STATUS_REQUEST_ENTITY_TOO_LARGE);
399 soup_message_headers_append (msg->response_headers, "Connection", "close");
405 request_started (SoupServer *server, SoupMessage *msg,
406 SoupClientContext *client, gpointer user_data)
408 g_signal_connect (msg, "got_headers",
409 G_CALLBACK (server_got_headers), server);
411 g_signal_connect (msg, "got_informational",
412 G_CALLBACK (got_informational), "server");
413 g_signal_connect (msg, "got_headers",
414 G_CALLBACK (got_headers), "server");
415 g_signal_connect (msg, "got_body",
416 G_CALLBACK (got_body), "server");
417 g_signal_connect (msg, "wrote_informational",
418 G_CALLBACK (wrote_informational), "server");
419 g_signal_connect (msg, "wrote_headers",
420 G_CALLBACK (wrote_headers), "server");
421 g_signal_connect (msg, "wrote_body",
422 G_CALLBACK (wrote_body), "server");
423 g_signal_connect (msg, "finished",
424 G_CALLBACK (finished), "server");
428 auth_callback (SoupAuthDomain *auth_domain, SoupMessage *msg,
429 const char *username, const char *password, gpointer user_data)
431 return !strcmp (username, "user") && !strcmp (password, "pass");
435 server_callback (SoupServer *server, SoupMessage *msg,
436 const char *path, GHashTable *query,
437 SoupClientContext *context, gpointer data)
439 if (msg->method != SOUP_METHOD_POST) {
440 soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED);
441 soup_message_headers_append (msg->response_headers, "Connection", "close");
442 } else if (msg->request_body->length > MAX_POST_LENGTH) {
443 soup_message_set_status (msg, SOUP_STATUS_REQUEST_ENTITY_TOO_LARGE);
444 soup_message_headers_append (msg->response_headers, "Connection", "close");
446 soup_message_set_status (msg, SOUP_STATUS_CREATED);
453 SoupAuthDomain *auth_domain;
455 server = soup_test_server_new (FALSE);
457 g_signal_connect (server, "request-started",
458 G_CALLBACK (request_started), NULL);
460 soup_server_add_handler (server, NULL, server_callback, NULL, NULL);
462 auth_domain = soup_auth_domain_basic_new (
463 SOUP_AUTH_DOMAIN_REALM, "continue-test",
464 SOUP_AUTH_DOMAIN_ADD_PATH, "/auth",
465 SOUP_AUTH_DOMAIN_BASIC_AUTH_CALLBACK, auth_callback,
467 soup_server_add_auth_domain (server, auth_domain);
468 g_object_unref (auth_domain);
476 main (int argc, char **argv)
481 test_init (argc, argv, NULL);
483 server = setup_server ();
484 port = soup_server_get_port (server);
486 g_test_add_func ("/continue/unauth_short_noexpect_nopass", do_test_unauth_short_noexpect_nopass);
487 g_test_add_func ("/continue/unauth_long_noexpect_nopass", do_test_unauth_long_noexpect_nopass);
488 g_test_add_func ("/continue/unauth_short_expect_nopass", do_test_unauth_short_expect_nopass);
489 g_test_add_func ("/continue/unauth_long_expect_nopass", do_test_unauth_long_expect_nopass);
490 g_test_add_func ("/continue/auth_short_noexpect_nopass", do_test_auth_short_noexpect_nopass);
491 g_test_add_func ("/continue/auth_long_noexpect_nopass", do_test_auth_long_noexpect_nopass);
492 g_test_add_func ("/continue/auth_short_expect_nopass", do_test_auth_short_expect_nopass);
493 g_test_add_func ("/continue/auth_long_expect_nopass", do_test_auth_long_expect_nopass);
494 g_test_add_func ("/continue/auth_short_noexpect_pass", do_test_auth_short_noexpect_pass);
495 g_test_add_func ("/continue/auth_long_noexpect_pass", do_test_auth_long_noexpect_pass);
496 g_test_add_func ("/continue/auth_short_expect_pass", do_test_auth_short_expect_pass);
497 g_test_add_func ("/continue/auth_long_expect_pass", do_test_auth_long_expect_pass);
501 soup_test_server_quit_unref (server);