| Index: chrome/browser/pref_value_store_unittest.cc
|
| diff --git a/chrome/browser/pref_value_store_unittest.cc b/chrome/browser/pref_value_store_unittest.cc
|
| index 282f305533b0fca101b7f54674ab27e000e42480..ae14598d6e569adc5bb5f2644619674388dd53a6 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();
|
| +}
|
|
|