OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/user_prefs/tracked/tracked_preferences_migration.h" | 5 #include "components/user_prefs/tracked/tracked_preferences_migration.h" |
6 | 6 |
| 7 #include <memory> |
7 #include <set> | 8 #include <set> |
8 #include <string> | 9 #include <string> |
9 #include <utility> | 10 #include <utility> |
10 #include <vector> | 11 #include <vector> |
11 | 12 |
12 #include "base/bind.h" | 13 #include "base/bind.h" |
13 #include "base/callback.h" | 14 #include "base/callback.h" |
14 #include "base/macros.h" | 15 #include "base/macros.h" |
15 #include "base/memory/scoped_ptr.h" | |
16 #include "base/strings/string_split.h" | 16 #include "base/strings/string_split.h" |
17 #include "base/values.h" | 17 #include "base/values.h" |
18 #include "components/prefs/testing_pref_service.h" | 18 #include "components/prefs/testing_pref_service.h" |
19 #include "components/user_prefs/tracked/dictionary_hash_store_contents.h" | 19 #include "components/user_prefs/tracked/dictionary_hash_store_contents.h" |
20 #include "components/user_prefs/tracked/hash_store_contents.h" | 20 #include "components/user_prefs/tracked/hash_store_contents.h" |
21 #include "components/user_prefs/tracked/interceptable_pref_filter.h" | 21 #include "components/user_prefs/tracked/interceptable_pref_filter.h" |
22 #include "components/user_prefs/tracked/pref_hash_store.h" | 22 #include "components/user_prefs/tracked/pref_hash_store.h" |
23 #include "components/user_prefs/tracked/pref_hash_store_impl.h" | 23 #include "components/user_prefs/tracked/pref_hash_store_impl.h" |
24 #include "components/user_prefs/tracked/pref_hash_store_transaction.h" | 24 #include "components/user_prefs/tracked/pref_hash_store_transaction.h" |
25 #include "components/user_prefs/tracked/pref_service_hash_store_contents.h" | 25 #include "components/user_prefs/tracked/pref_service_hash_store_contents.h" |
(...skipping 24 matching lines...) Expand all Loading... |
50 void FilterUpdate(const std::string& path) override { ADD_FAILURE(); } | 50 void FilterUpdate(const std::string& path) override { ADD_FAILURE(); } |
51 void FilterSerializeData( | 51 void FilterSerializeData( |
52 base::DictionaryValue* pref_store_contents) override { | 52 base::DictionaryValue* pref_store_contents) override { |
53 ADD_FAILURE(); | 53 ADD_FAILURE(); |
54 } | 54 } |
55 | 55 |
56 private: | 56 private: |
57 // InterceptablePrefFilter implementation. | 57 // InterceptablePrefFilter implementation. |
58 void FinalizeFilterOnLoad( | 58 void FinalizeFilterOnLoad( |
59 const PostFilterOnLoadCallback& post_filter_on_load_callback, | 59 const PostFilterOnLoadCallback& post_filter_on_load_callback, |
60 scoped_ptr<base::DictionaryValue> pref_store_contents, | 60 std::unique_ptr<base::DictionaryValue> pref_store_contents, |
61 bool prefs_altered) override { | 61 bool prefs_altered) override { |
62 post_filter_on_load_callback.Run(std::move(pref_store_contents), | 62 post_filter_on_load_callback.Run(std::move(pref_store_contents), |
63 prefs_altered); | 63 prefs_altered); |
64 } | 64 } |
65 }; | 65 }; |
66 | 66 |
67 // A test fixture designed to be used like this: | 67 // A test fixture designed to be used like this: |
68 // 1) Set up initial store prefs with PresetStoreValue(). | 68 // 1) Set up initial store prefs with PresetStoreValue(). |
69 // 2) Hand both sets of prefs to the migrator via HandPrefsToMigrator(). | 69 // 2) Hand both sets of prefs to the migrator via HandPrefsToMigrator(). |
70 // 3) Migration completes synchronously when the second store hands its prefs | 70 // 3) Migration completes synchronously when the second store hands its prefs |
(...skipping 30 matching lines...) Expand all Loading... |
101 | 101 |
102 migration_modified_unprotected_store_ = false; | 102 migration_modified_unprotected_store_ = false; |
103 migration_modified_protected_store_ = false; | 103 migration_modified_protected_store_ = false; |
104 unprotected_store_migration_complete_ = false; | 104 unprotected_store_migration_complete_ = false; |
105 protected_store_migration_complete_ = false; | 105 protected_store_migration_complete_ = false; |
106 | 106 |
107 unprotected_store_successful_write_callback_.Reset(); | 107 unprotected_store_successful_write_callback_.Reset(); |
108 protected_store_successful_write_callback_.Reset(); | 108 protected_store_successful_write_callback_.Reset(); |
109 | 109 |
110 SetupTrackedPreferencesMigration( | 110 SetupTrackedPreferencesMigration( |
111 unprotected_pref_names, | 111 unprotected_pref_names, protected_pref_names, |
112 protected_pref_names, | |
113 base::Bind(&TrackedPreferencesMigrationTest::RemovePathFromStore, | 112 base::Bind(&TrackedPreferencesMigrationTest::RemovePathFromStore, |
114 base::Unretained(this), | 113 base::Unretained(this), MOCK_UNPROTECTED_PREF_STORE), |
115 MOCK_UNPROTECTED_PREF_STORE), | |
116 base::Bind(&TrackedPreferencesMigrationTest::RemovePathFromStore, | 114 base::Bind(&TrackedPreferencesMigrationTest::RemovePathFromStore, |
117 base::Unretained(this), | 115 base::Unretained(this), MOCK_PROTECTED_PREF_STORE), |
118 MOCK_PROTECTED_PREF_STORE), | |
119 base::Bind( | 116 base::Bind( |
120 &TrackedPreferencesMigrationTest::RegisterSuccessfulWriteClosure, | 117 &TrackedPreferencesMigrationTest::RegisterSuccessfulWriteClosure, |
121 base::Unretained(this), | 118 base::Unretained(this), MOCK_UNPROTECTED_PREF_STORE), |
122 MOCK_UNPROTECTED_PREF_STORE), | |
123 base::Bind( | 119 base::Bind( |
124 &TrackedPreferencesMigrationTest::RegisterSuccessfulWriteClosure, | 120 &TrackedPreferencesMigrationTest::RegisterSuccessfulWriteClosure, |
125 base::Unretained(this), | 121 base::Unretained(this), MOCK_PROTECTED_PREF_STORE), |
126 MOCK_PROTECTED_PREF_STORE), | 122 std::unique_ptr<PrefHashStore>( |
127 scoped_ptr<PrefHashStore>( | |
128 new PrefHashStoreImpl(kSeed, kDeviceId, false)), | 123 new PrefHashStoreImpl(kSeed, kDeviceId, false)), |
129 scoped_ptr<PrefHashStore>( | 124 std::unique_ptr<PrefHashStore>( |
130 new PrefHashStoreImpl(kSeed, kDeviceId, true)), | 125 new PrefHashStoreImpl(kSeed, kDeviceId, true)), |
131 scoped_ptr<HashStoreContents>( | 126 std::unique_ptr<HashStoreContents>( |
132 new PrefServiceHashStoreContents(kHashStoreId, &local_state_)), | 127 new PrefServiceHashStoreContents(kHashStoreId, &local_state_)), |
133 | 128 |
134 &mock_unprotected_pref_filter_, | 129 &mock_unprotected_pref_filter_, &mock_protected_pref_filter_); |
135 &mock_protected_pref_filter_); | |
136 | 130 |
137 // Verify initial expectations are met. | 131 // Verify initial expectations are met. |
138 EXPECT_TRUE(HasPrefs(MOCK_UNPROTECTED_PREF_STORE)); | 132 EXPECT_TRUE(HasPrefs(MOCK_UNPROTECTED_PREF_STORE)); |
139 EXPECT_TRUE(HasPrefs(MOCK_PROTECTED_PREF_STORE)); | 133 EXPECT_TRUE(HasPrefs(MOCK_PROTECTED_PREF_STORE)); |
140 EXPECT_FALSE( | 134 EXPECT_FALSE( |
141 WasOnSuccessfulWriteCallbackRegistered(MOCK_UNPROTECTED_PREF_STORE)); | 135 WasOnSuccessfulWriteCallbackRegistered(MOCK_UNPROTECTED_PREF_STORE)); |
142 EXPECT_FALSE( | 136 EXPECT_FALSE( |
143 WasOnSuccessfulWriteCallbackRegistered(MOCK_PROTECTED_PREF_STORE)); | 137 WasOnSuccessfulWriteCallbackRegistered(MOCK_PROTECTED_PREF_STORE)); |
144 } | 138 } |
145 | 139 |
(...skipping 16 matching lines...) Expand all Loading... |
162 PresetStoreValueOnly(store_id, key, value); | 156 PresetStoreValueOnly(store_id, key, value); |
163 PresetLegacyValueHash(key, value); | 157 PresetLegacyValueHash(key, value); |
164 } | 158 } |
165 | 159 |
166 // Stores a hash for |key| and |value| in the hash store identified by | 160 // Stores a hash for |key| and |value| in the hash store identified by |
167 // |store_id| before migration begins. | 161 // |store_id| before migration begins. |
168 void PresetStoreValueHash(MockPrefStoreID store_id, | 162 void PresetStoreValueHash(MockPrefStoreID store_id, |
169 const std::string& key, | 163 const std::string& key, |
170 const std::string value) { | 164 const std::string value) { |
171 base::DictionaryValue* store = NULL; | 165 base::DictionaryValue* store = NULL; |
172 scoped_ptr<PrefHashStore> pref_hash_store; | 166 std::unique_ptr<PrefHashStore> pref_hash_store; |
173 switch (store_id) { | 167 switch (store_id) { |
174 case MOCK_UNPROTECTED_PREF_STORE: | 168 case MOCK_UNPROTECTED_PREF_STORE: |
175 store = unprotected_prefs_.get(); | 169 store = unprotected_prefs_.get(); |
176 pref_hash_store.reset(new PrefHashStoreImpl(kSeed, kDeviceId, false)); | 170 pref_hash_store.reset(new PrefHashStoreImpl(kSeed, kDeviceId, false)); |
177 break; | 171 break; |
178 case MOCK_PROTECTED_PREF_STORE: | 172 case MOCK_PROTECTED_PREF_STORE: |
179 store = protected_prefs_.get(); | 173 store = protected_prefs_.get(); |
180 pref_hash_store.reset(new PrefHashStoreImpl(kSeed, kDeviceId, true)); | 174 pref_hash_store.reset(new PrefHashStoreImpl(kSeed, kDeviceId, true)); |
181 break; | 175 break; |
182 } | 176 } |
183 DCHECK(store); | 177 DCHECK(store); |
184 | 178 |
185 base::StringValue string_value(value); | 179 base::StringValue string_value(value); |
186 pref_hash_store->BeginTransaction( | 180 pref_hash_store |
187 scoped_ptr<HashStoreContents>( | 181 ->BeginTransaction(std::unique_ptr<HashStoreContents>( |
188 new DictionaryHashStoreContents(store)))->StoreHash( | 182 new DictionaryHashStoreContents(store))) |
189 key, &string_value); | 183 ->StoreHash(key, &string_value); |
190 } | 184 } |
191 | 185 |
192 // Stores a hash for |key| and |value| in the legacy hash store in | 186 // Stores a hash for |key| and |value| in the legacy hash store in |
193 // local_state. | 187 // local_state. |
194 void PresetLegacyValueHash(const std::string& key, | 188 void PresetLegacyValueHash(const std::string& key, |
195 const std::string value) { | 189 const std::string value) { |
196 scoped_ptr<PrefHashStore> pref_hash_store( | 190 std::unique_ptr<PrefHashStore> pref_hash_store( |
197 new PrefHashStoreImpl(kSeed, kDeviceId, true)); | 191 new PrefHashStoreImpl(kSeed, kDeviceId, true)); |
198 | 192 |
199 base::StringValue string_value(value); | 193 base::StringValue string_value(value); |
200 PrefHashStoreImpl(kSeed, kDeviceId, true) | 194 PrefHashStoreImpl(kSeed, kDeviceId, true) |
201 .BeginTransaction(scoped_ptr<HashStoreContents>( | 195 .BeginTransaction(std::unique_ptr<HashStoreContents>( |
202 new PrefServiceHashStoreContents(kHashStoreId, &local_state_))) | 196 new PrefServiceHashStoreContents(kHashStoreId, &local_state_))) |
203 ->StoreHash(key, &string_value); | 197 ->StoreHash(key, &string_value); |
204 } | 198 } |
205 | 199 |
206 // Returns true if the store opposite to |store_id| is observed for its next | 200 // Returns true if the store opposite to |store_id| is observed for its next |
207 // successful write. | 201 // successful write. |
208 bool WasOnSuccessfulWriteCallbackRegistered(MockPrefStoreID store_id) { | 202 bool WasOnSuccessfulWriteCallbackRegistered(MockPrefStoreID store_id) { |
209 switch (store_id) { | 203 switch (store_id) { |
210 case MOCK_UNPROTECTED_PREF_STORE: | 204 case MOCK_UNPROTECTED_PREF_STORE: |
211 return !protected_store_successful_write_callback_.is_null(); | 205 return !protected_store_successful_write_callback_.is_null(); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 case MOCK_PROTECTED_PREF_STORE: | 338 case MOCK_PROTECTED_PREF_STORE: |
345 EXPECT_TRUE(protected_store_successful_write_callback_.is_null()); | 339 EXPECT_TRUE(protected_store_successful_write_callback_.is_null()); |
346 protected_store_successful_write_callback_ = successful_write_closure; | 340 protected_store_successful_write_callback_ = successful_write_closure; |
347 break; | 341 break; |
348 } | 342 } |
349 } | 343 } |
350 | 344 |
351 // Helper given as an InterceptablePrefFilter::FinalizeFilterOnLoadCallback | 345 // Helper given as an InterceptablePrefFilter::FinalizeFilterOnLoadCallback |
352 // to the migrator to be invoked when it's done. | 346 // to the migrator to be invoked when it's done. |
353 void GetPrefsBack(MockPrefStoreID store_id, | 347 void GetPrefsBack(MockPrefStoreID store_id, |
354 scoped_ptr<base::DictionaryValue> prefs, | 348 std::unique_ptr<base::DictionaryValue> prefs, |
355 bool prefs_altered) { | 349 bool prefs_altered) { |
356 switch (store_id) { | 350 switch (store_id) { |
357 case MOCK_UNPROTECTED_PREF_STORE: | 351 case MOCK_UNPROTECTED_PREF_STORE: |
358 EXPECT_FALSE(unprotected_prefs_); | 352 EXPECT_FALSE(unprotected_prefs_); |
359 unprotected_prefs_ = std::move(prefs); | 353 unprotected_prefs_ = std::move(prefs); |
360 migration_modified_unprotected_store_ = prefs_altered; | 354 migration_modified_unprotected_store_ = prefs_altered; |
361 unprotected_store_migration_complete_ = true; | 355 unprotected_store_migration_complete_ = true; |
362 break; | 356 break; |
363 case MOCK_PROTECTED_PREF_STORE: | 357 case MOCK_PROTECTED_PREF_STORE: |
364 EXPECT_FALSE(protected_prefs_); | 358 EXPECT_FALSE(protected_prefs_); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 } | 393 } |
400 DCHECK(store); | 394 DCHECK(store); |
401 | 395 |
402 store->SetString(key, value); | 396 store->SetString(key, value); |
403 } | 397 } |
404 | 398 |
405 static const char kHashStoreId[]; | 399 static const char kHashStoreId[]; |
406 static const char kSeed[]; | 400 static const char kSeed[]; |
407 static const char kDeviceId[]; | 401 static const char kDeviceId[]; |
408 | 402 |
409 scoped_ptr<base::DictionaryValue> unprotected_prefs_; | 403 std::unique_ptr<base::DictionaryValue> unprotected_prefs_; |
410 scoped_ptr<base::DictionaryValue> protected_prefs_; | 404 std::unique_ptr<base::DictionaryValue> protected_prefs_; |
411 | 405 |
412 SimpleInterceptablePrefFilter mock_unprotected_pref_filter_; | 406 SimpleInterceptablePrefFilter mock_unprotected_pref_filter_; |
413 SimpleInterceptablePrefFilter mock_protected_pref_filter_; | 407 SimpleInterceptablePrefFilter mock_protected_pref_filter_; |
414 | 408 |
415 base::Closure unprotected_store_successful_write_callback_; | 409 base::Closure unprotected_store_successful_write_callback_; |
416 base::Closure protected_store_successful_write_callback_; | 410 base::Closure protected_store_successful_write_callback_; |
417 | 411 |
418 bool migration_modified_unprotected_store_; | 412 bool migration_modified_unprotected_store_; |
419 bool migration_modified_protected_store_; | 413 bool migration_modified_protected_store_; |
420 | 414 |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
897 expected_unprotected_values); | 891 expected_unprotected_values); |
898 | 892 |
899 base::StringPairs expected_protected_values; | 893 base::StringPairs expected_protected_values; |
900 expected_protected_values.push_back(std::make_pair( | 894 expected_protected_values.push_back(std::make_pair( |
901 kProtectedPref, kProtectedPrefValue)); | 895 kProtectedPref, kProtectedPrefValue)); |
902 expected_protected_values.push_back(std::make_pair( | 896 expected_protected_values.push_back(std::make_pair( |
903 kPreviouslyUnprotectedPref, kPreviouslyUnprotectedPrefValue)); | 897 kPreviouslyUnprotectedPref, kPreviouslyUnprotectedPrefValue)); |
904 VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, expected_protected_values); | 898 VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, expected_protected_values); |
905 } | 899 } |
906 } | 900 } |
OLD | NEW |