Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <memory> | 5 #include <memory> |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "blimp/common/create_blimp_message.h" | 9 #include "blimp/common/create_blimp_message.h" |
| 10 #include "blimp/common/proto/blimp_message.pb.h" | 10 #include "blimp/common/proto/blimp_message.pb.h" |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 21 #include "net/base/test_completion_callback.h" | 21 #include "net/base/test_completion_callback.h" |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 23 | 23 |
| 24 using testing::_; | 24 using testing::_; |
| 25 using testing::SaveArg; | 25 using testing::SaveArg; |
| 26 | 26 |
| 27 namespace blimp { | 27 namespace blimp { |
| 28 | 28 |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 // The length of |kPayload1| and |kPayload2| must be identical. | |
|
CJ
2016/08/12 23:59:15
Perhaps add why they must be identical? It seems t
Kevin M
2016/08/15 17:35:09
You're right, it does seem arbitrary. I removed th
| |
| 32 const char kPayload1[] = "foo"; | |
| 33 const char kPayload2[] = "bar"; | |
| 34 | |
| 31 // Integration test for TCPEngineTransport and TCPClientTransport. | 35 // Integration test for TCPEngineTransport and TCPClientTransport. |
| 32 class TCPTransportTest : public testing::Test { | 36 class TCPTransportTest : public testing::Test { |
| 33 protected: | 37 protected: |
| 34 TCPTransportTest() { | 38 TCPTransportTest() |
| 35 net::IPEndPoint local_address(net::IPAddress(127, 0, 0, 1), 0); | 39 : local_address_(net::IPAddress(127, 0, 0, 1), 0), |
| 36 engine_.reset(new TCPEngineTransport(local_address, nullptr)); | 40 engine_(local_address_, nullptr), |
| 41 write_buffer_( | |
| 42 new net::DrainableIOBuffer(new net::IOBuffer(arraysize(kPayload1)), | |
| 43 arraysize(kPayload1))), | |
| 44 read_buffer_(new net::GrowableIOBuffer) { | |
| 45 read_buffer_->SetCapacity(arraysize(kPayload1)); | |
| 37 } | 46 } |
| 38 | 47 |
| 39 net::IPEndPoint GetLocalEndpoint() const { | 48 net::IPEndPoint GetLocalEndpoint() const { |
| 40 net::IPEndPoint local_address; | 49 net::IPEndPoint local_address; |
| 41 CHECK_EQ(net::OK, engine_->GetLocalAddress(&local_address)); | 50 CHECK_EQ(net::OK, engine_.GetLocalAddress(&local_address)); |
| 42 return local_address; | 51 return local_address; |
| 43 } | 52 } |
| 44 | 53 |
| 45 base::MessageLoopForIO message_loop_; | 54 base::MessageLoopForIO message_loop_; |
| 46 std::unique_ptr<TCPEngineTransport> engine_; | 55 net::IPEndPoint local_address_; |
| 56 TCPEngineTransport engine_; | |
| 57 scoped_refptr<net::DrainableIOBuffer> write_buffer_; | |
| 58 scoped_refptr<net::GrowableIOBuffer> read_buffer_; | |
| 47 }; | 59 }; |
| 48 | 60 |
| 49 TEST_F(TCPTransportTest, Connect) { | 61 TEST_F(TCPTransportTest, Connect) { |
| 50 net::TestCompletionCallback accept_callback; | 62 net::TestCompletionCallback accept_callback; |
| 51 engine_->Connect(accept_callback.callback()); | 63 engine_.Connect(accept_callback.callback()); |
| 52 | 64 |
| 53 net::TestCompletionCallback connect_callback; | 65 net::TestCompletionCallback connect_callback; |
| 54 TCPClientTransport client(GetLocalEndpoint(), nullptr); | 66 TCPClientTransport client(GetLocalEndpoint(), nullptr); |
| 55 client.Connect(connect_callback.callback()); | 67 client.Connect(connect_callback.callback()); |
| 56 | 68 |
| 57 EXPECT_EQ(net::OK, connect_callback.WaitForResult()); | 69 EXPECT_EQ(net::OK, connect_callback.WaitForResult()); |
| 58 EXPECT_EQ(net::OK, accept_callback.WaitForResult()); | 70 EXPECT_EQ(net::OK, accept_callback.WaitForResult()); |
| 59 EXPECT_TRUE(engine_->TakeConnection() != nullptr); | 71 EXPECT_NE(nullptr, client.TakeMessagePort()); |
| 60 } | 72 } |
| 61 | 73 |
| 62 TEST_F(TCPTransportTest, TwoClientConnections) { | 74 TEST_F(TCPTransportTest, TwoClientConnections) { |
| 63 net::TestCompletionCallback accept_callback1; | 75 net::TestCompletionCallback accept_callback1; |
| 64 engine_->Connect(accept_callback1.callback()); | 76 engine_.Connect(accept_callback1.callback()); |
| 65 | 77 |
| 66 net::TestCompletionCallback connect_callback1; | 78 net::TestCompletionCallback connect_callback1; |
| 67 TCPClientTransport client1(GetLocalEndpoint(), nullptr); | 79 TCPClientTransport client(GetLocalEndpoint(), nullptr); |
| 68 client1.Connect(connect_callback1.callback()); | 80 client.Connect(connect_callback1.callback()); |
| 81 EXPECT_EQ(net::OK, connect_callback1.WaitForResult()); | |
| 82 EXPECT_EQ(net::OK, accept_callback1.WaitForResult()); | |
| 83 EXPECT_NE(nullptr, engine_.TakeMessagePort()); | |
| 84 | |
| 85 net::TestCompletionCallback accept_callback2; | |
| 86 engine_.Connect(accept_callback2.callback()); | |
| 69 | 87 |
| 70 net::TestCompletionCallback connect_callback2; | 88 net::TestCompletionCallback connect_callback2; |
| 71 TCPClientTransport client2(GetLocalEndpoint(), nullptr); | 89 TCPClientTransport client2(GetLocalEndpoint(), nullptr); |
| 72 client2.Connect(connect_callback2.callback()); | 90 client2.Connect(connect_callback2.callback()); |
| 73 | |
| 74 EXPECT_EQ(net::OK, connect_callback1.WaitForResult()); | |
| 75 EXPECT_EQ(net::OK, accept_callback1.WaitForResult()); | |
| 76 EXPECT_TRUE(engine_->TakeConnection() != nullptr); | |
| 77 | |
| 78 net::TestCompletionCallback accept_callback2; | |
| 79 engine_->Connect(accept_callback2.callback()); | |
| 80 EXPECT_EQ(net::OK, connect_callback2.WaitForResult()); | 91 EXPECT_EQ(net::OK, connect_callback2.WaitForResult()); |
| 81 EXPECT_EQ(net::OK, accept_callback2.WaitForResult()); | 92 EXPECT_EQ(net::OK, accept_callback2.WaitForResult()); |
| 82 EXPECT_TRUE(engine_->TakeConnection() != nullptr); | 93 EXPECT_NE(nullptr, engine_.TakeMessagePort()); |
| 83 } | 94 } |
| 84 | 95 |
| 85 TEST_F(TCPTransportTest, ExchangeMessages) { | 96 TEST_F(TCPTransportTest, ExchangeMessages) { |
| 86 // Start the Engine transport and connect a client to it. | 97 // Start the Engine transport and connect a client to it. |
| 87 net::TestCompletionCallback accept_callback; | 98 net::TestCompletionCallback accept_callback; |
| 88 engine_->Connect(accept_callback.callback()); | 99 engine_.Connect(accept_callback.callback()); |
| 89 net::TestCompletionCallback client_connect_callback; | 100 net::TestCompletionCallback clientconnect_callback; |
|
CJ
2016/08/12 23:59:15
Is there a reason to remove the underscore?
Kevin M
2016/08/15 17:35:09
Looks like I typo'd. :\
Thanks, fixed!
| |
| 90 TCPClientTransport client(GetLocalEndpoint(), nullptr); | 101 TCPClientTransport client(GetLocalEndpoint(), nullptr); |
| 91 client.Connect(client_connect_callback.callback()); | 102 client.Connect(clientconnect_callback.callback()); |
| 92 EXPECT_EQ(net::OK, client_connect_callback.WaitForResult()); | |
| 93 EXPECT_EQ(net::OK, accept_callback.WaitForResult()); | 103 EXPECT_EQ(net::OK, accept_callback.WaitForResult()); |
| 104 EXPECT_EQ(net::OK, clientconnect_callback.WaitForResult()); | |
| 94 | 105 |
| 95 // Expect the engine to get two messages from the client, and the client to | 106 std::unique_ptr<MessagePort> engine_message_port = engine_.TakeMessagePort(); |
| 96 // get one from the engine. | 107 std::unique_ptr<MessagePort> clientmessage_port = client.TakeMessagePort(); |
|
CJ
2016/08/12 23:59:15
why are engine variables following the underscore
Kevin M
2016/08/15 17:35:09
"engine_" is a class member, which have trailing u
CJ
2016/08/15 18:17:42
I was more meaning the typo issue, since it was re
| |
| 97 MockBlimpMessageProcessor engine_incoming_processor; | |
| 98 MockBlimpMessageProcessor client_incoming_processor; | |
| 99 net::CompletionCallback engine_process_message_cb; | |
| 100 std::unique_ptr<BlimpMessage> client_message1 = | |
| 101 CreateStartConnectionMessage("", 0); | |
| 102 int client_message1_size = client_message1->ByteSize(); | |
| 103 std::unique_ptr<BlimpMessage> client_message2 = CreateCheckpointAckMessage(5); | |
| 104 std::unique_ptr<BlimpMessage> engine_message = CreateCheckpointAckMessage(10); | |
| 105 EXPECT_CALL(engine_incoming_processor, | |
| 106 MockableProcessMessage(EqualsProto(*client_message1), _)) | |
| 107 .WillOnce(SaveArg<1>(&engine_process_message_cb)); | |
| 108 EXPECT_CALL(engine_incoming_processor, | |
| 109 MockableProcessMessage(EqualsProto(*client_message2), _)) | |
| 110 .Times(1); | |
| 111 EXPECT_CALL(client_incoming_processor, | |
| 112 MockableProcessMessage(EqualsProto(*engine_message), _)) | |
| 113 .Times(1); | |
| 114 | 108 |
| 115 // Attach the ends of the connection to our mock message-processors. | 109 // Engine sends kPayload1 to client. |
| 116 std::unique_ptr<BlimpConnection> engine_connnection = | 110 net::TestCompletionCallback read_cb1; |
| 117 engine_->TakeConnection(); | 111 net::TestCompletionCallback write_cb1; |
| 118 std::unique_ptr<BlimpConnection> client_connnection = client.TakeConnection(); | 112 memcpy(write_buffer_->data(), kPayload1, arraysize(kPayload1)); |
| 119 engine_connnection->SetIncomingMessageProcessor(&engine_incoming_processor); | 113 engine_message_port->writer()->WritePacket(write_buffer_, |
| 120 client_connnection->SetIncomingMessageProcessor(&client_incoming_processor); | 114 write_cb1.callback()); |
| 115 clientmessage_port->reader()->ReadPacket(read_buffer_, read_cb1.callback()); | |
| 116 EXPECT_EQ(arraysize(kPayload1), | |
| 117 static_cast<size_t>(read_cb1.WaitForResult())); | |
| 118 EXPECT_EQ(net::OK, write_cb1.WaitForResult()); | |
| 119 EXPECT_TRUE( | |
| 120 BufferStartsWith(read_buffer_.get(), arraysize(kPayload1), kPayload1)); | |
| 121 | 121 |
| 122 // Client sends the first message. | 122 // Client sends kPayload2 to engine. |
| 123 net::TestCompletionCallback client_send_callback1; | 123 net::TestCompletionCallback read_cb2; |
| 124 client_connnection->GetOutgoingMessageProcessor()->ProcessMessage( | 124 net::TestCompletionCallback write_cb2; |
| 125 std::move(client_message1), client_send_callback1.callback()); | 125 memcpy(write_buffer_->data(), kPayload2, arraysize(kPayload2)); |
| 126 EXPECT_EQ(net::OK, client_send_callback1.WaitForResult()); | 126 clientmessage_port->writer()->WritePacket(write_buffer_, |
| 127 | 127 write_cb2.callback()); |
| 128 // Engine finishes processing the client message. | 128 engine_message_port->reader()->ReadPacket(read_buffer_, read_cb2.callback()); |
| 129 EXPECT_FALSE(engine_process_message_cb.is_null()); | 129 EXPECT_EQ(arraysize(kPayload2), |
| 130 engine_process_message_cb.Run(client_message1_size); | 130 static_cast<size_t>(read_cb2.WaitForResult())); |
| 131 | 131 EXPECT_EQ(net::OK, write_cb2.WaitForResult()); |
| 132 // Engine sends one message. | 132 EXPECT_TRUE( |
| 133 net::TestCompletionCallback engine_send_callback; | 133 BufferStartsWith(read_buffer_.get(), arraysize(kPayload2), kPayload2)); |
| 134 engine_connnection->GetOutgoingMessageProcessor()->ProcessMessage( | |
| 135 std::move(engine_message), engine_send_callback.callback()); | |
| 136 EXPECT_EQ(net::OK, engine_send_callback.WaitForResult()); | |
| 137 | |
| 138 // Client sends the second message. | |
| 139 net::TestCompletionCallback client_send_callback2; | |
| 140 client_connnection->GetOutgoingMessageProcessor()->ProcessMessage( | |
| 141 std::move(client_message2), client_send_callback2.callback()); | |
| 142 EXPECT_EQ(net::OK, client_send_callback2.WaitForResult()); | |
| 143 } | 134 } |
| 144 | 135 |
| 145 } // namespace | 136 } // namespace |
| 146 | 137 |
| 147 } // namespace blimp | 138 } // namespace blimp |
| OLD | NEW |