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

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

Issue 1535943002: Convert Pass()→std::move() in //mojo/public/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove self-move checks to avoid triggering clang warning. Created 5 years 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 <utility>
6
5 #include "base/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
6 #include "mojo/message_pump/message_pump_mojo.h" 8 #include "mojo/message_pump/message_pump_mojo.h"
7 #include "mojo/public/cpp/bindings/binding.h" 9 #include "mojo/public/cpp/bindings/binding.h"
8 #include "mojo/public/cpp/bindings/strong_binding.h" 10 #include "mojo/public/cpp/bindings/strong_binding.h"
9 #include "mojo/public/interfaces/bindings/tests/math_calculator.mojom.h" 11 #include "mojo/public/interfaces/bindings/tests/math_calculator.mojom.h"
10 #include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h" 12 #include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
11 #include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h" 13 #include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
12 #include "mojo/public/interfaces/bindings/tests/scoping.mojom.h" 14 #include "mojo/public/interfaces/bindings/tests/scoping.mojom.h"
13 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
14 16
(...skipping 19 matching lines...) Expand all
34 template <typename Method, typename Class> 36 template <typename Method, typename Class>
35 RunnableImpl<Method, Class> MakeRunnable(Method method, Class object) { 37 RunnableImpl<Method, Class> MakeRunnable(Method method, Class object) {
36 return RunnableImpl<Method, Class>(method, object); 38 return RunnableImpl<Method, Class>(method, object);
37 } 39 }
38 40
39 typedef mojo::Callback<void(double)> CalcCallback; 41 typedef mojo::Callback<void(double)> CalcCallback;
40 42
41 class MathCalculatorImpl : public math::Calculator { 43 class MathCalculatorImpl : public math::Calculator {
42 public: 44 public:
43 explicit MathCalculatorImpl(InterfaceRequest<math::Calculator> request) 45 explicit MathCalculatorImpl(InterfaceRequest<math::Calculator> request)
44 : total_(0.0), binding_(this, request.Pass()) {} 46 : total_(0.0), binding_(this, std::move(request)) {}
45 ~MathCalculatorImpl() override {} 47 ~MathCalculatorImpl() override {}
46 48
47 void CloseMessagePipe() { binding_.Close(); } 49 void CloseMessagePipe() { binding_.Close(); }
48 50
49 void WaitForIncomingMethodCall() { binding_.WaitForIncomingMethodCall(); } 51 void WaitForIncomingMethodCall() { binding_.WaitForIncomingMethodCall(); }
50 52
51 void Clear(const CalcCallback& callback) override { 53 void Clear(const CalcCallback& callback) override {
52 total_ = 0.0; 54 total_ = 0.0;
53 callback.Run(total_); 55 callback.Run(total_);
54 } 56 }
55 57
56 void Add(double value, const CalcCallback& callback) override { 58 void Add(double value, const CalcCallback& callback) override {
57 total_ += value; 59 total_ += value;
58 callback.Run(total_); 60 callback.Run(total_);
59 } 61 }
60 62
61 void Multiply(double value, const CalcCallback& callback) override { 63 void Multiply(double value, const CalcCallback& callback) override {
62 total_ *= value; 64 total_ *= value;
63 callback.Run(total_); 65 callback.Run(total_);
64 } 66 }
65 67
66 private: 68 private:
67 double total_; 69 double total_;
68 Binding<math::Calculator> binding_; 70 Binding<math::Calculator> binding_;
69 }; 71 };
70 72
71 class MathCalculatorUI { 73 class MathCalculatorUI {
72 public: 74 public:
73 explicit MathCalculatorUI(math::CalculatorPtr calculator) 75 explicit MathCalculatorUI(math::CalculatorPtr calculator)
74 : calculator_(calculator.Pass()), 76 : calculator_(std::move(calculator)),
75 output_(0.0), 77 output_(0.0),
76 callback_(MakeRunnable(&MathCalculatorUI::Output, this)) {} 78 callback_(MakeRunnable(&MathCalculatorUI::Output, this)) {}
77 79
78 bool WaitForIncomingResponse() { 80 bool WaitForIncomingResponse() {
79 return calculator_.WaitForIncomingResponse(); 81 return calculator_.WaitForIncomingResponse();
80 } 82 }
81 83
82 bool encountered_error() const { return calculator_.encountered_error(); } 84 bool encountered_error() const { return calculator_.encountered_error(); }
83 85
84 void Add(double value) { calculator_->Add(value, callback_); } 86 void Add(double value) { calculator_->Add(value, callback_); }
(...skipping 10 matching lines...) Expand all
95 void Output(double output) { output_ = output; } 97 void Output(double output) { output_ = output; }
96 98
97 math::CalculatorPtr calculator_; 99 math::CalculatorPtr calculator_;
98 double output_; 100 double output_;
99 Callback<void(double)> callback_; 101 Callback<void(double)> callback_;
100 }; 102 };
101 103
102 class SelfDestructingMathCalculatorUI { 104 class SelfDestructingMathCalculatorUI {
103 public: 105 public:
104 explicit SelfDestructingMathCalculatorUI(math::CalculatorPtr calculator) 106 explicit SelfDestructingMathCalculatorUI(math::CalculatorPtr calculator)
105 : calculator_(calculator.Pass()), nesting_level_(0) { 107 : calculator_(std::move(calculator)), nesting_level_(0) {
106 ++num_instances_; 108 ++num_instances_;
107 } 109 }
108 110
109 void BeginTest(bool nested) { 111 void BeginTest(bool nested) {
110 nesting_level_ = nested ? 2 : 1; 112 nesting_level_ = nested ? 2 : 1;
111 calculator_->Add( 113 calculator_->Add(
112 1.0, MakeRunnable(&SelfDestructingMathCalculatorUI::Output, this)); 114 1.0, MakeRunnable(&SelfDestructingMathCalculatorUI::Output, this));
113 } 115 }
114 116
115 static int num_instances() { return num_instances_; } 117 static int num_instances() { return num_instances_; }
(...skipping 18 matching lines...) Expand all
134 }; 136 };
135 137
136 // static 138 // static
137 int SelfDestructingMathCalculatorUI::num_instances_ = 0; 139 int SelfDestructingMathCalculatorUI::num_instances_ = 0;
138 140
139 class ReentrantServiceImpl : public sample::Service { 141 class ReentrantServiceImpl : public sample::Service {
140 public: 142 public:
141 ~ReentrantServiceImpl() override {} 143 ~ReentrantServiceImpl() override {}
142 144
143 explicit ReentrantServiceImpl(InterfaceRequest<sample::Service> request) 145 explicit ReentrantServiceImpl(InterfaceRequest<sample::Service> request)
144 : call_depth_(0), max_call_depth_(0), binding_(this, request.Pass()) {} 146 : call_depth_(0),
147 max_call_depth_(0),
148 binding_(this, std::move(request)) {}
145 149
146 int max_call_depth() { return max_call_depth_; } 150 int max_call_depth() { return max_call_depth_; }
147 151
148 void Frobinate(sample::FooPtr foo, 152 void Frobinate(sample::FooPtr foo,
149 sample::Service::BazOptions baz, 153 sample::Service::BazOptions baz,
150 sample::PortPtr port, 154 sample::PortPtr port,
151 const sample::Service::FrobinateCallback& callback) override { 155 const sample::Service::FrobinateCallback& callback) override {
152 max_call_depth_ = std::max(++call_depth_, max_call_depth_); 156 max_call_depth_ = std::max(++call_depth_, max_call_depth_);
153 if (call_depth_ == 1) { 157 if (call_depth_ == 1) {
154 EXPECT_TRUE(binding_.WaitForIncomingMethodCall()); 158 EXPECT_TRUE(binding_.WaitForIncomingMethodCall());
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 EXPECT_FALSE(calc.is_bound()); 202 EXPECT_FALSE(calc.is_bound());
199 MathCalculatorImpl calc_impl(GetProxy(&calc)); 203 MathCalculatorImpl calc_impl(GetProxy(&calc));
200 EXPECT_TRUE(calc.is_bound()); 204 EXPECT_TRUE(calc.is_bound());
201 } 205 }
202 206
203 TEST_F(InterfacePtrTest, EndToEnd) { 207 TEST_F(InterfacePtrTest, EndToEnd) {
204 math::CalculatorPtr calc; 208 math::CalculatorPtr calc;
205 MathCalculatorImpl calc_impl(GetProxy(&calc)); 209 MathCalculatorImpl calc_impl(GetProxy(&calc));
206 210
207 // Suppose this is instantiated in a process that has pipe1_. 211 // Suppose this is instantiated in a process that has pipe1_.
208 MathCalculatorUI calculator_ui(calc.Pass()); 212 MathCalculatorUI calculator_ui(std::move(calc));
209 213
210 calculator_ui.Add(2.0); 214 calculator_ui.Add(2.0);
211 calculator_ui.Multiply(5.0); 215 calculator_ui.Multiply(5.0);
212 216
213 PumpMessages(); 217 PumpMessages();
214 218
215 EXPECT_EQ(10.0, calculator_ui.GetOutput()); 219 EXPECT_EQ(10.0, calculator_ui.GetOutput());
216 } 220 }
217 221
218 TEST_F(InterfacePtrTest, EndToEnd_Synchronous) { 222 TEST_F(InterfacePtrTest, EndToEnd_Synchronous) {
219 math::CalculatorPtr calc; 223 math::CalculatorPtr calc;
220 MathCalculatorImpl calc_impl(GetProxy(&calc)); 224 MathCalculatorImpl calc_impl(GetProxy(&calc));
221 225
222 // Suppose this is instantiated in a process that has pipe1_. 226 // Suppose this is instantiated in a process that has pipe1_.
223 MathCalculatorUI calculator_ui(calc.Pass()); 227 MathCalculatorUI calculator_ui(std::move(calc));
224 228
225 EXPECT_EQ(0.0, calculator_ui.GetOutput()); 229 EXPECT_EQ(0.0, calculator_ui.GetOutput());
226 230
227 calculator_ui.Add(2.0); 231 calculator_ui.Add(2.0);
228 EXPECT_EQ(0.0, calculator_ui.GetOutput()); 232 EXPECT_EQ(0.0, calculator_ui.GetOutput());
229 calc_impl.WaitForIncomingMethodCall(); 233 calc_impl.WaitForIncomingMethodCall();
230 calculator_ui.WaitForIncomingResponse(); 234 calculator_ui.WaitForIncomingResponse();
231 EXPECT_EQ(2.0, calculator_ui.GetOutput()); 235 EXPECT_EQ(2.0, calculator_ui.GetOutput());
232 236
233 calculator_ui.Multiply(5.0); 237 calculator_ui.Multiply(5.0);
234 EXPECT_EQ(2.0, calculator_ui.GetOutput()); 238 EXPECT_EQ(2.0, calculator_ui.GetOutput());
235 calc_impl.WaitForIncomingMethodCall(); 239 calc_impl.WaitForIncomingMethodCall();
236 calculator_ui.WaitForIncomingResponse(); 240 calculator_ui.WaitForIncomingResponse();
237 EXPECT_EQ(10.0, calculator_ui.GetOutput()); 241 EXPECT_EQ(10.0, calculator_ui.GetOutput());
238 } 242 }
239 243
240 TEST_F(InterfacePtrTest, Movable) { 244 TEST_F(InterfacePtrTest, Movable) {
241 math::CalculatorPtr a; 245 math::CalculatorPtr a;
242 math::CalculatorPtr b; 246 math::CalculatorPtr b;
243 MathCalculatorImpl calc_impl(GetProxy(&b)); 247 MathCalculatorImpl calc_impl(GetProxy(&b));
244 248
245 EXPECT_TRUE(!a); 249 EXPECT_TRUE(!a);
246 EXPECT_FALSE(!b); 250 EXPECT_FALSE(!b);
247 251
248 a = b.Pass(); 252 a = std::move(b);
249 253
250 EXPECT_FALSE(!a); 254 EXPECT_FALSE(!a);
251 EXPECT_TRUE(!b); 255 EXPECT_TRUE(!b);
252 } 256 }
253 257
254 TEST_F(InterfacePtrTest, Resettable) { 258 TEST_F(InterfacePtrTest, Resettable) {
255 math::CalculatorPtr a; 259 math::CalculatorPtr a;
256 260
257 EXPECT_TRUE(!a); 261 EXPECT_TRUE(!a);
258 262
259 MessagePipe pipe; 263 MessagePipe pipe;
260 264
261 // Save this so we can test it later. 265 // Save this so we can test it later.
262 Handle handle = pipe.handle0.get(); 266 Handle handle = pipe.handle0.get();
263 267
264 a = MakeProxy(InterfacePtrInfo<math::Calculator>(pipe.handle0.Pass(), 0u)); 268 a = MakeProxy(
269 InterfacePtrInfo<math::Calculator>(std::move(pipe.handle0), 0u));
265 270
266 EXPECT_FALSE(!a); 271 EXPECT_FALSE(!a);
267 272
268 a.reset(); 273 a.reset();
269 274
270 EXPECT_TRUE(!a); 275 EXPECT_TRUE(!a);
271 EXPECT_FALSE(a.internal_state()->is_bound()); 276 EXPECT_FALSE(a.internal_state()->is_bound());
272 277
273 // Test that handle was closed. 278 // Test that handle was closed.
274 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, CloseRaw(handle)); 279 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, CloseRaw(handle));
275 } 280 }
276 281
277 TEST_F(InterfacePtrTest, BindInvalidHandle) { 282 TEST_F(InterfacePtrTest, BindInvalidHandle) {
278 math::CalculatorPtr ptr; 283 math::CalculatorPtr ptr;
279 EXPECT_FALSE(ptr.get()); 284 EXPECT_FALSE(ptr.get());
280 EXPECT_FALSE(ptr); 285 EXPECT_FALSE(ptr);
281 286
282 ptr.Bind(InterfacePtrInfo<math::Calculator>()); 287 ptr.Bind(InterfacePtrInfo<math::Calculator>());
283 EXPECT_FALSE(ptr.get()); 288 EXPECT_FALSE(ptr.get());
284 EXPECT_FALSE(ptr); 289 EXPECT_FALSE(ptr);
285 } 290 }
286 291
287 TEST_F(InterfacePtrTest, EncounteredError) { 292 TEST_F(InterfacePtrTest, EncounteredError) {
288 math::CalculatorPtr proxy; 293 math::CalculatorPtr proxy;
289 MathCalculatorImpl calc_impl(GetProxy(&proxy)); 294 MathCalculatorImpl calc_impl(GetProxy(&proxy));
290 295
291 MathCalculatorUI calculator_ui(proxy.Pass()); 296 MathCalculatorUI calculator_ui(std::move(proxy));
292 297
293 calculator_ui.Add(2.0); 298 calculator_ui.Add(2.0);
294 PumpMessages(); 299 PumpMessages();
295 EXPECT_EQ(2.0, calculator_ui.GetOutput()); 300 EXPECT_EQ(2.0, calculator_ui.GetOutput());
296 EXPECT_FALSE(calculator_ui.encountered_error()); 301 EXPECT_FALSE(calculator_ui.encountered_error());
297 302
298 calculator_ui.Multiply(5.0); 303 calculator_ui.Multiply(5.0);
299 EXPECT_FALSE(calculator_ui.encountered_error()); 304 EXPECT_FALSE(calculator_ui.encountered_error());
300 305
301 // Close the server. 306 // Close the server.
302 calc_impl.CloseMessagePipe(); 307 calc_impl.CloseMessagePipe();
303 308
304 // The state change isn't picked up locally yet. 309 // The state change isn't picked up locally yet.
305 EXPECT_FALSE(calculator_ui.encountered_error()); 310 EXPECT_FALSE(calculator_ui.encountered_error());
306 311
307 PumpMessages(); 312 PumpMessages();
308 313
309 // OK, now we see the error. 314 // OK, now we see the error.
310 EXPECT_TRUE(calculator_ui.encountered_error()); 315 EXPECT_TRUE(calculator_ui.encountered_error());
311 } 316 }
312 317
313 TEST_F(InterfacePtrTest, EncounteredErrorCallback) { 318 TEST_F(InterfacePtrTest, EncounteredErrorCallback) {
314 math::CalculatorPtr proxy; 319 math::CalculatorPtr proxy;
315 MathCalculatorImpl calc_impl(GetProxy(&proxy)); 320 MathCalculatorImpl calc_impl(GetProxy(&proxy));
316 321
317 bool encountered_error = false; 322 bool encountered_error = false;
318 proxy.set_connection_error_handler( 323 proxy.set_connection_error_handler(
319 [&encountered_error]() { encountered_error = true; }); 324 [&encountered_error]() { encountered_error = true; });
320 325
321 MathCalculatorUI calculator_ui(proxy.Pass()); 326 MathCalculatorUI calculator_ui(std::move(proxy));
322 327
323 calculator_ui.Add(2.0); 328 calculator_ui.Add(2.0);
324 PumpMessages(); 329 PumpMessages();
325 EXPECT_EQ(2.0, calculator_ui.GetOutput()); 330 EXPECT_EQ(2.0, calculator_ui.GetOutput());
326 EXPECT_FALSE(calculator_ui.encountered_error()); 331 EXPECT_FALSE(calculator_ui.encountered_error());
327 332
328 calculator_ui.Multiply(5.0); 333 calculator_ui.Multiply(5.0);
329 EXPECT_FALSE(calculator_ui.encountered_error()); 334 EXPECT_FALSE(calculator_ui.encountered_error());
330 335
331 // Close the server. 336 // Close the server.
(...skipping 12 matching lines...) Expand all
344 EXPECT_TRUE(encountered_error); 349 EXPECT_TRUE(encountered_error);
345 } 350 }
346 351
347 TEST_F(InterfacePtrTest, DestroyInterfacePtrOnMethodResponse) { 352 TEST_F(InterfacePtrTest, DestroyInterfacePtrOnMethodResponse) {
348 math::CalculatorPtr proxy; 353 math::CalculatorPtr proxy;
349 MathCalculatorImpl calc_impl(GetProxy(&proxy)); 354 MathCalculatorImpl calc_impl(GetProxy(&proxy));
350 355
351 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); 356 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
352 357
353 SelfDestructingMathCalculatorUI* impl = 358 SelfDestructingMathCalculatorUI* impl =
354 new SelfDestructingMathCalculatorUI(proxy.Pass()); 359 new SelfDestructingMathCalculatorUI(std::move(proxy));
355 impl->BeginTest(false); 360 impl->BeginTest(false);
356 361
357 PumpMessages(); 362 PumpMessages();
358 363
359 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); 364 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
360 } 365 }
361 366
362 TEST_F(InterfacePtrTest, NestedDestroyInterfacePtrOnMethodResponse) { 367 TEST_F(InterfacePtrTest, NestedDestroyInterfacePtrOnMethodResponse) {
363 math::CalculatorPtr proxy; 368 math::CalculatorPtr proxy;
364 MathCalculatorImpl calc_impl(GetProxy(&proxy)); 369 MathCalculatorImpl calc_impl(GetProxy(&proxy));
365 370
366 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); 371 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
367 372
368 SelfDestructingMathCalculatorUI* impl = 373 SelfDestructingMathCalculatorUI* impl =
369 new SelfDestructingMathCalculatorUI(proxy.Pass()); 374 new SelfDestructingMathCalculatorUI(std::move(proxy));
370 impl->BeginTest(true); 375 impl->BeginTest(true);
371 376
372 PumpMessages(); 377 PumpMessages();
373 378
374 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); 379 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
375 } 380 }
376 381
377 TEST_F(InterfacePtrTest, ReentrantWaitForIncomingMethodCall) { 382 TEST_F(InterfacePtrTest, ReentrantWaitForIncomingMethodCall) {
378 sample::ServicePtr proxy; 383 sample::ServicePtr proxy;
379 ReentrantServiceImpl impl(GetProxy(&proxy)); 384 ReentrantServiceImpl impl(GetProxy(&proxy));
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 EXPECT_EQ(456, impl.integer()); 440 EXPECT_EQ(456, impl.integer());
436 } 441 }
437 442
438 class StrongMathCalculatorImpl : public math::Calculator { 443 class StrongMathCalculatorImpl : public math::Calculator {
439 public: 444 public:
440 StrongMathCalculatorImpl(ScopedMessagePipeHandle handle, 445 StrongMathCalculatorImpl(ScopedMessagePipeHandle handle,
441 bool* error_received, 446 bool* error_received,
442 bool* destroyed) 447 bool* destroyed)
443 : error_received_(error_received), 448 : error_received_(error_received),
444 destroyed_(destroyed), 449 destroyed_(destroyed),
445 binding_(this, handle.Pass()) { 450 binding_(this, std::move(handle)) {
446 binding_.set_connection_error_handler( 451 binding_.set_connection_error_handler(
447 [this]() { *error_received_ = true; }); 452 [this]() { *error_received_ = true; });
448 } 453 }
449 ~StrongMathCalculatorImpl() override { *destroyed_ = true; } 454 ~StrongMathCalculatorImpl() override { *destroyed_ = true; }
450 455
451 // math::Calculator implementation. 456 // math::Calculator implementation.
452 void Clear(const CalcCallback& callback) override { callback.Run(total_); } 457 void Clear(const CalcCallback& callback) override { callback.Run(total_); }
453 458
454 void Add(double value, const CalcCallback& callback) override { 459 void Add(double value, const CalcCallback& callback) override {
455 total_ += value; 460 total_ += value;
(...skipping 12 matching lines...) Expand all
468 473
469 StrongBinding<math::Calculator> binding_; 474 StrongBinding<math::Calculator> binding_;
470 }; 475 };
471 476
472 TEST(StrongConnectorTest, Math) { 477 TEST(StrongConnectorTest, Math) {
473 base::MessageLoop loop(common::MessagePumpMojo::Create()); 478 base::MessageLoop loop(common::MessagePumpMojo::Create());
474 479
475 bool error_received = false; 480 bool error_received = false;
476 bool destroyed = false; 481 bool destroyed = false;
477 MessagePipe pipe; 482 MessagePipe pipe;
478 new StrongMathCalculatorImpl(pipe.handle0.Pass(), &error_received, 483 new StrongMathCalculatorImpl(std::move(pipe.handle0), &error_received,
479 &destroyed); 484 &destroyed);
480 485
481 math::CalculatorPtr calc; 486 math::CalculatorPtr calc;
482 calc.Bind(InterfacePtrInfo<math::Calculator>(pipe.handle1.Pass(), 0u)); 487 calc.Bind(InterfacePtrInfo<math::Calculator>(std::move(pipe.handle1), 0u));
483 488
484 { 489 {
485 // Suppose this is instantiated in a process that has the other end of the 490 // Suppose this is instantiated in a process that has the other end of the
486 // message pipe. 491 // message pipe.
487 MathCalculatorUI calculator_ui(calc.Pass()); 492 MathCalculatorUI calculator_ui(std::move(calc));
488 493
489 calculator_ui.Add(2.0); 494 calculator_ui.Add(2.0);
490 calculator_ui.Multiply(5.0); 495 calculator_ui.Multiply(5.0);
491 496
492 loop.RunUntilIdle(); 497 loop.RunUntilIdle();
493 498
494 EXPECT_EQ(10.0, calculator_ui.GetOutput()); 499 EXPECT_EQ(10.0, calculator_ui.GetOutput());
495 EXPECT_FALSE(error_received); 500 EXPECT_FALSE(error_received);
496 EXPECT_FALSE(destroyed); 501 EXPECT_FALSE(destroyed);
497 } 502 }
498 // Destroying calculator_ui should close the pipe and generate an error on the 503 // Destroying calculator_ui should close the pipe and generate an error on the
499 // other 504 // other
500 // end which will destroy the instance since it is strongly bound. 505 // end which will destroy the instance since it is strongly bound.
501 506
502 loop.RunUntilIdle(); 507 loop.RunUntilIdle();
503 EXPECT_TRUE(error_received); 508 EXPECT_TRUE(error_received);
504 EXPECT_TRUE(destroyed); 509 EXPECT_TRUE(destroyed);
505 } 510 }
506 511
507 class WeakMathCalculatorImpl : public math::Calculator { 512 class WeakMathCalculatorImpl : public math::Calculator {
508 public: 513 public:
509 WeakMathCalculatorImpl(ScopedMessagePipeHandle handle, 514 WeakMathCalculatorImpl(ScopedMessagePipeHandle handle,
510 bool* error_received, 515 bool* error_received,
511 bool* destroyed) 516 bool* destroyed)
512 : error_received_(error_received), 517 : error_received_(error_received),
513 destroyed_(destroyed), 518 destroyed_(destroyed),
514 binding_(this, handle.Pass()) { 519 binding_(this, std::move(handle)) {
515 binding_.set_connection_error_handler( 520 binding_.set_connection_error_handler(
516 [this]() { *error_received_ = true; }); 521 [this]() { *error_received_ = true; });
517 } 522 }
518 ~WeakMathCalculatorImpl() override { *destroyed_ = true; } 523 ~WeakMathCalculatorImpl() override { *destroyed_ = true; }
519 524
520 void Clear(const CalcCallback& callback) override { callback.Run(total_); } 525 void Clear(const CalcCallback& callback) override { callback.Run(total_); }
521 526
522 void Add(double value, const CalcCallback& callback) override { 527 void Add(double value, const CalcCallback& callback) override {
523 total_ += value; 528 total_ += value;
524 callback.Run(total_); 529 callback.Run(total_);
(...skipping 11 matching lines...) Expand all
536 541
537 Binding<math::Calculator> binding_; 542 Binding<math::Calculator> binding_;
538 }; 543 };
539 544
540 TEST(WeakConnectorTest, Math) { 545 TEST(WeakConnectorTest, Math) {
541 base::MessageLoop loop(common::MessagePumpMojo::Create()); 546 base::MessageLoop loop(common::MessagePumpMojo::Create());
542 547
543 bool error_received = false; 548 bool error_received = false;
544 bool destroyed = false; 549 bool destroyed = false;
545 MessagePipe pipe; 550 MessagePipe pipe;
546 WeakMathCalculatorImpl impl(pipe.handle0.Pass(), &error_received, &destroyed); 551 WeakMathCalculatorImpl impl(std::move(pipe.handle0), &error_received,
552 &destroyed);
547 553
548 math::CalculatorPtr calc; 554 math::CalculatorPtr calc;
549 calc.Bind(InterfacePtrInfo<math::Calculator>(pipe.handle1.Pass(), 0u)); 555 calc.Bind(InterfacePtrInfo<math::Calculator>(std::move(pipe.handle1), 0u));
550 556
551 { 557 {
552 // Suppose this is instantiated in a process that has the other end of the 558 // Suppose this is instantiated in a process that has the other end of the
553 // message pipe. 559 // message pipe.
554 MathCalculatorUI calculator_ui(calc.Pass()); 560 MathCalculatorUI calculator_ui(std::move(calc));
555 561
556 calculator_ui.Add(2.0); 562 calculator_ui.Add(2.0);
557 calculator_ui.Multiply(5.0); 563 calculator_ui.Multiply(5.0);
558 564
559 loop.RunUntilIdle(); 565 loop.RunUntilIdle();
560 566
561 EXPECT_EQ(10.0, calculator_ui.GetOutput()); 567 EXPECT_EQ(10.0, calculator_ui.GetOutput());
562 EXPECT_FALSE(error_received); 568 EXPECT_FALSE(error_received);
563 EXPECT_FALSE(destroyed); 569 EXPECT_FALSE(destroyed);
564 // Destroying calculator_ui should close the pipe and generate an error on 570 // Destroying calculator_ui should close the pipe and generate an error on
565 // the other 571 // the other
566 // end which will destroy the instance since it is strongly bound. 572 // end which will destroy the instance since it is strongly bound.
567 } 573 }
568 574
569 loop.RunUntilIdle(); 575 loop.RunUntilIdle();
570 EXPECT_TRUE(error_received); 576 EXPECT_TRUE(error_received);
571 EXPECT_FALSE(destroyed); 577 EXPECT_FALSE(destroyed);
572 } 578 }
573 579
574 class CImpl : public C { 580 class CImpl : public C {
575 public: 581 public:
576 CImpl(bool* d_called, InterfaceRequest<C> request) 582 CImpl(bool* d_called, InterfaceRequest<C> request)
577 : d_called_(d_called), 583 : d_called_(d_called), binding_(this, std::move(request)) {}
578 binding_(this, request.Pass()) {}
579 ~CImpl() override {} 584 ~CImpl() override {}
580 585
581 private: 586 private:
582 void D() override { 587 void D() override {
583 *d_called_ = true; 588 *d_called_ = true;
584 } 589 }
585 590
586 bool* d_called_; 591 bool* d_called_;
587 StrongBinding<C> binding_; 592 StrongBinding<C> binding_;
588 }; 593 };
589 594
590 class BImpl : public B { 595 class BImpl : public B {
591 public: 596 public:
592 BImpl(bool* d_called, InterfaceRequest<B> request) 597 BImpl(bool* d_called, InterfaceRequest<B> request)
593 : d_called_(d_called), 598 : d_called_(d_called), binding_(this, std::move(request)) {}
594 binding_(this, request.Pass()) {}
595 ~BImpl() override {} 599 ~BImpl() override {}
596 600
597 private: 601 private:
598 void GetC(InterfaceRequest<C> c) override { 602 void GetC(InterfaceRequest<C> c) override {
599 new CImpl(d_called_, c.Pass()); 603 new CImpl(d_called_, std::move(c));
600 } 604 }
601 605
602 bool* d_called_; 606 bool* d_called_;
603 StrongBinding<B> binding_; 607 StrongBinding<B> binding_;
604 }; 608 };
605 609
606 class AImpl : public A { 610 class AImpl : public A {
607 public: 611 public:
608 explicit AImpl(InterfaceRequest<A> request) 612 explicit AImpl(InterfaceRequest<A> request)
609 : d_called_(false), 613 : d_called_(false), binding_(this, std::move(request)) {}
610 binding_(this, request.Pass()) {}
611 ~AImpl() override {} 614 ~AImpl() override {}
612 615
613 bool d_called() const { return d_called_; } 616 bool d_called() const { return d_called_; }
614 617
615 private: 618 private:
616 void GetB(InterfaceRequest<B> b) override { 619 void GetB(InterfaceRequest<B> b) override {
617 new BImpl(&d_called_, b.Pass()); 620 new BImpl(&d_called_, std::move(b));
618 } 621 }
619 622
620 bool d_called_; 623 bool d_called_;
621 Binding<A> binding_; 624 Binding<A> binding_;
622 }; 625 };
623 626
624 TEST_F(InterfacePtrTest, Scoping) { 627 TEST_F(InterfacePtrTest, Scoping) {
625 APtr a; 628 APtr a;
626 AImpl a_impl(GetProxy(&a)); 629 AImpl a_impl(GetProxy(&a));
627 630
(...skipping 10 matching lines...) Expand all
638 // While B & C have fallen out of scope, the pipes will remain until they are 641 // While B & C have fallen out of scope, the pipes will remain until they are
639 // flushed. 642 // flushed.
640 EXPECT_FALSE(a_impl.d_called()); 643 EXPECT_FALSE(a_impl.d_called());
641 PumpMessages(); 644 PumpMessages();
642 EXPECT_TRUE(a_impl.d_called()); 645 EXPECT_TRUE(a_impl.d_called());
643 } 646 }
644 647
645 } // namespace 648 } // namespace
646 } // namespace test 649 } // namespace test
647 } // namespace mojo 650 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698