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

Side by Side Diff: mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc

Issue 2280483002: Add FlushForTesting to InterfacePtr and Binding. (Closed)
Patch Set: Created 4 years, 3 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
OLDNEW
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 "mojo/public/cpp/bindings/lib/multiplex_router.h" 5 #include "mojo/public/cpp/bindings/lib/multiplex_router.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 ScopedInterfaceEndpointHandle endpoint0_; 58 ScopedInterfaceEndpointHandle endpoint0_;
59 ScopedInterfaceEndpointHandle endpoint1_; 59 ScopedInterfaceEndpointHandle endpoint1_;
60 60
61 private: 61 private:
62 base::MessageLoop loop_; 62 base::MessageLoop loop_;
63 }; 63 };
64 64
65 TEST_F(MultiplexRouterTest, BasicRequestResponse) { 65 TEST_F(MultiplexRouterTest, BasicRequestResponse) {
66 InterfaceEndpointClient client0(std::move(endpoint0_), nullptr, 66 InterfaceEndpointClient client0(std::move(endpoint0_), nullptr,
67 base::MakeUnique<PassThroughFilter>(), false, 67 base::MakeUnique<PassThroughFilter>(), false,
68 base::ThreadTaskRunnerHandle::Get()); 68 base::ThreadTaskRunnerHandle::Get(), 0u);
69 ResponseGenerator generator; 69 ResponseGenerator generator;
70 InterfaceEndpointClient client1(std::move(endpoint1_), &generator, 70 InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
71 base::MakeUnique<PassThroughFilter>(), false, 71 base::MakeUnique<PassThroughFilter>(), false,
72 base::ThreadTaskRunnerHandle::Get()); 72 base::ThreadTaskRunnerHandle::Get(), 0u);
73 73
74 Message request; 74 Message request;
75 AllocRequestMessage(1, "hello", &request); 75 AllocRequestMessage(1, "hello", &request);
76 76
77 MessageQueue message_queue; 77 MessageQueue message_queue;
78 base::RunLoop run_loop; 78 base::RunLoop run_loop;
79 client0.AcceptWithResponder( 79 client0.AcceptWithResponder(
80 &request, 80 &request,
81 new MessageAccumulator(&message_queue, run_loop.QuitClosure())); 81 new MessageAccumulator(&message_queue, run_loop.QuitClosure()));
82 82
(...skipping 22 matching lines...) Expand all
105 105
106 message_queue.Pop(&response); 106 message_queue.Pop(&response);
107 107
108 EXPECT_EQ(std::string("hello again world!"), 108 EXPECT_EQ(std::string("hello again world!"),
109 std::string(reinterpret_cast<const char*>(response.payload()))); 109 std::string(reinterpret_cast<const char*>(response.payload())));
110 } 110 }
111 111
112 TEST_F(MultiplexRouterTest, BasicRequestResponse_Synchronous) { 112 TEST_F(MultiplexRouterTest, BasicRequestResponse_Synchronous) {
113 InterfaceEndpointClient client0(std::move(endpoint0_), nullptr, 113 InterfaceEndpointClient client0(std::move(endpoint0_), nullptr,
114 base::MakeUnique<PassThroughFilter>(), false, 114 base::MakeUnique<PassThroughFilter>(), false,
115 base::ThreadTaskRunnerHandle::Get()); 115 base::ThreadTaskRunnerHandle::Get(), 0u);
116 ResponseGenerator generator; 116 ResponseGenerator generator;
117 InterfaceEndpointClient client1(std::move(endpoint1_), &generator, 117 InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
118 base::MakeUnique<PassThroughFilter>(), false, 118 base::MakeUnique<PassThroughFilter>(), false,
119 base::ThreadTaskRunnerHandle::Get()); 119 base::ThreadTaskRunnerHandle::Get(), 0u);
120 120
121 Message request; 121 Message request;
122 AllocRequestMessage(1, "hello", &request); 122 AllocRequestMessage(1, "hello", &request);
123 123
124 MessageQueue message_queue; 124 MessageQueue message_queue;
125 client0.AcceptWithResponder(&request, new MessageAccumulator(&message_queue)); 125 client0.AcceptWithResponder(&request, new MessageAccumulator(&message_queue));
126 126
127 router1_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 127 router1_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
128 router0_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 128 router0_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
129 129
(...skipping 16 matching lines...) Expand all
146 router0_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 146 router0_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
147 147
148 EXPECT_FALSE(message_queue.IsEmpty()); 148 EXPECT_FALSE(message_queue.IsEmpty());
149 149
150 message_queue.Pop(&response); 150 message_queue.Pop(&response);
151 151
152 EXPECT_EQ(std::string("hello again world!"), 152 EXPECT_EQ(std::string("hello again world!"),
153 std::string(reinterpret_cast<const char*>(response.payload()))); 153 std::string(reinterpret_cast<const char*>(response.payload())));
154 } 154 }
155 155
156 TEST_F(MultiplexRouterTest, RequestWithNoReceiver) {
157 InterfaceEndpointClient client0(std::move(endpoint0_), nullptr,
158 base::MakeUnique<PassThroughFilter>(), false,
159 base::ThreadTaskRunnerHandle::Get());
160 InterfaceEndpointClient client1(std::move(endpoint1_), nullptr,
161 base::MakeUnique<PassThroughFilter>(), false,
162 base::ThreadTaskRunnerHandle::Get());
163
164 // Without an incoming receiver set on client1, we expect client0 to observe
165 // an error as a result of sending a message.
166
167 Message request;
168 AllocRequestMessage(1, "hello", &request);
169
170 MessageQueue message_queue;
171 base::RunLoop run_loop, run_loop2;
172 client0.set_connection_error_handler(run_loop.QuitClosure());
173 client1.set_connection_error_handler(run_loop2.QuitClosure());
174 client0.AcceptWithResponder(
175 &request, new MessageAccumulator(&message_queue, run_loop.QuitClosure()));
176
177 run_loop.Run();
178 run_loop2.Run();
179
180 EXPECT_TRUE(client0.encountered_error());
181 EXPECT_TRUE(client1.encountered_error());
182 EXPECT_TRUE(message_queue.IsEmpty());
183 }
184
185 // Tests MultiplexRouter using the LazyResponseGenerator. The responses will not 156 // Tests MultiplexRouter using the LazyResponseGenerator. The responses will not
186 // be sent until after the requests have been accepted. 157 // be sent until after the requests have been accepted.
187 TEST_F(MultiplexRouterTest, LazyResponses) { 158 TEST_F(MultiplexRouterTest, LazyResponses) {
188 InterfaceEndpointClient client0(std::move(endpoint0_), nullptr, 159 InterfaceEndpointClient client0(
189 base::WrapUnique(new PassThroughFilter()), 160 std::move(endpoint0_), nullptr, base::WrapUnique(new PassThroughFilter()),
190 false, base::ThreadTaskRunnerHandle::Get()); 161 false, base::ThreadTaskRunnerHandle::Get(), 0u);
191 base::RunLoop run_loop; 162 base::RunLoop run_loop;
192 LazyResponseGenerator generator(run_loop.QuitClosure()); 163 LazyResponseGenerator generator(run_loop.QuitClosure());
193 InterfaceEndpointClient client1(std::move(endpoint1_), &generator, 164 InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
194 base::WrapUnique(new PassThroughFilter()), 165 base::WrapUnique(new PassThroughFilter()),
195 false, base::ThreadTaskRunnerHandle::Get()); 166 false, base::ThreadTaskRunnerHandle::Get(),
167 0u);
196 168
197 Message request; 169 Message request;
198 AllocRequestMessage(1, "hello", &request); 170 AllocRequestMessage(1, "hello", &request);
199 171
200 MessageQueue message_queue; 172 MessageQueue message_queue;
201 base::RunLoop run_loop2; 173 base::RunLoop run_loop2;
202 client0.AcceptWithResponder( 174 client0.AcceptWithResponder(
203 &request, 175 &request,
204 new MessageAccumulator(&message_queue, run_loop2.QuitClosure())); 176 new MessageAccumulator(&message_queue, run_loop2.QuitClosure()));
205 run_loop.Run(); 177 run_loop.Run();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 void ForwardErrorHandler(bool* called, const base::Closure& callback) { 221 void ForwardErrorHandler(bool* called, const base::Closure& callback) {
250 *called = true; 222 *called = true;
251 callback.Run(); 223 callback.Run();
252 } 224 }
253 225
254 // Tests that if the receiving application destroys the responder_ without 226 // Tests that if the receiving application destroys the responder_ without
255 // sending a response, then we trigger connection error at both sides. Moreover, 227 // sending a response, then we trigger connection error at both sides. Moreover,
256 // both sides still appear to have a valid message pipe handle bound. 228 // both sides still appear to have a valid message pipe handle bound.
257 TEST_F(MultiplexRouterTest, MissingResponses) { 229 TEST_F(MultiplexRouterTest, MissingResponses) {
258 base::RunLoop run_loop0, run_loop1; 230 base::RunLoop run_loop0, run_loop1;
259 InterfaceEndpointClient client0(std::move(endpoint0_), nullptr, 231 InterfaceEndpointClient client0(
260 base::WrapUnique(new PassThroughFilter()), 232 std::move(endpoint0_), nullptr, base::WrapUnique(new PassThroughFilter()),
261 false, base::ThreadTaskRunnerHandle::Get()); 233 false, base::ThreadTaskRunnerHandle::Get(), 0u);
262 bool error_handler_called0 = false; 234 bool error_handler_called0 = false;
263 client0.set_connection_error_handler( 235 client0.set_connection_error_handler(
264 base::Bind(&ForwardErrorHandler, &error_handler_called0, 236 base::Bind(&ForwardErrorHandler, &error_handler_called0,
265 run_loop0.QuitClosure())); 237 run_loop0.QuitClosure()));
266 238
267 base::RunLoop run_loop3; 239 base::RunLoop run_loop3;
268 LazyResponseGenerator generator(run_loop3.QuitClosure()); 240 LazyResponseGenerator generator(run_loop3.QuitClosure());
269 InterfaceEndpointClient client1(std::move(endpoint1_), &generator, 241 InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
270 base::WrapUnique(new PassThroughFilter()), 242 base::WrapUnique(new PassThroughFilter()),
271 false, base::ThreadTaskRunnerHandle::Get()); 243 false, base::ThreadTaskRunnerHandle::Get(),
244 0u);
272 bool error_handler_called1 = false; 245 bool error_handler_called1 = false;
273 client1.set_connection_error_handler( 246 client1.set_connection_error_handler(
274 base::Bind(&ForwardErrorHandler, &error_handler_called1, 247 base::Bind(&ForwardErrorHandler, &error_handler_called1,
275 run_loop1.QuitClosure())); 248 run_loop1.QuitClosure()));
276 249
277 Message request; 250 Message request;
278 AllocRequestMessage(1, "hello", &request); 251 AllocRequestMessage(1, "hello", &request);
279 252
280 MessageQueue message_queue; 253 MessageQueue message_queue;
281 client0.AcceptWithResponder(&request, new MessageAccumulator(&message_queue)); 254 client0.AcceptWithResponder(&request, new MessageAccumulator(&message_queue));
(...skipping 24 matching lines...) Expand all
306 } 279 }
307 280
308 TEST_F(MultiplexRouterTest, LateResponse) { 281 TEST_F(MultiplexRouterTest, LateResponse) {
309 // Test that things won't blow up if we try to send a message to a 282 // Test that things won't blow up if we try to send a message to a
310 // MessageReceiver, which was given to us via AcceptWithResponder, 283 // MessageReceiver, which was given to us via AcceptWithResponder,
311 // after the router has gone away. 284 // after the router has gone away.
312 285
313 base::RunLoop run_loop; 286 base::RunLoop run_loop;
314 LazyResponseGenerator generator(run_loop.QuitClosure()); 287 LazyResponseGenerator generator(run_loop.QuitClosure());
315 { 288 {
316 InterfaceEndpointClient client0(std::move(endpoint0_), nullptr, 289 InterfaceEndpointClient client0(
317 base::MakeUnique<PassThroughFilter>(), 290 std::move(endpoint0_), nullptr, base::MakeUnique<PassThroughFilter>(),
318 false, base::ThreadTaskRunnerHandle::Get()); 291 false, base::ThreadTaskRunnerHandle::Get(), 0u);
319 InterfaceEndpointClient client1(std::move(endpoint1_), &generator, 292 InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
320 base::MakeUnique<PassThroughFilter>(), 293 base::MakeUnique<PassThroughFilter>(),
321 false, base::ThreadTaskRunnerHandle::Get()); 294 false, base::ThreadTaskRunnerHandle::Get(),
295 0u);
322 296
323 Message request; 297 Message request;
324 AllocRequestMessage(1, "hello", &request); 298 AllocRequestMessage(1, "hello", &request);
325 299
326 MessageQueue message_queue; 300 MessageQueue message_queue;
327 client0.AcceptWithResponder(&request, 301 client0.AcceptWithResponder(&request,
328 new MessageAccumulator(&message_queue)); 302 new MessageAccumulator(&message_queue));
329 303
330 run_loop.Run(); 304 run_loop.Run();
331 305
332 EXPECT_TRUE(generator.has_responder()); 306 EXPECT_TRUE(generator.has_responder());
333 } 307 }
334 308
335 EXPECT_FALSE(generator.responder_is_valid()); 309 EXPECT_FALSE(generator.responder_is_valid());
336 generator.CompleteWithResponse(); // This should end up doing nothing. 310 generator.CompleteWithResponse(); // This should end up doing nothing.
337 } 311 }
338 312
339 // TODO(yzshen): add more tests. 313 // TODO(yzshen): add more tests.
340 314
341 } // namespace 315 } // namespace
342 } // namespace test 316 } // namespace test
343 } // namespace mojo 317 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc ('k') | mojo/public/cpp/bindings/tests/router_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698