summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--tests/Makefile2
-rw-r--r--tests/test-webserver.cpp103
2 files changed, 104 insertions, 1 deletions
diff --git a/tests/Makefile b/tests/Makefile
index 338800a..d4d047c 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -13,7 +13,7 @@ CXXFLAGS+=--coverage
LDFLAGS+=--coverage
endif
-CXXFLAGS+= -I. -fPIE
+CXXFLAGS+= -I. -I.. -fPIE
CXXTESTFLAGS=
diff --git a/tests/test-webserver.cpp b/tests/test-webserver.cpp
index 1668c60..473e67d 100644
--- a/tests/test-webserver.cpp
+++ b/tests/test-webserver.cpp
@@ -10,12 +10,113 @@
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
+#include <chrono>
+#include <filesystem>
#include <sstream>
#include <string>
+#include <thread>
+
+#include <unistd.h>
+#include <signal.h>
+#include <sys/wait.h>
+
+#include <libreichwein/file.h>
+
+#include "webserver.h"
using namespace std::string_literals;
+namespace fs = std::filesystem;
namespace pt = boost::property_tree;
+class WebserverProcess
+{
+public:
+ const fs::path testConfigFilename{"./webserver.conf"};
+ WebserverProcess(): m_pid{}
+ {
+ File::setFile(testConfigFilename, R"CONFIG(
+<webserver>
+ <user>www-data</user>
+ <group>www-data</group>
+ <threads>10</threads>
+ <plugin-directory>../plugins</plugin-directory>
+ <sites>
+ <site>
+ <name>localhost</name>
+ <host>ip6-localhost</host>
+ <host>localhost</host>
+ <host>127.0.0.1</host>
+ <host>[::1]</host>
+ <path requested="/">
+ <plugin>static-files</plugin>
+ <target>.</target>
+ </path>
+ </site>
+ </sites>
+ <sockets>
+ <socket>
+ <address>127.0.0.1</address>
+ <port>8080</port>
+ <protocol>http</protocol>
+ <site>localhost</site>
+ </socket>
+ <socket>
+ <address>::1</address>
+ <port>8080</port>
+ <protocol>http</protocol>
+ <site>localhost</site>
+ </socket>
+ </sockets>
+</webserver>
+
+)CONFIG");
+
+ start();
+ }
+
+ ~WebserverProcess()
+ {
+ stop();
+ fs::remove(testConfigFilename);
+ }
+
+ void start()
+ {
+ if (m_pid != 0)
+ throw std::runtime_error("Process already running, so it can't be started");
+
+ m_pid = fork();
+ if (m_pid < 0)
+ throw std::runtime_error("Fork unsuccessful.");
+
+ if (m_pid == 0) { // child process branch
+ char* argv[] = {(char*)"webserver", (char*)"-c", (char*)"./webserver.conf"};
+ webserver(sizeof(argv) / sizeof(char*), argv);
+ exit(0);
+ }
+
+ // wait for server to start up
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ }
+
+ void stop()
+ {
+ if (m_pid == 0)
+ throw std::runtime_error("Process not running, so it can't be stopped");
+
+ if (kill(m_pid, SIGTERM) != 0)
+ throw std::runtime_error("Unable to kill process");
+
+ if (int result = waitpid(m_pid, NULL, 0); result != m_pid)
+ throw std::runtime_error("waitpid returned "s + std::to_string(result));
+
+ m_pid = 0;
+ }
+
+private:
+ pid_t m_pid;
+};
+
class Fixture
{
public:
@@ -25,4 +126,6 @@ public:
BOOST_FIXTURE_TEST_CASE(http_download, Fixture)
{
+ WebserverProcess serverProcess;
}
+