#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(); }