| 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 "blimp/net/blimp_connection.h" | 5 #include "blimp/net/blimp_connection.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 | 30 |
| 31 namespace blimp { | 31 namespace blimp { |
| 32 namespace { | 32 namespace { |
| 33 | 33 |
| 34 class BlimpConnectionTest : public testing::Test { | 34 class BlimpConnectionTest : public testing::Test { |
| 35 public: | 35 public: |
| 36 BlimpConnectionTest() { | 36 BlimpConnectionTest() { |
| 37 std::unique_ptr<testing::StrictMock<MockPacketWriter>> writer( | 37 std::unique_ptr<testing::StrictMock<MockPacketWriter>> writer( |
| 38 new testing::StrictMock<MockPacketWriter>); | 38 new testing::StrictMock<MockPacketWriter>); |
| 39 writer_ = writer.get(); | 39 writer_ = writer.get(); |
| 40 connection_.reset(new BlimpConnection( | 40 std::unique_ptr<testing::StrictMock<MockPacketReader>> reader( |
| 41 base::WrapUnique(new MockPacketReader), std::move(writer))); | 41 new testing::StrictMock<MockPacketReader>); |
| 42 reader_ = reader.get(); |
| 43 connection_.reset( |
| 44 new BlimpConnection(std::move(reader), std::move(writer))); |
| 42 connection_->AddConnectionErrorObserver(&error_observer1_); | 45 connection_->AddConnectionErrorObserver(&error_observer1_); |
| 43 connection_->AddConnectionErrorObserver(&error_observer2_); | 46 connection_->AddConnectionErrorObserver(&error_observer2_); |
| 44 connection_->AddConnectionErrorObserver(&error_observer3_); | 47 connection_->AddConnectionErrorObserver(&error_observer3_); |
| 45 connection_->RemoveConnectionErrorObserver(&error_observer3_); | 48 connection_->RemoveConnectionErrorObserver(&error_observer3_); |
| 46 } | 49 } |
| 47 | 50 |
| 48 ~BlimpConnectionTest() override {} | 51 ~BlimpConnectionTest() override {} |
| 49 | 52 |
| 50 void DropConnection() { connection_.reset(); } | 53 void DropConnection() { connection_.reset(); } |
| 51 | 54 |
| 52 protected: | 55 protected: |
| 53 std::unique_ptr<BlimpMessage> CreateInputMessage() { | 56 std::unique_ptr<BlimpMessage> CreateInputMessage() { |
| 54 InputMessage* input; | 57 InputMessage* input; |
| 55 return CreateBlimpMessage(&input); | 58 return CreateBlimpMessage(&input); |
| 56 } | 59 } |
| 57 | 60 |
| 58 std::unique_ptr<BlimpMessage> CreateControlMessage() { | 61 std::unique_ptr<BlimpMessage> CreateControlMessage() { |
| 59 TabControlMessage* control; | 62 TabControlMessage* control; |
| 60 return CreateBlimpMessage(&control); | 63 return CreateBlimpMessage(&control); |
| 61 } | 64 } |
| 62 | 65 |
| 63 base::MessageLoop message_loop_; | 66 base::MessageLoop message_loop_; |
| 67 testing::StrictMock<MockPacketReader>* reader_; |
| 64 testing::StrictMock<MockPacketWriter>* writer_; | 68 testing::StrictMock<MockPacketWriter>* writer_; |
| 65 testing::StrictMock<MockConnectionErrorObserver> error_observer1_; | 69 testing::StrictMock<MockConnectionErrorObserver> error_observer1_; |
| 66 testing::StrictMock<MockConnectionErrorObserver> error_observer2_; | 70 testing::StrictMock<MockConnectionErrorObserver> error_observer2_; |
| 67 | 71 |
| 68 // This error observer is Removed() immediately after it's added; | 72 // This error observer is Removed() immediately after it's added; |
| 69 // it should never be called. | 73 // it should never be called. |
| 70 testing::StrictMock<MockConnectionErrorObserver> error_observer3_; | 74 testing::StrictMock<MockConnectionErrorObserver> error_observer3_; |
| 71 | 75 |
| 72 testing::StrictMock<MockBlimpMessageProcessor> receiver_; | 76 testing::StrictMock<MockBlimpMessageProcessor> receiver_; |
| 73 std::unique_ptr<BlimpConnection> connection_; | 77 std::unique_ptr<BlimpConnection> connection_; |
| 74 }; | 78 }; |
| 75 | 79 |
| 76 // Write completes writing two packets asynchronously. | 80 // Write completes writing two packets asynchronously. |
| 77 TEST_F(BlimpConnectionTest, AsyncTwoPacketsWrite) { | 81 TEST_F(BlimpConnectionTest, AsyncTwoPacketsWrite) { |
| 78 net::CompletionCallback write_packet_cb; | 82 net::CompletionCallback write_packet_cb; |
| 79 | 83 |
| 80 InSequence s; | 84 InSequence s; |
| 81 EXPECT_CALL(*writer_, | 85 EXPECT_CALL(*writer_, |
| 82 WritePacket(BufferEqualsProto(*CreateInputMessage()), _)) | 86 WritePacket(BufferEqualsProto(*CreateInputMessage()), _)) |
| 83 .WillOnce(SaveArg<1>(&write_packet_cb)) | 87 .WillOnce(SaveArg<1>(&write_packet_cb)) |
| 84 .RetiresOnSaturation(); | 88 .RetiresOnSaturation(); |
| 85 EXPECT_CALL(*writer_, | 89 EXPECT_CALL(*writer_, |
| 86 WritePacket(BufferEqualsProto(*CreateControlMessage()), _)) | 90 WritePacket(BufferEqualsProto(*CreateControlMessage()), _)) |
| 87 .WillOnce(SaveArg<1>(&write_packet_cb)) | 91 .WillOnce(SaveArg<1>(&write_packet_cb)) |
| 88 .RetiresOnSaturation(); | 92 .RetiresOnSaturation(); |
| 93 EXPECT_CALL(error_observer1_, OnConnectionError(_)).Times(0); |
| 94 EXPECT_CALL(error_observer2_, OnConnectionError(_)).Times(0); |
| 95 EXPECT_CALL(error_observer3_, OnConnectionError(_)).Times(0); |
| 89 | 96 |
| 90 BlimpMessageProcessor* sender = connection_->GetOutgoingMessageProcessor(); | 97 BlimpMessageProcessor* sender = connection_->GetOutgoingMessageProcessor(); |
| 91 net::TestCompletionCallback complete_cb_1; | 98 net::TestCompletionCallback complete_cb_1; |
| 92 ASSERT_TRUE(write_packet_cb.is_null()); | 99 ASSERT_TRUE(write_packet_cb.is_null()); |
| 93 sender->ProcessMessage(CreateInputMessage(), | 100 sender->ProcessMessage(CreateInputMessage(), |
| 94 complete_cb_1.callback()); | 101 complete_cb_1.callback()); |
| 95 ASSERT_FALSE(write_packet_cb.is_null()); | 102 ASSERT_FALSE(write_packet_cb.is_null()); |
| 96 base::ResetAndReturn(&write_packet_cb).Run(net::OK); | 103 base::ResetAndReturn(&write_packet_cb).Run(net::OK); |
| 97 EXPECT_EQ(net::OK, complete_cb_1.WaitForResult()); | 104 EXPECT_EQ(net::OK, complete_cb_1.WaitForResult()); |
| 98 | 105 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 114 EXPECT_CALL(*writer_, | 121 EXPECT_CALL(*writer_, |
| 115 WritePacket(BufferEqualsProto(*CreateInputMessage()), _)) | 122 WritePacket(BufferEqualsProto(*CreateInputMessage()), _)) |
| 116 .WillOnce(SaveArg<1>(&write_packet_cb)) | 123 .WillOnce(SaveArg<1>(&write_packet_cb)) |
| 117 .RetiresOnSaturation(); | 124 .RetiresOnSaturation(); |
| 118 EXPECT_CALL(*writer_, | 125 EXPECT_CALL(*writer_, |
| 119 WritePacket(BufferEqualsProto(*CreateControlMessage()), _)) | 126 WritePacket(BufferEqualsProto(*CreateControlMessage()), _)) |
| 120 .WillOnce(SaveArg<1>(&write_packet_cb)) | 127 .WillOnce(SaveArg<1>(&write_packet_cb)) |
| 121 .RetiresOnSaturation(); | 128 .RetiresOnSaturation(); |
| 122 EXPECT_CALL(error_observer1_, OnConnectionError(net::ERR_FAILED)); | 129 EXPECT_CALL(error_observer1_, OnConnectionError(net::ERR_FAILED)); |
| 123 EXPECT_CALL(error_observer2_, OnConnectionError(net::ERR_FAILED)); | 130 EXPECT_CALL(error_observer2_, OnConnectionError(net::ERR_FAILED)); |
| 131 EXPECT_CALL(error_observer3_, OnConnectionError(_)).Times(0); |
| 124 | 132 |
| 125 BlimpMessageProcessor* sender = connection_->GetOutgoingMessageProcessor(); | 133 BlimpMessageProcessor* sender = connection_->GetOutgoingMessageProcessor(); |
| 126 net::TestCompletionCallback complete_cb_1; | 134 net::TestCompletionCallback complete_cb_1; |
| 127 sender->ProcessMessage(CreateInputMessage(), | 135 sender->ProcessMessage(CreateInputMessage(), |
| 128 complete_cb_1.callback()); | 136 complete_cb_1.callback()); |
| 129 base::ResetAndReturn(&write_packet_cb).Run(net::OK); | 137 base::ResetAndReturn(&write_packet_cb).Run(net::OK); |
| 130 EXPECT_EQ(net::OK, complete_cb_1.WaitForResult()); | 138 EXPECT_EQ(net::OK, complete_cb_1.WaitForResult()); |
| 131 | 139 |
| 132 net::TestCompletionCallback complete_cb_2; | 140 net::TestCompletionCallback complete_cb_2; |
| 133 sender->ProcessMessage(CreateControlMessage(), | 141 sender->ProcessMessage(CreateControlMessage(), |
| (...skipping 15 matching lines...) Expand all Loading... |
| 149 this, &BlimpConnectionTest::DropConnection)); | 157 this, &BlimpConnectionTest::DropConnection)); |
| 150 | 158 |
| 151 BlimpMessageProcessor* sender = connection_->GetOutgoingMessageProcessor(); | 159 BlimpMessageProcessor* sender = connection_->GetOutgoingMessageProcessor(); |
| 152 net::TestCompletionCallback complete_cb_1; | 160 net::TestCompletionCallback complete_cb_1; |
| 153 sender->ProcessMessage(CreateInputMessage(), | 161 sender->ProcessMessage(CreateInputMessage(), |
| 154 complete_cb_1.callback()); | 162 complete_cb_1.callback()); |
| 155 base::ResetAndReturn(&write_packet_cb).Run(net::ERR_FAILED); | 163 base::ResetAndReturn(&write_packet_cb).Run(net::ERR_FAILED); |
| 156 EXPECT_EQ(net::ERR_FAILED, complete_cb_1.WaitForResult()); | 164 EXPECT_EQ(net::ERR_FAILED, complete_cb_1.WaitForResult()); |
| 157 } | 165 } |
| 158 | 166 |
| 167 // Verifies that a ReadPacket error causes ErrorObservers to be notified. |
| 168 TEST_F(BlimpConnectionTest, ReadPacketErrorInvokesErrorObservers) { |
| 169 scoped_refptr<net::GrowableIOBuffer> read_packet_buffer; |
| 170 net::CompletionCallback read_packet_cb; |
| 171 |
| 172 EXPECT_CALL(*reader_, ReadPacket(_, _)) |
| 173 .WillOnce( |
| 174 DoAll(SaveArg<0>(&read_packet_buffer), SaveArg<1>(&read_packet_cb))) |
| 175 .RetiresOnSaturation(); |
| 176 |
| 177 EXPECT_CALL(error_observer1_, OnConnectionError(net::ERR_FAILED)); |
| 178 EXPECT_CALL(error_observer2_, OnConnectionError(net::ERR_FAILED)); |
| 179 EXPECT_CALL(error_observer3_, OnConnectionError(_)).Times(0); |
| 180 |
| 181 EXPECT_CALL(receiver_, MockableProcessMessage(_, _)).Times(0); |
| 182 |
| 183 // Trigger the first ReadPacket() call by setting the MessageProcessor. |
| 184 connection_->SetIncomingMessageProcessor(&receiver_); |
| 185 EXPECT_TRUE(read_packet_buffer); |
| 186 EXPECT_FALSE(read_packet_cb.is_null()); |
| 187 |
| 188 // Signal an error back from the ReadPacket operation. |
| 189 base::ResetAndReturn(&read_packet_cb).Run(net::ERR_FAILED); |
| 190 } |
| 191 |
| 192 // Verifies that EndConnection messages received from the peer are |
| 193 // routed through to registered ConnectionErrorObservers as errors. |
| 194 TEST_F(BlimpConnectionTest, EndConnectionInvokesErrorObservers) { |
| 195 scoped_refptr<net::GrowableIOBuffer> read_packet_buffer; |
| 196 net::CompletionCallback read_packet_cb; |
| 197 |
| 198 EXPECT_CALL(*reader_, ReadPacket(_, _)) |
| 199 .WillOnce( |
| 200 DoAll(SaveArg<0>(&read_packet_buffer), SaveArg<1>(&read_packet_cb))) |
| 201 .WillOnce(Return()) |
| 202 .RetiresOnSaturation(); |
| 203 |
| 204 EXPECT_CALL(error_observer1_, |
| 205 OnConnectionError(EndConnectionMessage::PROTOCOL_MISMATCH)); |
| 206 EXPECT_CALL(error_observer2_, |
| 207 OnConnectionError(EndConnectionMessage::PROTOCOL_MISMATCH)); |
| 208 EXPECT_CALL(error_observer3_, OnConnectionError(_)).Times(0); |
| 209 |
| 210 EXPECT_CALL(receiver_, MockableProcessMessage(_, _)).Times(0); |
| 211 |
| 212 // Trigger the first ReadPacket() call by setting the MessageProcessor. |
| 213 connection_->SetIncomingMessageProcessor(&receiver_); |
| 214 EXPECT_TRUE(read_packet_buffer); |
| 215 EXPECT_FALSE(read_packet_cb.is_null()); |
| 216 |
| 217 // Create an EndConnection message to return from ReadPacket. |
| 218 std::unique_ptr<BlimpMessage> message = |
| 219 CreateEndConnectionMessage(EndConnectionMessage::PROTOCOL_MISMATCH); |
| 220 |
| 221 // Put the EndConnection message in the buffer and invoke the read callback. |
| 222 read_packet_buffer->SetCapacity(message->ByteSize()); |
| 223 ASSERT_TRUE(message->SerializeToArray(read_packet_buffer->data(), |
| 224 message->GetCachedSize())); |
| 225 base::ResetAndReturn(&read_packet_cb).Run(message->ByteSize()); |
| 226 } |
| 227 |
| 159 } // namespace | 228 } // namespace |
| 160 } // namespace blimp | 229 } // namespace blimp |
| OLD | NEW |