Index: base/prefs/scoped_user_pref_update_unittest.cc |
diff --git a/base/prefs/scoped_user_pref_update_unittest.cc b/base/prefs/scoped_user_pref_update_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..48e3dc4f7d425346a98785c7207ce78e32a481bb |
--- /dev/null |
+++ b/base/prefs/scoped_user_pref_update_unittest.cc |
@@ -0,0 +1,81 @@ |
+// Copyright 2013 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 "base/prefs/mock_pref_change_callback.h" |
+#include "base/prefs/pref_change_registrar.h" |
+#include "base/prefs/pref_registry_simple.h" |
+#include "base/prefs/scoped_user_pref_update.h" |
+#include "base/prefs/testing_pref_service.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+using testing::_; |
+using testing::Mock; |
+ |
+class ScopedUserPrefUpdateTest : public testing::Test { |
+ public: |
+ ScopedUserPrefUpdateTest() : observer_(&prefs_) {} |
+ ~ScopedUserPrefUpdateTest() override {} |
+ |
+ protected: |
+ void SetUp() override { |
+ prefs_.registry()->RegisterDictionaryPref(kPref); |
+ registrar_.Init(&prefs_); |
+ registrar_.Add(kPref, observer_.GetCallback()); |
+ } |
+ |
+ static const char kPref[]; |
+ static const char kKey[]; |
+ static const char kValue[]; |
+ |
+ TestingPrefServiceSimple prefs_; |
+ MockPrefChangeCallback observer_; |
+ PrefChangeRegistrar registrar_; |
+}; |
+ |
+const char ScopedUserPrefUpdateTest::kPref[] = "name"; |
+const char ScopedUserPrefUpdateTest::kKey[] = "key"; |
+const char ScopedUserPrefUpdateTest::kValue[] = "value"; |
+ |
+TEST_F(ScopedUserPrefUpdateTest, RegularUse) { |
+ // Dictionary that will be expected to be set at the end. |
+ base::DictionaryValue expected_dictionary; |
+ expected_dictionary.SetString(kKey, kValue); |
+ |
+ { |
+ EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0); |
+ DictionaryPrefUpdate update(&prefs_, kPref); |
+ base::DictionaryValue* value = update.Get(); |
+ ASSERT_TRUE(value); |
+ value->SetString(kKey, kValue); |
+ |
+ // The dictionary was created for us but the creation should have happened |
+ // silently without notifications. |
+ Mock::VerifyAndClearExpectations(&observer_); |
+ |
+ // Modifications happen online and are instantly visible, though. |
+ const base::DictionaryValue* current_value = prefs_.GetDictionary(kPref); |
+ ASSERT_TRUE(current_value); |
+ EXPECT_TRUE(expected_dictionary.Equals(current_value)); |
+ |
+ // Now we are leaving the scope of the update so we should be notified. |
+ observer_.Expect(kPref, &expected_dictionary); |
+ } |
+ Mock::VerifyAndClearExpectations(&observer_); |
+ |
+ const base::DictionaryValue* current_value = prefs_.GetDictionary(kPref); |
+ ASSERT_TRUE(current_value); |
+ EXPECT_TRUE(expected_dictionary.Equals(current_value)); |
+} |
+ |
+TEST_F(ScopedUserPrefUpdateTest, NeverTouchAnything) { |
+ const base::DictionaryValue* old_value = prefs_.GetDictionary(kPref); |
+ EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0); |
+ { |
+ DictionaryPrefUpdate update(&prefs_, kPref); |
+ } |
+ const base::DictionaryValue* new_value = prefs_.GetDictionary(kPref); |
+ EXPECT_EQ(old_value, new_value); |
+ Mock::VerifyAndClearExpectations(&observer_); |
+} |