diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2016-04-13 15:39:12 +0200 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2016-04-13 15:46:17 +0200 |
commit | f573f1a40bc3f94fc83c72e291511cdabf2311e5 (patch) | |
tree | 99c5652bdda6daa33997a58e9b7352dfc2bce1c6 | |
parent | 505faa6c17031a6a04cb847d492cd332b8efeab0 (diff) |
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.
-rw-r--r-- | Makefile.am | 3 | ||||
-rw-r--r-- | configure.ac | 3 | ||||
-rw-r--r-- | tests/Makefile.am | 17 | ||||
-rw-r--r-- | tests/https-cert/ca-cert.pem | 32 | ||||
-rw-r--r-- | tests/https-cert/ca-key.pem | 54 | ||||
-rw-r--r-- | tests/https-cert/server-cert.pem | 30 | ||||
-rw-r--r-- | tests/https-cert/server-key.csr | 27 | ||||
-rw-r--r-- | tests/https-cert/server-key.pem | 51 | ||||
-rw-r--r-- | tests/mock-httpd.c | 252 | ||||
-rw-r--r-- | 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----- +MIIJKAIBAAKCAgEAt6OkS5HhwwFLJWDmuRSOYCXwQP6vOlToc7rHvK0+shkspUb1 +KYks3iEw9djLQdxf1E5k+oDlifDKAMgd/AxkJn8kZ4f1i3183gFdad+UlMFwCliR +eb3opdtalR6Bef1CDE91+wsN1S4OLXYlVY/EO/sV4YdhkhReJiSQzUS+s1T9Nxa5 +7YiuhJ6KYhS5SKkoFDQ7OmyvXM4cSnqOy7h4xBg8fBv9jxI24DNsF1qPg3XVQg3F +DmHLEdRTlOWzq39qxzHPrTcFCboS1EaKHIX5DwlNR/L+x/JVqP99t2d/7lp2u8rv +eHsV0sLCoGK6ehbL6CHMXZQmmRQaVL/xueVIUvUhpwCSBXdxRNHpSizPkM4P7/0i +sgvJ8okElwKv2G46rJjt/AuQTOXVJDEfajHe/703E5r3iJkkG4Jd3uVeZIEigic9 +PEyervYk2VrWXIIZltfgaCUZYiJNRQ6xbG6RrKLYgSfVfpr8urFWFKs+j8dZHc8/ +GPi1tjTtaaYG0kXg3CGEh3Ww3ym0xjxrt2Qr62nMD+lH0loK8wdJbzsHgmLOGnUR +UWN55XKFpWcrP9rYHSl0d70u6YioMpIM2UClfRPQnLvX+/H3yBshAPQldBgseXJ9 +zlG1ho5fXaIg5u4mtNg+GccerNOFypdJJc97IdYFmyhmww/6LcpMKk+e6wECAwEA +AQKCAgB3dqNI7gwaGdtS46j0uiSs88FJ5uUDY30c3GNXoLRqk+nxUynl7XEcyCbb +qD8CB2Tn7l/Ofs/UXqpqu8SV1VHJoWiDWXUpW2dB3U1xtJsp8nT6pgdtVVflnb9d +xsygGVtAOukbeWN0TVO3y2YaNT6JbpwbbUDSESH2Wk9A2fndG+rmTYiCuCof6CtK +BwVJ+ZEzI49sQIwMKaFJ6lS+vrEBkGq4qlTXIBhG3ezxfF5kPOGQ6PhKlN/QJ3qA +ILYzWN6T2xmpK2PBoiThp0ntqFIPsBNwPOn2FPYYzKxyBYi5/GvFWw1SKXBW/ZAz +WkbJac8YofQa5Gf/qY4/l+ae8kOLZ/3kQ1F1wV09f+uiMHE9a/YVnz/bXYRTQF8+ +cnw2TZ0vMHrUBGZYqCyXDfF3z+yjOb+DRutGlVMFCdV7rCHP2DWQOeHvHiFwRpBm +2dDFfd/YVdSRa2b/WfWVCs3ikUdtPusaBExbrh89DMxc5cJUDFh6TdG0zPM1MYZ4 +Y33ovbHqVqkeehmAvmeD56T907w4A/6s0MmzgHwHPptX7/yaDKzbGDqXrLYwHVwu +jz/WA9YZ/1ACKo3k2/PO06OtuLgjjU7q1kLPhZKz91XVGPk6Rh7WJ5bShAvZH58O +n7jVEcH1a3J6UDWNxqbMGgAeab/o7y+LZmuGNsZcZxGbFsR9gQKCAQEA9HOv6k57 +QgPkcJiPir4t0g/O9fY5BIOy1CUMmMe1WpNINz4Huv1DixPa1RjCHaxpGq4S7Bde +PlsrN+A+GEu8rlRXawD0LQEXB11wkHMTBBBaOPmalcu9dp36lmMpuwI8PsK7PLMs +4Yrc9/A8urxScXw0OuTafsVl4pKjogZXEzYOhch2KJ5wUJanHyzBSiMwVpPo7rmV +mcpyNpH3RxaIBCACzT3wWbEpOJ1uiEw5RhfWBiI8KDK+5OC3P+GXF5JCgz3QfwTM +l6A+sxTs0feQ7qCRTy8vT0EfZu5oz5OmKZOc2rJTs/743qaw9G9Lb8wtLAIzOifT +R2CO0xnMgT35WQKCAQEAwFCCEvmXwxsSgWvPId+JjPp8uOOPrnfg1GgIQnoFHWiO +IKhNL/quelHYiroD7codEEI9A8PsPU4Cpd2VpZb5FuzP0SePU1whAXL8+5RrvRmw +KcIq3ADmZCcBKdsn/Gh6YWq7iL2P7dwCIsgzXWByZmV9NO1pusCWnn6xiklynRzd +xO3vWAAgPIpMawAGOcYtY6ovy/TzQOvaHKKhHMgGxIZLmdAW0EXduPl+/T11Wxgg +Sq/0o+l+69SUPk2AICEMup1jmCtC/2UcInFvA6ZhT4+anbLu7PGtA8XZDXK4TckU +eaxzwnJl+sbND4t9lFqTM/KymqHdVe7Onxv35Nah6QKCAQB+8FQ5Z+e5sCvADHj9 +oyRIIM1oDCQvo/QJFfQkohAaqMCnbx60iy+32OeaIPEsV4t8v0g0MS5PUyhuK5QT +KcEhBcsfVa92b0p2GJ+LYzZMtfEkBPmxL8uC/SZTUcspwU9nh9eS/bggput4FNh0 +X7awF79Hle+gRQFTVrKCQKiW4UtJTX+OODg6oQDHv4Xf6cYAL26WCOkWo3oLvGCc +Gacn/Td3POLCsKynKZlsTaiwLVCGfuCePzvBvq9qDMtZAipn3IGYc/WKBzyH4iXY +IqawQ9ExPV9j2H1mBgeHQzTWAkFBj7jHj2/MruLVC7Ywp+YNJFdVq7ibKBkCpjL8 +KiKBAoIBAFHJ64fmXoS7nsMr9ouRZg5u+Vwoa5LnqNas59Zdzo8TSF7bNPiSxGGB +LXbSZZlbu8COaySOzonEA5xHAL3L12PIkxmAmZP6Oo9DOBRGqwthQWqBCXlHaLRv +Yi9K5VaTmHiVy+v7spqWVtI0EqRDwGOMBhPcZHroLSZ6+0a0tenbvPVju8bRRuR4 +bMeU2xD3F5aramhzZIDXzYsgHyT+bOJnuv9PYGRzUji44ykQWjjDqfgZnRGY3EGv +xtw4WaVQaPl0tkahH30+oxiC5ZPHztrnV/p5fuOGZO6V1hnCEGAEhJC6pwCrZnOg +2NUjneTaIICXVx4seNVzGqzQWD0aiwECggEBALUDifRsfDqo/jGHJwoMVNDLrr4d +dGEz46ydwDGopUGkdEzJ9ToKjzctw1slEddN+FKZs09GB/NXyXCqVzianHlg6GoC +1+nqt4R38vsOiAwdAPsdfV+ln2jXDfnbDSFzpaqk88zfRbPXReH16cGi1Gyz53sU +Whu6/zhHFizKJkdpLd6+W8kg8XYoY5VHYPV6wdMNMk7108GnnVZ7p+2VlZcn+sjU +BosFjWnDA0suxXmL+U7t9RiGVp+4l7jq3mpjYsYF6PoRpOxNHUy7XROkS4E+V4oU +HwI0qizD+pjiCOOQaijNJGTU2hJytwO/Lh2mVCVMqDIpM53qYhrUJH+b6RQ= +-----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__ */ |