OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // Create a service process that uses a Mock to respond to the browser in order | 5 // Create a service process that uses a Mock to respond to the browser in order |
6 // to test launching the browser using the cloud print policy check command | 6 // to test launching the browser using the cloud print policy check command |
7 // line switch. | 7 // line switch. |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
12 #include "base/process/kill.h" | 12 #include "base/process/kill.h" |
| 13 #include "base/process/process.h" |
13 #include "base/rand_util.h" | 14 #include "base/rand_util.h" |
14 #include "base/synchronization/waitable_event.h" | 15 #include "base/synchronization/waitable_event.h" |
15 #include "base/test/multiprocess_test.h" | 16 #include "base/test/multiprocess_test.h" |
16 #include "base/test/test_timeouts.h" | 17 #include "base/test/test_timeouts.h" |
17 #include "base/time/default_tick_clock.h" | 18 #include "base/time/default_tick_clock.h" |
18 #include "base/time/time.h" | 19 #include "base/time/time.h" |
19 #include "chrome/browser/chrome_content_browser_client.h" | 20 #include "chrome/browser/chrome_content_browser_client.h" |
20 #include "chrome/browser/prefs/browser_prefs.h" | 21 #include "chrome/browser/prefs/browser_prefs.h" |
21 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h" | 22 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h" |
22 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.
h" | 23 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.
h" |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 public: | 302 public: |
302 CloudPrintProxyPolicyStartupTest(); | 303 CloudPrintProxyPolicyStartupTest(); |
303 ~CloudPrintProxyPolicyStartupTest() override; | 304 ~CloudPrintProxyPolicyStartupTest() override; |
304 | 305 |
305 void SetUp() override; | 306 void SetUp() override; |
306 void TearDown() override; | 307 void TearDown() override; |
307 | 308 |
308 scoped_refptr<base::MessageLoopProxy> IOMessageLoopProxy() { | 309 scoped_refptr<base::MessageLoopProxy> IOMessageLoopProxy() { |
309 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); | 310 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); |
310 } | 311 } |
311 base::ProcessHandle Launch(const std::string& name); | 312 base::Process Launch(const std::string& name); |
312 void WaitForConnect(); | 313 void WaitForConnect(); |
313 bool Send(IPC::Message* message); | 314 bool Send(IPC::Message* message); |
314 void ShutdownAndWaitForExitWithTimeout(base::ProcessHandle handle); | 315 void ShutdownAndWaitForExitWithTimeout(base::Process process); |
315 | 316 |
316 // IPC::Listener implementation | 317 // IPC::Listener implementation |
317 bool OnMessageReceived(const IPC::Message& message) override { return false; } | 318 bool OnMessageReceived(const IPC::Message& message) override { return false; } |
318 void OnChannelConnected(int32 peer_pid) override; | 319 void OnChannelConnected(int32 peer_pid) override; |
319 | 320 |
320 // MultiProcessTest implementation. | 321 // MultiProcessTest implementation. |
321 base::CommandLine MakeCmdLine(const std::string& procname) override; | 322 base::CommandLine MakeCmdLine(const std::string& procname) override; |
322 | 323 |
323 bool LaunchBrowser(const base::CommandLine& command_line, Profile* profile) { | 324 bool LaunchBrowser(const base::CommandLine& command_line, Profile* profile) { |
324 int return_code = 0; | 325 int return_code = 0; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 } | 424 } |
424 | 425 |
425 void CloudPrintProxyPolicyStartupTest::TearDown() { | 426 void CloudPrintProxyPolicyStartupTest::TearDown() { |
426 browser_content_client_.reset(); | 427 browser_content_client_.reset(); |
427 content_client_.reset(); | 428 content_client_.reset(); |
428 content::SetContentClient(NULL); | 429 content::SetContentClient(NULL); |
429 | 430 |
430 TestingBrowserProcess::DeleteInstance(); | 431 TestingBrowserProcess::DeleteInstance(); |
431 } | 432 } |
432 | 433 |
433 base::ProcessHandle CloudPrintProxyPolicyStartupTest::Launch( | 434 base::Process CloudPrintProxyPolicyStartupTest::Launch( |
434 const std::string& name) { | 435 const std::string& name) { |
435 EXPECT_FALSE(CheckServiceProcessReady()); | 436 EXPECT_FALSE(CheckServiceProcessReady()); |
436 | 437 |
437 startup_channel_id_ = | 438 startup_channel_id_ = |
438 base::StringPrintf("%d.%p.%d", | 439 base::StringPrintf("%d.%p.%d", |
439 base::GetCurrentProcId(), this, | 440 base::GetCurrentProcId(), this, |
440 base::RandInt(0, std::numeric_limits<int>::max())); | 441 base::RandInt(0, std::numeric_limits<int>::max())); |
441 startup_channel_ = IPC::ChannelProxy::Create(startup_channel_id_, | 442 startup_channel_ = IPC::ChannelProxy::Create(startup_channel_id_, |
442 IPC::Channel::MODE_SERVER, | 443 IPC::Channel::MODE_SERVER, |
443 this, | 444 this, |
444 IOMessageLoopProxy()); | 445 IOMessageLoopProxy()); |
445 | 446 |
446 #if defined(OS_POSIX) | 447 #if defined(OS_POSIX) |
447 base::FileHandleMappingVector ipc_file_list; | 448 base::FileHandleMappingVector ipc_file_list; |
448 ipc_file_list.push_back(std::make_pair( | 449 ipc_file_list.push_back(std::make_pair( |
449 startup_channel_->TakeClientFileDescriptor().release(), | 450 startup_channel_->TakeClientFileDescriptor().release(), |
450 kPrimaryIPCChannel + base::GlobalDescriptors::kBaseDescriptor)); | 451 kPrimaryIPCChannel + base::GlobalDescriptors::kBaseDescriptor)); |
451 base::LaunchOptions options; | 452 base::LaunchOptions options; |
452 options.fds_to_remap = &ipc_file_list; | 453 options.fds_to_remap = &ipc_file_list; |
453 base::ProcessHandle handle = SpawnChildWithOptions(name, options); | 454 base::Process process = SpawnChildWithOptions(name, options); |
454 #else | 455 #else |
455 base::ProcessHandle handle = SpawnChild(name); | 456 base::Process process = SpawnChild(name); |
456 #endif | 457 #endif |
457 EXPECT_TRUE(handle); | 458 EXPECT_TRUE(process.IsValid()); |
458 return handle; | 459 return process.Pass(); |
459 } | 460 } |
460 | 461 |
461 void CloudPrintProxyPolicyStartupTest::WaitForConnect() { | 462 void CloudPrintProxyPolicyStartupTest::WaitForConnect() { |
462 observer_.Wait(); | 463 observer_.Wait(); |
463 EXPECT_TRUE(CheckServiceProcessReady()); | 464 EXPECT_TRUE(CheckServiceProcessReady()); |
464 EXPECT_TRUE(base::MessageLoopProxy::current().get()); | 465 EXPECT_TRUE(base::MessageLoopProxy::current().get()); |
465 ServiceProcessControl::GetInstance()->SetChannel( | 466 ServiceProcessControl::GetInstance()->SetChannel( |
466 IPC::ChannelProxy::Create(GetServiceProcessChannel(), | 467 IPC::ChannelProxy::Create(GetServiceProcessChannel(), |
467 IPC::Channel::MODE_NAMED_CLIENT, | 468 IPC::Channel::MODE_NAMED_CLIENT, |
468 ServiceProcessControl::GetInstance(), | 469 ServiceProcessControl::GetInstance(), |
469 IOMessageLoopProxy())); | 470 IOMessageLoopProxy())); |
470 } | 471 } |
471 | 472 |
472 bool CloudPrintProxyPolicyStartupTest::Send(IPC::Message* message) { | 473 bool CloudPrintProxyPolicyStartupTest::Send(IPC::Message* message) { |
473 return ServiceProcessControl::GetInstance()->Send(message); | 474 return ServiceProcessControl::GetInstance()->Send(message); |
474 } | 475 } |
475 | 476 |
476 void CloudPrintProxyPolicyStartupTest::ShutdownAndWaitForExitWithTimeout( | 477 void CloudPrintProxyPolicyStartupTest::ShutdownAndWaitForExitWithTimeout( |
477 base::ProcessHandle handle) { | 478 base::Process process) { |
478 ASSERT_TRUE(Send(new ServiceMsg_Shutdown())); | 479 ASSERT_TRUE(Send(new ServiceMsg_Shutdown())); |
479 | 480 |
480 int exit_code = -100; | 481 int exit_code = -100; |
481 bool exited = | 482 bool exited = process.WaitForExitWithTimeout(TestTimeouts::action_timeout(), |
482 base::WaitForExitCodeWithTimeout(handle, &exit_code, | 483 &exit_code); |
483 TestTimeouts::action_timeout()); | |
484 EXPECT_TRUE(exited); | 484 EXPECT_TRUE(exited); |
485 EXPECT_EQ(exit_code, 0); | 485 EXPECT_EQ(exit_code, 0); |
486 base::CloseProcessHandle(handle); | |
487 } | 486 } |
488 | 487 |
489 void CloudPrintProxyPolicyStartupTest::OnChannelConnected(int32 peer_pid) { | 488 void CloudPrintProxyPolicyStartupTest::OnChannelConnected(int32 peer_pid) { |
490 observer_.Notify(); | 489 observer_.Notify(); |
491 } | 490 } |
492 | 491 |
493 base::CommandLine CloudPrintProxyPolicyStartupTest::MakeCmdLine( | 492 base::CommandLine CloudPrintProxyPolicyStartupTest::MakeCmdLine( |
494 const std::string& procname) { | 493 const std::string& procname) { |
495 base::CommandLine cl = MultiProcessTest::MakeCmdLine(procname); | 494 base::CommandLine cl = MultiProcessTest::MakeCmdLine(procname); |
496 cl.AppendSwitchASCII(switches::kProcessChannelID, startup_channel_id_); | 495 cl.AppendSwitchASCII(switches::kProcessChannelID, startup_channel_id_); |
497 #if defined(OS_MACOSX) | 496 #if defined(OS_MACOSX) |
498 cl.AppendSwitchASCII(kTestExecutablePath, executable_path_.value()); | 497 cl.AppendSwitchASCII(kTestExecutablePath, executable_path_.value()); |
499 #endif | 498 #endif |
500 return cl; | 499 return cl; |
501 } | 500 } |
502 | 501 |
503 TEST_F(CloudPrintProxyPolicyStartupTest, StartAndShutdown) { | 502 TEST_F(CloudPrintProxyPolicyStartupTest, StartAndShutdown) { |
504 TestingBrowserProcess* browser_process = | 503 TestingBrowserProcess* browser_process = |
505 TestingBrowserProcess::GetGlobal(); | 504 TestingBrowserProcess::GetGlobal(); |
506 TestingProfileManager profile_manager(browser_process); | 505 TestingProfileManager profile_manager(browser_process); |
507 ASSERT_TRUE(profile_manager.SetUp()); | 506 ASSERT_TRUE(profile_manager.SetUp()); |
508 | 507 |
509 // Must be created after the TestingProfileManager since that creates the | 508 // Must be created after the TestingProfileManager since that creates the |
510 // LocalState for the BrowserProcess. Must be created before profiles are | 509 // LocalState for the BrowserProcess. Must be created before profiles are |
511 // constructed. | 510 // constructed. |
512 chrome::TestingIOThreadState testing_io_thread_state; | 511 chrome::TestingIOThreadState testing_io_thread_state; |
513 | 512 |
514 base::ProcessHandle handle = | 513 base::Process process = |
515 Launch("CloudPrintMockService_StartEnabledWaitForQuit"); | 514 Launch("CloudPrintMockService_StartEnabledWaitForQuit"); |
516 WaitForConnect(); | 515 WaitForConnect(); |
517 ShutdownAndWaitForExitWithTimeout(handle); | 516 ShutdownAndWaitForExitWithTimeout(process.Pass()); |
518 content::RunAllPendingInMessageLoop(); | 517 content::RunAllPendingInMessageLoop(); |
519 } | 518 } |
520 | 519 |
521 KeyedService* CloudPrintProxyServiceFactoryForPolicyTest( | 520 KeyedService* CloudPrintProxyServiceFactoryForPolicyTest( |
522 content::BrowserContext* profile) { | 521 content::BrowserContext* profile) { |
523 CloudPrintProxyService* service = | 522 CloudPrintProxyService* service = |
524 new CloudPrintProxyService(static_cast<Profile*>(profile)); | 523 new CloudPrintProxyService(static_cast<Profile*>(profile)); |
525 service->Initialize(); | 524 service->Initialize(); |
526 return service; | 525 return service; |
527 } | 526 } |
528 | 527 |
529 TEST_F(CloudPrintProxyPolicyStartupTest, StartBrowserWithoutPolicy) { | 528 TEST_F(CloudPrintProxyPolicyStartupTest, StartBrowserWithoutPolicy) { |
530 base::ProcessHandle handle = | 529 base::Process process = |
531 Launch("CloudPrintMockService_StartEnabledWaitForQuit"); | 530 Launch("CloudPrintMockService_StartEnabledWaitForQuit"); |
532 | 531 |
533 // Setup the Browser Process with a full IOThread::Globals. | 532 // Setup the Browser Process with a full IOThread::Globals. |
534 TestingBrowserProcess* browser_process = | 533 TestingBrowserProcess* browser_process = |
535 TestingBrowserProcess::GetGlobal(); | 534 TestingBrowserProcess::GetGlobal(); |
536 | 535 |
537 TestingProfileManager profile_manager(browser_process); | 536 TestingProfileManager profile_manager(browser_process); |
538 ASSERT_TRUE(profile_manager.SetUp()); | 537 ASSERT_TRUE(profile_manager.SetUp()); |
539 | 538 |
540 // Must be created after the TestingProfileManager since that creates the | 539 // Must be created after the TestingProfileManager since that creates the |
(...skipping 23 matching lines...) Expand all Loading... |
564 TestTimeouts::action_timeout()); | 563 TestTimeouts::action_timeout()); |
565 | 564 |
566 bool should_run_loop = LaunchBrowser(command_line, profile); | 565 bool should_run_loop = LaunchBrowser(command_line, profile); |
567 EXPECT_FALSE(should_run_loop); | 566 EXPECT_FALSE(should_run_loop); |
568 if (should_run_loop) | 567 if (should_run_loop) |
569 run_loop.Run(); | 568 run_loop.Run(); |
570 | 569 |
571 EXPECT_EQ(MockServiceIPCServer::EnabledUserId(), | 570 EXPECT_EQ(MockServiceIPCServer::EnabledUserId(), |
572 prefs->GetString(prefs::kCloudPrintEmail)); | 571 prefs->GetString(prefs::kCloudPrintEmail)); |
573 | 572 |
574 ShutdownAndWaitForExitWithTimeout(handle); | 573 ShutdownAndWaitForExitWithTimeout(process.Pass()); |
575 content::RunAllPendingInMessageLoop(); | 574 content::RunAllPendingInMessageLoop(); |
576 profile_manager.DeleteTestingProfile("StartBrowserWithoutPolicy"); | 575 profile_manager.DeleteTestingProfile("StartBrowserWithoutPolicy"); |
577 } | 576 } |
578 | 577 |
579 TEST_F(CloudPrintProxyPolicyStartupTest, StartBrowserWithPolicy) { | 578 TEST_F(CloudPrintProxyPolicyStartupTest, StartBrowserWithPolicy) { |
580 base::ProcessHandle handle = | 579 base::Process process = |
581 Launch("CloudPrintMockService_StartEnabledExpectDisabled"); | 580 Launch("CloudPrintMockService_StartEnabledExpectDisabled"); |
582 | 581 |
583 TestingBrowserProcess* browser_process = | 582 TestingBrowserProcess* browser_process = |
584 TestingBrowserProcess::GetGlobal(); | 583 TestingBrowserProcess::GetGlobal(); |
585 TestingProfileManager profile_manager(browser_process); | 584 TestingProfileManager profile_manager(browser_process); |
586 ASSERT_TRUE(profile_manager.SetUp()); | 585 ASSERT_TRUE(profile_manager.SetUp()); |
587 | 586 |
588 // Must be created after the TestingProfileManager since that creates the | 587 // Must be created after the TestingProfileManager since that creates the |
589 // LocalState for the BrowserProcess. Must be created before profiles are | 588 // LocalState for the BrowserProcess. Must be created before profiles are |
590 // constructed. | 589 // constructed. |
(...skipping 24 matching lines...) Expand all Loading... |
615 | 614 |
616 bool should_run_loop = LaunchBrowser(command_line, profile); | 615 bool should_run_loop = LaunchBrowser(command_line, profile); |
617 | 616 |
618 // No expectations on run_loop being true here; that would be a race | 617 // No expectations on run_loop being true here; that would be a race |
619 // condition. | 618 // condition. |
620 if (should_run_loop) | 619 if (should_run_loop) |
621 run_loop.Run(); | 620 run_loop.Run(); |
622 | 621 |
623 EXPECT_EQ("", prefs->GetString(prefs::kCloudPrintEmail)); | 622 EXPECT_EQ("", prefs->GetString(prefs::kCloudPrintEmail)); |
624 | 623 |
625 ShutdownAndWaitForExitWithTimeout(handle); | 624 ShutdownAndWaitForExitWithTimeout(process.Pass()); |
626 content::RunAllPendingInMessageLoop(); | 625 content::RunAllPendingInMessageLoop(); |
627 profile_manager.DeleteTestingProfile("StartBrowserWithPolicy"); | 626 profile_manager.DeleteTestingProfile("StartBrowserWithPolicy"); |
628 } | 627 } |
OLD | NEW |