summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/settings/policy_value_store_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/settings/policy_value_store_unittest.cc')
-rw-r--r--chrome/browser/extensions/settings/policy_value_store_unittest.cc217
1 files changed, 217 insertions, 0 deletions
diff --git a/chrome/browser/extensions/settings/policy_value_store_unittest.cc b/chrome/browser/extensions/settings/policy_value_store_unittest.cc
new file mode 100644
index 0000000..0d7fa45
--- /dev/null
+++ b/chrome/browser/extensions/settings/policy_value_store_unittest.cc
@@ -0,0 +1,217 @@
+// Copyright (c) 2012 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 "chrome/browser/extensions/settings/policy_value_store.h"
+
+#include "base/file_path.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop.h"
+#include "chrome/browser/extensions/settings/settings_observer.h"
+#include "chrome/browser/policy/policy_map.h"
+#include "chrome/browser/value_store/leveldb_value_store.h"
+#include "chrome/browser/value_store/value_store_unittest.h"
+#include "content/public/test/test_browser_thread.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::_;
+using testing::Mock;
+
+namespace extensions {
+
+namespace {
+
+const char kTestExtensionId[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+
+class MockSettingsObserver : public SettingsObserver {
+ public:
+ MOCK_METHOD3(OnSettingsChanged, void(
+ const std::string& extension_id,
+ settings_namespace::Namespace settings_namespace,
+ const std::string& changes_json));
+};
+
+// Extends PolicyValueStore by overriding the mutating methods, so that the
+// Get() base implementation can be tested with the ValueStoreTest parameterized
+// tests.
+class MutablePolicyValueStore : public PolicyValueStore {
+ public:
+ explicit MutablePolicyValueStore(const FilePath& path)
+ : PolicyValueStore(kTestExtensionId,
+ make_scoped_refptr(new SettingsObserverList()),
+ scoped_ptr<ValueStore>(new LeveldbValueStore(path))) {}
+ virtual ~MutablePolicyValueStore() {}
+
+ virtual WriteResult Set(
+ WriteOptions options,
+ const std::string& key,
+ const base::Value& value) OVERRIDE {
+ return delegate()->Set(options, key, value);
+ }
+
+ virtual WriteResult Set(
+ WriteOptions options, const base::DictionaryValue& values) OVERRIDE {
+ return delegate()->Set(options, values);
+ }
+
+ virtual WriteResult Remove(const std::string& key) OVERRIDE {
+ return delegate()->Remove(key);
+ }
+
+ virtual WriteResult Remove(const std::vector<std::string>& keys) OVERRIDE {
+ return delegate()->Remove(keys);
+ }
+
+ virtual WriteResult Clear() OVERRIDE {
+ return delegate()->Clear();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MutablePolicyValueStore);
+};
+
+ValueStore* Param(const FilePath& file_path) {
+ return new MutablePolicyValueStore(file_path);
+}
+
+} // namespace
+
+INSTANTIATE_TEST_CASE_P(
+ PolicyValueStoreTest,
+ ValueStoreTest,
+ testing::Values(&Param));
+
+class PolicyValueStoreTest : public testing::Test {
+ public:
+ PolicyValueStoreTest()
+ : file_thread_(content::BrowserThread::FILE, &loop_) {}
+ virtual ~PolicyValueStoreTest() {}
+
+ virtual void SetUp() OVERRIDE {
+ ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
+ observers_ = new SettingsObserverList();
+ observers_->AddObserver(&observer_);
+ store_.reset(new PolicyValueStore(
+ kTestExtensionId,
+ observers_,
+ scoped_ptr<ValueStore>(
+ new LeveldbValueStore(scoped_temp_dir_.path()))));
+ }
+
+ virtual void TearDown() OVERRIDE {
+ observers_->RemoveObserver(&observer_);
+ store_.reset();
+ }
+
+ protected:
+ base::ScopedTempDir scoped_temp_dir_;
+ MessageLoop loop_;
+ content::TestBrowserThread file_thread_;
+ scoped_ptr<PolicyValueStore> store_;
+ MockSettingsObserver observer_;
+ scoped_refptr<SettingsObserverList> observers_;
+};
+
+TEST_F(PolicyValueStoreTest, DontProvideRecommendedPolicies) {
+ policy::PolicyMap policies;
+ base::FundamentalValue expected(123);
+ policies.Set("must", policy::POLICY_LEVEL_MANDATORY,
+ policy::POLICY_SCOPE_USER, expected.DeepCopy());
+ policies.Set("may", policy::POLICY_LEVEL_RECOMMENDED,
+ policy::POLICY_SCOPE_USER, base::Value::CreateIntegerValue(456));
+ store_->SetCurrentPolicy(policies, false);
+ ValueStore::ReadResult result = store_->Get();
+ ASSERT_FALSE(result->HasError());
+ EXPECT_EQ(1u, result->settings()->size());
+ base::Value* value = NULL;
+ EXPECT_FALSE(result->settings()->Get("may", &value));
+ EXPECT_TRUE(result->settings()->Get("must", &value));
+ EXPECT_TRUE(base::Value::Equals(&expected, value));
+}
+
+TEST_F(PolicyValueStoreTest, ReadOnly) {
+ ValueStore::WriteOptions options = ValueStore::DEFAULTS;
+
+ base::StringValue string_value("value");
+ EXPECT_TRUE(store_->Set(options, "key", string_value)->HasError());
+
+ base::DictionaryValue dict;
+ dict.SetString("key", "value");
+ EXPECT_TRUE(store_->Set(options, dict)->HasError());
+
+ EXPECT_TRUE(store_->Remove("key")->HasError());
+ std::vector<std::string> keys;
+ keys.push_back("key");
+ EXPECT_TRUE(store_->Remove(keys)->HasError());
+ EXPECT_TRUE(store_->Clear()->HasError());
+}
+
+TEST_F(PolicyValueStoreTest, NotifyOnChanges) {
+ policy::PolicyMap policies;
+ policies.Set("aaa", policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
+ base::Value::CreateStringValue("111"));
+ EXPECT_CALL(observer_, OnSettingsChanged(_, _, _)).Times(0);
+ // No notification when setting the initial policy.
+ store_->SetCurrentPolicy(policies, false);
+ loop_.RunUntilIdle();
+ Mock::VerifyAndClearExpectations(&observer_);
+
+ // And no notifications on changes when not asked for.
+ policies.Set("aaa", policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
+ base::Value::CreateStringValue("222"));
+ policies.Set("bbb", policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
+ base::Value::CreateStringValue("223"));
+ EXPECT_CALL(observer_, OnSettingsChanged(_, _, _)).Times(0);
+ store_->SetCurrentPolicy(policies, false);
+ loop_.RunUntilIdle();
+ Mock::VerifyAndClearExpectations(&observer_);
+
+ // Notify when new policies are added.
+ ValueStoreChangeList changes;
+ base::StringValue value("333");
+ changes.push_back(ValueStoreChange("ccc", NULL, value.DeepCopy()));
+ policies.Set("ccc", policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
+ value.DeepCopy());
+ EXPECT_CALL(observer_, OnSettingsChanged(kTestExtensionId,
+ settings_namespace::MANAGED,
+ ValueStoreChange::ToJson(changes)));
+ store_->SetCurrentPolicy(policies, true);
+ loop_.RunUntilIdle();
+ Mock::VerifyAndClearExpectations(&observer_);
+
+ // Notify when policies change.
+ changes.clear();
+ base::StringValue new_value("444");
+ changes.push_back(
+ ValueStoreChange("ccc", value.DeepCopy(), new_value.DeepCopy()));
+ policies.Set("ccc", policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
+ new_value.DeepCopy());
+ EXPECT_CALL(observer_, OnSettingsChanged(kTestExtensionId,
+ settings_namespace::MANAGED,
+ ValueStoreChange::ToJson(changes)));
+ store_->SetCurrentPolicy(policies, true);
+ loop_.RunUntilIdle();
+ Mock::VerifyAndClearExpectations(&observer_);
+
+ // Notify when policies are removed.
+ changes.clear();
+ changes.push_back(ValueStoreChange("ccc", new_value.DeepCopy(), NULL));
+ policies.Erase("ccc");
+ EXPECT_CALL(observer_, OnSettingsChanged(kTestExtensionId,
+ settings_namespace::MANAGED,
+ ValueStoreChange::ToJson(changes)));
+ store_->SetCurrentPolicy(policies, true);
+ loop_.RunUntilIdle();
+ Mock::VerifyAndClearExpectations(&observer_);
+
+ // Don't notify when there aren't changes.
+ EXPECT_CALL(observer_, OnSettingsChanged(_, _, _)).Times(0);
+ store_->SetCurrentPolicy(policies, true);
+ loop_.RunUntilIdle();
+ Mock::VerifyAndClearExpectations(&observer_);
+}
+
+} // namespace extensions