| 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 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 void ExpectValueAndRunClosure(uint32_t expected_value, | 214 void ExpectValueAndRunClosure(uint32_t expected_value, |
| 215 const base::Closure& closure, | 215 const base::Closure& closure, |
| 216 uint32_t value) { | 216 uint32_t value) { |
| 217 EXPECT_EQ(expected_value, value); | 217 EXPECT_EQ(expected_value, value); |
| 218 closure.Run(); | 218 closure.Run(); |
| 219 } | 219 } |
| 220 | 220 |
| 221 TEST_F(InterfacePtrTest, IsBound) { | 221 TEST_F(InterfacePtrTest, IsBound) { |
| 222 math::CalculatorPtr calc; | 222 math::CalculatorPtr calc; |
| 223 EXPECT_FALSE(calc.is_bound()); | 223 EXPECT_FALSE(calc.is_bound()); |
| 224 MathCalculatorImpl calc_impl(GetProxy(&calc)); | 224 MathCalculatorImpl calc_impl(MakeRequest(&calc)); |
| 225 EXPECT_TRUE(calc.is_bound()); | 225 EXPECT_TRUE(calc.is_bound()); |
| 226 } | 226 } |
| 227 | 227 |
| 228 TEST_F(InterfacePtrTest, EndToEnd) { | 228 TEST_F(InterfacePtrTest, EndToEnd) { |
| 229 math::CalculatorPtr calc; | 229 math::CalculatorPtr calc; |
| 230 MathCalculatorImpl calc_impl(GetProxy(&calc)); | 230 MathCalculatorImpl calc_impl(MakeRequest(&calc)); |
| 231 | 231 |
| 232 // Suppose this is instantiated in a process that has pipe1_. | 232 // Suppose this is instantiated in a process that has pipe1_. |
| 233 MathCalculatorUI calculator_ui(std::move(calc)); | 233 MathCalculatorUI calculator_ui(std::move(calc)); |
| 234 | 234 |
| 235 base::RunLoop run_loop, run_loop2; | 235 base::RunLoop run_loop, run_loop2; |
| 236 calculator_ui.Add(2.0, run_loop.QuitClosure()); | 236 calculator_ui.Add(2.0, run_loop.QuitClosure()); |
| 237 calculator_ui.Multiply(5.0, run_loop2.QuitClosure()); | 237 calculator_ui.Multiply(5.0, run_loop2.QuitClosure()); |
| 238 run_loop.Run(); | 238 run_loop.Run(); |
| 239 run_loop2.Run(); | 239 run_loop2.Run(); |
| 240 | 240 |
| 241 EXPECT_EQ(10.0, calculator_ui.GetOutput()); | 241 EXPECT_EQ(10.0, calculator_ui.GetOutput()); |
| 242 } | 242 } |
| 243 | 243 |
| 244 TEST_F(InterfacePtrTest, EndToEnd_Synchronous) { | 244 TEST_F(InterfacePtrTest, EndToEnd_Synchronous) { |
| 245 math::CalculatorPtr calc; | 245 math::CalculatorPtr calc; |
| 246 MathCalculatorImpl calc_impl(GetProxy(&calc)); | 246 MathCalculatorImpl calc_impl(MakeRequest(&calc)); |
| 247 | 247 |
| 248 // Suppose this is instantiated in a process that has pipe1_. | 248 // Suppose this is instantiated in a process that has pipe1_. |
| 249 MathCalculatorUI calculator_ui(std::move(calc)); | 249 MathCalculatorUI calculator_ui(std::move(calc)); |
| 250 | 250 |
| 251 EXPECT_EQ(0.0, calculator_ui.GetOutput()); | 251 EXPECT_EQ(0.0, calculator_ui.GetOutput()); |
| 252 | 252 |
| 253 base::RunLoop run_loop; | 253 base::RunLoop run_loop; |
| 254 calculator_ui.Add(2.0, run_loop.QuitClosure()); | 254 calculator_ui.Add(2.0, run_loop.QuitClosure()); |
| 255 EXPECT_EQ(0.0, calculator_ui.GetOutput()); | 255 EXPECT_EQ(0.0, calculator_ui.GetOutput()); |
| 256 calc_impl.binding()->WaitForIncomingMethodCall(); | 256 calc_impl.binding()->WaitForIncomingMethodCall(); |
| 257 run_loop.Run(); | 257 run_loop.Run(); |
| 258 EXPECT_EQ(2.0, calculator_ui.GetOutput()); | 258 EXPECT_EQ(2.0, calculator_ui.GetOutput()); |
| 259 | 259 |
| 260 base::RunLoop run_loop2; | 260 base::RunLoop run_loop2; |
| 261 calculator_ui.Multiply(5.0, run_loop2.QuitClosure()); | 261 calculator_ui.Multiply(5.0, run_loop2.QuitClosure()); |
| 262 EXPECT_EQ(2.0, calculator_ui.GetOutput()); | 262 EXPECT_EQ(2.0, calculator_ui.GetOutput()); |
| 263 calc_impl.binding()->WaitForIncomingMethodCall(); | 263 calc_impl.binding()->WaitForIncomingMethodCall(); |
| 264 run_loop2.Run(); | 264 run_loop2.Run(); |
| 265 EXPECT_EQ(10.0, calculator_ui.GetOutput()); | 265 EXPECT_EQ(10.0, calculator_ui.GetOutput()); |
| 266 } | 266 } |
| 267 | 267 |
| 268 TEST_F(InterfacePtrTest, Movable) { | 268 TEST_F(InterfacePtrTest, Movable) { |
| 269 math::CalculatorPtr a; | 269 math::CalculatorPtr a; |
| 270 math::CalculatorPtr b; | 270 math::CalculatorPtr b; |
| 271 MathCalculatorImpl calc_impl(GetProxy(&b)); | 271 MathCalculatorImpl calc_impl(MakeRequest(&b)); |
| 272 | 272 |
| 273 EXPECT_TRUE(!a); | 273 EXPECT_TRUE(!a); |
| 274 EXPECT_FALSE(!b); | 274 EXPECT_FALSE(!b); |
| 275 | 275 |
| 276 a = std::move(b); | 276 a = std::move(b); |
| 277 | 277 |
| 278 EXPECT_FALSE(!a); | 278 EXPECT_FALSE(!a); |
| 279 EXPECT_TRUE(!b); | 279 EXPECT_TRUE(!b); |
| 280 } | 280 } |
| 281 | 281 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 308 EXPECT_FALSE(ptr.get()); | 308 EXPECT_FALSE(ptr.get()); |
| 309 EXPECT_FALSE(ptr); | 309 EXPECT_FALSE(ptr); |
| 310 | 310 |
| 311 ptr.Bind(InterfacePtrInfo<math::Calculator>()); | 311 ptr.Bind(InterfacePtrInfo<math::Calculator>()); |
| 312 EXPECT_FALSE(ptr.get()); | 312 EXPECT_FALSE(ptr.get()); |
| 313 EXPECT_FALSE(ptr); | 313 EXPECT_FALSE(ptr); |
| 314 } | 314 } |
| 315 | 315 |
| 316 TEST_F(InterfacePtrTest, EncounteredError) { | 316 TEST_F(InterfacePtrTest, EncounteredError) { |
| 317 math::CalculatorPtr proxy; | 317 math::CalculatorPtr proxy; |
| 318 MathCalculatorImpl calc_impl(GetProxy(&proxy)); | 318 MathCalculatorImpl calc_impl(MakeRequest(&proxy)); |
| 319 | 319 |
| 320 MathCalculatorUI calculator_ui(std::move(proxy)); | 320 MathCalculatorUI calculator_ui(std::move(proxy)); |
| 321 | 321 |
| 322 base::RunLoop run_loop; | 322 base::RunLoop run_loop; |
| 323 calculator_ui.Add(2.0, run_loop.QuitClosure()); | 323 calculator_ui.Add(2.0, run_loop.QuitClosure()); |
| 324 run_loop.Run(); | 324 run_loop.Run(); |
| 325 EXPECT_EQ(2.0, calculator_ui.GetOutput()); | 325 EXPECT_EQ(2.0, calculator_ui.GetOutput()); |
| 326 EXPECT_FALSE(calculator_ui.encountered_error()); | 326 EXPECT_FALSE(calculator_ui.encountered_error()); |
| 327 | 327 |
| 328 calculator_ui.Multiply(5.0, base::Closure()); | 328 calculator_ui.Multiply(5.0, base::Closure()); |
| 329 EXPECT_FALSE(calculator_ui.encountered_error()); | 329 EXPECT_FALSE(calculator_ui.encountered_error()); |
| 330 | 330 |
| 331 // Close the server. | 331 // Close the server. |
| 332 calc_impl.binding()->Close(); | 332 calc_impl.binding()->Close(); |
| 333 | 333 |
| 334 // The state change isn't picked up locally yet. | 334 // The state change isn't picked up locally yet. |
| 335 base::RunLoop run_loop2; | 335 base::RunLoop run_loop2; |
| 336 calculator_ui.set_connection_error_handler(run_loop2.QuitClosure()); | 336 calculator_ui.set_connection_error_handler(run_loop2.QuitClosure()); |
| 337 EXPECT_FALSE(calculator_ui.encountered_error()); | 337 EXPECT_FALSE(calculator_ui.encountered_error()); |
| 338 | 338 |
| 339 run_loop2.Run(); | 339 run_loop2.Run(); |
| 340 | 340 |
| 341 // OK, now we see the error. | 341 // OK, now we see the error. |
| 342 EXPECT_TRUE(calculator_ui.encountered_error()); | 342 EXPECT_TRUE(calculator_ui.encountered_error()); |
| 343 } | 343 } |
| 344 | 344 |
| 345 TEST_F(InterfacePtrTest, EncounteredErrorCallback) { | 345 TEST_F(InterfacePtrTest, EncounteredErrorCallback) { |
| 346 math::CalculatorPtr proxy; | 346 math::CalculatorPtr proxy; |
| 347 MathCalculatorImpl calc_impl(GetProxy(&proxy)); | 347 MathCalculatorImpl calc_impl(MakeRequest(&proxy)); |
| 348 | 348 |
| 349 bool encountered_error = false; | 349 bool encountered_error = false; |
| 350 base::RunLoop run_loop; | 350 base::RunLoop run_loop; |
| 351 proxy.set_connection_error_handler( | 351 proxy.set_connection_error_handler( |
| 352 base::Bind(&SetFlagAndRunClosure, &encountered_error, | 352 base::Bind(&SetFlagAndRunClosure, &encountered_error, |
| 353 run_loop.QuitClosure())); | 353 run_loop.QuitClosure())); |
| 354 | 354 |
| 355 MathCalculatorUI calculator_ui(std::move(proxy)); | 355 MathCalculatorUI calculator_ui(std::move(proxy)); |
| 356 | 356 |
| 357 base::RunLoop run_loop2; | 357 base::RunLoop run_loop2; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 374 // OK, now we see the error. | 374 // OK, now we see the error. |
| 375 EXPECT_TRUE(calculator_ui.encountered_error()); | 375 EXPECT_TRUE(calculator_ui.encountered_error()); |
| 376 | 376 |
| 377 // We should have also been able to observe the error through the error | 377 // We should have also been able to observe the error through the error |
| 378 // handler. | 378 // handler. |
| 379 EXPECT_TRUE(encountered_error); | 379 EXPECT_TRUE(encountered_error); |
| 380 } | 380 } |
| 381 | 381 |
| 382 TEST_F(InterfacePtrTest, DestroyInterfacePtrOnMethodResponse) { | 382 TEST_F(InterfacePtrTest, DestroyInterfacePtrOnMethodResponse) { |
| 383 math::CalculatorPtr proxy; | 383 math::CalculatorPtr proxy; |
| 384 MathCalculatorImpl calc_impl(GetProxy(&proxy)); | 384 MathCalculatorImpl calc_impl(MakeRequest(&proxy)); |
| 385 | 385 |
| 386 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); | 386 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); |
| 387 | 387 |
| 388 SelfDestructingMathCalculatorUI* impl = | 388 SelfDestructingMathCalculatorUI* impl = |
| 389 new SelfDestructingMathCalculatorUI(std::move(proxy)); | 389 new SelfDestructingMathCalculatorUI(std::move(proxy)); |
| 390 base::RunLoop run_loop; | 390 base::RunLoop run_loop; |
| 391 impl->BeginTest(false, run_loop.QuitClosure()); | 391 impl->BeginTest(false, run_loop.QuitClosure()); |
| 392 run_loop.Run(); | 392 run_loop.Run(); |
| 393 | 393 |
| 394 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); | 394 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); |
| 395 } | 395 } |
| 396 | 396 |
| 397 TEST_F(InterfacePtrTest, NestedDestroyInterfacePtrOnMethodResponse) { | 397 TEST_F(InterfacePtrTest, NestedDestroyInterfacePtrOnMethodResponse) { |
| 398 math::CalculatorPtr proxy; | 398 math::CalculatorPtr proxy; |
| 399 MathCalculatorImpl calc_impl(GetProxy(&proxy)); | 399 MathCalculatorImpl calc_impl(MakeRequest(&proxy)); |
| 400 | 400 |
| 401 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); | 401 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); |
| 402 | 402 |
| 403 SelfDestructingMathCalculatorUI* impl = | 403 SelfDestructingMathCalculatorUI* impl = |
| 404 new SelfDestructingMathCalculatorUI(std::move(proxy)); | 404 new SelfDestructingMathCalculatorUI(std::move(proxy)); |
| 405 base::RunLoop run_loop; | 405 base::RunLoop run_loop; |
| 406 impl->BeginTest(true, run_loop.QuitClosure()); | 406 impl->BeginTest(true, run_loop.QuitClosure()); |
| 407 run_loop.Run(); | 407 run_loop.Run(); |
| 408 | 408 |
| 409 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); | 409 EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances()); |
| 410 } | 410 } |
| 411 | 411 |
| 412 TEST_F(InterfacePtrTest, ReentrantWaitForIncomingMethodCall) { | 412 TEST_F(InterfacePtrTest, ReentrantWaitForIncomingMethodCall) { |
| 413 sample::ServicePtr proxy; | 413 sample::ServicePtr proxy; |
| 414 ReentrantServiceImpl impl(GetProxy(&proxy)); | 414 ReentrantServiceImpl impl(MakeRequest(&proxy)); |
| 415 | 415 |
| 416 base::RunLoop run_loop, run_loop2; | 416 base::RunLoop run_loop, run_loop2; |
| 417 proxy->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, | 417 proxy->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, |
| 418 base::Bind(&IgnoreValueAndRunClosure, | 418 base::Bind(&IgnoreValueAndRunClosure, |
| 419 run_loop.QuitClosure())); | 419 run_loop.QuitClosure())); |
| 420 proxy->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, | 420 proxy->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, |
| 421 base::Bind(&IgnoreValueAndRunClosure, | 421 base::Bind(&IgnoreValueAndRunClosure, |
| 422 run_loop2.QuitClosure())); | 422 run_loop2.QuitClosure())); |
| 423 | 423 |
| 424 run_loop.Run(); | 424 run_loop.Run(); |
| 425 run_loop2.Run(); | 425 run_loop2.Run(); |
| 426 | 426 |
| 427 EXPECT_EQ(2, impl.max_call_depth()); | 427 EXPECT_EQ(2, impl.max_call_depth()); |
| 428 } | 428 } |
| 429 | 429 |
| 430 TEST_F(InterfacePtrTest, QueryVersion) { | 430 TEST_F(InterfacePtrTest, QueryVersion) { |
| 431 IntegerAccessorImpl impl; | 431 IntegerAccessorImpl impl; |
| 432 sample::IntegerAccessorPtr ptr; | 432 sample::IntegerAccessorPtr ptr; |
| 433 Binding<sample::IntegerAccessor> binding(&impl, GetProxy(&ptr)); | 433 Binding<sample::IntegerAccessor> binding(&impl, MakeRequest(&ptr)); |
| 434 | 434 |
| 435 EXPECT_EQ(0u, ptr.version()); | 435 EXPECT_EQ(0u, ptr.version()); |
| 436 | 436 |
| 437 base::RunLoop run_loop; | 437 base::RunLoop run_loop; |
| 438 ptr.QueryVersion(base::Bind(&ExpectValueAndRunClosure, 3u, | 438 ptr.QueryVersion(base::Bind(&ExpectValueAndRunClosure, 3u, |
| 439 run_loop.QuitClosure())); | 439 run_loop.QuitClosure())); |
| 440 run_loop.Run(); | 440 run_loop.Run(); |
| 441 | 441 |
| 442 EXPECT_EQ(3u, ptr.version()); | 442 EXPECT_EQ(3u, ptr.version()); |
| 443 } | 443 } |
| 444 | 444 |
| 445 TEST_F(InterfacePtrTest, RequireVersion) { | 445 TEST_F(InterfacePtrTest, RequireVersion) { |
| 446 IntegerAccessorImpl impl; | 446 IntegerAccessorImpl impl; |
| 447 sample::IntegerAccessorPtr ptr; | 447 sample::IntegerAccessorPtr ptr; |
| 448 Binding<sample::IntegerAccessor> binding(&impl, GetProxy(&ptr)); | 448 Binding<sample::IntegerAccessor> binding(&impl, MakeRequest(&ptr)); |
| 449 | 449 |
| 450 EXPECT_EQ(0u, ptr.version()); | 450 EXPECT_EQ(0u, ptr.version()); |
| 451 | 451 |
| 452 ptr.RequireVersion(1u); | 452 ptr.RequireVersion(1u); |
| 453 EXPECT_EQ(1u, ptr.version()); | 453 EXPECT_EQ(1u, ptr.version()); |
| 454 base::RunLoop run_loop; | 454 base::RunLoop run_loop; |
| 455 impl.set_closure(run_loop.QuitClosure()); | 455 impl.set_closure(run_loop.QuitClosure()); |
| 456 ptr->SetInteger(123, sample::Enum::VALUE); | 456 ptr->SetInteger(123, sample::Enum::VALUE); |
| 457 run_loop.Run(); | 457 run_loop.Run(); |
| 458 EXPECT_FALSE(ptr.encountered_error()); | 458 EXPECT_FALSE(ptr.encountered_error()); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 }; | 504 }; |
| 505 | 505 |
| 506 TEST(StrongConnectorTest, Math) { | 506 TEST(StrongConnectorTest, Math) { |
| 507 base::MessageLoop loop; | 507 base::MessageLoop loop; |
| 508 | 508 |
| 509 bool error_received = false; | 509 bool error_received = false; |
| 510 bool destroyed = false; | 510 bool destroyed = false; |
| 511 math::CalculatorPtr calc; | 511 math::CalculatorPtr calc; |
| 512 base::RunLoop run_loop; | 512 base::RunLoop run_loop; |
| 513 | 513 |
| 514 auto binding = MakeStrongBinding( | 514 auto binding = |
| 515 base::MakeUnique<StrongMathCalculatorImpl>(&destroyed), GetProxy(&calc)); | 515 MakeStrongBinding(base::MakeUnique<StrongMathCalculatorImpl>(&destroyed), |
| 516 MakeRequest(&calc)); |
| 516 binding->set_connection_error_handler(base::Bind( | 517 binding->set_connection_error_handler(base::Bind( |
| 517 &SetFlagAndRunClosure, &error_received, run_loop.QuitClosure())); | 518 &SetFlagAndRunClosure, &error_received, run_loop.QuitClosure())); |
| 518 | 519 |
| 519 { | 520 { |
| 520 // Suppose this is instantiated in a process that has the other end of the | 521 // Suppose this is instantiated in a process that has the other end of the |
| 521 // message pipe. | 522 // message pipe. |
| 522 MathCalculatorUI calculator_ui(std::move(calc)); | 523 MathCalculatorUI calculator_ui(std::move(calc)); |
| 523 | 524 |
| 524 base::RunLoop run_loop, run_loop2; | 525 base::RunLoop run_loop, run_loop2; |
| 525 calculator_ui.Add(2.0, run_loop.QuitClosure()); | 526 calculator_ui.Add(2.0, run_loop.QuitClosure()); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 } | 662 } |
| 662 | 663 |
| 663 bool d_called_; | 664 bool d_called_; |
| 664 Binding<A> binding_; | 665 Binding<A> binding_; |
| 665 base::Closure closure_; | 666 base::Closure closure_; |
| 666 }; | 667 }; |
| 667 | 668 |
| 668 TEST_F(InterfacePtrTest, Scoping) { | 669 TEST_F(InterfacePtrTest, Scoping) { |
| 669 APtr a; | 670 APtr a; |
| 670 base::RunLoop run_loop; | 671 base::RunLoop run_loop; |
| 671 AImpl a_impl(GetProxy(&a), run_loop.QuitClosure()); | 672 AImpl a_impl(MakeRequest(&a), run_loop.QuitClosure()); |
| 672 | 673 |
| 673 EXPECT_FALSE(a_impl.d_called()); | 674 EXPECT_FALSE(a_impl.d_called()); |
| 674 | 675 |
| 675 { | 676 { |
| 676 BPtr b; | 677 BPtr b; |
| 677 a->GetB(GetProxy(&b)); | 678 a->GetB(MakeRequest(&b)); |
| 678 CPtr c; | 679 CPtr c; |
| 679 b->GetC(GetProxy(&c)); | 680 b->GetC(MakeRequest(&c)); |
| 680 c->D(); | 681 c->D(); |
| 681 } | 682 } |
| 682 | 683 |
| 683 // While B & C have fallen out of scope, the pipes will remain until they are | 684 // While B & C have fallen out of scope, the pipes will remain until they are |
| 684 // flushed. | 685 // flushed. |
| 685 EXPECT_FALSE(a_impl.d_called()); | 686 EXPECT_FALSE(a_impl.d_called()); |
| 686 run_loop.Run(); | 687 run_loop.Run(); |
| 687 EXPECT_TRUE(a_impl.d_called()); | 688 EXPECT_TRUE(a_impl.d_called()); |
| 688 } | 689 } |
| 689 | 690 |
| 690 class PingTestImpl : public sample::PingTest { | 691 class PingTestImpl : public sample::PingTest { |
| 691 public: | 692 public: |
| 692 explicit PingTestImpl(InterfaceRequest<sample::PingTest> request) | 693 explicit PingTestImpl(InterfaceRequest<sample::PingTest> request) |
| 693 : binding_(this, std::move(request)) {} | 694 : binding_(this, std::move(request)) {} |
| 694 ~PingTestImpl() override {} | 695 ~PingTestImpl() override {} |
| 695 | 696 |
| 696 private: | 697 private: |
| 697 // sample::PingTest: | 698 // sample::PingTest: |
| 698 void Ping(const PingCallback& callback) override { callback.Run(); } | 699 void Ping(const PingCallback& callback) override { callback.Run(); } |
| 699 | 700 |
| 700 Binding<sample::PingTest> binding_; | 701 Binding<sample::PingTest> binding_; |
| 701 }; | 702 }; |
| 702 | 703 |
| 703 // Tests that FuseProxy does what it's supposed to do. | 704 // Tests that FuseProxy does what it's supposed to do. |
| 704 TEST_F(InterfacePtrTest, Fusion) { | 705 TEST_F(InterfacePtrTest, Fusion) { |
| 705 sample::PingTestPtr proxy; | 706 sample::PingTestPtr proxy; |
| 706 PingTestImpl impl(GetProxy(&proxy)); | 707 PingTestImpl impl(MakeRequest(&proxy)); |
| 707 | 708 |
| 708 // Create another PingTest pipe. | 709 // Create another PingTest pipe. |
| 709 sample::PingTestPtr ptr; | 710 sample::PingTestPtr ptr; |
| 710 sample::PingTestRequest request = GetProxy(&ptr); | 711 sample::PingTestRequest request = MakeRequest(&ptr); |
| 711 | 712 |
| 712 // Fuse the new pipe to the one hanging off |impl|. | 713 // Fuse the new pipe to the one hanging off |impl|. |
| 713 EXPECT_TRUE(FuseInterface(std::move(request), proxy.PassInterface())); | 714 EXPECT_TRUE(FuseInterface(std::move(request), proxy.PassInterface())); |
| 714 | 715 |
| 715 // Ping! | 716 // Ping! |
| 716 bool called = false; | 717 bool called = false; |
| 717 base::RunLoop loop; | 718 base::RunLoop loop; |
| 718 ptr->Ping(base::Bind(&SetFlagAndRunClosure, &called, loop.QuitClosure())); | 719 ptr->Ping(base::Bind(&SetFlagAndRunClosure, &called, loop.QuitClosure())); |
| 719 loop.Run(); | 720 loop.Run(); |
| 720 EXPECT_TRUE(called); | 721 EXPECT_TRUE(called); |
| 721 } | 722 } |
| 722 | 723 |
| 723 void Fail() { | 724 void Fail() { |
| 724 FAIL() << "Unexpected connection error"; | 725 FAIL() << "Unexpected connection error"; |
| 725 } | 726 } |
| 726 | 727 |
| 727 TEST_F(InterfacePtrTest, FlushForTesting) { | 728 TEST_F(InterfacePtrTest, FlushForTesting) { |
| 728 math::CalculatorPtr calc; | 729 math::CalculatorPtr calc; |
| 729 MathCalculatorImpl calc_impl(GetProxy(&calc)); | 730 MathCalculatorImpl calc_impl(MakeRequest(&calc)); |
| 730 calc.set_connection_error_handler(base::Bind(&Fail)); | 731 calc.set_connection_error_handler(base::Bind(&Fail)); |
| 731 | 732 |
| 732 MathCalculatorUI calculator_ui(std::move(calc)); | 733 MathCalculatorUI calculator_ui(std::move(calc)); |
| 733 | 734 |
| 734 calculator_ui.Add(2.0, base::Bind(&base::DoNothing)); | 735 calculator_ui.Add(2.0, base::Bind(&base::DoNothing)); |
| 735 calculator_ui.GetInterfacePtr().FlushForTesting(); | 736 calculator_ui.GetInterfacePtr().FlushForTesting(); |
| 736 EXPECT_EQ(2.0, calculator_ui.GetOutput()); | 737 EXPECT_EQ(2.0, calculator_ui.GetOutput()); |
| 737 | 738 |
| 738 calculator_ui.Multiply(5.0, base::Bind(&base::DoNothing)); | 739 calculator_ui.Multiply(5.0, base::Bind(&base::DoNothing)); |
| 739 calculator_ui.GetInterfacePtr().FlushForTesting(); | 740 calculator_ui.GetInterfacePtr().FlushForTesting(); |
| 740 | 741 |
| 741 EXPECT_EQ(10.0, calculator_ui.GetOutput()); | 742 EXPECT_EQ(10.0, calculator_ui.GetOutput()); |
| 742 } | 743 } |
| 743 | 744 |
| 744 void SetBool(bool* value) { | 745 void SetBool(bool* value) { |
| 745 *value = true; | 746 *value = true; |
| 746 } | 747 } |
| 747 | 748 |
| 748 TEST_F(InterfacePtrTest, FlushForTestingWithClosedPeer) { | 749 TEST_F(InterfacePtrTest, FlushForTestingWithClosedPeer) { |
| 749 math::CalculatorPtr calc; | 750 math::CalculatorPtr calc; |
| 750 GetProxy(&calc); | 751 MakeRequest(&calc); |
| 751 bool called = false; | 752 bool called = false; |
| 752 calc.set_connection_error_handler(base::Bind(&SetBool, &called)); | 753 calc.set_connection_error_handler(base::Bind(&SetBool, &called)); |
| 753 calc.FlushForTesting(); | 754 calc.FlushForTesting(); |
| 754 EXPECT_TRUE(called); | 755 EXPECT_TRUE(called); |
| 755 calc.FlushForTesting(); | 756 calc.FlushForTesting(); |
| 756 } | 757 } |
| 757 | 758 |
| 758 TEST_F(InterfacePtrTest, ConnectionErrorWithReason) { | 759 TEST_F(InterfacePtrTest, ConnectionErrorWithReason) { |
| 759 math::CalculatorPtr calc; | 760 math::CalculatorPtr calc; |
| 760 MathCalculatorImpl calc_impl(GetProxy(&calc)); | 761 MathCalculatorImpl calc_impl(MakeRequest(&calc)); |
| 761 | 762 |
| 762 base::RunLoop run_loop; | 763 base::RunLoop run_loop; |
| 763 calc.set_connection_error_with_reason_handler(base::Bind( | 764 calc.set_connection_error_with_reason_handler(base::Bind( |
| 764 [](const base::Closure& quit_closure, uint32_t custom_reason, | 765 [](const base::Closure& quit_closure, uint32_t custom_reason, |
| 765 const std::string& description) { | 766 const std::string& description) { |
| 766 EXPECT_EQ(42u, custom_reason); | 767 EXPECT_EQ(42u, custom_reason); |
| 767 EXPECT_EQ("hey", description); | 768 EXPECT_EQ("hey", description); |
| 768 quit_closure.Run(); | 769 quit_closure.Run(); |
| 769 }, | 770 }, |
| 770 run_loop.QuitClosure())); | 771 run_loop.QuitClosure())); |
| 771 | 772 |
| 772 calc_impl.binding()->CloseWithReason(42u, "hey"); | 773 calc_impl.binding()->CloseWithReason(42u, "hey"); |
| 773 | 774 |
| 774 run_loop.Run(); | 775 run_loop.Run(); |
| 775 } | 776 } |
| 776 | 777 |
| 777 TEST_F(InterfacePtrTest, InterfaceRequestResetWithReason) { | 778 TEST_F(InterfacePtrTest, InterfaceRequestResetWithReason) { |
| 778 math::CalculatorPtr calc; | 779 math::CalculatorPtr calc; |
| 779 auto request = GetProxy(&calc); | 780 auto request = MakeRequest(&calc); |
| 780 | 781 |
| 781 base::RunLoop run_loop; | 782 base::RunLoop run_loop; |
| 782 calc.set_connection_error_with_reason_handler(base::Bind( | 783 calc.set_connection_error_with_reason_handler(base::Bind( |
| 783 [](const base::Closure& quit_closure, uint32_t custom_reason, | 784 [](const base::Closure& quit_closure, uint32_t custom_reason, |
| 784 const std::string& description) { | 785 const std::string& description) { |
| 785 EXPECT_EQ(88u, custom_reason); | 786 EXPECT_EQ(88u, custom_reason); |
| 786 EXPECT_EQ("greetings", description); | 787 EXPECT_EQ("greetings", description); |
| 787 quit_closure.Run(); | 788 quit_closure.Run(); |
| 788 }, | 789 }, |
| 789 run_loop.QuitClosure())); | 790 run_loop.QuitClosure())); |
| 790 | 791 |
| 791 request.ResetWithReason(88u, "greetings"); | 792 request.ResetWithReason(88u, "greetings"); |
| 792 | 793 |
| 793 run_loop.Run(); | 794 run_loop.Run(); |
| 794 } | 795 } |
| 795 | 796 |
| 796 TEST_F(InterfacePtrTest, CallbackOwnsInterfacePtr) { | 797 TEST_F(InterfacePtrTest, CallbackOwnsInterfacePtr) { |
| 797 sample::PingTestPtr ptr; | 798 sample::PingTestPtr ptr; |
| 798 sample::PingTestRequest request = GetProxy(&ptr); | 799 sample::PingTestRequest request = MakeRequest(&ptr); |
| 799 | 800 |
| 800 base::RunLoop run_loop; | 801 base::RunLoop run_loop; |
| 801 | 802 |
| 802 // Make a call with the proxy's lifetime bound to the response callback. | 803 // Make a call with the proxy's lifetime bound to the response callback. |
| 803 sample::PingTest* raw_proxy = ptr.get(); | 804 sample::PingTest* raw_proxy = ptr.get(); |
| 804 ptr.set_connection_error_handler(run_loop.QuitClosure()); | 805 ptr.set_connection_error_handler(run_loop.QuitClosure()); |
| 805 raw_proxy->Ping( | 806 raw_proxy->Ping( |
| 806 base::Bind([](sample::PingTestPtr ptr) {}, base::Passed(&ptr))); | 807 base::Bind([](sample::PingTestPtr ptr) {}, base::Passed(&ptr))); |
| 807 | 808 |
| 808 // Trigger an error on |ptr|. This will ultimately lead to the proxy's | 809 // Trigger an error on |ptr|. This will ultimately lead to the proxy's |
| 809 // response callbacks being destroyed, which will in turn lead to the proxy | 810 // response callbacks being destroyed, which will in turn lead to the proxy |
| 810 // being destroyed. This should not crash. | 811 // being destroyed. This should not crash. |
| 811 request.PassMessagePipe(); | 812 request.PassMessagePipe(); |
| 812 run_loop.Run(); | 813 run_loop.Run(); |
| 813 } | 814 } |
| 814 | 815 |
| 815 TEST_F(InterfacePtrTest, ThreadSafeInterfacePointer) { | 816 TEST_F(InterfacePtrTest, ThreadSafeInterfacePointer) { |
| 816 math::CalculatorPtr ptr; | 817 math::CalculatorPtr ptr; |
| 817 MathCalculatorImpl calc_impl(GetProxy(&ptr)); | 818 MathCalculatorImpl calc_impl(MakeRequest(&ptr)); |
| 818 scoped_refptr<math::ThreadSafeCalculatorPtr> thread_safe_ptr = | 819 scoped_refptr<math::ThreadSafeCalculatorPtr> thread_safe_ptr = |
| 819 math::ThreadSafeCalculatorPtr::Create(std::move(ptr)); | 820 math::ThreadSafeCalculatorPtr::Create(std::move(ptr)); |
| 820 | 821 |
| 821 base::RunLoop run_loop; | 822 base::RunLoop run_loop; |
| 822 | 823 |
| 823 // Create and start the thread from where we'll call the interface pointer. | 824 // Create and start the thread from where we'll call the interface pointer. |
| 824 base::Thread other_thread("service test thread"); | 825 base::Thread other_thread("service test thread"); |
| 825 other_thread.Start(); | 826 other_thread.Start(); |
| 826 | 827 |
| 827 auto run_method = base::Bind( | 828 auto run_method = base::Bind( |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 MathCalculatorImpl* math_calc_impl = nullptr; | 866 MathCalculatorImpl* math_calc_impl = nullptr; |
| 866 { | 867 { |
| 867 base::RunLoop run_loop; | 868 base::RunLoop run_loop; |
| 868 auto run_method = base::Bind( | 869 auto run_method = base::Bind( |
| 869 [](const scoped_refptr<base::TaskRunner>& main_task_runner, | 870 [](const scoped_refptr<base::TaskRunner>& main_task_runner, |
| 870 const base::Closure& quit_closure, | 871 const base::Closure& quit_closure, |
| 871 const scoped_refptr<math::ThreadSafeCalculatorPtr>& thread_safe_ptr, | 872 const scoped_refptr<math::ThreadSafeCalculatorPtr>& thread_safe_ptr, |
| 872 MathCalculatorImpl** math_calc_impl) { | 873 MathCalculatorImpl** math_calc_impl) { |
| 873 math::CalculatorPtr ptr; | 874 math::CalculatorPtr ptr; |
| 874 // In real life, the implementation would have a legitimate owner. | 875 // In real life, the implementation would have a legitimate owner. |
| 875 *math_calc_impl = new MathCalculatorImpl(GetProxy(&ptr)); | 876 *math_calc_impl = new MathCalculatorImpl(MakeRequest(&ptr)); |
| 876 thread_safe_ptr->Bind(std::move(ptr)); | 877 thread_safe_ptr->Bind(std::move(ptr)); |
| 877 main_task_runner->PostTask(FROM_HERE, quit_closure); | 878 main_task_runner->PostTask(FROM_HERE, quit_closure); |
| 878 }, | 879 }, |
| 879 base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(), | 880 base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(), |
| 880 thread_safe_ptr, &math_calc_impl); | 881 thread_safe_ptr, &math_calc_impl); |
| 881 other_thread.message_loop()->task_runner()->PostTask(FROM_HERE, run_method); | 882 other_thread.message_loop()->task_runner()->PostTask(FROM_HERE, run_method); |
| 882 run_loop.Run(); | 883 run_loop.Run(); |
| 883 } | 884 } |
| 884 | 885 |
| 885 { | 886 { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 899 other_thread_task_runner->DeleteSoon(FROM_HERE, math_calc_impl); | 900 other_thread_task_runner->DeleteSoon(FROM_HERE, math_calc_impl); |
| 900 | 901 |
| 901 // Reset the pointer now so the InterfacePtr associated resources can be | 902 // Reset the pointer now so the InterfacePtr associated resources can be |
| 902 // deleted before the background thread's message loop is invalidated. | 903 // deleted before the background thread's message loop is invalidated. |
| 903 thread_safe_ptr = nullptr; | 904 thread_safe_ptr = nullptr; |
| 904 } | 905 } |
| 905 | 906 |
| 906 } // namespace | 907 } // namespace |
| 907 } // namespace test | 908 } // namespace test |
| 908 } // namespace mojo | 909 } // namespace mojo |
| OLD | NEW |