// Main unit test compilation unit // boost mandates that exactly one compilation unit contains the following two lines: #define BOOST_TEST_MODULE webserver_test #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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( www-data www-data 10 ../plugins localhost ip6-localhost localhost 127.0.0.1 [::1] static-files .
127.0.0.1
8080 http localhost
::1
8080 http localhost
)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: Fixture(){} ~Fixture(){} }; BOOST_FIXTURE_TEST_CASE(http_download, Fixture) { WebserverProcess serverProcess; }