Files
weaseldb/tests/test_server.cpp
2025-09-14 12:56:22 -04:00

62 lines
1.6 KiB
C++

#include "config.hpp"
#include "connection.hpp"
#include "connection_handler.hpp"
#include "server.hpp"
#include <doctest/doctest.h>
#include <future>
#include <string_view>
#include <thread>
// 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<char>(str.size());
std::memcpy(copied, str.data(), str.size());
return std::string_view(copied, str.size());
}
struct EchoHandler : ConnectionHandler {
std::future<void> f;
void on_data_arrived(std::string_view data, Connection &conn) override {
Arena arena;
auto reply = std::span{arena.allocate<std::string_view>(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();
}