• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 "chrome/browser/prefs/scoped_user_pref_update.h"
6 #include "chrome/browser/prefs/pref_change_registrar.h"
7 #include "chrome/browser/prefs/pref_observer_mock.h"
8 #include "chrome/test/testing_pref_service.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 using testing::_;
13 using testing::Mock;
14 
15 class ScopedUserPrefUpdateTest : public testing::Test {
16  public:
~ScopedUserPrefUpdateTest()17   ~ScopedUserPrefUpdateTest() {}
18 
19  protected:
SetUp()20   virtual void SetUp() {
21     prefs_.RegisterDictionaryPref(kPref);
22     registrar_.Init(&prefs_);
23     registrar_.Add(kPref, &observer_);
24   }
25 
26   static const char kPref[];
27   static const char kKey[];
28   static const char kValue[];
29 
30   TestingPrefService prefs_;
31   PrefObserverMock observer_;
32   PrefChangeRegistrar registrar_;
33 };
34 
35 const char ScopedUserPrefUpdateTest::kPref[] = "name";
36 const char ScopedUserPrefUpdateTest::kKey[] = "key";
37 const char ScopedUserPrefUpdateTest::kValue[] = "value";
38 
TEST_F(ScopedUserPrefUpdateTest,RegularUse)39 TEST_F(ScopedUserPrefUpdateTest, RegularUse) {
40   // Dictionary that will be expected to be set at the end.
41   DictionaryValue expected_dictionary;
42   expected_dictionary.SetString(kKey, kValue);
43 
44   {
45     EXPECT_CALL(observer_, Observe(_, _, _)).Times(0);
46     DictionaryPrefUpdate update(&prefs_, kPref);
47     DictionaryValue* value = update.Get();
48     ASSERT_TRUE(value);
49     value->SetString(kKey, kValue);
50 
51     // The dictionary was created for us but the creation should have happened
52     // silently without notifications.
53     Mock::VerifyAndClearExpectations(&observer_);
54 
55     // Modifications happen online and are instantly visible, though.
56     const DictionaryValue* current_value = prefs_.GetDictionary(kPref);
57     ASSERT_TRUE(current_value);
58     EXPECT_TRUE(expected_dictionary.Equals(current_value));
59 
60     // Now we are leaving the scope of the update so we should be notified.
61     observer_.Expect(&prefs_, kPref, &expected_dictionary);
62   }
63   Mock::VerifyAndClearExpectations(&observer_);
64 
65   const DictionaryValue* current_value = prefs_.GetDictionary(kPref);
66   ASSERT_TRUE(current_value);
67   EXPECT_TRUE(expected_dictionary.Equals(current_value));
68 }
69 
TEST_F(ScopedUserPrefUpdateTest,NeverTouchAnything)70 TEST_F(ScopedUserPrefUpdateTest, NeverTouchAnything) {
71   const DictionaryValue* old_value = prefs_.GetDictionary(kPref);
72   EXPECT_CALL(observer_, Observe(_, _, _)).Times(0);
73   {
74     DictionaryPrefUpdate update(&prefs_, kPref);
75   }
76   const DictionaryValue* new_value = prefs_.GetDictionary(kPref);
77   EXPECT_EQ(old_value, new_value);
78   Mock::VerifyAndClearExpectations(&observer_);
79 }
80