[libgovirt] tests: Add mock httpd server to mock oVirt API



commit f573f1a40bc3f94fc83c72e291511cdabf2311e5
Author: Christophe Fergeau <cfergeau redhat com>
Date:   Wed Apr 13 15:39:12 2016 +0200

    tests: Add mock httpd server to mock oVirt API
    
    This is based off libsoup/examples/simple-httpd.c, but provides a simple
    API that test cases can use to start/stop a mock webserver which will
    send predefined responses to specific requests.

 Makefile.am                      |    3 +-
 configure.ac                     |    3 +-
 tests/Makefile.am                |   17 +++
 tests/https-cert/ca-cert.pem     |   32 +++++
 tests/https-cert/ca-key.pem      |   54 ++++++++
 tests/https-cert/server-cert.pem |   30 +++++
 tests/https-cert/server-key.csr  |   27 ++++
 tests/https-cert/server-key.pem  |   51 ++++++++
 tests/mock-httpd.c               |  252 ++++++++++++++++++++++++++++++++++++++
 tests/mock-httpd.h               |   39 ++++++
 10 files changed, 506 insertions(+), 2 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 5d8f0e8..bc096ac 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3,7 +3,8 @@ ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
 SUBDIRS =                                              \
        govirt                                          \
        examples                                        \
-       po
+       po                                              \
+       tests
 
 INTLTOOL_FILES =                                       \
        intltool-extract.in                             \
diff --git a/configure.ac b/configure.ac
index b01ce8f..ea88ef1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -96,7 +96,7 @@ AC_SUBST(WARNINGFLAGS_C)
 dnl ---------------------------------------------------------------------------
 dnl - Check library dependencies
 dnl ---------------------------------------------------------------------------
-PKG_CHECK_MODULES([GLIB], [gobject-2.0 gio-2.0 >= 2.26.0])
+PKG_CHECK_MODULES([GLIB], [gobject-2.0 gio-2.0 gthread-2.0 >= 2.26.0])
 
 # Setup GLIB_MKENUMS to use glib-mkenums even if GLib is uninstalled.
 GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
@@ -123,6 +123,7 @@ examples/Makefile
 govirt/govirt-1.0.pc
 govirt/Makefile
 po/Makefile.in
+tests/Makefile
 ])
 AC_OUTPUT
 
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..f53273a
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,17 @@
+noinst_PROGRAMS = $(TESTS)
+
+AM_LDFLAGS =                                   \
+       $(top_builddir)/govirt/libgovirt.la     \
+       $(GLIB_LIBS)
+
+
+AM_CFLAGS =                                    \
+       $(WARNINGFLAGS_C)                       \
+       $(GLIB_CFLAGS)                          \
+       $(REST_CFLAGS)                          \
+       -Dabs_srcdir="\"$(abs_srcdir)\""        \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/govirt
+
+noinst_LTLIBRARIES = libmock-httpd.la
+libmock_httpd_la_SOURCES = mock-httpd.c mock-httpd.h
diff --git a/tests/https-cert/ca-cert.pem b/tests/https-cert/ca-cert.pem
new file mode 100644
index 0000000..1f37f35
--- /dev/null
+++ b/tests/https-cert/ca-cert.pem
@@ -0,0 +1,32 @@
+-----BEGIN CERTIFICATE-----
+MIIFfzCCA2egAwIBAgIJAJe68wcZuCytMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV
+BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
+Q29tcGFueSBMdGQxEjAQBgNVBAMMCWdvdmlydCBDQTAeFw0xNjA0MTIxNTEyNDFa
+Fw0xOTA0MTIxNTEyNDFaMFYxCzAJBgNVBAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0
+IENpdHkxHDAaBgNVBAoME0RlZmF1bHQgQ29tcGFueSBMdGQxEjAQBgNVBAMMCWdv
+dmlydCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALj2s6YqG9CE
+O7ZxudxjGRSN3rUsnc++p0I+Exo32lsPMD3AXGJ9EwGnXhoRvGnuF2piICZ3CLl2
+nOH/7Ta8Sb/RuHj67XpJyOhgamM9HULff7ZFXyOrSVyf7YhetCqtx6QhwGfeJ88A
+MsClJmLZ0AkC1rqtIze9r7HCHZCQxkZZHKV0EhF8RaK0oBxjt6MFIru/kzQCXvWT
+t9/RaaxhOdboCtTEmu5oTBQfmKUzl4KT3byYVhdm70MEu/PES1XcgnI2RiHcggrI
+jJ7IknDZTZVK6r0uYLwhBLYA7WsHjRuinTC45dfGcZo0ZTn3khO2Get1negU6wuq
+kkxyc/Su+tU+eH74haW58Xa3DRXlRNHu91ll81W1Wtpi2osDlImIbM/a+FTSTenl
+/bIpPOSqbncvi0yfOoZJhH/u8jgQl3hKVgcA8wYdBj/zcHknldnjeS/k0zI84jOd
+ZrSWL/U7CRGiqJJgRpEKMlggf8Zyh+Lu5Hs6DJrSMG36nbLuukioNCzk7mzMJtOk
+kcE2576RA/1qkYdno06ZHCR7AnOlwvOKusS8ApIti/quQy1COanBYKaiXOJOemZ2
+n5D3cDsqRk1s/Wj53Ci9KurhGoQOoquRXHv7Z3vzBtZdqZBdwLH3r0pM85a//M6c
+HkDwEDsZNUPlvteDahhMPt2qjJNI1ucVAgMBAAGjUDBOMB0GA1UdDgQWBBTxTMG0
+4azCV/NN7/DhFI5tVp9t3TAfBgNVHSMEGDAWgBTxTMG04azCV/NN7/DhFI5tVp9t
+3TAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQA0OOkImczWNwgz/CaB
+mEx6odCM0Kv2ozZ6d8ttsj4w9S3tn0HSR1xM62F/GmO1NfxQXKWTR3xYMou0fQVA
+RskWy/I9WVN/BTD2QSPD9b3fqZvXgi5eMXVeT/1zO2LywV/APLzVl+jbB3WT9J+9
+1CHyiMNQUUbkIULmE3Z4FPYL30TGbAj4QSIIAbJlHAxRsrTbLXqRXnqw/NxdKdBk
+v1AOvCenu1HcbtWwDnwrIJGt8/igPB5KqsBzHVfcVmvpXUDC1oLf8w8v7nUB55hs
+ZMFyaeEcmc+W2B/JM26npbfTCjST9D6kxBXUhIeu9oJDimfiUqYUaZOuybUM6ZEy
+76vsO8qB06AuA+KhbvBgz8VHveMCnL516VIB8gxThvBgGIe7AQJuDHCy3+oRJ1+k
+kQm04t2k+Gg03ZpgtzbKaOCL6zRFyy5XE8h59/92KyUh804WTiS5MQZLTnqONqS1
+49BWXgTZgL+PvMr2xzE5ECs3lkcNpO3TvQJB6eSg0X6NQEscQRbTI1qrmszfAov3
+teQQlwZZHwzXhJxDNAW9u4oaCWbhRsVbYIoDDdvgIeeLozNaQgJkVzQOrSDOcbrk
+4cclYBgxgSAp1wvlje6iUFGGz6Q37GLBhqBTONjIL2ArlizqznGvBbQ/0CO1bij4
+mePFkPdR8OZWT1+FN6HavKYtPg==
+-----END CERTIFICATE-----
diff --git a/tests/https-cert/ca-key.pem b/tests/https-cert/ca-key.pem
new file mode 100644
index 0000000..799f010
--- /dev/null
+++ b/tests/https-cert/ca-key.pem
@@ -0,0 +1,54 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,23C9FA3794AAFA52
+
+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
+-----END RSA PRIVATE KEY-----
diff --git a/tests/https-cert/server-cert.pem b/tests/https-cert/server-cert.pem
new file mode 100644
index 0000000..709369f
--- /dev/null
+++ b/tests/https-cert/server-cert.pem
@@ -0,0 +1,30 @@
+-----BEGIN CERTIFICATE-----
+MIIFIDCCAwgCAQEwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCWFgxFTATBgNV
+BAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDES
+MBAGA1UEAwwJZ292aXJ0IENBMB4XDTE2MDQxMjE1MTMzNVoXDTE5MDQxMjE1MTMz
+NVowVjELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UE
+CgwTRGVmYXVsdCBDb21wYW55IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt6OkS5HhwwFLJWDmuRSOYCXwQP6v
+OlToc7rHvK0+shkspUb1KYks3iEw9djLQdxf1E5k+oDlifDKAMgd/AxkJn8kZ4f1
+i3183gFdad+UlMFwCliReb3opdtalR6Bef1CDE91+wsN1S4OLXYlVY/EO/sV4Ydh
+khReJiSQzUS+s1T9Nxa57YiuhJ6KYhS5SKkoFDQ7OmyvXM4cSnqOy7h4xBg8fBv9
+jxI24DNsF1qPg3XVQg3FDmHLEdRTlOWzq39qxzHPrTcFCboS1EaKHIX5DwlNR/L+
+x/JVqP99t2d/7lp2u8rveHsV0sLCoGK6ehbL6CHMXZQmmRQaVL/xueVIUvUhpwCS
+BXdxRNHpSizPkM4P7/0isgvJ8okElwKv2G46rJjt/AuQTOXVJDEfajHe/703E5r3
+iJkkG4Jd3uVeZIEigic9PEyervYk2VrWXIIZltfgaCUZYiJNRQ6xbG6RrKLYgSfV
+fpr8urFWFKs+j8dZHc8/GPi1tjTtaaYG0kXg3CGEh3Ww3ym0xjxrt2Qr62nMD+lH
+0loK8wdJbzsHgmLOGnURUWN55XKFpWcrP9rYHSl0d70u6YioMpIM2UClfRPQnLvX
++/H3yBshAPQldBgseXJ9zlG1ho5fXaIg5u4mtNg+GccerNOFypdJJc97IdYFmyhm
+ww/6LcpMKk+e6wECAwEAATANBgkqhkiG9w0BAQsFAAOCAgEADePSnvlNHaO54TRl
+FZxfxNf/Ft3s+HP2ya6SC+tu1X7FgjbHQL4nm0Xf+pboAZoeUMujgUVGuYQ3ytkt
+irbSONYBbr439zZ4cPqWXqgzySTEiKwWR8REHXRPHJaupE09g+uEWo4E2u7423+k
+j3tbSkPZlObmsXkpdtQEw347yHcmZb8ujloxBopRK5KHchg/mXjiVGrkt9E8tzgX
+V8eG7CkCiEujnLpdjZ+7+AwmJoIuzB7xs2rXMe/zC7/4l2ViCFgjJKZra2oZLzqc
+FVBZXW8dAmWT4iIsZP4xXyzrKA8exzKgsdtXTMYNzgUsXH6Zcou0GhTR5jZvWbvZ
+Z0uPIXFnDRBqvK8nbRab0ok7iJRoLJhFih6q2tQwrpg05zPV39d9GLNwXKEKCo6/
+dqnqUhQcD5CpXoLhANbSgZZo7xdTM4Onxlm+h+3D/UxbciOQ8nRmNKUC+xX79+Xw
+zPLRULRs32brrfObOuOJuiA4tL81n9ghAdnbVhiZZvhxpJ/QvZWl4CH1UdR2/bO4
++lkEAJDfLTP2uvWe0zYFS2E1WeJUOBjt6mU4sFNxqf5Vt+6PMWBGKvUg/JW+2kCP
+S5h1pRFDf8XOGWJ5UvzwlxP/VXrDo70xeY7Pdgk+TPr+TroJsNjorIi9Y0JXKZJ6
+dux12jowA6uKxtF7dmtA5szUKSU=
+-----END CERTIFICATE-----
diff --git a/tests/https-cert/server-key.csr b/tests/https-cert/server-key.csr
new file mode 100644
index 0000000..64830e9
--- /dev/null
+++ b/tests/https-cert/server-key.csr
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEmzCCAoMCAQAwVjELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1bHQgQ2l0
+eTEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDESMBAGA1UEAwwJbG9jYWxo
+b3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt6OkS5HhwwFLJWDm
+uRSOYCXwQP6vOlToc7rHvK0+shkspUb1KYks3iEw9djLQdxf1E5k+oDlifDKAMgd
+/AxkJn8kZ4f1i3183gFdad+UlMFwCliReb3opdtalR6Bef1CDE91+wsN1S4OLXYl
+VY/EO/sV4YdhkhReJiSQzUS+s1T9Nxa57YiuhJ6KYhS5SKkoFDQ7OmyvXM4cSnqO
+y7h4xBg8fBv9jxI24DNsF1qPg3XVQg3FDmHLEdRTlOWzq39qxzHPrTcFCboS1EaK
+HIX5DwlNR/L+x/JVqP99t2d/7lp2u8rveHsV0sLCoGK6ehbL6CHMXZQmmRQaVL/x
+ueVIUvUhpwCSBXdxRNHpSizPkM4P7/0isgvJ8okElwKv2G46rJjt/AuQTOXVJDEf
+ajHe/703E5r3iJkkG4Jd3uVeZIEigic9PEyervYk2VrWXIIZltfgaCUZYiJNRQ6x
+bG6RrKLYgSfVfpr8urFWFKs+j8dZHc8/GPi1tjTtaaYG0kXg3CGEh3Ww3ym0xjxr
+t2Qr62nMD+lH0loK8wdJbzsHgmLOGnURUWN55XKFpWcrP9rYHSl0d70u6YioMpIM
+2UClfRPQnLvX+/H3yBshAPQldBgseXJ9zlG1ho5fXaIg5u4mtNg+GccerNOFypdJ
+Jc97IdYFmyhmww/6LcpMKk+e6wECAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQAD
+tKInVGTABnzODsUCSu5H17z9Xf0scmtdy4FjjsP4bkHkJyKRkAUqXzXFXTaW8ZtK
+BFhDbVvDwoofBJBmo5tHc/re42Fnw9dMjp50TfMYuT8I8cvO950wmoEeZoQ3ypZd
+wOmupyjCp9JIyuVLp7paQvx9dfoYVlWPvSdrI62bHP5rmjfjYpxqqCbtLn15ErP0
+1mCmK9GKzxPS3fxbkuC3PUh5fZBO8I+unsbLyRO+5rVOrhVr0dAXvHRpqNWyis+Q
+jGXJa5Ubg7DeOkHPFEuglbObqUI1i9eL8kNHbS+/54rmsLVSaWUNdGpVSSnkh6OP
+UtXcfX2ciExOh4NpKTggvJrkgpEAEZvoHqVcqtePoKQ2ZLAWuC8ouIABdTdslQcM
+HGtkP47ucFWXJDauAA8eqWsnHo37vOjUUr7EExSxazB5qfc9tkxpFQCxvUsdXeGL
+I5idWj5uKG1jxee1XU4NqGtMbLWRYck/xzmoUg9mc6abfBFYhYUyR54lCb12jZ/2
+aScO21t8/+JS2H6U0pUOqXI9MA/74YvEw1d7f8IksisfnribWverEen6tBudBTqg
+MOBb4pBgmVdRQYOnN55YvkOpO+QFDr9WyyGyKoQ1WdgTmJgIeffE2Az4YbaZm0y+
+UOwdrOQrwx+XLZpIDUeFLCN6r6WZrVOnbFiOi4PrVA==
+-----END CERTIFICATE REQUEST-----
diff --git a/tests/https-cert/server-key.pem b/tests/https-cert/server-key.pem
new file mode 100644
index 0000000..e0bcb2b
--- /dev/null
+++ b/tests/https-cert/server-key.pem
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/tests/mock-httpd.c b/tests/mock-httpd.c
new file mode 100644
index 0000000..5b4632e
--- /dev/null
+++ b/tests/mock-httpd.c
@@ -0,0 +1,252 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2001-2003, Ximian, Inc.
+ */
+#include <config.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <libsoup/soup.h>
+#include <glib/gstdio.h>
+#include <govirt/govirt.h>
+
+#include "mock-httpd.h"
+
+#define GOVIRT_HTTPS_PORT 8088
+
+struct GovirtMockHttpd {
+    GThread *thread;
+    GMainLoop *loop;
+
+    guint port;
+    gboolean disable_tls;
+
+    GHashTable *requests;
+};
+
+
+typedef struct {
+    char *method;
+    char *path;
+    char *content;
+} GovirtMockHttpdRequest;
+
+
+static const char *
+govirt_mock_httpd_find_request (GovirtMockHttpd *mock_httpd,
+                               const char *method,
+                               const char *path)
+{
+       GovirtMockHttpdRequest *request;
+
+       request = g_hash_table_lookup (mock_httpd->requests, path);
+
+       if (request == NULL) {
+               return NULL;
+       }
+       if (g_strcmp0 (request->method, method) != 0) {
+               return NULL;
+       }
+
+       return request->content;
+}
+
+
+static void
+govirt_mock_htttpd_request_free (GovirtMockHttpdRequest *request)
+{
+       g_free (request->method);
+       g_free (request->path);
+       g_free (request->content);
+       g_free (request);
+}
+
+
+static void
+server_callback (SoupServer *server, SoupMessage *msg,
+                const char *path, GHashTable *query,
+                SoupClientContext *context, gpointer data)
+{
+       SoupMessageHeadersIter iter;
+       const char *name, *value;
+       const char *content;
+       GovirtMockHttpd *mock_httpd = data;
+
+       g_debug ("%s %s HTTP/1.%d\n", msg->method, path,
+                soup_message_get_http_version (msg));
+       soup_message_headers_iter_init (&iter, msg->request_headers);
+       while (soup_message_headers_iter_next (&iter, &name, &value))
+               g_debug ("%s: %s\n", name, value);
+       if (msg->request_body->length)
+               g_debug ("%s\n", msg->request_body->data);
+
+       content = govirt_mock_httpd_find_request(mock_httpd, msg->method, path);
+       if (content == NULL) {
+               soup_message_set_status (msg, SOUP_STATUS_NOT_FOUND);
+       } else {
+               soup_message_body_append (msg->response_body, SOUP_MEMORY_STATIC,
+                                         content, strlen(content));
+               soup_message_set_status (msg, SOUP_STATUS_OK);
+       }
+       g_debug ("  -> %d %s\n\n", msg->status_code, msg->reason_phrase);
+}
+
+
+static gpointer
+govirt_httpd_run (gpointer user_data)
+{
+       GovirtMockHttpd *mock_httpd = user_data;
+       GSList *uris, *u;
+       SoupServer *server;
+       GError *error = NULL;
+       GMainContext *context;
+
+       context = g_main_loop_get_context (mock_httpd->loop);
+       g_main_context_push_thread_default (context);
+
+       if (!mock_httpd->disable_tls) {
+               GTlsCertificate *cert;
+
+               cert = g_tls_certificate_new_from_files (abs_srcdir "/https-cert/server-cert.pem",
+                                                        abs_srcdir "/https-cert/server-key.pem",
+                                                        &error);
+               g_assert (error == NULL);
+               server = soup_server_new (SOUP_SERVER_SERVER_HEADER, "simple-soup-httpd ",
+                                         SOUP_SERVER_TLS_CERTIFICATE, cert,
+                                         NULL);
+               g_object_unref (cert);
+
+               soup_server_listen_local (server, mock_httpd->port,
+                                         SOUP_SERVER_LISTEN_HTTPS, &error);
+       } else {
+               server = soup_server_new (SOUP_SERVER_SERVER_HEADER, "simple-soup-httpd ",
+                                         NULL);
+               soup_server_listen_local (server, mock_httpd->port, 0, &error);
+       }
+       g_assert (error == NULL);
+
+       soup_server_add_handler (server, NULL,
+                                server_callback, mock_httpd, NULL);
+
+       uris = soup_server_get_uris (server);
+       for (u = uris; u; u = u->next) {
+               char *str;
+               str = soup_uri_to_string (u->data, FALSE);
+               g_debug ("Listening on %s\n", str);
+               g_free (str);
+               soup_uri_free (u->data);
+       }
+       g_slist_free (uris);
+
+       g_debug ("\nWaiting for requests...\n");
+
+       g_main_loop_run (mock_httpd->loop);
+       g_main_context_pop_thread_default (context);
+       g_object_unref (server);
+
+       return NULL;
+}
+
+
+GovirtMockHttpd *
+govirt_mock_httpd_new (guint port)
+{
+       GMainContext *context;
+       GovirtMockHttpd *mock_httpd;
+
+       mock_httpd = g_new0 (GovirtMockHttpd, 1);
+
+       mock_httpd->port = port;
+       context = g_main_context_new ();
+       mock_httpd->loop = g_main_loop_new (context, TRUE);
+       g_main_context_unref (context);
+
+       mock_httpd->requests = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                                     NULL,
+                                                    (GDestroyNotify) govirt_mock_htttpd_request_free);
+
+       return mock_httpd;
+}
+
+
+void
+govirt_mock_httpd_disable_tls (GovirtMockHttpd *mock_httpd, gboolean disable_tls)
+{
+       g_return_if_fail(mock_httpd->thread == NULL);
+
+       mock_httpd->disable_tls = disable_tls;
+}
+
+
+void
+govirt_mock_httpd_add_request (GovirtMockHttpd *mock_httpd,
+                              const char *method,
+                              const char *path,
+                              const char *content)
+{
+       GovirtMockHttpdRequest *request;
+
+       g_return_if_fail(mock_httpd->thread == NULL);
+
+       /* FIXME: just one method is supported for a given path right now */
+       request = g_hash_table_lookup (mock_httpd->requests, path);
+       if (request != NULL) {
+               g_assert (g_strcmp0 (request->method, method) == 0);
+       }
+
+       request = g_new0 (GovirtMockHttpdRequest, 1);
+       request->method = g_strdup (method);
+       request->path = g_strdup (path);
+       request->content = g_strdup (content);
+
+       g_hash_table_replace (mock_httpd->requests, request->path, request);
+}
+
+
+void
+govirt_mock_httpd_start (GovirtMockHttpd *mock_httpd)
+{
+       g_return_if_fail(mock_httpd->thread == NULL);
+
+       mock_httpd->thread = g_thread_new ("simple-soup-httpd",
+                                          govirt_httpd_run, mock_httpd);
+}
+
+
+static gboolean
+govirt_mock_httpd_stop_idle (gpointer user_data)
+{
+       GMainLoop *loop = user_data;
+
+       if (g_main_loop_is_running (loop)) {
+               g_main_loop_quit (loop);
+       }
+
+       return G_SOURCE_REMOVE;
+}
+
+
+void
+govirt_mock_httpd_stop (GovirtMockHttpd *mock_httpd)
+{
+       GMainContext *context;
+       GSource *idle_source;
+
+       context = g_main_loop_get_context (mock_httpd->loop);
+       idle_source = g_idle_source_new ();
+       g_source_set_callback (idle_source,
+                              govirt_mock_httpd_stop_idle,
+                              g_main_loop_ref (mock_httpd->loop),
+                              (GDestroyNotify)g_main_loop_unref);
+       g_source_attach (idle_source, context);
+       g_source_unref (idle_source);
+
+       g_thread_join (mock_httpd->thread);
+       g_hash_table_unref (mock_httpd->requests);
+       g_main_loop_unref (mock_httpd->loop);
+       g_free (mock_httpd);
+}
diff --git a/tests/mock-httpd.h b/tests/mock-httpd.h
new file mode 100644
index 0000000..25623f0
--- /dev/null
+++ b/tests/mock-httpd.h
@@ -0,0 +1,39 @@
+/* Copyright 2016 Red Hat, Inc. and/or its affiliates.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __GOVIRT_MOCK_HTTPD__
+#define __GOVIRT_MOCK_HTTPD__
+
+G_BEGIN_DECLS
+
+typedef struct GovirtMockHttpd GovirtMockHttpd;
+
+GovirtMockHttpd *govirt_mock_httpd_new (guint port);
+void govirt_mock_httpd_start (GovirtMockHttpd *mock_httpd);
+void govirt_mock_httpd_stop (GovirtMockHttpd *mock_httpd);
+void govirt_mock_httpd_disable_tls (GovirtMockHttpd *mock_httpd, gboolean disable_tls);
+void govirt_mock_httpd_add_request (GovirtMockHttpd *mock_httpd, const char *method,
+                                    const char *path, const char *content);
+
+G_END_DECLS
+
+#endif /* __GOVIRT_MOCK_HTTPD__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]