summaryrefslogtreecommitdiffstats
path: root/chromium/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc')
-rw-r--r--chromium/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc554
1 files changed, 0 insertions, 554 deletions
diff --git a/chromium/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc b/chromium/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc
deleted file mode 100644
index 5ff6e89989b..00000000000
--- a/chromium/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc
+++ /dev/null
@@ -1,554 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/policy/core/common/cloud/component_cloud_policy_service.h"
-
-#include <map>
-#include <string>
-
-#include "base/callback.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/sha1.h"
-#include "base/single_thread_task_runner.h"
-#include "base/stl_util.h"
-#include "base/values.h"
-#include "components/policy/core/common/cloud/cloud_policy_constants.h"
-#include "components/policy/core/common/cloud/mock_cloud_policy_client.h"
-#include "components/policy/core/common/cloud/mock_cloud_policy_store.h"
-#include "components/policy/core/common/cloud/policy_builder.h"
-#include "components/policy/core/common/cloud/resource_cache.h"
-#include "components/policy/core/common/external_data_fetcher.h"
-#include "components/policy/core/common/policy_map.h"
-#include "components/policy/core/common/policy_types.h"
-#include "components/policy/core/common/schema.h"
-#include "components/policy/core/common/schema_map.h"
-#include "net/url_request/test_url_fetcher_factory.h"
-#include "net/url_request/url_fetcher_delegate.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "policy/proto/chrome_extension_policy.pb.h"
-#include "policy/proto/device_management_backend.pb.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace em = enterprise_management;
-
-using testing::Mock;
-
-namespace policy {
-
-namespace {
-
-const char kTestExtension[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
-const char kTestExtension2[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
-const char kTestDownload[] = "http://example.com/getpolicy?id=123";
-
-const char kTestPolicy[] =
- "{"
- " \"Name\": {"
- " \"Value\": \"disabled\""
- " },"
- " \"Second\": {"
- " \"Value\": \"maybe\","
- " \"Level\": \"Recommended\""
- " }"
- "}";
-
-const char kInvalidTestPolicy[] =
- "{"
- " \"Name\": {"
- " \"Value\": \"published\""
- " },"
- " \"Undeclared Name\": {"
- " \"Value\": \"not published\""
- " }"
- "}";
-
-const char kTestSchema[] =
- "{"
- " \"type\": \"object\","
- " \"properties\": {"
- " \"Name\": { \"type\": \"string\" },"
- " \"Second\": { \"type\": \"string\" }"
- " }"
- "}";
-
-class MockComponentCloudPolicyDelegate
- : public ComponentCloudPolicyService::Delegate {
- public:
- virtual ~MockComponentCloudPolicyDelegate() {}
-
- MOCK_METHOD0(OnComponentCloudPolicyUpdated, void());
-};
-
-class TestURLRequestContextGetter : public net::URLRequestContextGetter {
- public:
- explicit TestURLRequestContextGetter(
- scoped_refptr<base::SingleThreadTaskRunner> task_runner)
- : task_runner_(task_runner) {}
- virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE {
- return NULL;
- }
- virtual scoped_refptr<base::SingleThreadTaskRunner>
- GetNetworkTaskRunner() const OVERRIDE {
- return task_runner_;
- }
-
- private:
- virtual ~TestURLRequestContextGetter() {}
-
- scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-};
-
-} // namespace
-
-class ComponentCloudPolicyServiceTest : public testing::Test {
- protected:
- ComponentCloudPolicyServiceTest()
- : client_(NULL),
- core_(PolicyNamespaceKey(GetChromeUserPolicyType(), ""),
- &store_,
- loop_.message_loop_proxy()) {}
-
- virtual 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_,
- &registry_,
- &core_,
- make_scoped_ptr(cache_),
- request_context_,
- loop_.message_loop_proxy(),
- loop_.message_loop_proxy()));
-
- builder_.policy_data().set_policy_type(
- dm_protocol::kChromeExtensionPolicyType);
- builder_.policy_data().set_settings_entity_id(kTestExtension);
- builder_.payload().set_download_url(kTestDownload);
- builder_.payload().set_secure_hash(base::SHA1HashString(kTestPolicy));
-
- expected_policy_.Set("Name", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
- base::Value::CreateStringValue("disabled"), NULL);
- expected_policy_.Set("Second", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
- base::Value::CreateStringValue("maybe"), NULL);
- }
-
- virtual void TearDown() OVERRIDE {
- // The service cleans up its backend on the background thread.
- service_.reset();
- RunUntilIdle();
- }
-
- void RunUntilIdle() {
- base::RunLoop().RunUntilIdle();
- }
-
- void Connect(size_t expected_namespaces_in_client) {
- client_ = new MockCloudPolicyClient();
- client_->SetDMToken(ComponentPolicyBuilder::kFakeToken);
- EXPECT_EQ(0u, client_->namespaces_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_->namespaces_to_fetch_.size());
-
- // Also initialize the refresh scheduler, so that calls to
- // core()->RefreshSoon() trigger a FetchPolicy() call on the mock |client_|.
- // Expect the initial refresh now, if the store doesn't have policy (if it
- // does then the CloudPolicyRefreshScheduler won't start refreshing until
- // invalidations are available, or a timeout elapses).
- if (!store_.has_policy())
- EXPECT_CALL(*client_, FetchPolicy());
- core_.StartRefreshScheduler();
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(client_);
- }
-
- void LoadStore() {
- EXPECT_FALSE(store_.is_initialized());
-
- em::PolicyData* data = new em::PolicyData();
- data->set_username(ComponentPolicyBuilder::kFakeUsername);
- data->set_request_token(ComponentPolicyBuilder::kFakeToken);
- store_.policy_.reset(data);
-
- store_.NotifyStoreLoaded();
- RunUntilIdle();
- EXPECT_TRUE(store_.is_initialized());
- }
-
- void InitializeRegistry() {
- registry_.RegisterComponent(
- PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension),
- CreateTestSchema());
- registry_.SetReady(POLICY_DOMAIN_CHROME);
- registry_.SetReady(POLICY_DOMAIN_EXTENSIONS);
- }
-
- void PopulateCache() {
- EXPECT_TRUE(cache_->Store(
- "extension-policy", kTestExtension, CreateSerializedResponse()));
- EXPECT_TRUE(
- cache_->Store("extension-policy-data", kTestExtension, kTestPolicy));
-
- builder_.policy_data().set_settings_entity_id(kTestExtension2);
- EXPECT_TRUE(cache_->Store(
- "extension-policy", kTestExtension2, CreateSerializedResponse()));
- EXPECT_TRUE(
- cache_->Store("extension-policy-data", kTestExtension2, kTestPolicy));
- }
-
- scoped_ptr<em::PolicyFetchResponse> CreateResponse() {
- builder_.Build();
- return make_scoped_ptr(new em::PolicyFetchResponse(builder_.policy()));
- }
-
- std::string CreateSerializedResponse() {
- builder_.Build();
- return builder_.GetBlob();
- }
-
- Schema CreateTestSchema() {
- std::string error;
- Schema schema = Schema::Parse(kTestSchema, &error);
- EXPECT_TRUE(schema.valid()) << error;
- return schema;
- }
-
- base::MessageLoop loop_;
- base::ScopedTempDir temp_dir_;
- scoped_refptr<TestURLRequestContextGetter> request_context_;
- net::TestURLFetcherFactory fetcher_factory_;
- MockComponentCloudPolicyDelegate delegate_;
- // |cache_| is owned by the |service_| and is invalid once the |service_|
- // is destroyed.
- ResourceCache* cache_;
- MockCloudPolicyClient* client_;
- MockCloudPolicyStore store_;
- CloudPolicyCore core_;
- SchemaRegistry registry_;
- scoped_ptr<ComponentCloudPolicyService> service_;
- ComponentPolicyBuilder builder_;
- 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_,
- &registry_,
- &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());
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(&client_);
- Mock::VerifyAndClearExpectations(&delegate_);
-
- EXPECT_TRUE(service_->is_initialized());
- EXPECT_EQ(2u, client_->namespaces_to_fetch_.size());
- const PolicyBundle empty_bundle;
- EXPECT_TRUE(service_->policy().Equals(empty_bundle));
-}
-
-TEST_F(ComponentCloudPolicyServiceTest, InitializeStoreThenRegistry) {
- Connect(1u);
-
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(0);
- EXPECT_CALL(*client_, FetchPolicy()).Times(0);
- LoadStore();
- Mock::VerifyAndClearExpectations(client_);
- Mock::VerifyAndClearExpectations(&delegate_);
- EXPECT_FALSE(service_->is_initialized());
-
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
- EXPECT_CALL(*client_, FetchPolicy());
- InitializeRegistry();
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(client_);
- Mock::VerifyAndClearExpectations(&delegate_);
- EXPECT_TRUE(service_->is_initialized());
-
- const PolicyBundle empty_bundle;
- EXPECT_TRUE(service_->policy().Equals(empty_bundle));
-}
-
-TEST_F(ComponentCloudPolicyServiceTest, InitializeRegistryThenStore) {
- Connect(1u);
-
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(0);
- EXPECT_CALL(*client_, FetchPolicy()).Times(0);
- InitializeRegistry();
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(client_);
- Mock::VerifyAndClearExpectations(&delegate_);
- EXPECT_FALSE(service_->is_initialized());
-
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
- EXPECT_CALL(*client_, FetchPolicy());
- LoadStore();
- Mock::VerifyAndClearExpectations(client_);
- Mock::VerifyAndClearExpectations(&delegate_);
- EXPECT_TRUE(service_->is_initialized());
- EXPECT_EQ(2u, client_->namespaces_to_fetch_.size());
- const PolicyBundle empty_bundle;
- EXPECT_TRUE(service_->policy().Equals(empty_bundle));
-}
-
-TEST_F(ComponentCloudPolicyServiceTest, InitializeWithCachedPolicy) {
- PopulateCache();
- Connect(1u);
-
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
- EXPECT_CALL(*client_, FetchPolicy());
- InitializeRegistry();
- LoadStore();
- Mock::VerifyAndClearExpectations(client_);
- Mock::VerifyAndClearExpectations(&delegate_);
-
- EXPECT_TRUE(service_->is_initialized());
- EXPECT_EQ(2u, client_->namespaces_to_fetch_.size());
-
- // kTestExtension2 is not in the registry so it was dropped.
- std::map<std::string, std::string> contents;
- cache_->LoadAllSubkeys("extension-policy", &contents);
- ASSERT_EQ(1u, contents.size());
- EXPECT_EQ(kTestExtension, contents.begin()->first);
-
- PolicyBundle expected_bundle;
- const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
- expected_bundle.Get(ns).CopyFrom(expected_policy_);
- EXPECT_TRUE(service_->policy().Equals(expected_bundle));
-}
-
-TEST_F(ComponentCloudPolicyServiceTest, FetchPolicy) {
- Connect(1u);
- // Initialize the store and create the backend.
- // A refresh is not needed, because no components are registered yet.
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
- EXPECT_CALL(*client_, FetchPolicy()).Times(0);
- registry_.SetReady(POLICY_DOMAIN_CHROME);
- registry_.SetReady(POLICY_DOMAIN_EXTENSIONS);
- LoadStore();
- Mock::VerifyAndClearExpectations(client_);
- Mock::VerifyAndClearExpectations(&delegate_);
- EXPECT_TRUE(service_->is_initialized());
-
- // Register the components to fetch.
- EXPECT_CALL(*client_, FetchPolicy());
- registry_.RegisterComponent(
- PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension),
- CreateTestSchema());
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(client_);
-
- // Send back a fake policy fetch response.
- client_->SetPolicy(PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType,
- kTestExtension),
- *CreateResponse());
- service_->OnPolicyFetched(client_);
- RunUntilIdle();
-
- // That should have triggered the download fetch.
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
- ASSERT_TRUE(fetcher);
- EXPECT_EQ(GURL(kTestDownload), fetcher->GetOriginalURL());
- fetcher->set_response_code(200);
- fetcher->SetResponseString(kTestPolicy);
- fetcher->delegate()->OnURLFetchComplete(fetcher);
-
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(&delegate_);
-
- // The policy is now being served.
- const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
- PolicyBundle expected_bundle;
- expected_bundle.Get(ns).CopyFrom(expected_policy_);
- EXPECT_TRUE(service_->policy().Equals(expected_bundle));
-}
-
-TEST_F(ComponentCloudPolicyServiceTest, LoadAndPurgeCache) {
- Connect(1u);
- // Insert data in the cache.
- PopulateCache();
- registry_.RegisterComponent(
- PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension2),
- CreateTestSchema());
- InitializeRegistry();
-
- // Load the initial cache.
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
- EXPECT_CALL(*client_, FetchPolicy());
- LoadStore();
- Mock::VerifyAndClearExpectations(client_);
- Mock::VerifyAndClearExpectations(&delegate_);
-
- PolicyBundle expected_bundle;
- PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
- expected_bundle.Get(ns).CopyFrom(expected_policy_);
- ns.component_id = kTestExtension2;
- expected_bundle.Get(ns).CopyFrom(expected_policy_);
- EXPECT_TRUE(service_->policy().Equals(expected_bundle));
-
- // Now purge one of the extensions.
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
- registry_.UnregisterComponent(
- PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension));
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(&delegate_);
-
- ns.component_id = kTestExtension;
- expected_bundle.Get(ns).Clear();
- EXPECT_TRUE(service_->policy().Equals(expected_bundle));
-
- std::map<std::string, std::string> contents;
- cache_->LoadAllSubkeys("extension-policy", &contents);
- EXPECT_EQ(1u, contents.size());
- EXPECT_TRUE(ContainsKey(contents, kTestExtension2));
-}
-
-TEST_F(ComponentCloudPolicyServiceTest, SignInAfterStartup) {
- registry_.SetReady(POLICY_DOMAIN_CHROME);
- registry_.SetReady(POLICY_DOMAIN_EXTENSIONS);
-
- // 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.
- registry_.RegisterComponent(
- PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension),
- CreateTestSchema());
- RunUntilIdle();
-
- // Now signin. A fetch will be requested for the new extension.
- Connect(2u);
-
- // 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());
- service_->OnPolicyFetched(client_);
- RunUntilIdle();
-
- // The policy was ignored and no download is started because the store
- // doesn't have credentials.
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
- EXPECT_FALSE(fetcher);
-
- // Now update the |store_| with the updated policy, which includes
- // credentials. The responses in the |client_| will be reloaded.
- em::PolicyData* data = new em::PolicyData();
- data->set_username(ComponentPolicyBuilder::kFakeUsername);
- data->set_request_token(ComponentPolicyBuilder::kFakeToken);
- store_.policy_.reset(data);
- store_.NotifyStoreLoaded();
- RunUntilIdle();
-
- // The extension policy was validated this time, and the download is started.
- fetcher = fetcher_factory_.GetFetcherByID(0);
- ASSERT_TRUE(fetcher);
- EXPECT_EQ(GURL(kTestDownload), fetcher->GetOriginalURL());
- fetcher->set_response_code(200);
- fetcher->SetResponseString(kTestPolicy);
- fetcher->delegate()->OnURLFetchComplete(fetcher);
-
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(&delegate_);
-
- // The policy is now being served.
- PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
- PolicyBundle expected_bundle;
- expected_bundle.Get(ns).CopyFrom(expected_policy_);
- EXPECT_TRUE(service_->policy().Equals(expected_bundle));
-}
-
-TEST_F(ComponentCloudPolicyServiceTest, SignOut) {
- // Initialize everthing and serve policy for a component.
- PopulateCache();
- LoadStore();
- InitializeRegistry();
-
- // The initial, cached policy will be served once the backend is initialized.
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(&delegate_);
- PolicyBundle expected_bundle;
- const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
- expected_bundle.Get(ns).CopyFrom(expected_policy_);
- EXPECT_TRUE(service_->policy().Equals(expected_bundle));
- std::map<std::string, std::string> contents;
- 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());
- core_.Disconnect();
- store_.policy_.reset();
- store_.NotifyStoreLoaded();
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(&delegate_);
- const PolicyBundle empty_bundle;
- EXPECT_TRUE(service_->policy().Equals(empty_bundle));
- cache_->LoadAllSubkeys("extension-policy", &contents);
- ASSERT_EQ(0u, contents.size());
-}
-
-TEST_F(ComponentCloudPolicyServiceTest, LoadInvalidPolicyFromCache) {
- // Put the invalid test policy in the cache. One of its policies will be
- // loaded, the other should be filtered out by the schema.
- builder_.payload().set_secure_hash(base::SHA1HashString(kInvalidTestPolicy));
- EXPECT_TRUE(cache_->Store(
- "extension-policy", kTestExtension, CreateSerializedResponse()));
- EXPECT_TRUE(cache_->Store(
- "extension-policy-data", kTestExtension, kInvalidTestPolicy));
-
- LoadStore();
- InitializeRegistry();
-
- // The initial, cached policy will be served once the backend is initialized.
- EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated());
- RunUntilIdle();
- Mock::VerifyAndClearExpectations(&delegate_);
-
- PolicyBundle expected_bundle;
- const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
- expected_bundle.Get(ns).Set("Name", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
- base::Value::CreateStringValue("published"),
- NULL);
- EXPECT_TRUE(service_->policy().Equals(expected_bundle));
-}
-
-} // namespace policy