Mercurial > code
diff C++/tests/Socket/main.cpp @ 378:92457ea8f7e2
Socket: switch to more OO
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 19 Jun 2015 10:52:54 +0200 |
parents | 2c6a4f468499 |
children | 06b0f405c58f |
line wrap: on
line diff
--- a/C++/tests/Socket/main.cpp Thu Jun 18 14:24:01 2015 +0200 +++ b/C++/tests/Socket/main.cpp Fri Jun 19 10:52:54 2015 +0200 @@ -76,7 +76,7 @@ std::this_thread::sleep_for(100ms); m_tclient = std::thread([this] () { - m_client.connect(Internet("127.0.0.1", 16000, AF_INET)); + m_client.connect(std::make_unique<Internet>("127.0.0.1", 16000, AF_INET)); ASSERT_EQ(SocketState::Connected, m_client.state()); @@ -91,25 +91,20 @@ m_server.listen(); auto client = m_server.accept(); - auto msg = client.recv(512); + auto msg = client->recv(512); ASSERT_EQ("hello world", msg); - client.send(msg); - client.close(); - - m_server.close(); + client->send(msg); }); std::this_thread::sleep_for(100ms); m_tclient = std::thread([this] () { - m_client.connect(Internet("127.0.0.1", 16000, AF_INET)); + m_client.connect(std::make_unique<Internet>("127.0.0.1", 16000, AF_INET)); m_client.send("hello world"); ASSERT_EQ("hello world", m_client.recv(512)); - - m_client.close(); }); } @@ -178,25 +173,25 @@ bool m_added{false}; int m_flags{0}; - inline void set(const SocketTable &, Socket sc, int flags, bool add) noexcept + inline void set(const SocketTable &, const std::shared_ptr<Socket> &sc, int flags, bool add) noexcept { m_callcount ++; m_added = add; m_flags |= flags; } - inline void unset(const SocketTable &, Socket, int, bool) noexcept {} + inline void unset(const SocketTable &, const std::shared_ptr<Socket> &, int, bool) noexcept {} std::vector<SocketStatus> wait(const SocketTable &table, int ms) {} }; class TestBackendSetFail { public: - inline void set(const SocketTable &, Socket, int, bool) + inline void set(const SocketTable &, const std::shared_ptr<Socket> &, int, bool) { throw "fail"; } - inline void unset(const SocketTable &, Socket, int, bool) noexcept {} + inline void unset(const SocketTable &, const std::shared_ptr<Socket> &, int, bool) noexcept {} std::vector<SocketStatus> wait(const SocketTable &table, int ms) {} }; @@ -204,7 +199,7 @@ { SocketListenerBase<TestBackendSet> listener; - listener.set(Socket(0), SocketListener::Read); + listener.set(std::make_shared<Socket>(0), SocketListener::Read); ASSERT_EQ(1U, listener.size()); ASSERT_EQ(1, listener.backend().m_callcount); @@ -215,7 +210,7 @@ TEST(ListenerSet, readThenWrite) { SocketListenerBase<TestBackendSet> listener; - Socket sc(0); + std::shared_ptr<Socket> sc = std::make_shared<Socket>(0); listener.set(sc, SocketListener::Read); listener.set(sc, SocketListener::Write); @@ -229,7 +224,7 @@ TEST(ListenerSet, allOneShot) { SocketListenerBase<TestBackendSet> listener; - Socket sc(0); + std::shared_ptr<Socket> sc = std::make_shared<Socket>(0); listener.set(sc, SocketListener::Read | SocketListener::Write); @@ -242,7 +237,7 @@ TEST(ListenerSet, readTwice) { SocketListenerBase<TestBackendSet> listener; - Socket sc(0); + std::shared_ptr<Socket> sc = std::make_shared<Socket>(0); listener.set(sc, SocketListener::Read); listener.set(sc, SocketListener::Read); @@ -258,7 +253,7 @@ SocketListenerBase<TestBackendSetFail> listener; try { - listener.set(Socket(0), SocketListener::Read); + listener.set(std::make_shared<Socket>(0), SocketListener::Read); FAIL() << "exception expected"; } catch (...) { } @@ -277,13 +272,13 @@ int m_flags{0}; bool m_removal{false}; - inline void set(const SocketTable &, Socket, int flags, bool) noexcept + inline void set(const SocketTable &, const std::shared_ptr<Socket> &, int flags, bool) noexcept { m_isset = true; m_flags |= flags; } - inline void unset(const SocketTable &, Socket, int flags, bool remove) noexcept + inline void unset(const SocketTable &, const std::shared_ptr<Socket> &, int flags, bool remove) noexcept { m_isunset = true; m_flags &= ~(flags); @@ -295,9 +290,9 @@ class TestBackendUnsetFail { public: - inline void set(const SocketTable &, Socket, int, bool) noexcept {} + inline void set(const SocketTable &, const std::shared_ptr<Socket> &, int, bool) noexcept {} - inline void unset(const SocketTable &, Socket, int, bool) + inline void unset(const SocketTable &, const std::shared_ptr<Socket> &, int, bool) { throw "fail"; } @@ -308,7 +303,7 @@ TEST(ListenerUnsetRemove, unset) { SocketListenerBase<TestBackendUnset> listener; - Socket sc(0); + std::shared_ptr<Socket> sc = std::make_shared<Socket>(0); listener.set(sc, SocketListener::Read); listener.unset(sc, SocketListener::Read); @@ -323,7 +318,7 @@ TEST(ListenerUnsetRemove, unsetOne) { SocketListenerBase<TestBackendUnset> listener; - Socket sc(0); + std::shared_ptr<Socket> sc = std::make_shared<Socket>(0); listener.set(sc, SocketListener::Read | SocketListener::Write); listener.unset(sc, SocketListener::Read); @@ -338,7 +333,7 @@ TEST(ListenerUnsetRemove, unsetAll) { SocketListenerBase<TestBackendUnset> listener; - Socket sc(0); + std::shared_ptr<Socket> sc = std::make_shared<Socket>(0); listener.set(sc, SocketListener::Read | SocketListener::Write); listener.unset(sc, SocketListener::Read); @@ -354,7 +349,7 @@ TEST(ListenerUnsetRemove, remove) { SocketListenerBase<TestBackendUnset> listener; - Socket sc(0); + std::shared_ptr<Socket> sc = std::make_shared<Socket>(0); listener.set(sc, SocketListener::Read | SocketListener::Write); listener.remove(sc); @@ -369,7 +364,7 @@ TEST(ListenerUnsetRemove, failure) { SocketListenerBase<TestBackendUnsetFail> listener; - Socket sc(0); + std::shared_ptr<Socket> sc = std::make_shared<Socket>(0); listener.set(sc, SocketListener::Read | SocketListener::Write); @@ -390,18 +385,20 @@ class ListenerTest : public testing::Test { protected: SocketListenerBase<backend::Select> m_listener; - SocketTcp m_masterTcp{AF_INET, 0}; - SocketTcp m_clientTcp{AF_INET, 0}; + std::shared_ptr<SocketTcp> m_masterTcp; + std::shared_ptr<SocketTcp> m_clientTcp; std::thread m_tserver; std::thread m_tclient; public: ListenerTest() + : m_masterTcp{std::make_shared<SocketTcp>(AF_INET, 0)} + , m_clientTcp{std::make_shared<SocketTcp>(AF_INET, 0)} { - m_masterTcp.set(SOL_SOCKET, SO_REUSEADDR, 1); - m_masterTcp.bind(Internet("*", 16000, AF_INET)); - m_masterTcp.listen(); + m_masterTcp->set(SOL_SOCKET, SO_REUSEADDR, 1); + m_masterTcp->bind(Internet("*", 16000, AF_INET)); + m_masterTcp->listen(); } ~ListenerTest() @@ -421,8 +418,8 @@ try { m_listener.set(m_masterTcp, SocketListener::Read); m_listener.wait(); - m_masterTcp.accept(); - m_masterTcp.close(); + m_masterTcp->accept(); + m_masterTcp->close(); } catch (const std::exception &ex) { FAIL() << ex.what(); } @@ -431,7 +428,7 @@ std::this_thread::sleep_for(100ms); m_tclient = std::thread([this] () { - m_clientTcp.connect(Internet("127.0.0.1", 16000, AF_INET)); + m_clientTcp->connect(std::make_unique<Internet>("127.0.0.1", 16000, AF_INET)); }); } @@ -442,11 +439,9 @@ m_listener.set(m_masterTcp, SocketListener::Read); m_listener.wait(); - auto sc = m_masterTcp.accept(); + auto sc = m_masterTcp->accept(); - ASSERT_EQ("hello", sc.recv(512)); - - m_masterTcp.close(); + ASSERT_EQ("hello", sc->recv(512)); } catch (const std::exception &ex) { FAIL() << ex.what(); } @@ -455,8 +450,8 @@ std::this_thread::sleep_for(100ms); m_tclient = std::thread([this] () { - m_clientTcp.connect(Internet("127.0.0.1", 16000, AF_INET)); - m_clientTcp.send("hello"); + m_clientTcp->connect(std::make_unique<Internet>("127.0.0.1", 16000, AF_INET)); + m_clientTcp->send("hello"); }); } @@ -487,54 +482,6 @@ } }; -TEST_F(NonBlockingConnectTest, success) -{ - m_server.set(SOL_SOCKET, SO_REUSEADDR, 1); - m_server.bind(Internet("*", 16000, AF_INET)); - m_server.listen(); - - m_tserver = std::thread([this] () { - SocketTcp client = m_server.accept(); - - std::this_thread::sleep_for(100ms); - - m_server.close(); - client.close(); - }); - - std::this_thread::sleep_for(100ms); - - m_tclient = std::thread([this] () { - try { - m_client.waitConnect(Internet("127.0.0.1", 16000, AF_INET), 3000); - } catch (const SocketError &error) { - FAIL() << error.function() << ": " << error.what(); - } - - ASSERT_EQ(SocketState::Connected, m_client.state()); - - m_client.close(); - }); -} - -TEST_F(NonBlockingConnectTest, fail) -{ - /* - * /!\ If you find a way to test this locally please tell me /!\ - */ - m_tclient = std::thread([this] () { - try { - m_client.waitConnect(Internet("google.fr", 9000, AF_INET), 100); - - FAIL() << "Expected exception, got success"; - } catch (const SocketError &error) { - ASSERT_EQ(SocketError::Timeout, error.code()); - } - - m_client.close(); - }); -} - /* -------------------------------------------------------- * TCP accept * -------------------------------------------------------- */ @@ -564,62 +511,6 @@ } }; -TEST_F(TcpAcceptTest, blockingWaitSuccess) -{ - m_tserver = std::thread([this] () { - try { - m_server.waitAccept(3000).close(); - } catch (const SocketError &error) { - FAIL() << error.what(); - } - - m_server.close(); - }); - - std::this_thread::sleep_for(100ms); - - m_tclient = std::thread([this] () { - m_client.connect(Internet("127.0.0.1", 16000, AF_INET)); - m_client.close(); - }); -} - -TEST_F(TcpAcceptTest, nonBlockingWaitSuccess) -{ - m_tserver = std::thread([this] () { - try { - m_server.setBlockMode(false); - m_server.waitAccept(3000).close(); - } catch (const SocketError &error) { - FAIL() << error.what(); - } - - m_server.close(); - }); - - std::this_thread::sleep_for(100ms); - - m_tclient = std::thread([this] () { - m_client.connect(Internet("127.0.0.1", 16000, AF_INET)); - m_client.close(); - }); -} - -TEST_F(TcpAcceptTest, nonBlockingWaitFail) -{ - // No client, no accept - try { - m_server.setBlockMode(false); - m_server.waitAccept(100).close(); - - FAIL() << "Expected exception, got success"; - } catch (const SocketError &error) { - ASSERT_EQ(SocketError::Timeout, error.code()); - } - - m_server.close(); -} - /* -------------------------------------------------------- * TCP recv * -------------------------------------------------------- */ @@ -652,60 +543,15 @@ TEST_F(TcpRecvTest, blockingSuccess) { m_tserver = std::thread([this] () { - SocketTcp client = m_server.accept(); + auto client = m_server.accept(); - ASSERT_EQ("hello", client.recv(32)); - - client.close(); - m_server.close(); + ASSERT_EQ("hello", client->recv(32)); }); std::this_thread::sleep_for(100ms); m_tclient = std::thread([this] () { - m_client.connect(Internet("127.0.0.1", 16000, AF_INET)); - m_client.send("hello"); - m_client.close(); - }); -} - -TEST_F(TcpRecvTest, blockingWaitSuccess) -{ - m_tserver = std::thread([this] () { - SocketTcp client = m_server.accept(); - - ASSERT_EQ("hello", client.waitRecv(32, 3000)); - - client.close(); - m_server.close(); - }); - - std::this_thread::sleep_for(100ms); - - m_tclient = std::thread([this] () { - m_client.connect(Internet("127.0.0.1", 16000, AF_INET)); - m_client.send("hello"); - m_client.close(); - }); -} - -TEST_F(TcpRecvTest, nonBlockingWaitSuccess) -{ - m_tserver = std::thread([this] () { - SocketTcp client = m_server.accept(); - - client.setBlockMode(false); - - ASSERT_EQ("hello", client.waitRecv(32, 3000)); - - client.close(); - m_server.close(); - }); - - std::this_thread::sleep_for(100ms); - - m_tclient = std::thread([this] () { - m_client.connect(Internet("127.0.0.1", 16000, AF_INET)); + m_client.connect(std::make_unique<Internet>("127.0.0.1", 16000, AF_INET)); m_client.send("hello"); m_client.close(); }); @@ -723,7 +569,7 @@ TEST_F(SslTest, connect) { try { - client.connect(Internet("google.fr", 443, AF_INET)); + client.connect(std::make_unique<Internet>("google.fr", 443, AF_INET)); client.close(); } catch (const SocketError &error) { FAIL() << error.what(); @@ -733,7 +579,7 @@ TEST_F(SslTest, recv) { try { - client.connect(Internet("google.fr", 443, AF_INET)); + client.connect(std::make_unique<Internet>("google.fr", 443, AF_INET)); client.send("GET / HTTP/1.0\r\n\r\n"); std::string msg = client.recv(512);