OLD | NEW |
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 <stdint.h> | 5 #include <stdint.h> |
6 #include <utility> | 6 #include <utility> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 namespace { | 22 namespace { |
23 | 23 |
24 typedef base::Callback<void(double)> CalcCallback; | 24 typedef base::Callback<void(double)> CalcCallback; |
25 | 25 |
26 class MathCalculatorImpl : public math::Calculator { | 26 class MathCalculatorImpl : public math::Calculator { |
27 public: | 27 public: |
28 explicit MathCalculatorImpl(InterfaceRequest<math::Calculator> request) | 28 explicit MathCalculatorImpl(InterfaceRequest<math::Calculator> request) |
29 : total_(0.0), binding_(this, std::move(request)) {} | 29 : total_(0.0), binding_(this, std::move(request)) {} |
30 ~MathCalculatorImpl() override {} | 30 ~MathCalculatorImpl() override {} |
31 | 31 |
32 void CloseMessagePipe() { binding_.Close(); } | |
33 | |
34 void WaitForIncomingMethodCall() { binding_.WaitForIncomingMethodCall(); } | |
35 | |
36 void Clear(const CalcCallback& callback) override { | 32 void Clear(const CalcCallback& callback) override { |
37 total_ = 0.0; | 33 total_ = 0.0; |
38 callback.Run(total_); | 34 callback.Run(total_); |
39 } | 35 } |
40 | 36 |
41 void Add(double value, const CalcCallback& callback) override { | 37 void Add(double value, const CalcCallback& callback) override { |
42 total_ += value; | 38 total_ += value; |
43 callback.Run(total_); | 39 callback.Run(total_); |
44 } | 40 } |
45 | 41 |
46 void Multiply(double value, const CalcCallback& callback) override { | 42 void Multiply(double value, const CalcCallback& callback) override { |
47 total_ *= value; | 43 total_ *= value; |
48 callback.Run(total_); | 44 callback.Run(total_); |
49 } | 45 } |
50 | 46 |
| 47 Binding<math::Calculator>* binding() { return &binding_; } |
| 48 |
51 private: | 49 private: |
52 double total_; | 50 double total_; |
53 Binding<math::Calculator> binding_; | 51 Binding<math::Calculator> binding_; |
54 }; | 52 }; |
55 | 53 |
56 class MathCalculatorUI { | 54 class MathCalculatorUI { |
57 public: | 55 public: |
58 explicit MathCalculatorUI(math::CalculatorPtr calculator) | 56 explicit MathCalculatorUI(math::CalculatorPtr calculator) |
59 : calculator_(std::move(calculator)), | 57 : calculator_(std::move(calculator)), |
60 output_(0.0) {} | 58 output_(0.0) {} |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 MathCalculatorImpl calc_impl(GetProxy(&calc)); | 243 MathCalculatorImpl calc_impl(GetProxy(&calc)); |
246 | 244 |
247 // Suppose this is instantiated in a process that has pipe1_. | 245 // Suppose this is instantiated in a process that has pipe1_. |
248 MathCalculatorUI calculator_ui(std::move(calc)); | 246 MathCalculatorUI calculator_ui(std::move(calc)); |
249 | 247 |
250 EXPECT_EQ(0.0, calculator_ui.GetOutput()); | 248 EXPECT_EQ(0.0, calculator_ui.GetOutput()); |
251 | 249 |
252 base::RunLoop run_loop; | 250 base::RunLoop run_loop; |
253 calculator_ui.Add(2.0, run_loop.QuitClosure()); | 251 calculator_ui.Add(2.0, run_loop.QuitClosure()); |
254 EXPECT_EQ(0.0, calculator_ui.GetOutput()); | 252 EXPECT_EQ(0.0, calculator_ui.GetOutput()); |
255 calc_impl.WaitForIncomingMethodCall(); | 253 calc_impl.binding()->WaitForIncomingMethodCall(); |
256 run_loop.Run(); | 254 run_loop.Run(); |
257 EXPECT_EQ(2.0, calculator_ui.GetOutput()); | 255 EXPECT_EQ(2.0, calculator_ui.GetOutput()); |
258 | 256 |
259 base::RunLoop run_loop2; | 257 base::RunLoop run_loop2; |
260 calculator_ui.Multiply(5.0, run_loop2.QuitClosure()); | 258 calculator_ui.Multiply(5.0, run_loop2.QuitClosure()); |
261 EXPECT_EQ(2.0, calculator_ui.GetOutput()); | 259 EXPECT_EQ(2.0, calculator_ui.GetOutput()); |
262 calc_impl.WaitForIncomingMethodCall(); | 260 calc_impl.binding()->WaitForIncomingMethodCall(); |
263 run_loop2.Run(); | 261 run_loop2.Run(); |
264 EXPECT_EQ(10.0, calculator_ui.GetOutput()); | 262 EXPECT_EQ(10.0, calculator_ui.GetOutput()); |
265 } | 263 } |
266 | 264 |
267 TEST_F(InterfacePtrTest, Movable) { | 265 TEST_F(InterfacePtrTest, Movable) { |
268 math::CalculatorPtr a; | 266 math::CalculatorPtr a; |
269 math::CalculatorPtr b; | 267 math::CalculatorPtr b; |
270 MathCalculatorImpl calc_impl(GetProxy(&b)); | 268 MathCalculatorImpl calc_impl(GetProxy(&b)); |
271 | 269 |
272 EXPECT_TRUE(!a); | 270 EXPECT_TRUE(!a); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 base::RunLoop run_loop; | 319 base::RunLoop run_loop; |
322 calculator_ui.Add(2.0, run_loop.QuitClosure()); | 320 calculator_ui.Add(2.0, run_loop.QuitClosure()); |
323 run_loop.Run(); | 321 run_loop.Run(); |
324 EXPECT_EQ(2.0, calculator_ui.GetOutput()); | 322 EXPECT_EQ(2.0, calculator_ui.GetOutput()); |
325 EXPECT_FALSE(calculator_ui.encountered_error()); | 323 EXPECT_FALSE(calculator_ui.encountered_error()); |
326 | 324 |
327 calculator_ui.Multiply(5.0, base::Closure()); | 325 calculator_ui.Multiply(5.0, base::Closure()); |
328 EXPECT_FALSE(calculator_ui.encountered_error()); | 326 EXPECT_FALSE(calculator_ui.encountered_error()); |
329 | 327 |
330 // Close the server. | 328 // Close the server. |
331 calc_impl.CloseMessagePipe(); | 329 calc_impl.binding()->Close(); |
332 | 330 |
333 // The state change isn't picked up locally yet. | 331 // The state change isn't picked up locally yet. |
334 base::RunLoop run_loop2; | 332 base::RunLoop run_loop2; |
335 calculator_ui.set_connection_error_handler(run_loop2.QuitClosure()); | 333 calculator_ui.set_connection_error_handler(run_loop2.QuitClosure()); |
336 EXPECT_FALSE(calculator_ui.encountered_error()); | 334 EXPECT_FALSE(calculator_ui.encountered_error()); |
337 | 335 |
338 run_loop2.Run(); | 336 run_loop2.Run(); |
339 | 337 |
340 // OK, now we see the error. | 338 // OK, now we see the error. |
341 EXPECT_TRUE(calculator_ui.encountered_error()); | 339 EXPECT_TRUE(calculator_ui.encountered_error()); |
(...skipping 14 matching lines...) Expand all Loading... |
356 base::RunLoop run_loop2; | 354 base::RunLoop run_loop2; |
357 calculator_ui.Add(2.0, run_loop2.QuitClosure()); | 355 calculator_ui.Add(2.0, run_loop2.QuitClosure()); |
358 run_loop2.Run(); | 356 run_loop2.Run(); |
359 EXPECT_EQ(2.0, calculator_ui.GetOutput()); | 357 EXPECT_EQ(2.0, calculator_ui.GetOutput()); |
360 EXPECT_FALSE(calculator_ui.encountered_error()); | 358 EXPECT_FALSE(calculator_ui.encountered_error()); |
361 | 359 |
362 calculator_ui.Multiply(5.0, base::Closure()); | 360 calculator_ui.Multiply(5.0, base::Closure()); |
363 EXPECT_FALSE(calculator_ui.encountered_error()); | 361 EXPECT_FALSE(calculator_ui.encountered_error()); |
364 | 362 |
365 // Close the server. | 363 // Close the server. |
366 calc_impl.CloseMessagePipe(); | 364 calc_impl.binding()->Close(); |
367 | 365 |
368 // The state change isn't picked up locally yet. | 366 // The state change isn't picked up locally yet. |
369 EXPECT_FALSE(calculator_ui.encountered_error()); | 367 EXPECT_FALSE(calculator_ui.encountered_error()); |
370 | 368 |
371 run_loop.Run(); | 369 run_loop.Run(); |
372 | 370 |
373 // OK, now we see the error. | 371 // OK, now we see the error. |
374 EXPECT_TRUE(calculator_ui.encountered_error()); | 372 EXPECT_TRUE(calculator_ui.encountered_error()); |
375 | 373 |
376 // We should have also been able to observe the error through the error | 374 // We should have also been able to observe the error through the error |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 TEST_F(InterfacePtrTest, FlushForTestingWithClosedPeer) { | 745 TEST_F(InterfacePtrTest, FlushForTestingWithClosedPeer) { |
748 math::CalculatorPtr calc; | 746 math::CalculatorPtr calc; |
749 GetProxy(&calc); | 747 GetProxy(&calc); |
750 bool called = false; | 748 bool called = false; |
751 calc.set_connection_error_handler(base::Bind(&SetBool, &called)); | 749 calc.set_connection_error_handler(base::Bind(&SetBool, &called)); |
752 calc.FlushForTesting(); | 750 calc.FlushForTesting(); |
753 EXPECT_TRUE(called); | 751 EXPECT_TRUE(called); |
754 calc.FlushForTesting(); | 752 calc.FlushForTesting(); |
755 } | 753 } |
756 | 754 |
| 755 TEST_F(InterfacePtrTest, ConnectionErrorWithReason) { |
| 756 math::CalculatorPtr calc; |
| 757 MathCalculatorImpl calc_impl(GetProxy(&calc)); |
| 758 |
| 759 base::RunLoop run_loop; |
| 760 calc.set_connection_error_with_reason_handler(base::Bind( |
| 761 [](const base::Closure& quit_closure, uint32_t custom_reason, |
| 762 const std::string& description) { |
| 763 EXPECT_EQ(42u, custom_reason); |
| 764 EXPECT_EQ("hey", description); |
| 765 quit_closure.Run(); |
| 766 }, |
| 767 run_loop.QuitClosure())); |
| 768 |
| 769 calc_impl.binding()->CloseWithReason(42u, "hey"); |
| 770 |
| 771 run_loop.Run(); |
| 772 } |
| 773 |
757 } // namespace | 774 } // namespace |
758 } // namespace test | 775 } // namespace test |
759 } // namespace mojo | 776 } // namespace mojo |
OLD | NEW |