11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/mock_pref_change_callback.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_change_registrar.h" 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/testing_pref_service.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Mock; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedUserPrefUpdateTest : public testing::Test { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedUserPrefUpdateTest() : observer_(&prefs_) {} 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ScopedUserPrefUpdateTest() {} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prefs_.registry()->RegisterDictionaryPref(kPref); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Init(&prefs_); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(kPref, observer_.GetCallback()); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kPref[]; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kKey[]; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kValue[]; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestingPrefServiceSimple prefs_; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockPrefChangeCallback observer_; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefChangeRegistrar registrar_; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char ScopedUserPrefUpdateTest::kPref[] = "name"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char ScopedUserPrefUpdateTest::kKey[] = "key"; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char ScopedUserPrefUpdateTest::kValue[] = "value"; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ScopedUserPrefUpdateTest, RegularUse) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dictionary that will be expected to be set at the end. 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue expected_dictionary; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_dictionary.SetString(kKey, kValue); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(&prefs_, kPref); 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* value = update.Get(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kKey, kValue); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The dictionary was created for us but the creation should have happened 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // silently without notifications. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modifications happen online and are instantly visible, though. 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* current_value = prefs_.GetDictionary(kPref); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(current_value); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(expected_dictionary.Equals(current_value)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we are leaving the scope of the update so we should be notified. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_.Expect(kPref, &expected_dictionary); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* current_value = prefs_.GetDictionary(kPref); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(current_value); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(expected_dictionary.Equals(current_value)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ScopedUserPrefUpdateTest, NeverTouchAnything) { 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* old_value = prefs_.GetDictionary(kPref); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(&prefs_, kPref); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* new_value = prefs_.GetDictionary(kPref); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(old_value, new_value); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 82