| 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 605be1aca75e11fea1f3d3acf2bdda988165b701..77fa309f5feddbbb1ecffa352292f9d04380667c 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
|
| @@ -154,7 +154,7 @@ class ComponentCloudPolicyServiceTest : public testing::Test {
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| - void Connect(size_t expected_namespaces_in_client) {
|
| + void Connect(bool expect_extensions_namespace) {
|
| client_ = new MockCloudPolicyClient();
|
| client_->SetDMToken(ComponentPolicyBuilder::kFakeToken);
|
| EXPECT_EQ(0u, client_->namespaces_to_fetch_.size());
|
| @@ -164,6 +164,7 @@ class ComponentCloudPolicyServiceTest : public testing::Test {
|
| // |expected_namespaces_in_client| is the expected number of components
|
| // that the ComponentCloudPolicyService will set at the |client_| at
|
| // OnCoreConnected.
|
| + size_t expected_namespaces_in_client = expect_extensions_namespace ? 2 : 1;
|
| EXPECT_EQ(expected_namespaces_in_client,
|
| client_->namespaces_to_fetch_.size());
|
|
|
| @@ -246,7 +247,7 @@ class ComponentCloudPolicyServiceTest : public testing::Test {
|
|
|
| TEST_F(ComponentCloudPolicyServiceTest, InitializedAtConstructionTime) {
|
| service_.reset();
|
| - Connect(1u);
|
| + Connect(false);
|
| LoadStore();
|
| InitializeRegistry();
|
|
|
| @@ -273,7 +274,7 @@ TEST_F(ComponentCloudPolicyServiceTest, InitializedAtConstructionTime) {
|
| }
|
|
|
| TEST_F(ComponentCloudPolicyServiceTest, InitializeStoreThenRegistry) {
|
| - Connect(2u);
|
| + Connect(true);
|
|
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(0);
|
| EXPECT_CALL(*client_, FetchPolicy()).Times(0);
|
| @@ -295,7 +296,7 @@ TEST_F(ComponentCloudPolicyServiceTest, InitializeStoreThenRegistry) {
|
| }
|
|
|
| TEST_F(ComponentCloudPolicyServiceTest, InitializeRegistryThenStore) {
|
| - Connect(2u);
|
| + Connect(true);
|
|
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(0);
|
| EXPECT_CALL(*client_, FetchPolicy()).Times(0);
|
| @@ -318,7 +319,7 @@ TEST_F(ComponentCloudPolicyServiceTest, InitializeRegistryThenStore) {
|
|
|
| TEST_F(ComponentCloudPolicyServiceTest, InitializeWithCachedPolicy) {
|
| PopulateCache();
|
| - Connect(2u);
|
| + Connect(true);
|
|
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| EXPECT_CALL(*client_, FetchPolicy()).Times(0);
|
| @@ -343,7 +344,7 @@ TEST_F(ComponentCloudPolicyServiceTest, InitializeWithCachedPolicy) {
|
| }
|
|
|
| TEST_F(ComponentCloudPolicyServiceTest, FetchPolicy) {
|
| - Connect(2u);
|
| + Connect(true);
|
| // Initialize the store and create the backend.
|
| // A refresh is not needed, because no components are registered yet.
|
| EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
|
| @@ -370,6 +371,8 @@ TEST_F(ComponentCloudPolicyServiceTest, FetchPolicy) {
|
| client_->SetPolicy(PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType,
|
| kTestExtension),
|
| *CreateResponse());
|
| + client_->namespaces_requested_.insert(
|
| + PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType, ""));
|
| service_->OnPolicyFetched(client_);
|
| RunUntilIdle();
|
|
|
| @@ -393,7 +396,7 @@ TEST_F(ComponentCloudPolicyServiceTest, FetchPolicy) {
|
| }
|
|
|
| TEST_F(ComponentCloudPolicyServiceTest, LoadAndPurgeCache) {
|
| - Connect(2u);
|
| + Connect(true);
|
| // Insert data in the cache.
|
| PopulateCache();
|
| registry_.RegisterComponent(
|
| @@ -456,13 +459,15 @@ TEST_F(ComponentCloudPolicyServiceTest, SignInAfterStartup) {
|
| Mock::VerifyAndClearExpectations(&delegate_);
|
|
|
| // Now signin. A fetch will be requested for the new extension.
|
| - Connect(2u);
|
| + Connect(true);
|
|
|
| // Send the response to the service. The response data will be ignored,
|
| // because the store doesn't have the updated credentials yet.
|
| client_->SetPolicy(PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType,
|
| kTestExtension),
|
| *CreateResponse());
|
| + client_->namespaces_requested_.insert(
|
| + PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType, ""));
|
| service_->OnPolicyFetched(client_);
|
| RunUntilIdle();
|
|
|
| @@ -518,7 +523,7 @@ TEST_F(ComponentCloudPolicyServiceTest, SignOut) {
|
| ASSERT_EQ(1u, contents.size());
|
|
|
| // Now sign in.
|
| - Connect(2u);
|
| + Connect(true);
|
|
|
| // Signing out removes all of the component policies from the service and
|
| // from the cache. It does not trigger a refresh.
|
| @@ -562,4 +567,66 @@ TEST_F(ComponentCloudPolicyServiceTest, LoadInvalidPolicyFromCache) {
|
| EXPECT_TRUE(service_->policy().Equals(expected_bundle));
|
| }
|
|
|
| +TEST_F(ComponentCloudPolicyServiceTest, PurgeWhenServerRemovesPolicy) {
|
| + // Initialize with cached policy.
|
| + PopulateCache();
|
| + Connect(true);
|
| +
|
| + 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_->namespaces_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(PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType,
|
| + kTestExtension),
|
| + *CreateResponse());
|
| + client_->namespaces_requested_.insert(
|
| + PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType, ""));
|
| + 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
|
|
|