summaryrefslogtreecommitdiffstats
path: root/chrome/browser/pref_value_store_unittest.cc
diff options
context:
space:
mode:
authordanno@chromium.org <danno@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-04 15:31:38 +0000
committerdanno@chromium.org <danno@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-04 15:31:38 +0000
commit61f972be4f7409243bfd81abd41facb31f421550 (patch)
tree6bd79ad823720c1c98553a946f4522ec336379be /chrome/browser/pref_value_store_unittest.cc
parenteb9afc859fc8df63b52de503c0aa3e690e674963 (diff)
downloadchromium_src-61f972be4f7409243bfd81abd41facb31f421550.zip
chromium_src-61f972be4f7409243bfd81abd41facb31f421550.tar.gz
chromium_src-61f972be4f7409243bfd81abd41facb31f421550.tar.bz2
Changing policy while Chrome is running should refresh preferences without relaunching
Includes windows-only Group Policy watcher that triggers policy refresh. BUG=45324 TEST=--gtest_filter=PrefValueStoreTest.* and manual Review URL: http://codereview.chromium.org/2858060 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@54902 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/pref_value_store_unittest.cc')
-rw-r--r--chrome/browser/pref_value_store_unittest.cc210
1 files changed, 186 insertions, 24 deletions
diff --git a/chrome/browser/pref_value_store_unittest.cc b/chrome/browser/pref_value_store_unittest.cc
index 282f305..ae14598 100644
--- a/chrome/browser/pref_value_store_unittest.cc
+++ b/chrome/browser/pref_value_store_unittest.cc
@@ -3,10 +3,11 @@
// found in the LICENSE file.
#include "base/scoped_ptr.h"
+#include "base/utf_string_conversions.h"
#include "base/values.h"
+#include "chrome/browser/configuration_policy_pref_store.h"
#include "chrome/browser/dummy_pref_store.h"
#include "chrome/browser/pref_value_store.h"
-
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -62,22 +63,6 @@ namespace recommended_pref {
class PrefValueStoreTest : public testing::Test {
protected:
- scoped_ptr<PrefValueStore> pref_value_store_;
-
- // |PrefStore|s are owned by the |PrefValueStore|.
- DummyPrefStore* enforced_pref_store_;
- DummyPrefStore* extension_pref_store_;
- DummyPrefStore* command_line_pref_store_;
- DummyPrefStore* recommended_pref_store_;
- DummyPrefStore* user_pref_store_;
-
- // Preferences are owned by the individual |DummyPrefStores|.
- DictionaryValue* enforced_prefs_;
- DictionaryValue* extension_prefs_;
- DictionaryValue* command_line_prefs_;
- DictionaryValue* user_prefs_;
- DictionaryValue* recommended_prefs_;
-
virtual void SetUp() {
// Create dummy user preferences.
enforced_prefs_= CreateEnforcedPrefs();
@@ -100,11 +85,14 @@ class PrefValueStoreTest : public testing::Test {
recommended_pref_store_->set_prefs(recommended_prefs_);
// Create a new pref-value-store.
- pref_value_store_.reset(new PrefValueStore(enforced_pref_store_,
- extension_pref_store_,
- command_line_pref_store_,
- user_pref_store_,
- recommended_pref_store_));
+ pref_value_store_ = new PrefValueStore(enforced_pref_store_,
+ extension_pref_store_,
+ command_line_pref_store_,
+ user_pref_store_,
+ recommended_pref_store_);
+
+ ui_thread_.reset(new ChromeThread(ChromeThread::UI, &loop_));
+ file_thread_.reset(new ChromeThread(ChromeThread::FILE, &loop_));
}
// Creates a new dictionary and stores some sample user preferences
@@ -124,6 +112,7 @@ class PrefValueStoreTest : public testing::Test {
DictionaryValue* CreateEnforcedPrefs() {
DictionaryValue* enforced_prefs = new DictionaryValue();
enforced_prefs->SetString(prefs::kHomepage, enforced_pref::kHomepageValue);
+ expected_differing_paths_.push_back(WideToUTF8(prefs::kHomepage));
return enforced_prefs;
}
@@ -154,6 +143,14 @@ class PrefValueStoreTest : public testing::Test {
recommended_prefs->SetBoolean(
prefs::kRecommendedPref,
recommended_pref::kRecommendedPrefValue);
+
+ // Expected differing paths must be added in lexicographic order
+ // to work properly
+ expected_differing_paths_.push_back("tabs");
+ expected_differing_paths_.push_back(WideToUTF8(prefs::kMaxTabs));
+ expected_differing_paths_.push_back("this");
+ expected_differing_paths_.push_back("this.pref");
+ expected_differing_paths_.push_back(WideToUTF8(prefs::kRecommendedPref));
return recommended_prefs; }
DictionaryValue* CreateSampleDictValue() {
@@ -173,9 +170,38 @@ class PrefValueStoreTest : public testing::Test {
return sample_list;
}
- virtual void TearDown() {}
-};
+ virtual void TearDown() {
+ loop_.RunAllPending();
+ }
+
+ MessageLoop loop_;
+ scoped_refptr<PrefValueStore> pref_value_store_;
+
+ // |PrefStore|s are owned by the |PrefValueStore|.
+ DummyPrefStore* enforced_pref_store_;
+ DummyPrefStore* extension_pref_store_;
+ DummyPrefStore* command_line_pref_store_;
+ DummyPrefStore* recommended_pref_store_;
+ DummyPrefStore* user_pref_store_;
+
+ // A vector of the preferences paths in the managed and recommended
+ // PrefStores that are set at the beginning of a test. Can be modified
+ // by the test to track changes that it makes to the preferences
+ // stored in the managed and recommended PrefStores.
+ std::vector<std::string> expected_differing_paths_;
+
+ // Preferences are owned by the individual |DummyPrefStores|.
+ DictionaryValue* enforced_prefs_;
+ DictionaryValue* extension_prefs_;
+ DictionaryValue* command_line_prefs_;
+ DictionaryValue* user_prefs_;
+ DictionaryValue* recommended_prefs_;
+
+ private:
+ scoped_ptr<ChromeThread> ui_thread_;
+ scoped_ptr<ChromeThread> file_thread_;
+};
TEST_F(PrefValueStoreTest, IsReadOnly) {
enforced_pref_store_->set_read_only(true);
@@ -427,3 +453,139 @@ TEST_F(PrefValueStoreTest, PrefValueInUserStore) {
EXPECT_FALSE(pref_value_store_->PrefValueInUserStore(prefs::kMissingPref));
EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(prefs::kMissingPref));
}
+
+class MockPolicyRefreshCallback {
+ public:
+ MockPolicyRefreshCallback() {}
+ MOCK_METHOD1(DoCallback, void(const std::vector<std::string>));
+};
+
+TEST_F(PrefValueStoreTest, TestPolicyRefresh) {
+ // pref_value_store_ is initialized by PrefValueStoreTest to have values
+ // in both it's managed and recommended store. By replacing them with
+ // dummy stores, all of the paths of the prefs originally managed and
+ // recommended stores should change.
+ MockPolicyRefreshCallback callback;
+ EXPECT_CALL(callback, DoCallback(_)).Times(0);
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ pref_value_store_.get(),
+ &PrefValueStore::RefreshPolicyPrefs,
+ new DummyPrefStore(),
+ new DummyPrefStore(),
+ NewCallback(&callback,
+ &MockPolicyRefreshCallback::DoCallback)));
+ Mock::VerifyAndClearExpectations(&callback);
+ EXPECT_CALL(callback, DoCallback(expected_differing_paths_)).Times(1);
+ loop_.RunAllPending();
+}
+
+TEST_F(PrefValueStoreTest, TestRefreshPolicyPrefsCompletion) {
+ // Test changed preferences in managed store and removed
+ // preferences in the recommended store. In addition
+ // to "homepage", the other prefs that are set by default in
+ // the test class are removed by the DummyStore
+ scoped_ptr<DummyPrefStore> new_managed_store(new DummyPrefStore());
+ DictionaryValue* dict = new DictionaryValue();
+ dict->SetString(L"homepage", L"some other changed homepage");
+ new_managed_store->set_prefs(dict);
+ MockPolicyRefreshCallback callback;
+ EXPECT_CALL(callback, DoCallback(expected_differing_paths_)).Times(1);
+ pref_value_store_->RefreshPolicyPrefsCompletion(
+ new_managed_store.release(),
+ new DummyPrefStore(),
+ NewCallback(&callback,
+ &MockPolicyRefreshCallback::DoCallback));
+
+ // Test properties that have been removed from the managed store.
+ // Homepage is still set in managed prefs.
+ expected_differing_paths_.clear();
+ expected_differing_paths_.push_back(std::string("homepage"));
+ MockPolicyRefreshCallback callback2;
+ EXPECT_CALL(callback2, DoCallback(expected_differing_paths_)).Times(1);
+ pref_value_store_->RefreshPolicyPrefsCompletion(
+ new DummyPrefStore(),
+ new DummyPrefStore(),
+ NewCallback(&callback2,
+ &MockPolicyRefreshCallback::DoCallback));
+
+ // Test properties that are added to the recommended store.
+ scoped_ptr<DummyPrefStore> new_recommended_store(new DummyPrefStore());
+ dict = new DictionaryValue();
+ dict->SetString(L"homepage", L"some other changed homepage 2");
+ new_recommended_store->set_prefs(dict);
+ expected_differing_paths_.clear();
+ expected_differing_paths_.push_back(std::string("homepage"));
+ MockPolicyRefreshCallback callback3;
+ EXPECT_CALL(callback3, DoCallback(expected_differing_paths_)).Times(1);
+ pref_value_store_->RefreshPolicyPrefsCompletion(
+ new DummyPrefStore(),
+ new_recommended_store.release(),
+ NewCallback(&callback3,
+ &MockPolicyRefreshCallback::DoCallback));
+
+ // Test adding a multi-key path.
+ new_managed_store.reset(new DummyPrefStore());
+ dict = new DictionaryValue();
+ dict->SetString("segment1.segment2", "value");
+ new_managed_store->set_prefs(dict);
+ expected_differing_paths_.clear();
+ expected_differing_paths_.push_back(std::string("homepage"));
+ expected_differing_paths_.push_back(std::string("segment1"));
+ expected_differing_paths_.push_back(std::string("segment1.segment2"));
+ MockPolicyRefreshCallback callback4;
+ EXPECT_CALL(callback4, DoCallback(expected_differing_paths_)).Times(1);
+ pref_value_store_->RefreshPolicyPrefsCompletion(
+ new_managed_store.release(),
+ new DummyPrefStore(),
+ NewCallback(&callback4,
+ &MockPolicyRefreshCallback::DoCallback));
+}
+
+TEST_F(PrefValueStoreTest, TestConcurrentPolicyRefresh) {
+ MockPolicyRefreshCallback callback1;
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ pref_value_store_.get(),
+ &PrefValueStore::RefreshPolicyPrefs,
+ new DummyPrefStore(),
+ new DummyPrefStore(),
+ NewCallback(&callback1,
+ &MockPolicyRefreshCallback::DoCallback)));
+ EXPECT_CALL(callback1, DoCallback(_)).Times(0);
+
+ MockPolicyRefreshCallback callback2;
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ pref_value_store_.get(),
+ &PrefValueStore::RefreshPolicyPrefs,
+ new DummyPrefStore(),
+ new DummyPrefStore(),
+ NewCallback(&callback2,
+ &MockPolicyRefreshCallback::DoCallback)));
+ EXPECT_CALL(callback2, DoCallback(_)).Times(0);
+
+ MockPolicyRefreshCallback callback3;
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ pref_value_store_.get(),
+ &PrefValueStore::RefreshPolicyPrefs,
+ new DummyPrefStore(),
+ new DummyPrefStore(),
+ NewCallback(&callback3,
+ &MockPolicyRefreshCallback::DoCallback)));
+ EXPECT_CALL(callback3, DoCallback(_)).Times(0);
+ Mock::VerifyAndClearExpectations(&callback1);
+ Mock::VerifyAndClearExpectations(&callback2);
+ Mock::VerifyAndClearExpectations(&callback3);
+
+ EXPECT_CALL(callback1, DoCallback(expected_differing_paths_)).Times(1);
+ std::vector<std::string> no_differing_paths;
+ EXPECT_CALL(callback2, DoCallback(no_differing_paths)).Times(1);
+ EXPECT_CALL(callback3, DoCallback(no_differing_paths)).Times(1);
+ loop_.RunAllPending();
+}