// Connect - Disconnect from Server in back thread TEST_F(WSClientServerConnectionTest, DisconnectFromServerBT) { MockHandler ch; WSClient cl(ch); MockHandler sh; WSServer sv(sh); Error e = sv.Start(TEST_ADDR, TEST_PORT); ASSERT_EQ(LNR_OK, e.Code()); WSSocket cs = cl.CreateSocket(TEST_ADDR, TEST_PORT); { InSequence dummy; EXPECT_CALL(sh, OnConnectMock(_)).WillOnce(WithArg<0>(Disconnect())); EXPECT_CALL(sh, OnDisconnectMock(Eq(ByRef(sh.s_)), Error(LNR_OK))).WillOnce(Assign(&srv_finished, true)); } { InSequence dummy; // never called OnConnect: fail handshake EXPECT_CALL(ch, OnDisconnectMock(cs, Error(LNR_ECONNRESET))).WillOnce(Assign(&cli_finished, true));; } e = cs.Connect(); ASSERT_EQ(LNR_OK, e.Code()); WAIT_TO_FINISH_CALLBACK(); }
// Connect - Disconnect from other thread, and check certificate: must not SEGV TEST_F(WSClientServerConnectionTest, OnConnectAndDisconnectFromOtherTherad) { ThreadMockHandler ch; WSClient cl(ch); MockHandler sh; WSServer sv(sh); { InSequence dummy; EXPECT_CALL(sh, OnConnectMock(_)); EXPECT_CALL(sh, OnDisconnectMock(Eq(ByRef(sh.s_)), Error(LNR_ECONNRESET))).WillOnce(Assign(&srv_finished, true)); } Error e = sv.Start(TEST_ADDR, TEST_PORT); ASSERT_EQ(LNR_OK, e.Code()); WSSocket cs = cl.CreateSocket(TEST_ADDR, TEST_PORT); { InSequence dummy; EXPECT_CALL(ch, OnConnectMock(cs)).WillOnce(WithArg<0>(DisconnectFromOtherThread_WS())); EXPECT_CALL(ch, OnDisconnectMock(cs, Error(LNR_OK))).WillOnce(Assign(&cli_finished, true)); } e = cs.Connect(); ASSERT_EQ(LNR_OK, e.Code()); WAIT_TO_FINISH_CALLBACK(); ASSERT_NE(global::gs_, cs); EXPECT_CALL(sh, OnDisconnectMock(_, _)).Times(::testing::AtLeast(0)); EXPECT_CALL(ch, OnDisconnectMock(_, _)).Times(::testing::AtLeast(0)); }
// Connect - Disconnect from Client in front thread TEST_F(WSClientServerConnectionTest, DisconnectFromClientFT) { MockHandler ch; WSClient cl(ch); MockHandler sh; WSServer sv(sh); Error e = sv.Start(TEST_ADDR, TEST_PORT); ASSERT_EQ(LNR_OK, e.Code()); WSSocket cs = cl.CreateSocket(TEST_ADDR, TEST_PORT); EXPECT_CALL(sh, OnConnectMock(_)).WillOnce(Assign(&srv_finished, true)); EXPECT_CALL(ch, OnConnectMock(cs)).WillOnce(Assign(&cli_finished, true)); e = cs.Connect(); ASSERT_EQ(LNR_OK, e.Code()); WAIT_TO_FINISH_CALLBACK(); EXPECT_CALL(sh, OnDisconnectMock(sh.s_, Error(LNR_ECONNRESET))).WillOnce(Assign(&srv_finished, true)); EXPECT_CALL(ch, OnDisconnectMock(cs, Error(LNR_OK))).WillOnce(Assign(&cli_finished, true)); e = cs.Disconnect(); ASSERT_EQ(LNR_OK, e.Code()); WAIT_TO_FINISH_CALLBACK(); }
// Connect EINVAL TEST_F(SSLClientServerConnectionTest, ConnectEinval) { MockHandler ch; SSLContext context(SSLContext::TLSv1_1); context.SetCertificate(std::string(CLIENT_CERT)); context.SetPrivateKey(std::string(CLIENT_PKEY)); context.SetCAFile(std::string(CA_CERT)); context.SetCiphers(std::string(CIPHER_LIST)); context.SetVerifyMode(SSLContext::VERIFY_PEER); SSLClient cl(ch, context); MockHandler sh; SSLContext server_context(SSLContext::TLSv1_1); server_context.SetCertificate(std::string(SERVER_CERT)); server_context.SetPrivateKey(std::string(SERVER_PKEY)); server_context.SetCAFile(std::string(CA_CERT)); server_context.SetCiphers(std::string(CIPHER_LIST)); server_context.SetVerifyMode(SSLContext::VERIFY_PEER); SSLServer sv(sh, server_context); Error e = sv.Start(TEST_ADDR, TEST_PORT); ASSERT_EQ(LNR_OK, e.Code()); SSLSocket cs = cl.CreateSocket(TEST_ADDR, TEST_PORT); EXPECT_CALL(sh, OnConnectMock(_)).WillOnce(Assign(&srv_finished, true)); EXPECT_CALL(ch, OnConnectMock(cs)).WillOnce(Assign(&cli_finished, true)); e = cs.Connect(); ASSERT_EQ(LNR_OK, e.Code()); WAIT_TO_FINISH_CALLBACK(); e = sh.s_.Connect(); ASSERT_EQ(LNR_EINVAL, e.Code()); }
// Connect - Disconnect delayed Socket Destruct: must not SEGV TEST_F(SSLClientServerConnectionTest, DelayedSocketDestruct) { DelayedMockHandler ch; SSLContext context(SSLContext::TLSv1_1); context.SetCertificate(std::string(CLIENT_CERT)); context.SetPrivateKey(std::string(CLIENT_PKEY)); context.SetCAFile(std::string(CA_CERT)); context.SetCiphers(std::string(CIPHER_LIST)); context.SetVerifyMode(SSLContext::VERIFY_PEER); SSLClient cl(ch, context); MockHandler sh; SSLContext server_context(SSLContext::TLSv1_1); server_context.SetCertificate(std::string(SERVER_CERT)); server_context.SetPrivateKey(std::string(SERVER_PKEY)); server_context.SetCAFile(std::string(CA_CERT)); server_context.SetCiphers(std::string(CIPHER_LIST)); server_context.SetVerifyMode(SSLContext::VERIFY_PEER); SSLServer sv(sh, server_context); { InSequence dummy; EXPECT_CALL(sh, OnConnectMock(_)).WillOnce(WithArg<0>(Disconnect())); EXPECT_CALL(sh, OnDisconnectMock(Eq(ByRef(sh.s_)), Error(LNR_OK))).WillOnce(Assign(&srv_finished, true)); } Error e = sv.Start(TEST_ADDR, TEST_PORT); ASSERT_EQ(LNR_OK, e.Code()); SSLSocket cs = cl.CreateSocket(TEST_ADDR, TEST_PORT); { InSequence dummy; EXPECT_CALL(ch, OnConnectMock(cs)); EXPECT_CALL(ch, OnDisconnectMock(cs, Error(LNR_EOF))).WillOnce(Assign(&cli_finished, true)); } e = cs.Connect(); ASSERT_EQ(LNR_OK, e.Code()); WAIT_TO_FINISH_CALLBACK(); ASSERT_EQ(global::gs_, cs); cs = cl.CreateSocket(TEST_ADDR, TEST_PORT); EXPECT_CALL(sh, OnConnectMock(_)).WillOnce(Assign(&srv_finished, true)); EXPECT_CALL(ch, OnConnectMock(cs)).WillOnce(Assign(&cli_finished, true)); e = cs.Connect(); ASSERT_EQ(LNR_OK, e.Code()); WAIT_TO_FINISH_CALLBACK(); ASSERT_NE(global::gs_, cs); EXPECT_CALL(sh, OnDisconnectMock(_, _)).Times(::testing::AtLeast(0)); EXPECT_CALL(ch, OnDisconnectMock(_, _)).Times(::testing::AtLeast(0)); }
// Connect EALREADY TEST_F(WSClientServerConnectionTest, ConnectEalready) { MockHandler ch; WSClient cl(ch); MockHandler sh; WSServer sv(sh); Error e = sv.Start(TEST_ADDR, TEST_PORT); ASSERT_EQ(LNR_OK, e.Code()); WSSocket cs = cl.CreateSocket(TEST_ADDR, TEST_PORT); EXPECT_CALL(sh, OnConnectMock(_)).WillOnce(Assign(&srv_finished, true)); EXPECT_CALL(ch, OnConnectMock(cs)).WillOnce(Assign(&cli_finished, true)); e = cs.Connect(); ASSERT_EQ(LNR_OK, e.Code()); WAIT_TO_FINISH_CALLBACK(); e = cs.Connect(); ASSERT_EQ(LNR_EALREADY, e.Code()); }
// Disconnect EALREADY TEST_F(WSClientServerConnectionTest, DisconnectEalready) { MockHandler ch; WSClient cl(ch); WSSocket cs = cl.CreateSocket(TEST_ADDR, TEST_PORT); EXPECT_CALL(ch, OnConnectMock(_)).Times(0); EXPECT_CALL(ch, OnDisconnectMock(_, _)).Times(0); Error e = cs.Disconnect(); ASSERT_EQ(LNR_EALREADY, e.Code()); msleep(WAIT_MSEC); }
// Timeout TEST_F(WSClientServerConnectionTest, ConnectTimeout) { MockHandler ch; WSClient cl(ch); WSSocket cs = cl.CreateSocket(TEST_ADDR_4_TIMEOUT, TEST_PORT); EXPECT_CALL(ch, OnConnectMock(_)).Times(0); EXPECT_CALL(ch, OnDisconnectMock(cs, Error(LNR_ETIMEDOUT))).WillOnce(DoAll(Assign(&srv_finished, true), Assign(&cli_finished, true))); Error e = cs.Connect(1); ASSERT_EQ(LNR_OK, e.Code()); WAIT_TO_FINISH_CALLBACK(); }
// Cancel TEST_F(WSClientServerConnectionTest, ConnectCancel) { MockHandler ch; WSClient cl(ch); WSSocket cs = cl.CreateSocket("127.0.0.2", TEST_PORT); EXPECT_CALL(ch, OnConnectMock(_)).Times(0); EXPECT_CALL(ch, OnDisconnectMock(_, _)).WillOnce(DoAll(Assign(&srv_finished, true), Assign(&cli_finished, true))); Error e = cs.Connect(); ASSERT_EQ(LNR_OK, e.Code()); e = cs.Disconnect(); WAIT_TO_FINISH_CALLBACK(); }
// Disconnect EALREADY TEST_F(SSLClientServerConnectionTest, DisconnectEalready) { MockHandler ch; SSLContext context(SSLContext::TLSv1_1); context.SetCertificate(std::string(CLIENT_CERT)); context.SetPrivateKey(std::string(CLIENT_PKEY)); context.SetCAFile(std::string(CA_CERT)); context.SetCiphers(std::string(CIPHER_LIST)); context.SetVerifyMode(SSLContext::VERIFY_PEER); SSLClient cl(ch, context); SSLSocket cs = cl.CreateSocket(TEST_ADDR, TEST_PORT); EXPECT_CALL(ch, OnConnectMock(_)).Times(0); EXPECT_CALL(ch, OnDisconnectMock(_, _)).Times(0); Error e = cs.Disconnect(); ASSERT_EQ(LNR_EALREADY, e.Code()); msleep(WAIT_MSEC); }
// Timeout TEST_F(SSLClientServerConnectionTest, ConnectTimeout) { MockHandler ch; SSLContext context(SSLContext::TLSv1_1); context.SetCertificate(std::string(CLIENT_CERT)); context.SetPrivateKey(std::string(CLIENT_PKEY)); context.SetCAFile(std::string(CA_CERT)); context.SetCiphers(std::string(CIPHER_LIST)); context.SetVerifyMode(SSLContext::VERIFY_PEER); SSLClient cl(ch, context); SSLSocket cs = cl.CreateSocket(TEST_ADDR_4_TIMEOUT, TEST_PORT); EXPECT_CALL(ch, OnConnectMock(_)).Times(0); EXPECT_CALL(ch, OnDisconnectMock(cs, Error(LNR_ETIMEDOUT))).WillOnce(DoAll(Assign(&srv_finished, true), Assign(&cli_finished, true))); Error e = cs.Connect(1); ASSERT_EQ(LNR_OK, e.Code()); WAIT_TO_FINISH_CALLBACK(); }