| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "remoting/protocol/channel_multiplexer.h" | 5 #include "remoting/protocol/channel_multiplexer.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 } | 41 } |
| 42 | 42 |
| 43 class MockSocketCallback { | 43 class MockSocketCallback { |
| 44 public: | 44 public: |
| 45 MOCK_METHOD1(OnDone, void(int result)); | 45 MOCK_METHOD1(OnDone, void(int result)); |
| 46 }; | 46 }; |
| 47 | 47 |
| 48 class MockConnectCallback { | 48 class MockConnectCallback { |
| 49 public: | 49 public: |
| 50 MOCK_METHOD1(OnConnectedPtr, void(P2PStreamSocket* socket)); | 50 MOCK_METHOD1(OnConnectedPtr, void(P2PStreamSocket* socket)); |
| 51 void OnConnected(scoped_ptr<P2PStreamSocket> socket) { | 51 void OnConnected(std::unique_ptr<P2PStreamSocket> socket) { |
| 52 OnConnectedPtr(socket.release()); | 52 OnConnectedPtr(socket.release()); |
| 53 } | 53 } |
| 54 }; | 54 }; |
| 55 | 55 |
| 56 } // namespace | 56 } // namespace |
| 57 | 57 |
| 58 class ChannelMultiplexerTest : public testing::Test { | 58 class ChannelMultiplexerTest : public testing::Test { |
| 59 public: | 59 public: |
| 60 void DeleteAll() { | 60 void DeleteAll() { |
| 61 host_socket1_.reset(); | 61 host_socket1_.reset(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 79 host_mux_.reset( | 79 host_mux_.reset( |
| 80 new ChannelMultiplexer(&host_channel_factory_, kMuxChannelName)); | 80 new ChannelMultiplexer(&host_channel_factory_, kMuxChannelName)); |
| 81 client_mux_.reset( | 81 client_mux_.reset( |
| 82 new ChannelMultiplexer(&client_channel_factory_, kMuxChannelName)); | 82 new ChannelMultiplexer(&client_channel_factory_, kMuxChannelName)); |
| 83 | 83 |
| 84 // Make writes asynchronous in one direction | 84 // Make writes asynchronous in one direction |
| 85 host_channel_factory_.set_async_write(true); | 85 host_channel_factory_.set_async_write(true); |
| 86 } | 86 } |
| 87 | 87 |
| 88 void CreateChannel(const std::string& name, | 88 void CreateChannel(const std::string& name, |
| 89 scoped_ptr<P2PStreamSocket>* host_socket, | 89 std::unique_ptr<P2PStreamSocket>* host_socket, |
| 90 scoped_ptr<P2PStreamSocket>* client_socket) { | 90 std::unique_ptr<P2PStreamSocket>* client_socket) { |
| 91 int counter = 2; | 91 int counter = 2; |
| 92 host_mux_->CreateChannel(name, base::Bind( | 92 host_mux_->CreateChannel(name, base::Bind( |
| 93 &ChannelMultiplexerTest::OnChannelConnected, base::Unretained(this), | 93 &ChannelMultiplexerTest::OnChannelConnected, base::Unretained(this), |
| 94 host_socket, &counter)); | 94 host_socket, &counter)); |
| 95 client_mux_->CreateChannel(name, base::Bind( | 95 client_mux_->CreateChannel(name, base::Bind( |
| 96 &ChannelMultiplexerTest::OnChannelConnected, base::Unretained(this), | 96 &ChannelMultiplexerTest::OnChannelConnected, base::Unretained(this), |
| 97 client_socket, &counter)); | 97 client_socket, &counter)); |
| 98 | 98 |
| 99 message_loop_.Run(); | 99 message_loop_.Run(); |
| 100 | 100 |
| 101 EXPECT_TRUE(host_socket->get()); | 101 EXPECT_TRUE(host_socket->get()); |
| 102 EXPECT_TRUE(client_socket->get()); | 102 EXPECT_TRUE(client_socket->get()); |
| 103 } | 103 } |
| 104 | 104 |
| 105 void OnChannelConnected( | 105 void OnChannelConnected(std::unique_ptr<P2PStreamSocket>* storage, |
| 106 scoped_ptr<P2PStreamSocket>* storage, | 106 int* counter, |
| 107 int* counter, | 107 std::unique_ptr<P2PStreamSocket> socket) { |
| 108 scoped_ptr<P2PStreamSocket> socket) { | |
| 109 *storage = std::move(socket); | 108 *storage = std::move(socket); |
| 110 --(*counter); | 109 --(*counter); |
| 111 EXPECT_GE(*counter, 0); | 110 EXPECT_GE(*counter, 0); |
| 112 if (*counter == 0) | 111 if (*counter == 0) |
| 113 QuitCurrentThread(); | 112 QuitCurrentThread(); |
| 114 } | 113 } |
| 115 | 114 |
| 116 scoped_refptr<net::IOBufferWithSize> CreateTestBuffer(int size) { | 115 scoped_refptr<net::IOBufferWithSize> CreateTestBuffer(int size) { |
| 117 scoped_refptr<net::IOBufferWithSize> result = | 116 scoped_refptr<net::IOBufferWithSize> result = |
| 118 new net::IOBufferWithSize(size); | 117 new net::IOBufferWithSize(size); |
| 119 for (int i = 0; i< size; ++i) { | 118 for (int i = 0; i< size; ++i) { |
| 120 result->data()[i] = rand() % 256; | 119 result->data()[i] = rand() % 256; |
| 121 } | 120 } |
| 122 return result; | 121 return result; |
| 123 } | 122 } |
| 124 | 123 |
| 125 base::MessageLoop message_loop_; | 124 base::MessageLoop message_loop_; |
| 126 | 125 |
| 127 FakeStreamChannelFactory host_channel_factory_; | 126 FakeStreamChannelFactory host_channel_factory_; |
| 128 FakeStreamChannelFactory client_channel_factory_; | 127 FakeStreamChannelFactory client_channel_factory_; |
| 129 | 128 |
| 130 scoped_ptr<ChannelMultiplexer> host_mux_; | 129 std::unique_ptr<ChannelMultiplexer> host_mux_; |
| 131 scoped_ptr<ChannelMultiplexer> client_mux_; | 130 std::unique_ptr<ChannelMultiplexer> client_mux_; |
| 132 | 131 |
| 133 scoped_ptr<P2PStreamSocket> host_socket1_; | 132 std::unique_ptr<P2PStreamSocket> host_socket1_; |
| 134 scoped_ptr<P2PStreamSocket> client_socket1_; | 133 std::unique_ptr<P2PStreamSocket> client_socket1_; |
| 135 scoped_ptr<P2PStreamSocket> host_socket2_; | 134 std::unique_ptr<P2PStreamSocket> host_socket2_; |
| 136 scoped_ptr<P2PStreamSocket> client_socket2_; | 135 std::unique_ptr<P2PStreamSocket> client_socket2_; |
| 137 }; | 136 }; |
| 138 | 137 |
| 139 | 138 |
| 140 TEST_F(ChannelMultiplexerTest, OneChannel) { | 139 TEST_F(ChannelMultiplexerTest, OneChannel) { |
| 141 scoped_ptr<P2PStreamSocket> host_socket; | 140 std::unique_ptr<P2PStreamSocket> host_socket; |
| 142 scoped_ptr<P2PStreamSocket> client_socket; | 141 std::unique_ptr<P2PStreamSocket> client_socket; |
| 143 ASSERT_NO_FATAL_FAILURE( | 142 ASSERT_NO_FATAL_FAILURE( |
| 144 CreateChannel(kTestChannelName, &host_socket, &client_socket)); | 143 CreateChannel(kTestChannelName, &host_socket, &client_socket)); |
| 145 | 144 |
| 146 StreamConnectionTester tester(host_socket.get(), client_socket.get(), | 145 StreamConnectionTester tester(host_socket.get(), client_socket.get(), |
| 147 kMessageSize, kMessages); | 146 kMessageSize, kMessages); |
| 148 tester.Start(); | 147 tester.Start(); |
| 149 message_loop_.Run(); | 148 message_loop_.Run(); |
| 150 tester.CheckResults(); | 149 tester.CheckResults(); |
| 151 } | 150 } |
| 152 | 151 |
| 153 TEST_F(ChannelMultiplexerTest, TwoChannels) { | 152 TEST_F(ChannelMultiplexerTest, TwoChannels) { |
| 154 scoped_ptr<P2PStreamSocket> host_socket1_; | 153 std::unique_ptr<P2PStreamSocket> host_socket1_; |
| 155 scoped_ptr<P2PStreamSocket> client_socket1_; | 154 std::unique_ptr<P2PStreamSocket> client_socket1_; |
| 156 ASSERT_NO_FATAL_FAILURE( | 155 ASSERT_NO_FATAL_FAILURE( |
| 157 CreateChannel(kTestChannelName, &host_socket1_, &client_socket1_)); | 156 CreateChannel(kTestChannelName, &host_socket1_, &client_socket1_)); |
| 158 | 157 |
| 159 scoped_ptr<P2PStreamSocket> host_socket2_; | 158 std::unique_ptr<P2PStreamSocket> host_socket2_; |
| 160 scoped_ptr<P2PStreamSocket> client_socket2_; | 159 std::unique_ptr<P2PStreamSocket> client_socket2_; |
| 161 ASSERT_NO_FATAL_FAILURE( | 160 ASSERT_NO_FATAL_FAILURE( |
| 162 CreateChannel(kTestChannelName2, &host_socket2_, &client_socket2_)); | 161 CreateChannel(kTestChannelName2, &host_socket2_, &client_socket2_)); |
| 163 | 162 |
| 164 StreamConnectionTester tester1(host_socket1_.get(), client_socket1_.get(), | 163 StreamConnectionTester tester1(host_socket1_.get(), client_socket1_.get(), |
| 165 kMessageSize, kMessages); | 164 kMessageSize, kMessages); |
| 166 StreamConnectionTester tester2(host_socket2_.get(), client_socket2_.get(), | 165 StreamConnectionTester tester2(host_socket2_.get(), client_socket2_.get(), |
| 167 kMessageSize, kMessages); | 166 kMessageSize, kMessages); |
| 168 tester1.Start(); | 167 tester1.Start(); |
| 169 tester2.Start(); | 168 tester2.Start(); |
| 170 while (!tester1.done() || !tester2.done()) { | 169 while (!tester1.done() || !tester2.done()) { |
| 171 message_loop_.Run(); | 170 message_loop_.Run(); |
| 172 } | 171 } |
| 173 tester1.CheckResults(); | 172 tester1.CheckResults(); |
| 174 tester2.CheckResults(); | 173 tester2.CheckResults(); |
| 175 } | 174 } |
| 176 | 175 |
| 177 // Four channels, two in each direction | 176 // Four channels, two in each direction |
| 178 TEST_F(ChannelMultiplexerTest, FourChannels) { | 177 TEST_F(ChannelMultiplexerTest, FourChannels) { |
| 179 scoped_ptr<P2PStreamSocket> host_socket1_; | 178 std::unique_ptr<P2PStreamSocket> host_socket1_; |
| 180 scoped_ptr<P2PStreamSocket> client_socket1_; | 179 std::unique_ptr<P2PStreamSocket> client_socket1_; |
| 181 ASSERT_NO_FATAL_FAILURE( | 180 ASSERT_NO_FATAL_FAILURE( |
| 182 CreateChannel(kTestChannelName, &host_socket1_, &client_socket1_)); | 181 CreateChannel(kTestChannelName, &host_socket1_, &client_socket1_)); |
| 183 | 182 |
| 184 scoped_ptr<P2PStreamSocket> host_socket2_; | 183 std::unique_ptr<P2PStreamSocket> host_socket2_; |
| 185 scoped_ptr<P2PStreamSocket> client_socket2_; | 184 std::unique_ptr<P2PStreamSocket> client_socket2_; |
| 186 ASSERT_NO_FATAL_FAILURE( | 185 ASSERT_NO_FATAL_FAILURE( |
| 187 CreateChannel(kTestChannelName2, &host_socket2_, &client_socket2_)); | 186 CreateChannel(kTestChannelName2, &host_socket2_, &client_socket2_)); |
| 188 | 187 |
| 189 scoped_ptr<P2PStreamSocket> host_socket3; | 188 std::unique_ptr<P2PStreamSocket> host_socket3; |
| 190 scoped_ptr<P2PStreamSocket> client_socket3; | 189 std::unique_ptr<P2PStreamSocket> client_socket3; |
| 191 ASSERT_NO_FATAL_FAILURE( | 190 ASSERT_NO_FATAL_FAILURE( |
| 192 CreateChannel("test3", &host_socket3, &client_socket3)); | 191 CreateChannel("test3", &host_socket3, &client_socket3)); |
| 193 | 192 |
| 194 scoped_ptr<P2PStreamSocket> host_socket4; | 193 std::unique_ptr<P2PStreamSocket> host_socket4; |
| 195 scoped_ptr<P2PStreamSocket> client_socket4; | 194 std::unique_ptr<P2PStreamSocket> client_socket4; |
| 196 ASSERT_NO_FATAL_FAILURE( | 195 ASSERT_NO_FATAL_FAILURE( |
| 197 CreateChannel("ch4", &host_socket4, &client_socket4)); | 196 CreateChannel("ch4", &host_socket4, &client_socket4)); |
| 198 | 197 |
| 199 StreamConnectionTester tester1(host_socket1_.get(), client_socket1_.get(), | 198 StreamConnectionTester tester1(host_socket1_.get(), client_socket1_.get(), |
| 200 kMessageSize, kMessages); | 199 kMessageSize, kMessages); |
| 201 StreamConnectionTester tester2(host_socket2_.get(), client_socket2_.get(), | 200 StreamConnectionTester tester2(host_socket2_.get(), client_socket2_.get(), |
| 202 kMessageSize, kMessages); | 201 kMessageSize, kMessages); |
| 203 StreamConnectionTester tester3(client_socket3.get(), host_socket3.get(), | 202 StreamConnectionTester tester3(client_socket3.get(), host_socket3.get(), |
| 204 kMessageSize, kMessages); | 203 kMessageSize, kMessages); |
| 205 StreamConnectionTester tester4(client_socket4.get(), host_socket4.get(), | 204 StreamConnectionTester tester4(client_socket4.get(), host_socket4.get(), |
| 206 kMessageSize, kMessages); | 205 kMessageSize, kMessages); |
| 207 tester1.Start(); | 206 tester1.Start(); |
| 208 tester2.Start(); | 207 tester2.Start(); |
| 209 tester3.Start(); | 208 tester3.Start(); |
| 210 tester4.Start(); | 209 tester4.Start(); |
| 211 while (!tester1.done() || !tester2.done() || | 210 while (!tester1.done() || !tester2.done() || |
| 212 !tester3.done() || !tester4.done()) { | 211 !tester3.done() || !tester4.done()) { |
| 213 message_loop_.Run(); | 212 message_loop_.Run(); |
| 214 } | 213 } |
| 215 tester1.CheckResults(); | 214 tester1.CheckResults(); |
| 216 tester2.CheckResults(); | 215 tester2.CheckResults(); |
| 217 tester3.CheckResults(); | 216 tester3.CheckResults(); |
| 218 tester4.CheckResults(); | 217 tester4.CheckResults(); |
| 219 } | 218 } |
| 220 | 219 |
| 221 TEST_F(ChannelMultiplexerTest, WriteFailSync) { | 220 TEST_F(ChannelMultiplexerTest, WriteFailSync) { |
| 222 scoped_ptr<P2PStreamSocket> host_socket1_; | 221 std::unique_ptr<P2PStreamSocket> host_socket1_; |
| 223 scoped_ptr<P2PStreamSocket> client_socket1_; | 222 std::unique_ptr<P2PStreamSocket> client_socket1_; |
| 224 ASSERT_NO_FATAL_FAILURE( | 223 ASSERT_NO_FATAL_FAILURE( |
| 225 CreateChannel(kTestChannelName, &host_socket1_, &client_socket1_)); | 224 CreateChannel(kTestChannelName, &host_socket1_, &client_socket1_)); |
| 226 | 225 |
| 227 scoped_ptr<P2PStreamSocket> host_socket2_; | 226 std::unique_ptr<P2PStreamSocket> host_socket2_; |
| 228 scoped_ptr<P2PStreamSocket> client_socket2_; | 227 std::unique_ptr<P2PStreamSocket> client_socket2_; |
| 229 ASSERT_NO_FATAL_FAILURE( | 228 ASSERT_NO_FATAL_FAILURE( |
| 230 CreateChannel(kTestChannelName2, &host_socket2_, &client_socket2_)); | 229 CreateChannel(kTestChannelName2, &host_socket2_, &client_socket2_)); |
| 231 | 230 |
| 232 FakeStreamSocket* socket = | 231 FakeStreamSocket* socket = |
| 233 host_channel_factory_.GetFakeChannel(kMuxChannelName); | 232 host_channel_factory_.GetFakeChannel(kMuxChannelName); |
| 234 socket->set_next_write_error(net::ERR_FAILED); | 233 socket->set_next_write_error(net::ERR_FAILED); |
| 235 socket->set_async_write(false); | 234 socket->set_async_write(false); |
| 236 | 235 |
| 237 scoped_refptr<net::IOBufferWithSize> buf = CreateTestBuffer(100); | 236 scoped_refptr<net::IOBufferWithSize> buf = CreateTestBuffer(100); |
| 238 | 237 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 .WillOnce(InvokeWithoutArgs( | 344 .WillOnce(InvokeWithoutArgs( |
| 346 this, &ChannelMultiplexerTest::DeleteAfterSessionFail)); | 345 this, &ChannelMultiplexerTest::DeleteAfterSessionFail)); |
| 347 EXPECT_CALL(cb2, OnConnectedPtr(_)) | 346 EXPECT_CALL(cb2, OnConnectedPtr(_)) |
| 348 .Times(0); | 347 .Times(0); |
| 349 | 348 |
| 350 base::RunLoop().RunUntilIdle(); | 349 base::RunLoop().RunUntilIdle(); |
| 351 } | 350 } |
| 352 | 351 |
| 353 } // namespace protocol | 352 } // namespace protocol |
| 354 } // namespace remoting | 353 } // namespace remoting |
| OLD | NEW |