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 |