#pragma once #include #include #include #include #include #include #include #include #include /** * @brief Simple HTTP server for use in unit tests */ class TestHttpServer { public: using RequestHandler = std::function>( boost::beast::http::request )>; /** * @brief Construct a new TestHttpServer * * @param context boost::asio::io_context to use for networking * @param host host to bind to */ TestHttpServer(boost::asio::io_context& context, std::string host); /** * @brief Accept a new connection * * @param yield boost::asio::yield_context to use for networking * @return Either a socket with the new connection or an error code */ std::expected accept(boost::asio::yield_context yield); /** * @brief Start the server * * @note This method schedules to process only one request * * @param handler RequestHandler to use for incoming request * @param allowToFail if true, the server will not throw an exception if the request fails */ void handleRequest(RequestHandler handler, bool allowToFail = false); /** * @brief Return the port HTTP server is connected to * * @return string port number */ std::string port() const; private: boost::asio::ip::tcp::acceptor acceptor_; };