This source file includes following definitions.
- TestPolicyHash
- NotEqual
- True
- SetUp
- IsEmpty
- CreateResponse
- CreateSerializedResponse
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
#include "components/policy/core/common/cloud/component_cloud_policy_store.h"
#include <map>
#include <string>
#include "base/basictypes.h"
#include "base/bind.h"
#include "base/callback.h"
#include "base/files/scoped_temp_dir.h"
#include "base/memory/ref_counted.h"
#include "base/test/test_simple_task_runner.h"
#include "components/policy/core/common/cloud/cloud_policy_constants.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 "crypto/sha2.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 kTestDownload[] = "http://example.com/getpolicy?id=123";
const char kTestPolicy[] =
"{"
" \"Name\": {"
" \"Value\": \"disabled\""
" },"
" \"Second\": {"
" \"Value\": \"maybe\","
" \"Level\": \"Recommended\""
" }"
"}";
std::string TestPolicyHash() {
return crypto::SHA256HashString(kTestPolicy);
}
bool NotEqual(const std::string& expected, const std::string& key) {
return key != expected;
}
bool True(const std::string& ignored) {
return true;
}
class MockComponentCloudPolicyStoreDelegate
: public ComponentCloudPolicyStore::Delegate {
public:
virtual ~MockComponentCloudPolicyStoreDelegate() {}
MOCK_METHOD0(OnComponentCloudPolicyStoreUpdated, void());
};
}
class ComponentCloudPolicyStoreTest : public testing::Test {
protected:
virtual void SetUp() OVERRIDE {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
cache_.reset(new ResourceCache(
temp_dir_.path(),
make_scoped_refptr(new base::TestSimpleTaskRunner)));
store_.reset(new ComponentCloudPolicyStore(&store_delegate_, cache_.get()));
store_->SetCredentials(ComponentPolicyBuilder::kFakeUsername,
ComponentPolicyBuilder::kFakeToken);
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(TestPolicyHash());
PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
PolicyMap& policy = expected_bundle_.Get(ns);
policy.Set("Name", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
base::Value::CreateStringValue("disabled"), NULL);
policy.Set("Second", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
base::Value::CreateStringValue("maybe"), NULL);
}
bool IsEmpty() {
return store_->policy().begin() == store_->policy().end();
}
scoped_ptr<em::PolicyFetchResponse> CreateResponse() {
builder_.Build();
return make_scoped_ptr(new em::PolicyFetchResponse(builder_.policy()));
}
std::string CreateSerializedResponse() {
builder_.Build();
return builder_.GetBlob();
}
base::ScopedTempDir temp_dir_;
scoped_ptr<ResourceCache> cache_;
scoped_ptr<ComponentCloudPolicyStore> store_;
MockComponentCloudPolicyStoreDelegate store_delegate_;
ComponentPolicyBuilder builder_;
PolicyBundle expected_bundle_;
};
TEST_F(ComponentCloudPolicyStoreTest, ValidatePolicy) {
em::ExternalPolicyData payload;
PolicyNamespace ns;
EXPECT_TRUE(store_->ValidatePolicy(CreateResponse(), &ns, &payload));
EXPECT_EQ(POLICY_DOMAIN_EXTENSIONS, ns.domain);
EXPECT_EQ(kTestExtension, ns.component_id);
EXPECT_EQ(kTestDownload, payload.download_url());
EXPECT_EQ(TestPolicyHash(), payload.secure_hash());
}
TEST_F(ComponentCloudPolicyStoreTest, ValidatePolicyWrongUsername) {
builder_.policy_data().set_username("anotheruser@example.com");
em::ExternalPolicyData payload;
PolicyNamespace ns;
EXPECT_FALSE(store_->ValidatePolicy(CreateResponse(), &ns, &payload));
}
TEST_F(ComponentCloudPolicyStoreTest, ValidatePolicyWrongDMToken) {
builder_.policy_data().set_request_token("notmytoken");
em::ExternalPolicyData payload;
PolicyNamespace ns;
EXPECT_FALSE(store_->ValidatePolicy(CreateResponse(), &ns, &payload));
}
TEST_F(ComponentCloudPolicyStoreTest, ValidatePolicyBadType) {
builder_.policy_data().set_policy_type(dm_protocol::kChromeUserPolicyType);
em::ExternalPolicyData payload;
PolicyNamespace ns;
EXPECT_FALSE(store_->ValidatePolicy(CreateResponse(), &ns, &payload));
}
TEST_F(ComponentCloudPolicyStoreTest, ValidatePolicyBadDownloadUrl) {
builder_.payload().set_download_url("invalidurl");
em::ExternalPolicyData payload;
PolicyNamespace ns;
EXPECT_FALSE(store_->ValidatePolicy(CreateResponse(), &ns, &payload));
}
TEST_F(ComponentCloudPolicyStoreTest, ValidatePolicyEmptyDownloadUrl) {
builder_.payload().clear_download_url();
builder_.payload().clear_secure_hash();
em::ExternalPolicyData payload;
PolicyNamespace ns;
EXPECT_TRUE(store_->ValidatePolicy(CreateResponse(), &ns, &payload));
}
TEST_F(ComponentCloudPolicyStoreTest, ValidatePolicyBadPayload) {
builder_.clear_payload();
builder_.policy_data().set_policy_value("broken");
em::ExternalPolicyData payload;
PolicyNamespace ns;
EXPECT_FALSE(store_->ValidatePolicy(CreateResponse(), &ns, &payload));
}
TEST_F(ComponentCloudPolicyStoreTest, ValidateNoCredentials) {
store_.reset(new ComponentCloudPolicyStore(&store_delegate_, cache_.get()));
em::ExternalPolicyData payload;
PolicyNamespace ns;
EXPECT_FALSE(store_->ValidatePolicy(CreateResponse(), &ns, &payload));
}
TEST_F(ComponentCloudPolicyStoreTest, ValidateWrongCredentials) {
em::ExternalPolicyData payload;
PolicyNamespace ns;
EXPECT_TRUE(store_->ValidatePolicy(CreateResponse(), &ns, &payload));
EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated());
EXPECT_TRUE(store_->Store(
ns, CreateSerializedResponse(), TestPolicyHash(), kTestPolicy));
Mock::VerifyAndClearExpectations(&store_delegate_);
EXPECT_TRUE(store_->policy().Equals(expected_bundle_));
std::map<std::string, std::string> contents;
cache_->LoadAllSubkeys("extension-policy", &contents);
EXPECT_FALSE(contents.empty());
ComponentCloudPolicyStore another_store(&store_delegate_, cache_.get());
another_store.SetCredentials("wrongdude@example.com", "wrongtoken");
another_store.Load();
const PolicyBundle empty_bundle;
EXPECT_TRUE(another_store.policy().Equals(empty_bundle));
cache_->LoadAllSubkeys("extension-policy", &contents);
EXPECT_TRUE(contents.empty());
}
TEST_F(ComponentCloudPolicyStoreTest, StoreAndLoad) {
EXPECT_TRUE(IsEmpty());
store_->Load();
EXPECT_TRUE(IsEmpty());
PolicyNamespace ns(POLICY_DOMAIN_CHROME, kTestExtension);
builder_.policy_data().set_policy_type(dm_protocol::kChromeUserPolicyType);
EXPECT_FALSE(store_->Store(
ns, CreateSerializedResponse(), TestPolicyHash(), kTestPolicy));
builder_.policy_data().set_policy_type(
dm_protocol::kChromeExtensionPolicyType);
ns.domain = POLICY_DOMAIN_EXTENSIONS;
builder_.payload().set_secure_hash("badash");
EXPECT_FALSE(store_->Store(
ns, CreateSerializedResponse(), "badash", kTestPolicy));
builder_.payload().clear_secure_hash();
EXPECT_FALSE(store_->Store(
ns, CreateSerializedResponse(), std::string(), kTestPolicy));
static const char kInvalidData[] = "{ not json }";
const std::string invalid_data_hash = crypto::SHA256HashString(kInvalidData);
builder_.payload().set_secure_hash(invalid_data_hash);
EXPECT_FALSE(store_->Store(
ns, CreateSerializedResponse(), invalid_data_hash, kInvalidData));
EXPECT_TRUE(IsEmpty());
EXPECT_EQ(std::string(), store_->GetCachedHash(ns));
builder_.payload().set_secure_hash(TestPolicyHash());
EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated());
EXPECT_TRUE(store_->Store(
ns, CreateSerializedResponse(), TestPolicyHash(), kTestPolicy));
Mock::VerifyAndClearExpectations(&store_delegate_);
EXPECT_FALSE(IsEmpty());
EXPECT_TRUE(store_->policy().Equals(expected_bundle_));
EXPECT_EQ(TestPolicyHash(), store_->GetCachedHash(ns));
ComponentCloudPolicyStore another_store(&store_delegate_, cache_.get());
another_store.SetCredentials(ComponentPolicyBuilder::kFakeUsername,
ComponentPolicyBuilder::kFakeToken);
another_store.Load();
EXPECT_TRUE(another_store.policy().Equals(expected_bundle_));
EXPECT_EQ(TestPolicyHash(), another_store.GetCachedHash(ns));
}
TEST_F(ComponentCloudPolicyStoreTest, Updates) {
PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated());
EXPECT_TRUE(store_->Store(
ns, CreateSerializedResponse(), TestPolicyHash(), kTestPolicy));
Mock::VerifyAndClearExpectations(&store_delegate_);
EXPECT_FALSE(IsEmpty());
EXPECT_TRUE(store_->policy().Equals(expected_bundle_));
PolicyNamespace ns_fake(POLICY_DOMAIN_EXTENSIONS, "nosuchid");
store_->Delete(ns_fake);
Mock::VerifyAndClearExpectations(&store_delegate_);
EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated());
store_->Delete(ns);
Mock::VerifyAndClearExpectations(&store_delegate_);
}
TEST_F(ComponentCloudPolicyStoreTest, Purge) {
EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated());
PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension);
EXPECT_TRUE(store_->Store(
ns, CreateSerializedResponse(), TestPolicyHash(), kTestPolicy));
Mock::VerifyAndClearExpectations(&store_delegate_);
EXPECT_FALSE(IsEmpty());
EXPECT_TRUE(store_->policy().Equals(expected_bundle_));
store_->Purge(POLICY_DOMAIN_EXTENSIONS,
base::Bind(&NotEqual, kTestExtension));
EXPECT_TRUE(store_->policy().Equals(expected_bundle_));
ComponentCloudPolicyStore another_store(&store_delegate_, cache_.get());
const PolicyBundle empty_bundle;
EXPECT_TRUE(another_store.policy().Equals(empty_bundle));
another_store.SetCredentials(ComponentPolicyBuilder::kFakeUsername,
ComponentPolicyBuilder::kFakeToken);
another_store.Load();
EXPECT_TRUE(another_store.policy().Equals(expected_bundle_));
EXPECT_CALL(store_delegate_, OnComponentCloudPolicyStoreUpdated());
store_->Purge(POLICY_DOMAIN_EXTENSIONS, base::Bind(&True));
Mock::VerifyAndClearExpectations(&store_delegate_);
EXPECT_TRUE(store_->policy().Equals(empty_bundle));
ComponentCloudPolicyStore yet_another_store(&store_delegate_, cache_.get());
yet_another_store.SetCredentials(ComponentPolicyBuilder::kFakeUsername,
ComponentPolicyBuilder::kFakeToken);
yet_another_store.Load();
EXPECT_TRUE(yet_another_store.policy().Equals(empty_bundle));
}
}