Index: blimp/net/tcp_transport_unittest.cc |
diff --git a/blimp/net/tcp_transport_unittest.cc b/blimp/net/tcp_transport_unittest.cc |
index a692fd880c9b70b0435163d6bc2b84fa470b0e09..97ead2f9cfbb49ce049e87765a5d8cc529f8e34e 100644 |
--- a/blimp/net/tcp_transport_unittest.cc |
+++ b/blimp/net/tcp_transport_unittest.cc |
@@ -2,6 +2,7 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <algorithm> |
#include <memory> |
#include <string> |
@@ -31,24 +32,34 @@ namespace { |
// Integration test for TCPEngineTransport and TCPClientTransport. |
class TCPTransportTest : public testing::Test { |
protected: |
- TCPTransportTest() { |
- net::IPEndPoint local_address(net::IPAddress(127, 0, 0, 1), 0); |
- engine_.reset(new TCPEngineTransport(local_address, nullptr)); |
+ TCPTransportTest() |
+ : local_address_(net::IPAddress(127, 0, 0, 1), 0), |
+ engine_(local_address_, nullptr), |
+ read_buffer_(new net::GrowableIOBuffer) { |
+ size_t buf_size = std::max(payload_1_.size(), payload_2_.size()); |
+ write_buffer_ = make_scoped_refptr( |
+ new net::DrainableIOBuffer(new net::IOBuffer(buf_size), buf_size)); |
+ read_buffer_->SetCapacity(buf_size); |
} |
net::IPEndPoint GetLocalEndpoint() const { |
net::IPEndPoint local_address; |
- CHECK_EQ(net::OK, engine_->GetLocalAddress(&local_address)); |
+ CHECK_EQ(net::OK, engine_.GetLocalAddress(&local_address)); |
return local_address; |
} |
+ std::string payload_1_ = "foo"; |
+ std::string payload_2_ = "bar"; |
base::MessageLoopForIO message_loop_; |
- std::unique_ptr<TCPEngineTransport> engine_; |
+ net::IPEndPoint local_address_; |
+ TCPEngineTransport engine_; |
+ scoped_refptr<net::DrainableIOBuffer> write_buffer_; |
+ scoped_refptr<net::GrowableIOBuffer> read_buffer_; |
}; |
TEST_F(TCPTransportTest, Connect) { |
net::TestCompletionCallback accept_callback; |
- engine_->Connect(accept_callback.callback()); |
+ engine_.Connect(accept_callback.callback()); |
net::TestCompletionCallback connect_callback; |
TCPClientTransport client(GetLocalEndpoint(), nullptr); |
@@ -56,90 +67,67 @@ TEST_F(TCPTransportTest, Connect) { |
EXPECT_EQ(net::OK, connect_callback.WaitForResult()); |
EXPECT_EQ(net::OK, accept_callback.WaitForResult()); |
- EXPECT_TRUE(engine_->TakeConnection() != nullptr); |
+ EXPECT_NE(nullptr, client.TakeMessagePort()); |
} |
TEST_F(TCPTransportTest, TwoClientConnections) { |
net::TestCompletionCallback accept_callback1; |
- engine_->Connect(accept_callback1.callback()); |
+ engine_.Connect(accept_callback1.callback()); |
net::TestCompletionCallback connect_callback1; |
- TCPClientTransport client1(GetLocalEndpoint(), nullptr); |
- client1.Connect(connect_callback1.callback()); |
- |
- net::TestCompletionCallback connect_callback2; |
- TCPClientTransport client2(GetLocalEndpoint(), nullptr); |
- client2.Connect(connect_callback2.callback()); |
- |
+ TCPClientTransport client(GetLocalEndpoint(), nullptr); |
+ client.Connect(connect_callback1.callback()); |
EXPECT_EQ(net::OK, connect_callback1.WaitForResult()); |
EXPECT_EQ(net::OK, accept_callback1.WaitForResult()); |
- EXPECT_TRUE(engine_->TakeConnection() != nullptr); |
+ EXPECT_NE(nullptr, engine_.TakeMessagePort()); |
net::TestCompletionCallback accept_callback2; |
- engine_->Connect(accept_callback2.callback()); |
+ engine_.Connect(accept_callback2.callback()); |
+ |
+ net::TestCompletionCallback connect_callback2; |
+ TCPClientTransport client2(GetLocalEndpoint(), nullptr); |
+ client2.Connect(connect_callback2.callback()); |
EXPECT_EQ(net::OK, connect_callback2.WaitForResult()); |
EXPECT_EQ(net::OK, accept_callback2.WaitForResult()); |
- EXPECT_TRUE(engine_->TakeConnection() != nullptr); |
+ EXPECT_NE(nullptr, engine_.TakeMessagePort()); |
} |
TEST_F(TCPTransportTest, ExchangeMessages) { |
// Start the Engine transport and connect a client to it. |
net::TestCompletionCallback accept_callback; |
- engine_->Connect(accept_callback.callback()); |
+ engine_.Connect(accept_callback.callback()); |
net::TestCompletionCallback client_connect_callback; |
TCPClientTransport client(GetLocalEndpoint(), nullptr); |
client.Connect(client_connect_callback.callback()); |
- EXPECT_EQ(net::OK, client_connect_callback.WaitForResult()); |
EXPECT_EQ(net::OK, accept_callback.WaitForResult()); |
+ EXPECT_EQ(net::OK, client_connect_callback.WaitForResult()); |
- // Expect the engine to get two messages from the client, and the client to |
- // get one from the engine. |
- MockBlimpMessageProcessor engine_incoming_processor; |
- MockBlimpMessageProcessor client_incoming_processor; |
- net::CompletionCallback engine_process_message_cb; |
- std::unique_ptr<BlimpMessage> client_message1 = |
- CreateStartConnectionMessage("", 0); |
- int client_message1_size = client_message1->ByteSize(); |
- std::unique_ptr<BlimpMessage> client_message2 = CreateCheckpointAckMessage(5); |
- std::unique_ptr<BlimpMessage> engine_message = CreateCheckpointAckMessage(10); |
- EXPECT_CALL(engine_incoming_processor, |
- MockableProcessMessage(EqualsProto(*client_message1), _)) |
- .WillOnce(SaveArg<1>(&engine_process_message_cb)); |
- EXPECT_CALL(engine_incoming_processor, |
- MockableProcessMessage(EqualsProto(*client_message2), _)) |
- .Times(1); |
- EXPECT_CALL(client_incoming_processor, |
- MockableProcessMessage(EqualsProto(*engine_message), _)) |
- .Times(1); |
- |
- // Attach the ends of the connection to our mock message-processors. |
- std::unique_ptr<BlimpConnection> engine_connnection = |
- engine_->TakeConnection(); |
- std::unique_ptr<BlimpConnection> client_connnection = client.TakeConnection(); |
- engine_connnection->SetIncomingMessageProcessor(&engine_incoming_processor); |
- client_connnection->SetIncomingMessageProcessor(&client_incoming_processor); |
- |
- // Client sends the first message. |
- net::TestCompletionCallback client_send_callback1; |
- client_connnection->GetOutgoingMessageProcessor()->ProcessMessage( |
- std::move(client_message1), client_send_callback1.callback()); |
- EXPECT_EQ(net::OK, client_send_callback1.WaitForResult()); |
- |
- // Engine finishes processing the client message. |
- EXPECT_FALSE(engine_process_message_cb.is_null()); |
- engine_process_message_cb.Run(client_message1_size); |
- |
- // Engine sends one message. |
- net::TestCompletionCallback engine_send_callback; |
- engine_connnection->GetOutgoingMessageProcessor()->ProcessMessage( |
- std::move(engine_message), engine_send_callback.callback()); |
- EXPECT_EQ(net::OK, engine_send_callback.WaitForResult()); |
- |
- // Client sends the second message. |
- net::TestCompletionCallback client_send_callback2; |
- client_connnection->GetOutgoingMessageProcessor()->ProcessMessage( |
- std::move(client_message2), client_send_callback2.callback()); |
- EXPECT_EQ(net::OK, client_send_callback2.WaitForResult()); |
+ std::unique_ptr<MessagePort> engine_message_port = engine_.TakeMessagePort(); |
+ std::unique_ptr<MessagePort> clientmessage_port = client.TakeMessagePort(); |
+ |
+ // Engine sends payload_1_ to client. |
+ net::TestCompletionCallback read_cb1; |
+ net::TestCompletionCallback write_cb1; |
+ memcpy(write_buffer_->data(), payload_1_.data(), payload_1_.size()); |
+ engine_message_port->writer()->WritePacket(write_buffer_, |
+ write_cb1.callback()); |
+ clientmessage_port->reader()->ReadPacket(read_buffer_, read_cb1.callback()); |
+ EXPECT_EQ(payload_1_.size(), static_cast<size_t>(read_cb1.WaitForResult())); |
+ EXPECT_EQ(net::OK, write_cb1.WaitForResult()); |
+ EXPECT_TRUE( |
+ BufferStartsWith(read_buffer_.get(), payload_1_.size(), payload_1_)); |
+ |
+ // Client sends payload_2_ to engine. |
+ net::TestCompletionCallback read_cb2; |
+ net::TestCompletionCallback write_cb2; |
+ memcpy(write_buffer_->data(), payload_2_.data(), payload_2_.size()); |
+ clientmessage_port->writer()->WritePacket(write_buffer_, |
+ write_cb2.callback()); |
+ engine_message_port->reader()->ReadPacket(read_buffer_, read_cb2.callback()); |
+ EXPECT_EQ(payload_2_.size(), static_cast<size_t>(read_cb2.WaitForResult())); |
+ EXPECT_EQ(net::OK, write_cb2.WaitForResult()); |
+ EXPECT_TRUE( |
+ BufferStartsWith(read_buffer_.get(), payload_2_.size(), payload_2_)); |
} |
} // namespace |