| Index: chrome/browser/policy/policy_browsertest.cc
|
| diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
|
| index d716bdadcc39ca52599b054684be94ca90a6235a..a6b789ec669e6d2a85efa742f0f1ea49474cdf8e 100644
|
| --- a/chrome/browser/policy/policy_browsertest.cc
|
| +++ b/chrome/browser/policy/policy_browsertest.cc
|
| @@ -95,6 +95,7 @@
|
| #include "chrome/test/base/search_test_utils.h"
|
| #include "chrome/test/base/ui_test_utils.h"
|
| #include "components/bookmarks/common/bookmark_pref_names.h"
|
| +#include "components/component_updater/component_updater_service.h"
|
| #include "components/content_settings/core/common/content_settings.h"
|
| #include "components/content_settings/core/common/content_settings_pattern.h"
|
| #include "components/content_settings/core/common/pref_names.h"
|
| @@ -118,6 +119,7 @@
|
| #include "components/strings/grit/components_strings.h"
|
| #include "components/translate/core/browser/language_state.h"
|
| #include "components/translate/core/browser/translate_infobar_delegate.h"
|
| +#include "components/update_client/url_request_post_interceptor.h"
|
| #include "components/user_prefs/user_prefs.h"
|
| #include "components/variations/service/variations_service.h"
|
| #include "components/version_info/version_info.h"
|
| @@ -3693,6 +3695,276 @@ IN_PROC_BROWSER_TEST_F(WebRtcUdpPortRangeDisabledPolicyTest,
|
| }
|
| #endif // defined(ENABLE_WEBRTC)
|
|
|
| +// Tests the ComponentUpdater's EnabledComponentUpdates group policy by
|
| +// calling the OnDemand interface. It uses the network interceptor to inspect
|
| +// the presence of the updatedisabled="true" attribute in the update check
|
| +// request. The update check request is expected to fail, since CUP fails.
|
| +class ComponentUpdaterPolicyTest : public PolicyTest {
|
| + public:
|
| + ComponentUpdaterPolicyTest();
|
| + ~ComponentUpdaterPolicyTest() override;
|
| +
|
| + protected:
|
| + using TestCaseAction = void (ComponentUpdaterPolicyTest::*)();
|
| + using TestCase = std::pair<TestCaseAction, TestCaseAction>;
|
| +
|
| + // These test scenarios run as part of one test case by using the
|
| + // CallAsync helper, which calls OnDemand, then chains up to the next
|
| + // scenario when the OnDemandComplete callback fires.
|
| + void DefaultPolicy_GroupPolicySupported();
|
| + void FinishDefaultPolicy_GroupPolicySupported();
|
| +
|
| + void DefaultPolicy_GroupPolicyNotSupported();
|
| + void FinishDefaultPolicy_GroupPolicyNotSupported();
|
| +
|
| + void EnabledPolicy_GroupPolicySupported();
|
| + void FinishEnabledPolicy_GroupPolicySupported();
|
| +
|
| + void EnabledPolicy_GroupPolicyNotSupported();
|
| + void FinishEnabledPolicy_GroupPolicyNotSupported();
|
| +
|
| + void DisabledPolicy_GroupPolicySupported();
|
| + void FinishDisabled_PolicyGroupPolicySupported();
|
| +
|
| + void DisabledPolicy_GroupPolicyNotSupported();
|
| + void FinishDisabledPolicy_GroupPolicyNotSupported();
|
| +
|
| + void BeginTest();
|
| + void EndTest();
|
| +
|
| + void UpdateComponent(const update_client::CrxComponent& crx_component);
|
| + void CallAsync(TestCaseAction action);
|
| + void VerifyExpectations(bool update_disabled);
|
| +
|
| + void SetEnableComponentUpdates(bool enable_component_updates);
|
| +
|
| + static update_client::CrxComponent MakeCrxComponent(
|
| + bool supports_group_policy_enable_component_updates);
|
| +
|
| + TestCase cur_test_case_;
|
| +
|
| + static const char component_id_[];
|
| +
|
| + static const bool kUpdateDisabled = true;
|
| +
|
| + private:
|
| + void OnDemandComplete(int error);
|
| +
|
| + std::unique_ptr<update_client::URLRequestPostInterceptorFactory>
|
| + interceptor_factory_;
|
| +
|
| + // This member is owned by the |interceptor_factory_|.
|
| + update_client::URLRequestPostInterceptor* post_interceptor_ = nullptr;
|
| +
|
| + // This member is owned by g_browser_process;
|
| + component_updater::ComponentUpdateService* cus_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ComponentUpdaterPolicyTest);
|
| +};
|
| +
|
| +const char ComponentUpdaterPolicyTest::component_id_[] =
|
| + "jebgalgnebhfojomionfpkfelancnnkf";
|
| +
|
| +ComponentUpdaterPolicyTest::ComponentUpdaterPolicyTest() {}
|
| +
|
| +ComponentUpdaterPolicyTest::~ComponentUpdaterPolicyTest() {}
|
| +
|
| +void ComponentUpdaterPolicyTest::SetEnableComponentUpdates(
|
| + bool enable_component_updates) {
|
| + PolicyMap policies;
|
| + policies.Set(
|
| + key::kComponentUpdatesEnabled, POLICY_LEVEL_MANDATORY,
|
| + POLICY_SCOPE_MACHINE, POLICY_SOURCE_ENTERPRISE_DEFAULT,
|
| + base::WrapUnique(new base::FundamentalValue(enable_component_updates)),
|
| + nullptr);
|
| + UpdateProviderPolicy(policies);
|
| +}
|
| +
|
| +update_client::CrxComponent ComponentUpdaterPolicyTest::MakeCrxComponent(
|
| + bool supports_group_policy_enable_component_updates) {
|
| + class MockInstaller : public update_client::CrxInstaller {
|
| + public:
|
| + MockInstaller() {}
|
| +
|
| + MOCK_METHOD1(OnUpdateError, void(int error));
|
| + MOCK_METHOD2(Install,
|
| + bool(const base::DictionaryValue& manifest,
|
| + const base::FilePath& unpack_path));
|
| + MOCK_METHOD2(GetInstalledFile,
|
| + bool(const std::string& file, base::FilePath* installed_file));
|
| + MOCK_METHOD0(Uninstall, bool());
|
| +
|
| + private:
|
| + ~MockInstaller() override {}
|
| + };
|
| +
|
| + // component id "jebgalgnebhfojomionfpkfelancnnkf".
|
| + static const uint8_t jebg_hash[] = {
|
| + 0x94, 0x16, 0x0b, 0x6d, 0x41, 0x75, 0xe9, 0xec, 0x8e, 0xd5, 0xfa,
|
| + 0x54, 0xb0, 0xd2, 0xdd, 0xa5, 0x6e, 0x05, 0x6b, 0xe8, 0x73, 0x47,
|
| + 0xf6, 0xc4, 0x11, 0x9f, 0xbc, 0xb3, 0x09, 0xb3, 0x5b, 0x40};
|
| +
|
| + // The component uses HTTPS only for network interception purposes.
|
| + update_client::CrxComponent crx_component;
|
| + crx_component.pk_hash.assign(std::begin(jebg_hash), std::end(jebg_hash));
|
| + crx_component.version = Version("0.9");
|
| + crx_component.installer = scoped_refptr<MockInstaller>(new MockInstaller());
|
| + crx_component.requires_network_encryption = true;
|
| + crx_component.supports_group_policy_enable_component_updates =
|
| + supports_group_policy_enable_component_updates;
|
| +
|
| + return crx_component;
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::UpdateComponent(
|
| + const update_client::CrxComponent& crx_component) {
|
| + post_interceptor_->Reset();
|
| + EXPECT_TRUE(post_interceptor_->ExpectRequest(
|
| + new update_client::PartialMatch("updatecheck"), 200));
|
| + EXPECT_TRUE(cus_->RegisterComponent(crx_component));
|
| + cus_->GetOnDemandUpdater().OnDemandUpdate(
|
| + component_id_, base::Bind(&ComponentUpdaterPolicyTest::OnDemandComplete,
|
| + base::Unretained(this)));
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::CallAsync(TestCaseAction action) {
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(action, base::Unretained(this)));
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::OnDemandComplete(int error) {
|
| + CallAsync(cur_test_case_.second);
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::BeginTest() {
|
| + cus_ = g_browser_process->component_updater();
|
| +
|
| + interceptor_factory_ =
|
| + base::MakeUnique<update_client::URLRequestPostInterceptorFactory>(
|
| + "https", "clients2.google.com",
|
| + BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
|
| +
|
| + post_interceptor_ = interceptor_factory_->CreateInterceptor(
|
| + base::FilePath(FILE_PATH_LITERAL("service/update2")));
|
| +
|
| + cur_test_case_ = std::make_pair(
|
| + &ComponentUpdaterPolicyTest::DefaultPolicy_GroupPolicySupported,
|
| + &ComponentUpdaterPolicyTest::FinishDefaultPolicy_GroupPolicySupported);
|
| +
|
| + CallAsync(cur_test_case_.first);
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::EndTest() {
|
| + interceptor_factory_ = nullptr;
|
| + cus_ = nullptr;
|
| +
|
| + base::MessageLoop::current()->QuitWhenIdle();
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::VerifyExpectations(bool update_disabled) {
|
| + EXPECT_EQ(1, post_interceptor_->GetHitCount())
|
| + << post_interceptor_->GetRequestsAsString();
|
| + ASSERT_EQ(1, post_interceptor_->GetCount())
|
| + << post_interceptor_->GetRequestsAsString();
|
| + EXPECT_NE(std::string::npos,
|
| + post_interceptor_->GetRequests()[0].find(base::StringPrintf(
|
| + "<updatecheck%s/>",
|
| + update_disabled ? " updatedisabled=\"true\"" : "")));
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::DefaultPolicy_GroupPolicySupported() {
|
| + UpdateComponent(MakeCrxComponent(true));
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::FinishDefaultPolicy_GroupPolicySupported() {
|
| + // Default policy && policy support -> updates are enabled.
|
| + VerifyExpectations(!kUpdateDisabled);
|
| +
|
| + cur_test_case_ = std::make_pair(
|
| + &ComponentUpdaterPolicyTest::DefaultPolicy_GroupPolicyNotSupported,
|
| + &ComponentUpdaterPolicyTest::FinishDefaultPolicy_GroupPolicyNotSupported);
|
| + CallAsync(cur_test_case_.first);
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::DefaultPolicy_GroupPolicyNotSupported() {
|
| + UpdateComponent(MakeCrxComponent(false));
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::FinishDefaultPolicy_GroupPolicyNotSupported() {
|
| + // Default policy && no policy support -> updates are enabled.
|
| + VerifyExpectations(!kUpdateDisabled);
|
| +
|
| + cur_test_case_ = std::make_pair(
|
| + &ComponentUpdaterPolicyTest::EnabledPolicy_GroupPolicySupported,
|
| + &ComponentUpdaterPolicyTest::FinishEnabledPolicy_GroupPolicySupported);
|
| + CallAsync(cur_test_case_.first);
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::EnabledPolicy_GroupPolicySupported() {
|
| + SetEnableComponentUpdates(true);
|
| + UpdateComponent(MakeCrxComponent(true));
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::FinishEnabledPolicy_GroupPolicySupported() {
|
| + // Updates enabled policy && policy support -> updates are enabled.
|
| + VerifyExpectations(!kUpdateDisabled);
|
| +
|
| + cur_test_case_ = std::make_pair(
|
| + &ComponentUpdaterPolicyTest::EnabledPolicy_GroupPolicyNotSupported,
|
| + &ComponentUpdaterPolicyTest::FinishEnabledPolicy_GroupPolicyNotSupported);
|
| + CallAsync(cur_test_case_.first);
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::EnabledPolicy_GroupPolicyNotSupported() {
|
| + SetEnableComponentUpdates(true);
|
| + UpdateComponent(MakeCrxComponent(false));
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::FinishEnabledPolicy_GroupPolicyNotSupported() {
|
| + // Updates enabled policy && no policy support -> updates are enabled.
|
| + VerifyExpectations(!kUpdateDisabled);
|
| +
|
| + cur_test_case_ = std::make_pair(
|
| + &ComponentUpdaterPolicyTest::DisabledPolicy_GroupPolicySupported,
|
| + &ComponentUpdaterPolicyTest::FinishDisabled_PolicyGroupPolicySupported);
|
| + CallAsync(cur_test_case_.first);
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::DisabledPolicy_GroupPolicySupported() {
|
| + SetEnableComponentUpdates(false);
|
| + UpdateComponent(MakeCrxComponent(true));
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::FinishDisabled_PolicyGroupPolicySupported() {
|
| + // Updates enabled policy && policy support -> updates are disabled.
|
| + VerifyExpectations(kUpdateDisabled);
|
| +
|
| + cur_test_case_ = std::make_pair(
|
| + &ComponentUpdaterPolicyTest::DisabledPolicy_GroupPolicyNotSupported,
|
| + &ComponentUpdaterPolicyTest::
|
| + FinishDisabledPolicy_GroupPolicyNotSupported);
|
| + CallAsync(cur_test_case_.first);
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::DisabledPolicy_GroupPolicyNotSupported() {
|
| + SetEnableComponentUpdates(false);
|
| + UpdateComponent(MakeCrxComponent(false));
|
| +}
|
| +
|
| +void ComponentUpdaterPolicyTest::
|
| + FinishDisabledPolicy_GroupPolicyNotSupported() {
|
| + // Updates enabled policy && no policy support -> updates are enabled.
|
| + VerifyExpectations(!kUpdateDisabled);
|
| +
|
| + cur_test_case_ = TestCase();
|
| + CallAsync(&ComponentUpdaterPolicyTest::EndTest);
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ComponentUpdaterPolicyTest, EnabledComponentUpdates) {
|
| + BeginTest();
|
| + base::RunLoop().Run();
|
| +}
|
| +
|
| #if !defined(OS_CHROMEOS)
|
| // Similar to PolicyTest but sets the proper policy before the browser is
|
| // started.
|
|
|