tcp: a few tests

This commit is contained in:
Michele Caini 2017-01-27 17:57:21 +01:00
parent f218b2f134
commit 4d44d89158
3 changed files with 102 additions and 1 deletions

View File

@ -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 $<TARGET_OBJECTS:odr> 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 $<TARGET_OBJECTS:odr> uvw/timer.cpp)

View File

@ -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() {

92
test/uvw/tcp.cpp Normal file
View File

@ -0,0 +1,92 @@
#include <gtest/gtest.h>
#include <uvw.hpp>
TEST(Tcp, Functionalities) {
auto loop = uvw::Loop::getDefault();
auto handle = loop->resource<uvw::TcpHandle>();
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<uvw::TcpHandle>();
auto client = loop->resource<uvw::TcpHandle>();
server->on<uvw::ErrorEvent>([](const auto &, auto &) { FAIL(); });
client->on<uvw::ErrorEvent>([](const auto &, auto &) { FAIL(); });
server->once<uvw::ListenEvent>([](const uvw::ListenEvent &, uvw::TcpHandle &srv) {
std::shared_ptr<uvw::TcpHandle> socket = srv.loop().resource<uvw::TcpHandle>();
socket->on<uvw::ErrorEvent>([](const uvw::ErrorEvent &, uvw::TcpHandle &) { FAIL(); });
socket->on<uvw::CloseEvent>([&srv](const uvw::CloseEvent &, uvw::TcpHandle &) { srv.close(); });
socket->on<uvw::EndEvent>([](const uvw::EndEvent &, uvw::TcpHandle &sock) { sock.close(); });
srv.accept(*socket);
socket->read();
});
client->once<uvw::WriteEvent>([](const uvw::WriteEvent &, uvw::TcpHandle &handle) {
handle.close();
});
client->once<uvw::ConnectEvent>([](const uvw::ConnectEvent &, uvw::TcpHandle &handle) {
auto dataTryWrite = std::unique_ptr<char[]>(new char[1]{ 'a' });
handle.tryWrite(std::move(dataTryWrite), 1);
auto dataWrite = std::unique_ptr<char[]>(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<uvw::TcpHandle>();
auto client = loop->resource<uvw::TcpHandle>();
server->on<uvw::ErrorEvent>([](const auto &, auto &) { FAIL(); });
client->on<uvw::ErrorEvent>([](const auto &, auto &) { FAIL(); });
server->once<uvw::ListenEvent>([](const uvw::ListenEvent &, uvw::TcpHandle &srv) {
std::shared_ptr<uvw::TcpHandle> socket = srv.loop().resource<uvw::TcpHandle>();
socket->on<uvw::ErrorEvent>([](const uvw::ErrorEvent &, uvw::TcpHandle &) { FAIL(); });
socket->on<uvw::CloseEvent>([&srv](const uvw::CloseEvent &, uvw::TcpHandle &) { srv.close(); });
socket->on<uvw::EndEvent>([](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<uvw::ConnectEvent>([](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();
}