diff --git a/CMakeLists.txt b/CMakeLists.txt index ed87eef..c611bf7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -188,6 +188,11 @@ add_executable(test_arena tests/test_arena.cpp) target_link_libraries(test_arena doctest_impl weaseldb_sources_debug) target_compile_options(test_arena PRIVATE -UNDEBUG) +add_executable(test_server tests/test_server.cpp) +target_link_libraries(test_server doctest_impl weaseldb_sources_debug) +target_compile_options(test_server PRIVATE -UNDEBUG) +add_test(NAME test_server COMMAND test_server) + add_executable( test_commit_request tests/test_commit_request.cpp tests/nlohmann_reference_parser.cpp diff --git a/tests/test_server.cpp b/tests/test_server.cpp new file mode 100644 index 0000000..4c6fd2a --- /dev/null +++ b/tests/test_server.cpp @@ -0,0 +1,61 @@ +#include "config.hpp" +#include "connection.hpp" +#include "connection_handler.hpp" +#include "server.hpp" + +#include +#include +#include +#include + +// Helper to copy a string into arena memory +static std::string_view arena_copy_string(std::string_view str, Arena &arena) { + if (str.empty()) { + return std::string_view{}; + } + char *copied = arena.allocate(str.size()); + std::memcpy(copied, str.data(), str.size()); + return std::string_view(copied, str.size()); +} + +struct EchoHandler : ConnectionHandler { + std::future f; + void on_data_arrived(std::string_view data, Connection &conn) override { + Arena arena; + auto reply = std::span{arena.allocate(1), 1}; + reply[0] = arena_copy_string(data, arena); + f = std::async(std::launch::async, [wconn = conn.get_weak_ref(), reply, + arena = std::move(arena)]() mutable { + if (auto conn = wconn.lock()) { + conn->append_message(reply, std::move(arena)); + } else { + REQUIRE(false); + } + }); + } +}; + +TEST_CASE("Echo test") { + EchoHandler handler; + weaseldb::Config config; + config.server.io_threads = 1; + auto server = Server::create(config, handler, {}); + int fd = server->create_local_connection(); + + auto runThread = std::thread{[&]() { server->run(); }}; + + SUBCASE("writes hello back") { + int w = write(fd, "hello", 5); + REQUIRE(w == 5); + char buf[6]; + buf[5] = 0; + int r = read(fd, buf, 5); + REQUIRE(r == 5); + CHECK(std::string(buf) == "hello"); + } + + close(fd); + + server->shutdown(); + runThread.join(); +}