aboutsummaryrefslogtreecommitdiff
path: root/src/testspdy/test_proxies.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/testspdy/test_proxies.c')
-rw-r--r--src/testspdy/test_proxies.c255
1 files changed, 255 insertions, 0 deletions
diff --git a/src/testspdy/test_proxies.c b/src/testspdy/test_proxies.c
new file mode 100644
index 00000000..44a0c1bd
--- /dev/null
+++ b/src/testspdy/test_proxies.c
@@ -0,0 +1,255 @@
+/*
+ This file is part of libmicrospdy
+ Copyright Copyright (C) 2013 Andrey Uzunov
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file test_proxies.c
+ * @brief test curl > mhd2spdylay > microspdy2http > mhd
+ * @author Andrey Uzunov
+ */
+
+#include "platform.h"
+#include "microspdy.h"
+#include "common.h"
+#include <sys/wait.h>
+#include <stdio.h> /* printf, stderr, fprintf */
+#include <sys/types.h> /* pid_t */
+#include <unistd.h> /* _exit, fork */
+#include <stdlib.h> /* exit */
+#include <errno.h> /* errno */
+#include <sys/wait.h> /* pid_t */
+#include "common.h"
+
+#ifdef _WIN32
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif /* !WIN32_LEAN_AND_MEAN */
+#include <windows.h>
+#endif
+
+#define EXPECTED_BODY "<html><head><title>libmicrohttpd demo</title></head><body>libmicrohttpd demo</body></html>"
+
+
+pid_t parent;
+ pid_t child_mhd;
+ pid_t child_spdy2http;
+ pid_t child_mhd2spdy;
+ pid_t child_curl;
+
+ uint16_t mhd_port;
+ uint16_t spdy2http_port;
+ uint16_t mhd2spdy_port;
+
+void
+killproc(int pid, const char *message)
+{
+ printf("%s\nkilling %i\n",message,pid);
+ kill(pid, SIGKILL);
+}
+
+
+void killchildren()
+{
+ if(0 != child_mhd)
+ killproc(child_mhd,"kill mhd\n");
+ if(0 != child_spdy2http)
+ killproc(child_spdy2http,"kill spdy2http\n");
+ if(0 != child_mhd2spdy)
+ killproc(child_mhd2spdy,"kill mhd2spdy\n");
+ if(0 != child_curl)
+ killproc(child_curl,"kill curl\n");
+}
+
+pid_t au_fork()
+{
+ pid_t child = fork();
+ if (child == -1)
+ {
+ killchildren();
+
+ killproc(parent,"fork failed\n");
+ }
+
+ return child;
+}
+
+
+int main()
+{
+ //pid_t child;
+ int childstatus;
+ pid_t wpid;
+
+ parent = getpid();
+ mhd_port = get_port(4000);
+ spdy2http_port = get_port(4100);
+ mhd2spdy_port = get_port(4200);
+
+ child_mhd = au_fork();
+ if (child_mhd == 0)
+ {
+ //run MHD
+ pid_t devnull;
+ char *port_s;
+
+ close(1);
+ devnull = open("/dev/null", O_WRONLY);
+ if (-1 == devnull)
+ abort();
+ if (1 != devnull)
+ {
+ dup2(devnull, 1);
+ close(devnull);
+ }
+ asprintf(&port_s, "%i", mhd_port);
+ execlp ("../examples/minimal_example", "minimal_example", port_s, NULL);
+ fprintf(stderr, "executing mhd failed\nFor this test 'make' must be run before 'make check'!\n");
+ //killchildren();
+ _exit(1);
+ }
+
+
+ child_spdy2http = au_fork();
+ if (child_spdy2http == 0)
+ {
+ //run spdy2http
+ pid_t devnull;
+ char *port_s;
+ //char *url;
+
+ close(1);
+ devnull = open("/dev/null", O_WRONLY);
+ if (-1 == devnull)
+ abort();
+ if (1 != devnull)
+ {
+ dup2(devnull, 1);
+ close(devnull);
+ }
+ //asprintf(&url, "127.0.0.1:%i", mhd_port);
+ asprintf(&port_s, "%i", spdy2http_port);
+ sleep(1);
+ execlp ("../spdy2http/microspdy2http", "microspdy2http", "-v4rtT", "10", "-p", port_s, NULL);
+ fprintf(stderr, "executing microspdy2http failed\n");
+ //killchildren();
+ _exit(1);
+ }
+
+ child_mhd2spdy = au_fork();
+ if (child_mhd2spdy == 0)
+ {
+ //run MHD2sdpy
+ pid_t devnull;
+ char *port_s;
+ char *url;
+
+ close(1);
+ devnull = open("/dev/null", O_WRONLY);
+ if (-1 == devnull)
+ abort();
+ if (1 != devnull)
+ {
+ dup2(devnull, 1);
+ close(devnull);
+ }
+ asprintf(&url, "http://127.0.0.1:%i", spdy2http_port);
+ asprintf(&port_s, "%i", mhd2spdy_port);
+ sleep(2);
+ execlp ("../examples/mhd2spdy", "mhd2spdy", "-vosb", url, "-p", port_s, NULL);
+ fprintf(stderr, "executing mhd2spdy failed\n");
+ //killchildren();
+ _exit(1);
+ }
+
+ child_curl = au_fork();
+ if (child_curl == 0)
+ {
+ //run curl
+ FILE *p;
+ pid_t devnull;
+ char *cmd;
+ unsigned int i;
+ int retc;
+ char buf[strlen(EXPECTED_BODY) + 1];
+
+ close(1);
+ devnull = open("/dev/null", O_WRONLY);
+ if (-1 == devnull)
+ abort ();
+ if (1 != devnull)
+ {
+ dup2(devnull, 1);
+ close(devnull);
+ }
+
+ asprintf (&cmd, "curl --proxy http://127.0.0.1:%i http://127.0.0.1:%i/", mhd2spdy_port, mhd_port);
+ sleep(3);
+ p = popen(cmd, "r");
+ if (p != NULL)
+ {
+ for (i = 0; i < strlen(EXPECTED_BODY) && !feof(p); i++)
+ {
+ retc = fgetc (p);
+ if (EOF == retc)
+ abort (); /* what did feof(p) do there!? */
+ buf[i] = (char) retc;
+ }
+
+ pclose(p);
+ buf[i] = 0;
+ _exit(strcmp(EXPECTED_BODY, buf));
+ }
+ fprintf(stderr, "executing curl failed\n");
+ //killchildren();
+ _exit(1);
+ }
+
+ do
+ {
+ wpid = waitpid(child_mhd,&childstatus,WNOHANG);
+ if(wpid == child_mhd)
+ {
+ fprintf(stderr, "mhd died unexpectedly\n");
+ killchildren();
+ return 1;
+ }
+
+ wpid = waitpid(child_spdy2http,&childstatus,WNOHANG);
+ if(wpid == child_spdy2http)
+ {
+ fprintf(stderr, "spdy2http died unexpectedly\n");
+ killchildren();
+ return 1;
+ }
+
+ wpid = waitpid(child_mhd2spdy,&childstatus,WNOHANG);
+ if(wpid == child_mhd2spdy)
+ {
+ fprintf(stderr, "mhd2spdy died unexpectedly\n");
+ killchildren();
+ return 1;
+ }
+
+ if(waitpid(child_curl,&childstatus,WNOHANG) == child_curl)
+ {
+ killchildren();
+ return WEXITSTATUS(childstatus);
+ }
+ sleep(1);
+ }
+ while(true);
+}