12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/component_cloud_policy_updater.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/callback.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/sequenced_task_runner.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/test_simple_task_runner.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_constants.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/component_cloud_policy_store.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/external_policy_data_fetcher.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/policy_builder.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/resource_cache.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/external_data_fetcher.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_bundle.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_map.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "crypto/sha2.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "policy/proto/chrome_extension_policy.pb.h" 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "policy/proto/device_management_backend.pb.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace em = enterprise_management; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Mock; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace policy { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestExtension[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestExtension2[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kTestExtension3[] = "cccccccccccccccccccccccccccccccc"; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestDownload[] = "http://example.com/getpolicy?id=123"; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestDownload2[] = "http://example.com/getpolicy?id=456"; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestDownload3[] = "http://example.com/getpolicy?id=789"; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestPolicy[] = 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"Name\": {" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"Value\": \"disabled\"" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " }," 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"Second\": {" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"Value\": \"maybe\"," 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"Level\": \"Recommended\"" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " }" 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockComponentCloudPolicyStoreDelegate 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public ComponentCloudPolicyStore::Delegate { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MockComponentCloudPolicyStoreDelegate() {} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD0(OnComponentCloudPolicyStoreUpdated, void()); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ComponentCloudPolicyUpdaterTest : public testing::Test { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE; 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void TearDown() OVERRIDE; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<em::PolicyFetchResponse> CreateResponse(); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceCache> cache_; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ComponentCloudPolicyStore> store_; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockComponentCloudPolicyStoreDelegate store_delegate_; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcherFactory fetcher_factory_; 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<ExternalPolicyDataFetcherBackend> fetcher_backend_; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ComponentCloudPolicyUpdater> updater_; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ComponentPolicyBuilder builder_; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PolicyBundle expected_bundle_; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ComponentCloudPolicyUpdaterTest::SetUp() { 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) task_runner_ = new base::TestSimpleTaskRunner(); 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) cache_.reset(new ResourceCache(temp_dir_.path(), task_runner_)); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_.reset(new ComponentCloudPolicyStore(&store_delegate_, cache_.get())); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->SetCredentials(ComponentPolicyBuilder::kFakeUsername, 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ComponentPolicyBuilder::kFakeToken); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher_factory_.set_remove_fetcher_on_delete(true); 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher_backend_.reset(new ExternalPolicyDataFetcherBackend( 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_, 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter>())); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) updater_.reset(new ComponentCloudPolicyUpdater( 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher_backend_->CreateFrontend(task_runner_), 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_.get())); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(store_->policy().end(), store_->policy().begin()); 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.policy_data().set_policy_type( 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dm_protocol::kChromeExtensionPolicyType); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.policy_data().set_settings_entity_id(kTestExtension); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.payload().set_download_url(kTestDownload); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) builder_.payload().set_secure_hash(crypto::SHA256HashString(kTestPolicy)); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PolicyMap& policy = expected_bundle_.Get(ns); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) policy.Set("Name", 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_LEVEL_MANDATORY, 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_SCOPE_USER, 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::StringValue("disabled"), 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) policy.Set("Second", 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_LEVEL_RECOMMENDED, 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_SCOPE_USER, 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::StringValue("maybe"), 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ComponentCloudPolicyUpdaterTest::TearDown() { 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) updater_.reset(); 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<em::PolicyFetchResponse> 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ComponentCloudPolicyUpdaterTest::CreateResponse() { 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.Build(); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_ptr(new em::PolicyFetchResponse(builder_.policy())); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ComponentCloudPolicyUpdaterTest, FetchAndCache) { 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit a policy fetch response. 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that a download has been started. 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(fetcher); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload), fetcher->GetOriginalURL()); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Complete the download. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(200); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(kTestPolicy); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated()); 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mock::VerifyAndClearExpectations(&store_delegate_); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the downloaded policy is being served. 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(store_->policy().Equals(expected_bundle_)); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentCloudPolicyUpdaterTest, PolicyFetchResponseTooLarge) { 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit a policy fetch response that exceeds the allowed maximum size. 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string long_download("http://example.com/get?id="); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long_download.append(20 * 1024, '1'); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.payload().set_download_url(long_download); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit two valid policy fetch responses. 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.policy_data().set_settings_entity_id(kTestExtension2); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.payload().set_download_url(kTestDownload2); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.policy_data().set_settings_entity_id(kTestExtension3); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.payload().set_download_url(kTestDownload3); 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the first policy fetch response has been ignored and downloads 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // have been started for the next two fetch responses instead. 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(fetcher); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload2), fetcher->GetOriginalURL()); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(1); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(fetcher); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload3), fetcher->GetOriginalURL()); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentCloudPolicyUpdaterTest, PolicyFetchResponseInvalid) { 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit an invalid policy fetch response. 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.policy_data().set_username("wronguser@example.com"); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit two valid policy fetch responses. 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.policy_data().set_username(ComponentPolicyBuilder::kFakeUsername); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.policy_data().set_settings_entity_id(kTestExtension2); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.payload().set_download_url(kTestDownload2); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.policy_data().set_settings_entity_id(kTestExtension3); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.payload().set_download_url(kTestDownload3); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the first policy fetch response has been ignored and downloads 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // have been started for the next two fetch responses instead. 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(fetcher); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload2), fetcher->GetOriginalURL()); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(1); 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(fetcher); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload3), fetcher->GetOriginalURL()); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ComponentCloudPolicyUpdaterTest, AlreadyCached) { 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Cache policy for an extension. 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.Build(); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated()); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(store_->Store(ns, 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.GetBlob(), 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) crypto::SHA256HashString(kTestPolicy), 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestPolicy)); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mock::VerifyAndClearExpectations(&store_delegate_); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit a policy fetch response whose extension ID and hash match the 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // already cached policy. 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that no download has been started. 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentCloudPolicyUpdaterTest, PolicyDataInvalid) { 22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Submit three policy fetch responses. 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.payload().set_download_url(kTestDownload2); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder_.policy_data().set_settings_entity_id(kTestExtension2); 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) builder_.policy_data().set_settings_entity_id(kTestExtension3); 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) builder_.payload().set_download_url(kTestDownload3); 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the first download has been started. 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(fetcher); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload), fetcher->GetOriginalURL()); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the second download has been started. 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(1); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(fetcher); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload2), fetcher->GetOriginalURL()); 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Indicate that the policy data size will exceed allowed maximum. 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchDownloadProgress(fetcher, 6 * 1024 * 1024, -1); 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the third download has been started. 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(2); 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload3), fetcher->GetOriginalURL()); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentCloudPolicyUpdaterTest, FetchUpdatedData) { 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit a policy fetch response. 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the first download has been started. 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(fetcher); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload), fetcher->GetOriginalURL()); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit a second policy fetch response for the same extension with an 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // updated download URL. 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.payload().set_download_url(kTestDownload2); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the first download is no longer running. 27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the second download has been started. 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(1); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(fetcher); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload2), fetcher->GetOriginalURL()); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ComponentCloudPolicyUpdaterTest, FetchUpdatedDataWithoutPolicy) { 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit a policy fetch response. 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the download has been started. 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(fetcher); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(GURL(kTestDownload), fetcher->GetOriginalURL()); 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Complete the download. 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(200); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(kTestPolicy); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated()); 29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mock::VerifyAndClearExpectations(&store_delegate_); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the downloaded policy is being served. 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(store_->policy().Equals(expected_bundle_)); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit a second policy fetch response for the same extension with no 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // download URL, meaning that no policy should be provided for this extension. 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.payload().clear_download_url(); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.payload().clear_secure_hash(); 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated()); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mock::VerifyAndClearExpectations(&store_delegate_); 31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that no download has been started. 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the policy is no longer being served. 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PolicyBundle empty_bundle; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(store_->policy().Equals(empty_bundle)); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ComponentCloudPolicyUpdaterTest, NoPolicy) { 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Submit a policy fetch response with a valid download URL. 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the download has been started. 32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(fetcher_factory_.GetFetcherByID(0)); 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update the policy fetch response before the download has finished. The new 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // policy fetch response has no download URL. 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder_.payload().Clear(); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the download is no longer running. 33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ComponentCloudPolicyUpdaterTest, CancelUpdate) { 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Submit a policy fetch response with a valid download URL. 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) updater_->UpdateExternalPolicy(CreateResponse()); 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) task_runner_->RunUntilIdle(); 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Verify that the download has been started. 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(fetcher_factory_.GetFetcherByID(0)); 346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now cancel that update before the download completes. 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated()).Times(0); 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) updater_->CancelUpdate( 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension)); 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) task_runner_->RunUntilIdle(); 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&store_delegate_); 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace policy 357