| Index: components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc
|
| diff --git a/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc b/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc
|
| index 8224c7b4da85a7f4d6f852c3fd44b769f1b63700..6ffdd1364a38b7e5004409c9235c5b601af56b38 100644
|
| --- a/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc
|
| +++ b/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc
|
| @@ -106,7 +106,10 @@ class TestURLRequestContextGetter : public net::URLRequestContextGetter {
|
| class ComponentCloudPolicyServiceTest : public testing::Test {
|
| protected:
|
| ComponentCloudPolicyServiceTest()
|
| - : client_(nullptr),
|
| + : request_context_(
|
| + new TestURLRequestContextGetter(loop_.message_loop_proxy())),
|
| + cache_(nullptr),
|
| + client_(nullptr),
|
| core_(GetChromeUserPolicyType(),
|
| std::string(),
|
| &store_,
|
| @@ -115,17 +118,9 @@ class ComponentCloudPolicyServiceTest : public testing::Test {
|
| void SetUp() override {
|
| ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
|
|
|
| - cache_ = new ResourceCache(temp_dir_.path(), loop_.message_loop_proxy());
|
| - request_context_ =
|
| - new TestURLRequestContextGetter(loop_.message_loop_proxy());
|
| - service_.reset(new ComponentCloudPolicyService(
|
| - &delegate_,
|
| - ®istry_,
|
| - &core_,
|
| - make_scoped_ptr(cache_),
|
| - request_context_,
|
| - loop_.message_loop_proxy(),
|
| - loop_.message_loop_proxy()));
|
| + owned_cache_.reset(
|
| + new ResourceCache(temp_dir_.path(), loop_.message_loop_proxy()));
|
| + cache_ = owned_cache_.get();
|
|
|
| builder_.policy_data().set_policy_type(
|
| dm_protocol::kChromeExtensionPolicyType);
|
| @@ -155,17 +150,22 @@ class ComponentCloudPolicyServiceTest : public testing::Test {
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| - void Connect(size_t expected_namespaces_in_client) {
|
| + void Connect() {
|
| client_ = new MockCloudPolicyClient();
|
| - client_->SetDMToken(ComponentPolicyBuilder::kFakeToken);
|
| - EXPECT_EQ(0u, client_->types_to_fetch_.size());
|
| + service_.reset(new ComponentCloudPolicyService(
|
| + &delegate_,
|
| + ®istry_,
|
| + &core_,
|
| + client_,
|
| + owned_cache_.Pass(),
|
| + request_context_,
|
| + loop_.message_loop_proxy(),
|
| + loop_.message_loop_proxy()));
|
|
|
| + client_->SetDMToken(ComponentPolicyBuilder::kFakeToken);
|
| + EXPECT_EQ(1u, client_->types_to_fetch_.size());
|
| core_.Connect(scoped_ptr<CloudPolicyClient>(client_));
|
| -
|
| - // |expected_namespaces_in_client| is the expected number of components
|
| - // that the ComponentCloudPolicyService will set at the |client_| at
|
| - // OnCoreConnected.
|
| - EXPECT_EQ(expected_namespaces_in_client, client_->types_to_fetch_.size());
|
| + EXPECT_EQ(2u, client_->types_to_fetch_.size());
|
|
|
| // Also initialize the refresh scheduler, so that calls to
|
| // core()->RefreshSoon() trigger a FetchPolicy() call on the mock |client_|.
|
| @@ -234,6 +234,7 @@ class ComponentCloudPolicyServiceTest : public testing::Test {
|
| MockComponentCloudPolicyDelegate delegate_;
|
| // |cache_| is owned by the |service_| and is invalid once the |service_|
|
| // is destroyed.
|
| + scoped_ptr<ResourceCache> owned_cache_;
|
| ResourceCache* cache_;
|
| MockCloudPolicyClient* client_;
|
| MockCloudPolicyStore store_;
|
| @@ -244,36 +245,8 @@ class ComponentCloudPolicyServiceTest : public testing::Test {
|
| PolicyMap expected_policy_;
|
| };
|
|
|
| -TEST_F(ComponentCloudPolicyServiceTest, InitializedAtConstructionTime) {
|
| - service_.reset();
|
| - Connect(1u);
|
| - LoadStore();
|
| - InitializeRegistry();
|
| -
|
| - cache_ = new ResourceCache(temp_dir_.path(), loop_.message_loop_proxy());
|
| - service_.reset(new ComponentCloudPolicyService(&delegate_,
|
| - ®istry_,
|
| - &core_,
|
| - make_scoped_ptr(cache_),
|
| - request_context_,
|
| - loop_.message_loop_proxy(),
|
| - loop_.message_loop_proxy()));
|
| - EXPECT_FALSE(service_->is_initialized());
|
| -
|
| - EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| - EXPECT_CALL(*client_, FetchPolicy()).Times(0);
|
| - RunUntilIdle();
|
| - Mock::VerifyAndClearExpectations(&client_);
|
| - Mock::VerifyAndClearExpectations(&delegate_);
|
| -
|
| - EXPECT_TRUE(service_->is_initialized());
|
| - EXPECT_EQ(2u, client_->types_to_fetch_.size());
|
| - const PolicyBundle empty_bundle;
|
| - EXPECT_TRUE(service_->policy().Equals(empty_bundle));
|
| -}
|
| -
|
| TEST_F(ComponentCloudPolicyServiceTest, InitializeStoreThenRegistry) {
|
| - Connect(2u);
|
| + Connect();
|
|
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(0);
|
| EXPECT_CALL(*client_, FetchPolicy()).Times(0);
|
| @@ -295,7 +268,7 @@ TEST_F(ComponentCloudPolicyServiceTest, InitializeStoreThenRegistry) {
|
| }
|
|
|
| TEST_F(ComponentCloudPolicyServiceTest, InitializeRegistryThenStore) {
|
| - Connect(2u);
|
| + Connect();
|
|
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(0);
|
| EXPECT_CALL(*client_, FetchPolicy()).Times(0);
|
| @@ -318,7 +291,7 @@ TEST_F(ComponentCloudPolicyServiceTest, InitializeRegistryThenStore) {
|
|
|
| TEST_F(ComponentCloudPolicyServiceTest, InitializeWithCachedPolicy) {
|
| PopulateCache();
|
| - Connect(2u);
|
| + Connect();
|
|
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| EXPECT_CALL(*client_, FetchPolicy()).Times(0);
|
| @@ -343,7 +316,7 @@ TEST_F(ComponentCloudPolicyServiceTest, InitializeWithCachedPolicy) {
|
| }
|
|
|
| TEST_F(ComponentCloudPolicyServiceTest, FetchPolicy) {
|
| - Connect(2u);
|
| + Connect();
|
| // Initialize the store and create the backend.
|
| // A refresh is not needed, because no components are registered yet.
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| @@ -392,7 +365,7 @@ TEST_F(ComponentCloudPolicyServiceTest, FetchPolicy) {
|
| }
|
|
|
| TEST_F(ComponentCloudPolicyServiceTest, LoadAndPurgeCache) {
|
| - Connect(2u);
|
| + Connect();
|
| // Insert data in the cache.
|
| PopulateCache();
|
| registry_.RegisterComponent(
|
| @@ -439,23 +412,20 @@ TEST_F(ComponentCloudPolicyServiceTest, SignInAfterStartup) {
|
|
|
| // Initialize the store without credentials.
|
| EXPECT_FALSE(store_.is_initialized());
|
| - EXPECT_FALSE(service_->is_initialized());
|
| - EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| store_.NotifyStoreLoaded();
|
| RunUntilIdle();
|
| - Mock::VerifyAndClearExpectations(&delegate_);
|
| - EXPECT_TRUE(service_->is_initialized());
|
|
|
| // Register an extension.
|
| - EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| registry_.RegisterComponent(
|
| PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension),
|
| CreateTestSchema());
|
| RunUntilIdle();
|
| - Mock::VerifyAndClearExpectations(&delegate_);
|
|
|
| - // Now signin. A fetch will be requested for the new extension.
|
| - Connect(2u);
|
| + // Now signin. The service will finish loading its backend (which is empty
|
| + // for now, because there are no credentials) and issue a notification.
|
| + EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| + Connect();
|
| + Mock::VerifyAndClearExpectations(&delegate_);
|
|
|
| // Send the response to the service. The response data will be ignored,
|
| // because the store doesn't have the updated credentials yet.
|
| @@ -505,7 +475,7 @@ TEST_F(ComponentCloudPolicyServiceTest, SignOut) {
|
|
|
| // The initial, cached policy will be served once the backend is initialized.
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| - RunUntilIdle();
|
| + Connect();
|
| Mock::VerifyAndClearExpectations(&delegate_);
|
| PolicyBundle expected_bundle;
|
| const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
|
| @@ -515,9 +485,6 @@ TEST_F(ComponentCloudPolicyServiceTest, SignOut) {
|
| cache_->LoadAllSubkeys("extension-policy", &contents);
|
| ASSERT_EQ(1u, contents.size());
|
|
|
| - // Now sign in.
|
| - Connect(2u);
|
| -
|
| // Signing out removes all of the component policies from the service and
|
| // from the cache. It does not trigger a refresh.
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| @@ -547,7 +514,7 @@ TEST_F(ComponentCloudPolicyServiceTest, LoadInvalidPolicyFromCache) {
|
|
|
| // The initial, cached policy will be served once the backend is initialized.
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| - RunUntilIdle();
|
| + Connect();
|
| Mock::VerifyAndClearExpectations(&delegate_);
|
|
|
| PolicyBundle expected_bundle;
|
| @@ -560,4 +527,63 @@ TEST_F(ComponentCloudPolicyServiceTest, LoadInvalidPolicyFromCache) {
|
| EXPECT_TRUE(service_->policy().Equals(expected_bundle));
|
| }
|
|
|
| +TEST_F(ComponentCloudPolicyServiceTest, PurgeWhenServerRemovesPolicy) {
|
| + // Initialize with cached policy.
|
| + PopulateCache();
|
| + Connect();
|
| +
|
| + EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| + EXPECT_CALL(*client_, FetchPolicy()).Times(0);
|
| + registry_.RegisterComponent(
|
| + PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension2),
|
| + CreateTestSchema());
|
| + InitializeRegistry();
|
| + LoadStore();
|
| + Mock::VerifyAndClearExpectations(client_);
|
| + Mock::VerifyAndClearExpectations(&delegate_);
|
| +
|
| + EXPECT_TRUE(service_->is_initialized());
|
| + EXPECT_EQ(2u, client_->types_to_fetch_.size());
|
| +
|
| + // Verify that policy for 2 extensions has been loaded from the cache.
|
| + std::map<std::string, std::string> contents;
|
| + cache_->LoadAllSubkeys("extension-policy", &contents);
|
| + ASSERT_EQ(2u, contents.size());
|
| + EXPECT_TRUE(ContainsKey(contents, kTestExtension));
|
| + EXPECT_TRUE(ContainsKey(contents, kTestExtension2));
|
| +
|
| + PolicyBundle expected_bundle;
|
| + const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
|
| + expected_bundle.Get(ns).CopyFrom(expected_policy_);
|
| + const PolicyNamespace ns2(POLICY_DOMAIN_EXTENSIONS, kTestExtension2);
|
| + expected_bundle.Get(ns2).CopyFrom(expected_policy_);
|
| + EXPECT_TRUE(service_->policy().Equals(expected_bundle));
|
| +
|
| + // Receive an updated fetch response from the server. There is no response for
|
| + // extension 2, so it will be dropped from the cache. This triggers an
|
| + // immediate notification to the delegate.
|
| + EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| + client_->SetPolicy(dm_protocol::kChromeExtensionPolicyType, kTestExtension,
|
| + *CreateResponse());
|
| + service_->OnPolicyFetched(client_);
|
| + RunUntilIdle();
|
| + Mock::VerifyAndClearExpectations(&delegate_);
|
| +
|
| + // That should have triggered the download fetch for the first extension.
|
| + net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
|
| + ASSERT_TRUE(fetcher);
|
| +
|
| + // The cache should have dropped the entries for the second extension.
|
| + contents.clear();
|
| + cache_->LoadAllSubkeys("extension-policy", &contents);
|
| + ASSERT_EQ(1u, contents.size());
|
| + EXPECT_TRUE(ContainsKey(contents, kTestExtension));
|
| + EXPECT_FALSE(ContainsKey(contents, kTestExtension2));
|
| +
|
| + // And the service isn't publishing policy for the second extension anymore.
|
| + expected_bundle.Clear();
|
| + expected_bundle.Get(ns).CopyFrom(expected_policy_);
|
| + EXPECT_TRUE(service_->policy().Equals(expected_bundle));
|
| +}
|
| +
|
| } // namespace policy
|
|
|