7#include <mp/test/foo.capnp.h>
8#include <mp/test/foo.capnp.proxy.h>
12#include <condition_variable>
19#include <kj/function.h>
44 explicit ClientSetup(
int fd)
60 std::promise<std::unique_ptr<ProxyClient<messages::FooInterface>>>
client_promise;
61 std::unique_ptr<ProxyClient<messages::FooInterface>>
client;
74 explicit ListenSetup(std::optional<size_t> max_connections = std::nullopt,
78 loop.testing_hook_disconnected = [&] {
83 loop.testing_hook_connected = [&] {
106 Lock lock(counter_mutex);
112 Lock lock(counter_mutex);
118 Lock lock(counter_mutex);
128 Lock lock(counter_mutex);
129 const auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(5);
148KJ_TEST(
"ListenConnections accepts incoming connections")
164 ListenSetup server(1);
179 KJ_EXPECT(server.DisconnectedCount() == 0);
181 server.WaitForDisconnectedCount(1);
182 server.WaitForConnectedCount(2);
186 KJ_EXPECT(server.DisconnectedCount() == 1);
188 server.WaitForDisconnectedCount(2);
190 KJ_EXPECT(server.DisconnectedCount() == 2);
191 auto client3 = std::make_unique<ClientSetup>(server.listener.MakeConnectedSocket());
192 server.WaitForConnectedCount(3);
196KJ_TEST(
"ListenConnections accepts multiple connections")
201 ListenSetup server(2);
204 auto client1 = std::make_unique<ClientSetup>(server.listener.MakeConnectedSocket());
205 auto client2 = std::make_unique<ClientSetup>(server.listener.MakeConnectedSocket());
206 server.WaitForConnectedCount(2);
211 auto client3 = std::make_unique<ClientSetup>(server.listener.MakeConnectedSocket());
215 (**server.m_loop_ref).sync([] {});
218 KJ_EXPECT(server.DisconnectedCount() == 0);
220 server.WaitForDisconnectedCount(1);
221 server.WaitForConnectedCount(3);
226KJ_TEST(
"ListenConnections handles a client that disconnects before being accepted")
245 int fd = server.listener.MakeConnectedSocket();
253 std::this_thread::sleep_for(std::chrono::milliseconds(1));
std::optional< mp::EventLoopRef > m_loop_ref
Reference to the same EventLoop.
std::unique_ptr< ProxyClient< messages::FooInterface > > client
std::promise< std::unique_ptr< ProxyClient< messages::FooInterface > > > client_promise
std::condition_variable counter_cv
std::thread thread
Thread variable should be after other struct members so the thread does not start until the other mem...
std::promise< void > ready_promise
void DefaultLogHandler(LogMessage log)
Default event loop log handler used by tests.
KJ_TEST("SpawnProcess does not run callback in child")
Functions to serialize / deserialize common bitcoin types.
Stream MakeStream(EventLoop &loop, SocketId socket)
Wrap a socket file descriptor as an async stream, taking ownership of the fd.
std::function< void(LogMessage)> LogFn
void ListenConnections(EventLoop &loop, SocketId fd, InitImpl &init, std::optional< size_t > max_connections=std::nullopt)
Given listening socket identifier and an init object, handle incoming connections and requests by cal...
Log level
The severity level of this message.
std::string message
Message to be logged.
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.