1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/prefs/mock_pref_change_callback.h" 6 #include "base/prefs/pref_change_registrar.h" 7 #include "base/prefs/pref_registry_simple.h" 8 #include "base/prefs/scoped_user_pref_update.h" 9 #include "base/prefs/testing_pref_service.h" 10 #include "testing/gmock/include/gmock/gmock.h" 11 #include "testing/gtest/include/gtest/gtest.h" 12 13 using testing::_; 14 using testing::Mock; 15 16 class ScopedUserPrefUpdateTest : public testing::Test { 17 public: 18 ScopedUserPrefUpdateTest() : observer_(&prefs_) {} 19 virtual ~ScopedUserPrefUpdateTest() {} 20 21 protected: 22 virtual void SetUp() { 23 prefs_.registry()->RegisterDictionaryPref(kPref); 24 registrar_.Init(&prefs_); 25 registrar_.Add(kPref, observer_.GetCallback()); 26 } 27 28 static const char kPref[]; 29 static const char kKey[]; 30 static const char kValue[]; 31 32 TestingPrefServiceSimple prefs_; 33 MockPrefChangeCallback observer_; 34 PrefChangeRegistrar registrar_; 35 }; 36 37 const char ScopedUserPrefUpdateTest::kPref[] = "name"; 38 const char ScopedUserPrefUpdateTest::kKey[] = "key"; 39 const char ScopedUserPrefUpdateTest::kValue[] = "value"; 40 41 TEST_F(ScopedUserPrefUpdateTest, RegularUse) { 42 // Dictionary that will be expected to be set at the end. 43 DictionaryValue expected_dictionary; 44 expected_dictionary.SetString(kKey, kValue); 45 46 { 47 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0); 48 DictionaryPrefUpdate update(&prefs_, kPref); 49 DictionaryValue* value = update.Get(); 50 ASSERT_TRUE(value); 51 value->SetString(kKey, kValue); 52 53 // The dictionary was created for us but the creation should have happened 54 // silently without notifications. 55 Mock::VerifyAndClearExpectations(&observer_); 56 57 // Modifications happen online and are instantly visible, though. 58 const DictionaryValue* current_value = prefs_.GetDictionary(kPref); 59 ASSERT_TRUE(current_value); 60 EXPECT_TRUE(expected_dictionary.Equals(current_value)); 61 62 // Now we are leaving the scope of the update so we should be notified. 63 observer_.Expect(kPref, &expected_dictionary); 64 } 65 Mock::VerifyAndClearExpectations(&observer_); 66 67 const DictionaryValue* current_value = prefs_.GetDictionary(kPref); 68 ASSERT_TRUE(current_value); 69 EXPECT_TRUE(expected_dictionary.Equals(current_value)); 70 } 71 72 TEST_F(ScopedUserPrefUpdateTest, NeverTouchAnything) { 73 const DictionaryValue* old_value = prefs_.GetDictionary(kPref); 74 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0); 75 { 76 DictionaryPrefUpdate update(&prefs_, kPref); 77 } 78 const DictionaryValue* new_value = prefs_.GetDictionary(kPref); 79 EXPECT_EQ(old_value, new_value); 80 Mock::VerifyAndClearExpectations(&observer_); 81 } 82