OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "ipc/mojo/ipc_channel_mojo.h" | 5 #include "ipc/mojo/ipc_channel_mojo.h" |
6 | 6 |
7 #include "base/base_paths.h" | 7 #include "base/base_paths.h" |
8 #include "base/files/file.h" | 8 #include "base/files/file.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 | 424 |
425 base::MessageLoop::current()->Run(); | 425 base::MessageLoop::current()->Run(); |
426 this->channel()->Close(); | 426 this->channel()->Close(); |
427 | 427 |
428 EXPECT_TRUE(WaitForClientShutdown()); | 428 EXPECT_TRUE(WaitForClientShutdown()); |
429 DestroyChannel(); | 429 DestroyChannel(); |
430 } | 430 } |
431 | 431 |
432 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestSendMessagePipeClient) { | 432 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestSendMessagePipeClient) { |
433 ListenerThatExpectsMessagePipe listener; | 433 ListenerThatExpectsMessagePipe listener; |
434 ChannelClient client(&listener, "IPCChannelMojoTestSendPlatformHandleClient"); | 434 ChannelClient client(&listener, "IPCChannelMojoTestSendMessagePipeClient"); |
435 client.Connect(); | 435 client.Connect(); |
436 listener.set_sender(client.channel()); | 436 listener.set_sender(client.channel()); |
437 | 437 |
438 base::MessageLoop::current()->Run(); | 438 base::MessageLoop::current()->Run(); |
439 | 439 |
440 client.Close(); | 440 client.Close(); |
441 | 441 |
442 return 0; | 442 return 0; |
443 } | 443 } |
444 | 444 |
445 #if defined(OS_WIN) | 445 #if defined(OS_WIN) |
446 class IPCChannelMojoDeadHandleTest : public IPCChannelMojoTestBase { | 446 class IPCChannelMojoDeadHandleTest : public IPCChannelMojoTestBase { |
447 protected: | 447 protected: |
448 virtual scoped_ptr<IPC::ChannelFactory> CreateChannelFactory( | 448 virtual scoped_ptr<IPC::ChannelFactory> CreateChannelFactory( |
449 const IPC::ChannelHandle& handle, | 449 const IPC::ChannelHandle& handle, |
450 base::TaskRunner* runner) override { | 450 base::TaskRunner* runner) override { |
451 host_.reset(new IPC::ChannelMojoHost(task_runner())); | 451 host_.reset(new IPC::ChannelMojoHost(task_runner())); |
452 return IPC::ChannelMojo::CreateServerFactory(host_->channel_delegate(), | 452 return IPC::ChannelMojo::CreateServerFactory(host_->channel_delegate(), |
453 handle); | 453 handle); |
454 } | 454 } |
455 | 455 |
456 virtual bool DidStartClient() override { | 456 virtual bool DidStartClient() override { |
457 IPCTestBase::DidStartClient(); | 457 IPCTestBase::DidStartClient(); |
458 const base::ProcessHandle client = client_process().Handle(); | 458 const base::ProcessHandle client = client_process().Handle(); |
459 // Forces GetFileHandleForProcess() fail. It happens occasionally | 459 // Forces GetFileHandleForProcess() fail. It happens occasionally |
460 // in production, so we should exercise it somehow. | 460 // in production, so we should exercise it somehow. |
461 // TODO(morrita): figure out how to safely test this. | 461 // TODO(morrita): figure out how to safely test this. See crbug.com/464109. |
462 // ::CloseHandle(client); | 462 // ::CloseHandle(client); |
463 host_->OnClientLaunched(client); | 463 host_->OnClientLaunched(client); |
464 return true; | 464 return true; |
465 } | 465 } |
466 | 466 |
467 private: | 467 private: |
468 scoped_ptr<IPC::ChannelMojoHost> host_; | 468 scoped_ptr<IPC::ChannelMojoHost> host_; |
469 }; | 469 }; |
470 | 470 |
471 TEST_F(IPCChannelMojoDeadHandleTest, InvalidClientHandle) { | 471 TEST_F(IPCChannelMojoDeadHandleTest, InvalidClientHandle) { |
472 // Any client type is fine as it is going to be killed anyway. | 472 // Any client type is fine as it is going to be killed anyway. |
473 InitWithMojo("IPCChannelMojoTestDoNothingClient"); | 473 InitWithMojo("IPCChannelMojoTestDoNothingClient"); |
474 | 474 |
475 // Set up IPC channel and start client. | 475 // Set up IPC channel and start client. |
476 ListenerExpectingErrors listener; | 476 ListenerExpectingErrors listener; |
477 CreateChannel(&listener); | 477 CreateChannel(&listener); |
478 ASSERT_TRUE(ConnectChannel()); | 478 ASSERT_TRUE(ConnectChannel()); |
479 | 479 |
480 ASSERT_TRUE(StartClient()); | 480 ASSERT_TRUE(StartClient()); |
481 base::MessageLoop::current()->Run(); | 481 base::MessageLoop::current()->Run(); |
482 | 482 |
483 this->channel()->Close(); | 483 this->channel()->Close(); |
484 | 484 |
485 // WaitForClientShutdown() fails as client_hanadle() is already | 485 // TODO(morrita): We need CloseHandle() call in DidStartClient(), |
486 // closed. | 486 // which has been disabled since crrev.com/843113003, to |
487 EXPECT_FALSE(WaitForClientShutdown()); | 487 // make this fail. See crbug.com/464109. |
| 488 // EXPECT_FALSE(WaitForClientShutdown()); |
| 489 WaitForClientShutdown(); |
488 EXPECT_TRUE(listener.has_error()); | 490 EXPECT_TRUE(listener.has_error()); |
489 | 491 |
490 DestroyChannel(); | 492 DestroyChannel(); |
491 } | 493 } |
492 | 494 |
493 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestDoNothingClient) { | 495 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestDoNothingClient) { |
494 ListenerThatQuits listener; | 496 ListenerThatQuits listener; |
495 ChannelClient client(&listener, "IPCChannelMojoTestDoNothingClient"); | 497 ChannelClient client(&listener, "IPCChannelMojoTestDoNothingClient"); |
496 client.Connect(); | 498 client.Connect(); |
497 | 499 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 base::MessageLoop::current()->Run(); | 668 base::MessageLoop::current()->Run(); |
667 | 669 |
668 client.Close(); | 670 client.Close(); |
669 | 671 |
670 return 0; | 672 return 0; |
671 } | 673 } |
672 | 674 |
673 #endif // OS_LINUX | 675 #endif // OS_LINUX |
674 | 676 |
675 } // namespace | 677 } // namespace |
OLD | NEW |