TEST_F(StreamSocketTest, StreamSocketReceiveLineInString) { StreamSocket stream; EXPECT_TRUE(stream.Create(AF_INET)); EXPECT_FALSE(stream.Connect(SocketAddressInet("0.0.0.0:0"))); EXPECT_TRUE(stream.Connect(m_address)) << m_address.ToString(); struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; EXPECT_TRUE(stream.WaitWriteable(&tv, true)); std::string sent = "12345\n"; EXPECT_TRUE(stream.SendAll(sent.data(), sent.size())); tv.tv_sec = 5; tv.tv_usec = 0; EXPECT_TRUE(stream.WaitReadable(&tv, true)); std::string received; EXPECT_TRUE(stream.ReceiveLine(&received)); EXPECT_EQ(sent, received); // Send all with timeout tv.tv_sec = 5; tv.tv_usec = 0; size_t sent_size; EXPECT_TRUE(stream.SendAll(sent.data(), sent.size(), &sent_size, &tv)); EXPECT_EQ(sent.size(), sent_size); // peek size with 2 EXPECT_TRUE(stream.ReceiveLine(&received, 2)); EXPECT_EQ(sent, received); }
TEST_F(StreamSocketTest, StreamSocketReceiveAll) { StreamSocket stream; EXPECT_TRUE(stream.Create(AF_INET)); EXPECT_TRUE(stream.Connect(m_address)) << m_address.ToString(); std::string sent = "12345\n"; EXPECT_TRUE(stream.SendAll(sent.data(), sent.size())); char buffer1[6], buffer2[5]; size_t buffer1_size = 6; size_t buffer2_size = 5; size_t received_size; EXPECT_TRUE(stream.ReceiveAll(buffer1, buffer1_size)); EXPECT_STREQ(sent.data(), buffer1); // with timeout EXPECT_TRUE(stream.SendAll(sent.data(), sent.size())); struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; EXPECT_TRUE(stream.ReceiveAll(buffer1, buffer1_size, &received_size, &tv)); EXPECT_EQ(6U, received_size); EXPECT_STREQ(sent.data(), buffer1); EXPECT_TRUE(stream.SendAll(sent.data(), sent.size())); EXPECT_TRUE(stream.ReceiveAll(buffer2, buffer2_size, &received_size)); EXPECT_EQ(5U, received_size); for (size_t i = 0; i < received_size; ++i) { EXPECT_EQ(sent[i], buffer2[i]); } }
void IoThread() { StreamSocket acceptor; EXPECT_TRUE(m_listener.Accept(&acceptor)); SocketAddressInet peer_address; EXPECT_TRUE(acceptor.GetPeerAddress(&peer_address)); #if __unix__ int keep_alive; int idle; int interval; int count; EXPECT_TRUE(acceptor.SetTcpKeepAliveOption(14400, 150, 5)); EXPECT_TRUE(acceptor.GetOption(SOL_SOCKET, SO_KEEPALIVE, &keep_alive)); EXPECT_EQ(1, keep_alive); EXPECT_TRUE(acceptor.GetOption(SOL_TCP, TCP_KEEPIDLE, &idle)); EXPECT_EQ(14400, idle); EXPECT_TRUE(acceptor.GetOption(SOL_TCP, TCP_KEEPINTVL, &interval)); EXPECT_EQ(150, interval); EXPECT_TRUE(acceptor.GetOption(SOL_TCP, TCP_KEEPCNT, &count)); EXPECT_EQ(5, count); #endif std::string line; while (acceptor.ReceiveLine(&line) && !line.empty()) { acceptor.SendAll(line.data(), line.size()); } }
TEST_F(StreamSocketTest, StreamSocketReceiveLineInEqualSizeBuffer) { StreamSocket stream; EXPECT_TRUE(stream.Create(AF_INET)); EXPECT_TRUE(stream.Connect(m_address)) << m_address.ToString(); std::string sent = "12345\n"; char buffer[6]; size_t received_size; size_t buffer_size = 6; EXPECT_TRUE(stream.SendAll(sent.data(), sent.size())); EXPECT_TRUE(stream.ReceiveLine(buffer, buffer_size, &received_size)); EXPECT_EQ(6U, received_size); EXPECT_STREQ(sent.data(), buffer); }
TEST_F(StreamSocketTest, StreamSocketReceiveLineInLargerSizeBuffer) { StreamSocket stream; EXPECT_TRUE(stream.Create(AF_INET)); EXPECT_TRUE(stream.Connect(m_address)) << m_address.ToString(); std::string sent = "12345\n"; char buffer[10]; size_t buffer_size = 10; size_t received_size; EXPECT_TRUE(stream.SendAll(sent.data(), sent.size())); EXPECT_TRUE(stream.ReceiveLine(buffer, buffer_size, &received_size)); EXPECT_EQ(6U, received_size); for (size_t i = 0; i < received_size; ++i) { EXPECT_EQ(sent[i], buffer[i]); } }
TEST_F(StreamSocketTest, StreamSocketReceiveLineInSmallerSizeBuffer) { StreamSocket stream; EXPECT_TRUE(stream.Create(AF_INET)); EXPECT_FALSE(stream.Connect(SocketAddressInet("0.0.0.0:0"))); EXPECT_TRUE(stream.Connect(m_address)) << m_address.ToString(); std::string sent = "12345\n"; char buffer[5]; size_t buffer_size = 5; size_t received_size; EXPECT_TRUE(stream.SendAll(sent.data(), sent.size())); EXPECT_FALSE(stream.ReceiveLine(buffer, buffer_size, &received_size)); EXPECT_EQ(5U, received_size); for (size_t i = 0; i < received_size; ++i) { EXPECT_EQ(sent[i], buffer[i]); } // receive until '\n' EXPECT_TRUE(stream.ReceiveLine(buffer, buffer_size, &received_size)); EXPECT_EQ(1U, received_size); EXPECT_EQ('\n', buffer[0]); }
TEST_F(StreamSocketTest, ConnectWithTimeout) { StreamSocket stream; EXPECT_TRUE(stream.Create(AF_INET)); EXPECT_FALSE(stream.Connect(SocketAddressInet("0.0.0.0:0"), 10)); bool blocking = true; // For unknown reason, if we reuse failed socket, the following Connect // will faile with ECONNRESET, create a new socket here. EXPECT_TRUE(stream.Create(AF_INET)); EXPECT_TRUE(stream.GetBlocking(&blocking)); EXPECT_TRUE(blocking); EXPECT_TRUE(stream.Connect(m_address, 10)); EXPECT_TRUE(stream.GetBlocking(&blocking)); EXPECT_TRUE(blocking); EXPECT_TRUE(stream.SendAll("\n", 1)); }