diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f905e300..5aa508c0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -45,6 +45,7 @@ set(TARGET_LOOP loop) set(TARGET_PREPARE prepare) set(TARGET_RESOURCE resource) set(TARGET_SIGNAL signal) +set(TARGET_TCP tcp) set(TARGET_TIMER timer) set(TARGET_UTIL util) set(TARGET_WORK work) @@ -166,6 +167,14 @@ target_include_directories(${TARGET_SIGNAL} PRIVATE ${COMMON_INCLUDE_DIRS}) target_link_libraries(${TARGET_SIGNAL} PRIVATE ${COMMON_LINK_LIBS}) add_test(NAME ${TARGET_SIGNAL} COMMAND ${TARGET_SIGNAL}) +# Test TARGET_TCP + +set(TARGET_TCP_SOURCES $ uvw/tcp.cpp) +add_executable(${TARGET_TCP} ${TARGET_TCP_SOURCES}) +target_include_directories(${TARGET_TCP} PRIVATE ${COMMON_INCLUDE_DIRS}) +target_link_libraries(${TARGET_TCP} PRIVATE ${COMMON_LINK_LIBS}) +add_test(NAME ${TARGET_TCP} COMMAND ${TARGET_TCP}) + # Test TARGET_TIMER set(TARGET_TIMER_SOURCES $ uvw/timer.cpp) diff --git a/test/main.cpp b/test/main.cpp index 9d9df5c4..0e90b989 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -86,7 +86,7 @@ void conn(uvw::Loop &loop) { std::cout << "close" << std::endl; }); - tcp->connect(std::string{"127.0.0.1"}, 4242); + tcp->connect("127.0.0.1", 4242); } void g() { diff --git a/test/uvw/tcp.cpp b/test/uvw/tcp.cpp new file mode 100644 index 00000000..791651b9 --- /dev/null +++ b/test/uvw/tcp.cpp @@ -0,0 +1,92 @@ +#include +#include + + +TEST(Tcp, Functionalities) { + auto loop = uvw::Loop::getDefault(); + auto handle = loop->resource(); + + ASSERT_TRUE(handle->noDelay(true)); + ASSERT_TRUE(handle->keepAlive(true, uvw::TcpHandle::Time{128})); + ASSERT_TRUE(handle->simultaneousAccepts()); + + handle->close(); + loop->run(); +} + + +TEST(Tcp, ReadWrite) { + auto loop = uvw::Loop::getDefault(); + auto server = loop->resource(); + auto client = loop->resource(); + + server->on([](const auto &, auto &) { FAIL(); }); + client->on([](const auto &, auto &) { FAIL(); }); + + server->once([](const uvw::ListenEvent &, uvw::TcpHandle &srv) { + std::shared_ptr socket = srv.loop().resource(); + + socket->on([](const uvw::ErrorEvent &, uvw::TcpHandle &) { FAIL(); }); + socket->on([&srv](const uvw::CloseEvent &, uvw::TcpHandle &) { srv.close(); }); + socket->on([](const uvw::EndEvent &, uvw::TcpHandle &sock) { sock.close(); }); + + srv.accept(*socket); + socket->read(); + }); + + client->once([](const uvw::WriteEvent &, uvw::TcpHandle &handle) { + handle.close(); + }); + + client->once([](const uvw::ConnectEvent &, uvw::TcpHandle &handle) { + auto dataTryWrite = std::unique_ptr(new char[1]{ 'a' }); + handle.tryWrite(std::move(dataTryWrite), 1); + auto dataWrite = std::unique_ptr(new char[2]{ 'b', 'c' }); + handle.write(std::move(dataWrite), 2); + }); + + server->bind("127.0.0.1", 4242); + server->listen(); + client->connect("127.0.0.1", 4242); + + loop->run(); +} + + +TEST(Tcp, SockPeer) { + auto loop = uvw::Loop::getDefault(); + auto server = loop->resource(); + auto client = loop->resource(); + + server->on([](const auto &, auto &) { FAIL(); }); + client->on([](const auto &, auto &) { FAIL(); }); + + server->once([](const uvw::ListenEvent &, uvw::TcpHandle &srv) { + std::shared_ptr socket = srv.loop().resource(); + + socket->on([](const uvw::ErrorEvent &, uvw::TcpHandle &) { FAIL(); }); + socket->on([&srv](const uvw::CloseEvent &, uvw::TcpHandle &) { srv.close(); }); + socket->on([](const uvw::EndEvent &, uvw::TcpHandle &sock) { sock.close(); }); + + srv.accept(*socket); + socket->read(); + + uvw::Addr local = srv.sock(); + uvw::Addr remote = socket->peer(); + + ASSERT_EQ(local.ip, "127.0.0.1"); + ASSERT_EQ(remote.ip, "127.0.0.1"); + ASSERT_EQ(local.port, decltype(local.port){4242}); + ASSERT_NE(remote.port, decltype(remote.port){0}); + }); + + client->once([](const uvw::ConnectEvent &, uvw::TcpHandle &handle) { + handle.close(); + }); + + server->bind("127.0.0.1", 4242); + server->listen(); + client->connect("127.0.0.1", 4242); + + loop->run(); +}