5 #include "test-utils.h"
6 #include "libsoup/soup.h"
15 static gboolean apache_running;
18 static SoupLogger *logger;
20 int debug_level, errors;
21 gboolean expect_warning, tls_available;
22 static int http_debug_level;
25 increment_debug_level (const char *option_name, const char *value,
26 gpointer data, GError **error)
33 increment_http_debug_level (const char *option_name, const char *value,
34 gpointer data, GError **error)
40 static GOptionEntry debug_entry[] = {
41 { "debug", 'd', G_OPTION_FLAG_NO_ARG,
42 G_OPTION_ARG_CALLBACK, increment_debug_level,
43 "Enable (or increase) test-specific debugging", NULL },
44 { "http-debug", 'h', G_OPTION_FLAG_NO_ARG,
45 G_OPTION_ARG_CALLBACK, increment_http_debug_level,
46 "Enable (or increase) HTTP-level debugging", NULL },
62 test_log_handler (const char *log_domain, GLogLevelFlags log_level,
63 const char *message, gpointer user_data)
65 if (log_level & (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL)) {
67 expect_warning = FALSE;
68 debug_printf (2, "Got expected warning: %s\n", message);
73 g_log_default_handler (log_domain, log_level, message, user_data);
77 test_init (int argc, char **argv, GOptionEntry *entries)
82 GTlsBackend *tls_backend;
87 name = strrchr (argv[0], '/');
90 if (!strncmp (name, "lt-", 3))
94 opts = g_option_context_new (NULL);
95 g_option_context_add_main_entries (opts, debug_entry, NULL);
97 g_option_context_add_main_entries (opts, entries, NULL);
99 if (!g_option_context_parse (opts, &argc, &argv, &error)) {
100 fprintf (stderr, "Could not parse arguments: %s\n",
102 fprintf (stderr, "%s",
103 g_option_context_get_help (opts, TRUE, NULL));
106 g_option_context_free (opts);
108 /* Exit cleanly on ^C in case we're valgrinding. */
109 signal (SIGINT, quit);
111 g_log_set_default_handler (test_log_handler, NULL);
113 tls_backend = g_tls_backend_get_default ();
114 tls_available = g_tls_backend_supports_tls (tls_backend);
126 g_object_unref (logger);
128 g_main_context_unref (g_main_context_default ());
130 debug_printf (1, "\n");
132 printf ("%s: %d error(s).%s\n",
133 g_get_prgname (), errors,
134 debug_level == 0 ? " Run with '-d' for details" : "");
136 printf ("%s: OK\n", g_get_prgname ());
140 debug_printf (int level, const char *format, ...)
144 if (debug_level < level)
147 va_start (args, format);
148 vprintf (format, args);
155 apache_cmd (const char *cmd)
162 cwd = g_get_current_dir ();
163 conf = g_build_filename (cwd, "httpd.conf", NULL);
165 argv[0] = APACHE_HTTPD;
174 ok = g_spawn_sync (cwd, (char **)argv, NULL, 0, NULL, NULL,
175 NULL, NULL, &status, NULL);
188 if (!apache_cmd ("start")) {
189 fprintf (stderr, "Could not start apache\n");
192 apache_running = TRUE;
196 apache_cleanup (void)
201 if (g_file_get_contents ("httpd.pid", &contents, NULL, NULL)) {
202 pid = strtoul (contents, NULL, 10);
207 if (!apache_cmd ("graceful-stop"))
209 apache_running = FALSE;
212 while (kill (pid, 0) == 0)
217 #endif /* HAVE_APACHE */
220 soup_test_session_new (GType type, ...)
223 const char *propname;
224 SoupSession *session;
226 va_start (args, type);
227 propname = va_arg (args, const char *);
228 session = (SoupSession *)g_object_new_valist (type, propname, args);
231 g_object_set (G_OBJECT (session),
232 SOUP_SESSION_SSL_CA_FILE, SRCDIR "/test-cert.pem",
233 SOUP_SESSION_SSL_STRICT, FALSE,
236 if (http_debug_level && !logger) {
237 SoupLoggerLogLevel level = MIN ((SoupLoggerLogLevel)http_debug_level, SOUP_LOGGER_LOG_BODY);
239 logger = soup_logger_new (level, -1);
243 soup_session_add_feature (session, SOUP_SESSION_FEATURE (logger));
249 soup_test_session_abort_unref (SoupSession *session)
251 g_object_add_weak_pointer (G_OBJECT (session), (gpointer *)&session);
253 soup_session_abort (session);
254 g_object_unref (session);
258 debug_printf (1, "leaked SoupSession!\n");
259 g_object_remove_weak_pointer (G_OBJECT (session), (gpointer *)&session);
263 static gpointer run_server_thread (gpointer user_data);
266 test_server_new (gboolean in_own_thread, gboolean ssl)
269 GMainContext *async_context;
270 const char *ssl_cert_file, *ssl_key_file;
273 async_context = in_own_thread ? g_main_context_new () : NULL;
276 ssl_cert_file = SRCDIR "/test-cert.pem";
277 ssl_key_file = SRCDIR "/test-key.pem";
279 ssl_cert_file = ssl_key_file = NULL;
281 addr = soup_address_new ("127.0.0.1", SOUP_ADDRESS_ANY_PORT);
282 soup_address_resolve_sync (addr, NULL);
284 server = soup_server_new (SOUP_SERVER_INTERFACE, addr,
285 SOUP_SERVER_ASYNC_CONTEXT, async_context,
286 SOUP_SERVER_SSL_CERT_FILE, ssl_cert_file,
287 SOUP_SERVER_SSL_KEY_FILE, ssl_key_file,
289 g_object_unref (addr);
291 g_main_context_unref (async_context);
294 fprintf (stderr, "Unable to create server\n");
301 thread = g_thread_create (run_server_thread, server,
303 g_object_set_data (G_OBJECT (server), "thread", thread);
305 soup_server_run_async (server);
311 soup_test_server_new (gboolean in_own_thread)
313 return test_server_new (in_own_thread, FALSE);
317 soup_test_server_new_ssl (gboolean in_own_thread)
319 return test_server_new (in_own_thread, TRUE);
323 run_server_thread (gpointer user_data)
325 SoupServer *server = user_data;
327 soup_server_run (server);
332 idle_quit_server (gpointer server)
334 soup_server_quit (server);
339 soup_test_server_quit_unref (SoupServer *server)
343 g_object_add_weak_pointer (G_OBJECT (server),
344 (gpointer *)&server);
346 thread = g_object_get_data (G_OBJECT (server), "thread");
348 soup_add_completion (soup_server_get_async_context (server),
349 idle_quit_server, server);
350 g_thread_join (thread);
352 soup_server_quit (server);
353 g_object_unref (server);
357 debug_printf (1, "leaked SoupServer!\n");
358 g_object_remove_weak_pointer (G_OBJECT (server),
359 (gpointer *)&server);