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 "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/metrics/field_trial.h" | 6 #include "base/metrics/field_trial.h" |
| 7 #include "base/prefs/pref_registry_simple.h" |
| 8 #include "base/prefs/pref_service.h" |
| 9 #include "base/prefs/testing_pref_service.h" |
| 10 #include "base/run_loop.h" |
7 #include "base/test/mock_entropy_provider.h" | 11 #include "base/test/mock_entropy_provider.h" |
8 #include "chrome/browser/io_thread.h" | 12 #include "chrome/browser/io_thread.h" |
9 #include "chrome/common/chrome_switches.h" | 13 #include "chrome/common/chrome_switches.h" |
| 14 #include "chrome/common/pref_names.h" |
10 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_param
s.h" | 15 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_param
s.h" |
| 16 #include "components/policy/core/common/mock_policy_service.h" |
| 17 #include "components/proxy_config/pref_proxy_config_tracker_impl.h" |
| 18 #include "components/proxy_config/proxy_config_pref_names.h" |
| 19 #include "content/public/browser/browser_thread.h" |
| 20 #include "content/public/test/test_browser_thread_bundle.h" |
| 21 #include "net/http/http_auth_preferences.h" |
| 22 #include "net/http/http_auth_scheme.h" |
11 #include "net/http/http_network_session.h" | 23 #include "net/http/http_network_session.h" |
12 #include "net/http/http_server_properties_impl.h" | 24 #include "net/http/http_server_properties_impl.h" |
13 #include "net/quic/quic_protocol.h" | 25 #include "net/quic/quic_protocol.h" |
14 #include "net/quic/quic_stream_factory.h" | 26 #include "net/quic/quic_stream_factory.h" |
15 #include "testing/gmock/include/gmock/gmock.h" | 27 #include "testing/gmock/include/gmock/gmock.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
17 | 29 |
| 30 #if defined(ENABLE_EXTENSIONS) |
| 31 #include "chrome/browser/extensions/event_router_forwarder.h" |
| 32 #endif |
| 33 |
| 34 #if defined(OS_CHROMEOS) |
| 35 #include "chromeos/dbus/dbus_thread_manager.h" |
| 36 #include "chromeos/network/network_handler.h" |
| 37 #endif |
| 38 |
18 namespace test { | 39 namespace test { |
19 | 40 |
20 using ::testing::ElementsAre; | 41 using ::testing::ElementsAre; |
| 42 using ::testing::ReturnRef; |
21 | 43 |
| 44 // Class used for accessing IOThread methods (friend of IOThread). |
22 class IOThreadPeer { | 45 class IOThreadPeer { |
23 public: | 46 public: |
24 static void ConfigureQuicGlobals( | 47 static void ConfigureQuicGlobals( |
25 const base::CommandLine& command_line, | 48 const base::CommandLine& command_line, |
26 base::StringPiece quic_trial_group, | 49 base::StringPiece quic_trial_group, |
27 const std::map<std::string, std::string>& quic_trial_params, | 50 const std::map<std::string, std::string>& quic_trial_params, |
28 bool is_quic_allowed_by_policy, | 51 bool is_quic_allowed_by_policy, |
29 IOThread::Globals* globals) { | 52 IOThread::Globals* globals) { |
30 IOThread::ConfigureQuicGlobals(command_line, quic_trial_group, | 53 IOThread::ConfigureQuicGlobals(command_line, quic_trial_group, |
31 quic_trial_params, is_quic_allowed_by_policy, | 54 quic_trial_params, is_quic_allowed_by_policy, |
(...skipping 12 matching lines...) Expand all Loading... |
44 static void ConfigureNPNGlobals(base::StringPiece npn_trial_group, | 67 static void ConfigureNPNGlobals(base::StringPiece npn_trial_group, |
45 IOThread::Globals* globals) { | 68 IOThread::Globals* globals) { |
46 IOThread::ConfigureNPNGlobals(npn_trial_group, globals); | 69 IOThread::ConfigureNPNGlobals(npn_trial_group, globals); |
47 } | 70 } |
48 | 71 |
49 static void InitializeNetworkSessionParamsFromGlobals( | 72 static void InitializeNetworkSessionParamsFromGlobals( |
50 const IOThread::Globals& globals, | 73 const IOThread::Globals& globals, |
51 net::HttpNetworkSession::Params* params) { | 74 net::HttpNetworkSession::Params* params) { |
52 IOThread::InitializeNetworkSessionParamsFromGlobals(globals, params); | 75 IOThread::InitializeNetworkSessionParamsFromGlobals(globals, params); |
53 } | 76 } |
| 77 |
| 78 static void InitIOThread(IOThread* io_thread) { io_thread->Init(); } |
| 79 |
| 80 static void CleanUpIOThread(IOThread* io_thread) { io_thread->CleanUp(); } |
| 81 |
| 82 static net::HttpAuthPreferences* GetAuthPreferences(IOThread* io_thread) { |
| 83 return io_thread->globals()->http_auth_preferences.get(); |
| 84 } |
54 }; | 85 }; |
55 | 86 |
56 class IOThreadTest : public testing::Test { | 87 class IOThreadTest : public testing::Test { |
57 public: | 88 public: |
58 IOThreadTest() | 89 IOThreadTest() |
59 : command_line_(base::CommandLine::NO_PROGRAM), | 90 : command_line_(base::CommandLine::NO_PROGRAM), |
60 is_quic_allowed_by_policy_(true) { | 91 is_quic_allowed_by_policy_(true) { |
61 globals_.http_server_properties.reset(new net::HttpServerPropertiesImpl()); | 92 globals_.http_server_properties.reset(new net::HttpServerPropertiesImpl()); |
62 } | 93 } |
63 | 94 |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 TEST_F(IOThreadTest, QuicDisallowedByPolicy) { | 559 TEST_F(IOThreadTest, QuicDisallowedByPolicy) { |
529 command_line_.AppendSwitch(switches::kEnableQuic); | 560 command_line_.AppendSwitch(switches::kEnableQuic); |
530 is_quic_allowed_by_policy_ = false; | 561 is_quic_allowed_by_policy_ = false; |
531 ConfigureQuicGlobals(); | 562 ConfigureQuicGlobals(); |
532 | 563 |
533 net::HttpNetworkSession::Params params; | 564 net::HttpNetworkSession::Params params; |
534 InitializeNetworkSessionParams(¶ms); | 565 InitializeNetworkSessionParams(¶ms); |
535 EXPECT_FALSE(params.enable_quic); | 566 EXPECT_FALSE(params.enable_quic); |
536 } | 567 } |
537 | 568 |
| 569 class IOThreadTestWithIOThreadObject : public testing::Test { |
| 570 public: |
| 571 // These functions need to be public, since it is difficult to bind to |
| 572 // protected functions in a test (the code would need to explicitly contain |
| 573 // the name of the actual test class). |
| 574 void CheckCnameLookup(bool expected) { |
| 575 auto http_auth_preferences = |
| 576 IOThreadPeer::GetAuthPreferences(io_thread_.get()); |
| 577 ASSERT_NE(nullptr, http_auth_preferences); |
| 578 EXPECT_EQ(expected, http_auth_preferences->NegotiateDisableCnameLookup()); |
| 579 } |
| 580 |
| 581 void CheckNegotiateEnablePort(bool expected) { |
| 582 auto http_auth_preferences = |
| 583 IOThreadPeer::GetAuthPreferences(io_thread_.get()); |
| 584 ASSERT_NE(nullptr, http_auth_preferences); |
| 585 EXPECT_EQ(expected, http_auth_preferences->NegotiateEnablePort()); |
| 586 } |
| 587 |
| 588 #if defined(OS_ANDROID) |
| 589 void CheckAuthAndroidNegoitateAccountType(std::string expected) { |
| 590 auto http_auth_preferences = |
| 591 IOThreadPeer::GetAuthPreferences(io_thread_.get()); |
| 592 ASSERT_NE(nullptr, http_auth_preferences); |
| 593 EXPECT_EQ(expected, |
| 594 http_auth_preferences->AuthAndroidNegotiateAccountType()); |
| 595 } |
| 596 #endif |
| 597 |
| 598 void CheckCanUseDefaultCredentials(bool expected, const GURL& url) { |
| 599 auto http_auth_preferences = |
| 600 IOThreadPeer::GetAuthPreferences(io_thread_.get()); |
| 601 EXPECT_EQ(expected, http_auth_preferences->CanUseDefaultCredentials(url)); |
| 602 } |
| 603 |
| 604 void CheckCanDelegate(bool expected, const GURL& url) { |
| 605 auto http_auth_preferences = |
| 606 IOThreadPeer::GetAuthPreferences(io_thread_.get()); |
| 607 EXPECT_EQ(expected, http_auth_preferences->CanDelegate(url)); |
| 608 } |
| 609 |
| 610 protected: |
| 611 IOThreadTestWithIOThreadObject() |
| 612 : thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD) { |
| 613 #if defined(ENABLE_EXTENSIONS) |
| 614 event_router_forwarder_ = new extensions::EventRouterForwarder; |
| 615 #endif |
| 616 PrefRegistrySimple* pref_registry = pref_service_.registry(); |
| 617 IOThread::RegisterPrefs(pref_registry); |
| 618 PrefProxyConfigTrackerImpl::RegisterPrefs(pref_registry); |
| 619 ssl_config::SSLConfigServiceManager::RegisterPrefs(pref_registry); |
| 620 |
| 621 // Set up default function behaviour. |
| 622 EXPECT_CALL(policy_service_, |
| 623 GetPolicies(policy::PolicyNamespace( |
| 624 policy::POLICY_DOMAIN_CHROME, std::string()))) |
| 625 .WillRepeatedly(ReturnRef(policy_map_)); |
| 626 |
| 627 #if defined(OS_CHROMEOS) |
| 628 // Needed by IOThread constructor. |
| 629 chromeos::DBusThreadManager::Initialize(); |
| 630 chromeos::NetworkHandler::Initialize(); |
| 631 #endif |
| 632 io_thread_.reset(new IOThread(&pref_service_, &policy_service_, nullptr, |
| 633 #if defined(ENABLE_EXTENSIONS) |
| 634 event_router_forwarder_.get() |
| 635 #else |
| 636 nullptr |
| 637 #endif |
| 638 )); |
| 639 // Init must be run on the IO thread. |
| 640 RunOnIOThreadBlocking( |
| 641 base::Bind(&IOThreadPeer::InitIOThread, io_thread_.get())); |
| 642 } |
| 643 |
| 644 ~IOThreadTestWithIOThreadObject() override { |
| 645 RunOnIOThreadBlocking( |
| 646 base::Bind(&IOThreadPeer::CleanUpIOThread, io_thread_.get())); |
| 647 #if defined(OS_CHROMEOS) |
| 648 chromeos::NetworkHandler::Shutdown(); |
| 649 chromeos::DBusThreadManager::Shutdown(); |
| 650 #endif |
| 651 } |
| 652 TestingPrefServiceSimple* pref_service() { return &pref_service_; } |
| 653 |
| 654 void RunOnIOThreadBlocking(const base::Closure& task) { |
| 655 base::RunLoop run_loop; |
| 656 content::BrowserThread::PostTaskAndReply( |
| 657 content::BrowserThread::IO, FROM_HERE, task, run_loop.QuitClosure()); |
| 658 run_loop.Run(); |
| 659 } |
| 660 |
| 661 private: |
| 662 content::TestBrowserThreadBundle thread_bundle_; |
| 663 TestingPrefServiceSimple pref_service_; |
| 664 #if defined(ENABLE_EXTENSIONS) |
| 665 scoped_refptr<extensions::EventRouterForwarder> event_router_forwarder_; |
| 666 #endif |
| 667 policy::PolicyMap policy_map_; |
| 668 policy::MockPolicyService policy_service_; |
| 669 scoped_ptr<IOThread> io_thread_; |
| 670 }; |
| 671 |
| 672 TEST_F(IOThreadTestWithIOThreadObject, UpdateNegotiateDisableCnameLookup) { |
| 673 // This test uses the kDisableAuthNegotiateCnameLookup to check that |
| 674 // the HttpAuthPreferences are correctly initialized and running on the |
| 675 // IO thread. The other preferences are tested by the HttpAuthPreferences |
| 676 // unit tests. |
| 677 pref_service()->SetBoolean(prefs::kDisableAuthNegotiateCnameLookup, false); |
| 678 RunOnIOThreadBlocking( |
| 679 base::Bind(&IOThreadTestWithIOThreadObject::CheckCnameLookup, |
| 680 base::Unretained(this), false)); |
| 681 pref_service()->SetBoolean(prefs::kDisableAuthNegotiateCnameLookup, true); |
| 682 RunOnIOThreadBlocking( |
| 683 base::Bind(&IOThreadTestWithIOThreadObject::CheckCnameLookup, |
| 684 base::Unretained(this), true)); |
| 685 } |
| 686 |
| 687 TEST_F(IOThreadTestWithIOThreadObject, UpdateEnableAuthNegotiatePort) { |
| 688 pref_service()->SetBoolean(prefs::kEnableAuthNegotiatePort, false); |
| 689 RunOnIOThreadBlocking( |
| 690 base::Bind(&IOThreadTestWithIOThreadObject::CheckNegotiateEnablePort, |
| 691 base::Unretained(this), false)); |
| 692 pref_service()->SetBoolean(prefs::kEnableAuthNegotiatePort, true); |
| 693 RunOnIOThreadBlocking( |
| 694 base::Bind(&IOThreadTestWithIOThreadObject::CheckNegotiateEnablePort, |
| 695 base::Unretained(this), true)); |
| 696 } |
| 697 |
| 698 TEST_F(IOThreadTestWithIOThreadObject, UpdateServerWhitelist) { |
| 699 GURL url("http://test.example.com"); |
| 700 |
| 701 pref_service()->SetString(prefs::kAuthServerWhitelist, "xxx"); |
| 702 RunOnIOThreadBlocking( |
| 703 base::Bind(&IOThreadTestWithIOThreadObject::CheckCanUseDefaultCredentials, |
| 704 base::Unretained(this), false, url)); |
| 705 |
| 706 pref_service()->SetString(prefs::kAuthServerWhitelist, "*"); |
| 707 RunOnIOThreadBlocking( |
| 708 base::Bind(&IOThreadTestWithIOThreadObject::CheckCanUseDefaultCredentials, |
| 709 base::Unretained(this), true, url)); |
| 710 } |
| 711 |
| 712 TEST_F(IOThreadTestWithIOThreadObject, UpdateDelegateWhitelist) { |
| 713 GURL url("http://test.example.com"); |
| 714 |
| 715 pref_service()->SetString(prefs::kAuthNegotiateDelegateWhitelist, ""); |
| 716 RunOnIOThreadBlocking( |
| 717 base::Bind(&IOThreadTestWithIOThreadObject::CheckCanDelegate, |
| 718 base::Unretained(this), false, url)); |
| 719 |
| 720 pref_service()->SetString(prefs::kAuthNegotiateDelegateWhitelist, "*"); |
| 721 RunOnIOThreadBlocking( |
| 722 base::Bind(&IOThreadTestWithIOThreadObject::CheckCanDelegate, |
| 723 base::Unretained(this), true, url)); |
| 724 } |
| 725 |
| 726 #if defined(OS_ANDROID) |
| 727 // AuthAndroidNegotiateAccountType is only used on Android. |
| 728 TEST_F(IOThreadTestWithIOThreadObject, UpdateAuthAndroidNegotiateAccountType) { |
| 729 pref_service()->SetString(prefs::kAuthAndroidNegotiateAccountType, "acc1"); |
| 730 RunOnIOThreadBlocking(base::Bind( |
| 731 &IOThreadTestWithIOThreadObject::CheckAuthAndroidNegoitateAccountType, |
| 732 base::Unretained(this), "acc1")); |
| 733 pref_service()->SetString(prefs::kAuthAndroidNegotiateAccountType, "acc2"); |
| 734 RunOnIOThreadBlocking(base::Bind( |
| 735 &IOThreadTestWithIOThreadObject::CheckAuthAndroidNegoitateAccountType, |
| 736 base::Unretained(this), "acc2")); |
| 737 } |
| 738 #endif |
| 739 |
538 } // namespace test | 740 } // namespace test |
OLD | NEW |