Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(714)

Side by Side Diff: remoting/protocol/channel_multiplexer_unittest.cc

Issue 10830046: Implement ChannelMultiplexer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « remoting/protocol/channel_multiplexer.cc ('k') | remoting/protocol/connection_tester.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "remoting/protocol/channel_multiplexer.h"
6
7 #include "base/bind.h"
8 #include "base/message_loop.h"
9 #include "net/base/net_errors.h"
10 #include "net/socket/socket.h"
11 #include "net/socket/stream_socket.h"
12 #include "remoting/base/constants.h"
13 #include "remoting/protocol/connection_tester.h"
14 #include "remoting/protocol/fake_session.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 using testing::_;
19 using testing::AtMost;
20 using testing::InvokeWithoutArgs;
21
22 namespace remoting {
23 namespace protocol {
24
25 namespace {
26
27 const int kMessageSize = 1024;
28 const int kMessages = 100;
29 const char kMuxChannelName[] = "mux";
30
31 void QuitCurrentThread() {
32 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
33 }
34
35 class MockSocketCallback {
36 public:
37 MOCK_METHOD1(OnDone, void(int result));
38 };
39
40 } // namespace
41
42 class ChannelMultiplexerTest : public testing::Test {
43 public:
44 void DeleteAll() {
45 host_socket1_.reset();
46 host_socket2_.reset();
47 client_socket1_.reset();
48 client_socket2_.reset();
49 host_mux_.reset();
50 client_mux_.reset();
51 }
52
53 protected:
54 virtual void SetUp() OVERRIDE {
55 // Create pair of multiplexers and connect them to each other.
56 host_mux_.reset(new ChannelMultiplexer(&host_session_, kMuxChannelName));
57 client_mux_.reset(new ChannelMultiplexer(&client_session_,
58 kMuxChannelName));
59 FakeSocket* host_socket =
60 host_session_.GetStreamChannel(ChannelMultiplexer::kMuxChannelName);
61 FakeSocket* client_socket =
62 client_session_.GetStreamChannel(ChannelMultiplexer::kMuxChannelName);
63 host_socket->PairWith(client_socket);
64
65 // Make writes asynchronous in one direction.
66 host_socket->set_async_write(true);
67 }
68
69 void CreateChannel(const std::string& name,
70 scoped_ptr<net::StreamSocket>* host_socket,
71 scoped_ptr<net::StreamSocket>* client_socket) {
72 int counter = 2;
73 host_mux_->CreateStreamChannel(name, base::Bind(
74 &ChannelMultiplexerTest::OnChannelConnected, base::Unretained(this),
75 host_socket, &counter));
76 client_mux_->CreateStreamChannel(name, base::Bind(
77 &ChannelMultiplexerTest::OnChannelConnected, base::Unretained(this),
78 client_socket, &counter));
79
80 message_loop_.Run();
81
82 EXPECT_TRUE(host_socket->get());
83 EXPECT_TRUE(client_socket->get());
84 }
85
86 void OnChannelConnected(
87 scoped_ptr<net::StreamSocket>* storage,
88 int* counter,
89 scoped_ptr<net::StreamSocket> socket) {
90 *storage = socket.Pass();
91 --(*counter);
92 EXPECT_GE(*counter, 0);
93 if (*counter == 0)
94 QuitCurrentThread();
95 }
96
97 scoped_refptr<net::IOBufferWithSize> CreateTestBuffer(int size) {
98 scoped_refptr<net::IOBufferWithSize> result =
99 new net::IOBufferWithSize(size);
100 for (int i = 0; i< size; ++i) {
101 result->data()[i] = rand() % 256;
102 }
103 return result;
104 }
105
106 MessageLoop message_loop_;
107
108 FakeSession host_session_;
109 FakeSession client_session_;
110
111 scoped_ptr<ChannelMultiplexer> host_mux_;
112 scoped_ptr<ChannelMultiplexer> client_mux_;
113
114 scoped_ptr<net::StreamSocket> host_socket1_;
115 scoped_ptr<net::StreamSocket> client_socket1_;
116 scoped_ptr<net::StreamSocket> host_socket2_;
117 scoped_ptr<net::StreamSocket> client_socket2_;
118 };
119
120
121 TEST_F(ChannelMultiplexerTest, OneChannel) {
122 scoped_ptr<net::StreamSocket> host_socket;
123 scoped_ptr<net::StreamSocket> client_socket;
124 ASSERT_NO_FATAL_FAILURE(CreateChannel("test", &host_socket, &client_socket));
125
126 StreamConnectionTester tester(host_socket.get(), client_socket.get(),
127 kMessageSize, kMessages);
128 tester.Start();
129 message_loop_.Run();
130 tester.CheckResults();
131 }
132
133 TEST_F(ChannelMultiplexerTest, TwoChannels) {
134 scoped_ptr<net::StreamSocket> host_socket1_;
135 scoped_ptr<net::StreamSocket> client_socket1_;
136 ASSERT_NO_FATAL_FAILURE(
137 CreateChannel("test", &host_socket1_, &client_socket1_));
138
139 scoped_ptr<net::StreamSocket> host_socket2_;
140 scoped_ptr<net::StreamSocket> client_socket2_;
141 ASSERT_NO_FATAL_FAILURE(
142 CreateChannel("ch2", &host_socket2_, &client_socket2_));
143
144 StreamConnectionTester tester1(host_socket1_.get(), client_socket1_.get(),
145 kMessageSize, kMessages);
146 StreamConnectionTester tester2(host_socket2_.get(), client_socket2_.get(),
147 kMessageSize, kMessages);
148 tester1.Start();
149 tester2.Start();
150 while (!tester1.done() || !tester2.done()) {
151 message_loop_.Run();
152 }
153 tester1.CheckResults();
154 tester2.CheckResults();
155 }
156
157 // Four channels, two in each direction
158 TEST_F(ChannelMultiplexerTest, FourChannels) {
159 scoped_ptr<net::StreamSocket> host_socket1_;
160 scoped_ptr<net::StreamSocket> client_socket1_;
161 ASSERT_NO_FATAL_FAILURE(
162 CreateChannel("test", &host_socket1_, &client_socket1_));
163
164 scoped_ptr<net::StreamSocket> host_socket2_;
165 scoped_ptr<net::StreamSocket> client_socket2_;
166 ASSERT_NO_FATAL_FAILURE(
167 CreateChannel("ch2", &host_socket2_, &client_socket2_));
168
169 scoped_ptr<net::StreamSocket> host_socket3;
170 scoped_ptr<net::StreamSocket> client_socket3;
171 ASSERT_NO_FATAL_FAILURE(
172 CreateChannel("test3", &host_socket3, &client_socket3));
173
174 scoped_ptr<net::StreamSocket> host_socket4;
175 scoped_ptr<net::StreamSocket> client_socket4;
176 ASSERT_NO_FATAL_FAILURE(
177 CreateChannel("ch4", &host_socket4, &client_socket4));
178
179 StreamConnectionTester tester1(host_socket1_.get(), client_socket1_.get(),
180 kMessageSize, kMessages);
181 StreamConnectionTester tester2(host_socket2_.get(), client_socket2_.get(),
182 kMessageSize, kMessages);
183 StreamConnectionTester tester3(client_socket3.get(), host_socket3.get(),
184 kMessageSize, kMessages);
185 StreamConnectionTester tester4(client_socket4.get(), host_socket4.get(),
186 kMessageSize, kMessages);
187 tester1.Start();
188 tester2.Start();
189 tester3.Start();
190 tester4.Start();
191 while (!tester1.done() || !tester2.done() ||
192 !tester3.done() || !tester4.done()) {
193 message_loop_.Run();
194 }
195 tester1.CheckResults();
196 tester2.CheckResults();
197 tester3.CheckResults();
198 tester4.CheckResults();
199 }
200
201 TEST_F(ChannelMultiplexerTest, SyncFail) {
202 scoped_ptr<net::StreamSocket> host_socket1_;
203 scoped_ptr<net::StreamSocket> client_socket1_;
204 ASSERT_NO_FATAL_FAILURE(
205 CreateChannel("test", &host_socket1_, &client_socket1_));
206
207 scoped_ptr<net::StreamSocket> host_socket2_;
208 scoped_ptr<net::StreamSocket> client_socket2_;
209 ASSERT_NO_FATAL_FAILURE(
210 CreateChannel("ch2", &host_socket2_, &client_socket2_));
211
212 host_session_.GetStreamChannel(kMuxChannelName)->
213 set_next_write_error(net::ERR_FAILED);
214 host_session_.GetStreamChannel(kMuxChannelName)->
215 set_async_write(false);
216
217 scoped_refptr<net::IOBufferWithSize> buf = CreateTestBuffer(100);
218
219 MockSocketCallback cb1;
220 MockSocketCallback cb2;
221
222 EXPECT_CALL(cb1, OnDone(_))
223 .Times(0);
224 EXPECT_CALL(cb2, OnDone(_))
225 .Times(0);
226
227 EXPECT_EQ(net::ERR_FAILED, host_socket1_->Write(buf, buf->size(), base::Bind(
228 &MockSocketCallback::OnDone, base::Unretained(&cb1))));
229 EXPECT_EQ(net::ERR_FAILED, host_socket2_->Write(buf, buf->size(), base::Bind(
230 &MockSocketCallback::OnDone, base::Unretained(&cb2))));
231
232 message_loop_.RunAllPending();
233 }
234
235 TEST_F(ChannelMultiplexerTest, AsyncFail) {
236 ASSERT_NO_FATAL_FAILURE(
237 CreateChannel("test", &host_socket1_, &client_socket1_));
238
239 ASSERT_NO_FATAL_FAILURE(
240 CreateChannel("ch2", &host_socket2_, &client_socket2_));
241
242 host_session_.GetStreamChannel(kMuxChannelName)->
243 set_next_write_error(net::ERR_FAILED);
244 host_session_.GetStreamChannel(kMuxChannelName)->
245 set_async_write(true);
246
247 scoped_refptr<net::IOBufferWithSize> buf = CreateTestBuffer(100);
248
249 MockSocketCallback cb1;
250 MockSocketCallback cb2;
251 EXPECT_CALL(cb1, OnDone(net::ERR_FAILED));
252 EXPECT_CALL(cb2, OnDone(net::ERR_FAILED));
253
254 EXPECT_EQ(net::ERR_IO_PENDING,
255 host_socket1_->Write(buf, buf->size(), base::Bind(
256 &MockSocketCallback::OnDone, base::Unretained(&cb1))));
257 EXPECT_EQ(net::ERR_IO_PENDING,
258 host_socket2_->Write(buf, buf->size(), base::Bind(
259 &MockSocketCallback::OnDone, base::Unretained(&cb2))));
260
261 message_loop_.RunAllPending();
262 }
263
264 TEST_F(ChannelMultiplexerTest, DeleteWhenFailed) {
265 ASSERT_NO_FATAL_FAILURE(
266 CreateChannel("test", &host_socket1_, &client_socket1_));
267 ASSERT_NO_FATAL_FAILURE(
268 CreateChannel("ch2", &host_socket2_, &client_socket2_));
269
270 host_session_.GetStreamChannel(kMuxChannelName)->
271 set_next_write_error(net::ERR_FAILED);
272 host_session_.GetStreamChannel(kMuxChannelName)->
273 set_async_write(true);
274
275 scoped_refptr<net::IOBufferWithSize> buf = CreateTestBuffer(100);
276
277 MockSocketCallback cb1;
278 MockSocketCallback cb2;
279
280 EXPECT_CALL(cb1, OnDone(net::ERR_FAILED))
281 .Times(AtMost(1))
282 .WillOnce(InvokeWithoutArgs(this, &ChannelMultiplexerTest::DeleteAll));
283 EXPECT_CALL(cb2, OnDone(net::ERR_FAILED))
284 .Times(AtMost(1))
285 .WillOnce(InvokeWithoutArgs(this, &ChannelMultiplexerTest::DeleteAll));
286
287 EXPECT_EQ(net::ERR_IO_PENDING,
288 host_socket1_->Write(buf, buf->size(), base::Bind(
289 &MockSocketCallback::OnDone, base::Unretained(&cb1))));
290 EXPECT_EQ(net::ERR_IO_PENDING,
291 host_socket2_->Write(buf, buf->size(), base::Bind(
292 &MockSocketCallback::OnDone, base::Unretained(&cb2))));
293
294 message_loop_.RunAllPending();
295
296 // Check that the sockets were destroyed.
297 EXPECT_FALSE(host_mux_.get());
298 }
299
300 } // namespace protocol
301 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/protocol/channel_multiplexer.cc ('k') | remoting/protocol/connection_tester.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698