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 "chrome/browser/prefs/profile_pref_store_manager.h" | 5 #include "chrome/browser/prefs/profile_pref_store_manager.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
11 #include "base/files/file_enumerator.h" | 11 #include "base/files/file_enumerator.h" |
12 #include "base/files/scoped_temp_dir.h" | 12 #include "base/files/scoped_temp_dir.h" |
13 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "base/prefs/json_pref_store.h" | 16 #include "base/prefs/json_pref_store.h" |
17 #include "base/prefs/persistent_pref_store.h" | 17 #include "base/prefs/persistent_pref_store.h" |
18 #include "base/prefs/pref_service.h" | 18 #include "base/prefs/pref_service.h" |
19 #include "base/prefs/pref_service_factory.h" | 19 #include "base/prefs/pref_service_factory.h" |
20 #include "base/prefs/pref_store.h" | 20 #include "base/prefs/pref_store.h" |
21 #include "base/prefs/testing_pref_service.h" | 21 #include "base/prefs/testing_pref_service.h" |
22 #include "base/run_loop.h" | 22 #include "base/run_loop.h" |
23 #include "base/strings/string_util.h" | 23 #include "base/strings/string_util.h" |
24 #include "base/values.h" | 24 #include "base/values.h" |
| 25 #include "chrome/browser/prefs/mock_validation_delegate.h" |
25 #include "chrome/browser/prefs/pref_hash_filter.h" | 26 #include "chrome/browser/prefs/pref_hash_filter.h" |
26 #include "chrome/common/pref_names.h" | 27 #include "chrome/common/pref_names.h" |
27 #include "components/pref_registry/pref_registry_syncable.h" | 28 #include "components/pref_registry/pref_registry_syncable.h" |
28 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
29 | 30 |
30 namespace { | 31 namespace { |
31 | 32 |
32 class FirstEqualsPredicate { | 33 class FirstEqualsPredicate { |
33 public: | 34 public: |
34 explicit FirstEqualsPredicate(const std::string& expected) | 35 explicit FirstEqualsPredicate(const std::string& expected) |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 pref_service_factory.Create(profile_pref_registry_)); | 148 pref_service_factory.Create(profile_pref_registry_)); |
148 | 149 |
149 return !ProfilePrefStoreManager::GetResetTime(pref_service.get()).is_null(); | 150 return !ProfilePrefStoreManager::GetResetTime(pref_service.get()).is_null(); |
150 } | 151 } |
151 | 152 |
152 void InitializePrefs() { | 153 void InitializePrefs() { |
153 // According to the implementation of ProfilePrefStoreManager, this is | 154 // According to the implementation of ProfilePrefStoreManager, this is |
154 // actually a SegregatedPrefStore backed by two underlying pref stores. | 155 // actually a SegregatedPrefStore backed by two underlying pref stores. |
155 scoped_refptr<PersistentPrefStore> pref_store = | 156 scoped_refptr<PersistentPrefStore> pref_store = |
156 manager_->CreateProfilePrefStore( | 157 manager_->CreateProfilePrefStore( |
157 main_message_loop_.message_loop_proxy()); | 158 main_message_loop_.message_loop_proxy(), |
| 159 &mock_validation_delegate_); |
158 InitializePrefStore(pref_store); | 160 InitializePrefStore(pref_store); |
159 pref_store = NULL; | 161 pref_store = NULL; |
160 base::RunLoop().RunUntilIdle(); | 162 base::RunLoop().RunUntilIdle(); |
161 } | 163 } |
162 | 164 |
163 void DestroyPrefStore() { | 165 void DestroyPrefStore() { |
164 if (pref_store_) { | 166 if (pref_store_) { |
165 // Force everything to be written to disk, triggering the PrefHashFilter | 167 // Force everything to be written to disk, triggering the PrefHashFilter |
166 // while our RegistryVerifier is watching. | 168 // while our RegistryVerifier is watching. |
167 pref_store_->CommitPendingWrite(); | 169 pref_store_->CommitPendingWrite(); |
(...skipping 24 matching lines...) Expand all Loading... |
192 pref_store->SetValue(kProtectedAtomic, new base::StringValue(kHelloWorld)); | 194 pref_store->SetValue(kProtectedAtomic, new base::StringValue(kHelloWorld)); |
193 pref_store->SetValue(kUnprotectedPref, new base::StringValue(kFoobar)); | 195 pref_store->SetValue(kUnprotectedPref, new base::StringValue(kFoobar)); |
194 pref_store->RemoveObserver(®istry_verifier_); | 196 pref_store->RemoveObserver(®istry_verifier_); |
195 pref_store->CommitPendingWrite(); | 197 pref_store->CommitPendingWrite(); |
196 base::RunLoop().RunUntilIdle(); | 198 base::RunLoop().RunUntilIdle(); |
197 } | 199 } |
198 | 200 |
199 void LoadExistingPrefs() { | 201 void LoadExistingPrefs() { |
200 DestroyPrefStore(); | 202 DestroyPrefStore(); |
201 pref_store_ = manager_->CreateProfilePrefStore( | 203 pref_store_ = manager_->CreateProfilePrefStore( |
202 main_message_loop_.message_loop_proxy()); | 204 main_message_loop_.message_loop_proxy(), NULL); |
203 pref_store_->AddObserver(®istry_verifier_); | 205 pref_store_->AddObserver(®istry_verifier_); |
204 pref_store_->ReadPrefs(); | 206 pref_store_->ReadPrefs(); |
205 } | 207 } |
206 | 208 |
207 void ReplaceStringInPrefs(const std::string& find, | 209 void ReplaceStringInPrefs(const std::string& find, |
208 const std::string& replace) { | 210 const std::string& replace) { |
209 base::FileEnumerator file_enum( | 211 base::FileEnumerator file_enum( |
210 profile_dir_.path(), true, base::FileEnumerator::FILES); | 212 profile_dir_.path(), true, base::FileEnumerator::FILES); |
211 | 213 |
212 for (base::FilePath path = file_enum.Next(); !path.empty(); | 214 for (base::FilePath path = file_enum.Next(); !path.empty(); |
(...skipping 13 matching lines...) Expand all Loading... |
226 std::string as_string; | 228 std::string as_string; |
227 if (!pref_store_->GetValue(name, &value)) { | 229 if (!pref_store_->GetValue(name, &value)) { |
228 ADD_FAILURE() << name << " is not a defined value."; | 230 ADD_FAILURE() << name << " is not a defined value."; |
229 } else if (!value->GetAsString(&as_string)) { | 231 } else if (!value->GetAsString(&as_string)) { |
230 ADD_FAILURE() << name << " could not be coerced to a string."; | 232 ADD_FAILURE() << name << " could not be coerced to a string."; |
231 } else { | 233 } else { |
232 EXPECT_EQ(expected, as_string); | 234 EXPECT_EQ(expected, as_string); |
233 } | 235 } |
234 } | 236 } |
235 | 237 |
| 238 void ExpectValidationObserved(const std::string& pref_path) { |
| 239 // No validations are expected for platforms that do not support tracking. |
| 240 if (!ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking) |
| 241 return; |
| 242 if (!mock_validation_delegate_.GetEventForPath(pref_path)) |
| 243 ADD_FAILURE() << "No validation observed for preference: " << pref_path; |
| 244 } |
| 245 |
236 base::MessageLoop main_message_loop_; | 246 base::MessageLoop main_message_loop_; |
237 std::vector<PrefHashFilter::TrackedPreferenceMetadata> configuration_; | 247 std::vector<PrefHashFilter::TrackedPreferenceMetadata> configuration_; |
238 base::ScopedTempDir profile_dir_; | 248 base::ScopedTempDir profile_dir_; |
239 TestingPrefServiceSimple local_state_; | 249 TestingPrefServiceSimple local_state_; |
240 scoped_refptr<user_prefs::PrefRegistrySyncable> profile_pref_registry_; | 250 scoped_refptr<user_prefs::PrefRegistrySyncable> profile_pref_registry_; |
241 RegistryVerifier registry_verifier_; | 251 RegistryVerifier registry_verifier_; |
| 252 MockValidationDelegate mock_validation_delegate_; |
242 scoped_ptr<ProfilePrefStoreManager> manager_; | 253 scoped_ptr<ProfilePrefStoreManager> manager_; |
243 scoped_refptr<PersistentPrefStore> pref_store_; | 254 scoped_refptr<PersistentPrefStore> pref_store_; |
244 }; | 255 }; |
245 | 256 |
246 TEST_F(ProfilePrefStoreManagerTest, StoreValues) { | 257 TEST_F(ProfilePrefStoreManagerTest, StoreValues) { |
247 InitializePrefs(); | 258 InitializePrefs(); |
248 | 259 |
249 LoadExistingPrefs(); | 260 LoadExistingPrefs(); |
250 | 261 |
251 ExpectStringValueEquals(kTrackedAtomic, kFoobar); | 262 ExpectStringValueEquals(kTrackedAtomic, kFoobar); |
252 ExpectStringValueEquals(kProtectedAtomic, kHelloWorld); | 263 ExpectStringValueEquals(kProtectedAtomic, kHelloWorld); |
253 EXPECT_FALSE(WasResetRecorded()); | 264 EXPECT_FALSE(WasResetRecorded()); |
| 265 ExpectValidationObserved(kTrackedAtomic); |
| 266 ExpectValidationObserved(kProtectedAtomic); |
254 } | 267 } |
255 | 268 |
256 TEST_F(ProfilePrefStoreManagerTest, GetPrefFilePathFromProfilePath) { | 269 TEST_F(ProfilePrefStoreManagerTest, GetPrefFilePathFromProfilePath) { |
257 base::FilePath pref_file_path = | 270 base::FilePath pref_file_path = |
258 ProfilePrefStoreManager::GetPrefFilePathFromProfilePath( | 271 ProfilePrefStoreManager::GetPrefFilePathFromProfilePath( |
259 profile_dir_.path()); | 272 profile_dir_.path()); |
260 | 273 |
261 EXPECT_FALSE(base::PathExists(pref_file_path)); | 274 EXPECT_FALSE(base::PathExists(pref_file_path)); |
262 | 275 |
263 InitializePrefs(); | 276 InitializePrefs(); |
(...skipping 12 matching lines...) Expand all Loading... |
276 // kTrackedAtomic is unprotected and thus will be loaded as it appears on | 289 // kTrackedAtomic is unprotected and thus will be loaded as it appears on |
277 // disk. | 290 // disk. |
278 ExpectStringValueEquals(kTrackedAtomic, kBarfoo); | 291 ExpectStringValueEquals(kTrackedAtomic, kBarfoo); |
279 | 292 |
280 // If preference tracking is supported, the tampered value of kProtectedAtomic | 293 // If preference tracking is supported, the tampered value of kProtectedAtomic |
281 // will be discarded at load time, leaving this preference undefined. | 294 // will be discarded at load time, leaving this preference undefined. |
282 EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, | 295 EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
283 pref_store_->GetValue(kProtectedAtomic, NULL)); | 296 pref_store_->GetValue(kProtectedAtomic, NULL)); |
284 EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, | 297 EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
285 WasResetRecorded()); | 298 WasResetRecorded()); |
| 299 |
| 300 ExpectValidationObserved(kTrackedAtomic); |
| 301 ExpectValidationObserved(kProtectedAtomic); |
286 } | 302 } |
287 | 303 |
288 TEST_F(ProfilePrefStoreManagerTest, ResetPrefHashStore) { | 304 TEST_F(ProfilePrefStoreManagerTest, ResetPrefHashStore) { |
289 InitializePrefs(); | 305 InitializePrefs(); |
290 | 306 |
291 manager_->ResetPrefHashStore(); | 307 manager_->ResetPrefHashStore(); |
292 | 308 |
293 LoadExistingPrefs(); | 309 LoadExistingPrefs(); |
294 | 310 |
295 // kTrackedAtomic is loaded as it appears on disk. | 311 // kTrackedAtomic is loaded as it appears on disk. |
296 ExpectStringValueEquals(kTrackedAtomic, kFoobar); | 312 ExpectStringValueEquals(kTrackedAtomic, kFoobar); |
297 // If preference tracking is supported, kProtectedAtomic will be undefined | 313 // If preference tracking is supported, kProtectedAtomic will be undefined |
298 // because the value was discarded due to loss of the hash store contents. | 314 // because the value was discarded due to loss of the hash store contents. |
299 EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, | 315 EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
300 pref_store_->GetValue(kProtectedAtomic, NULL)); | 316 pref_store_->GetValue(kProtectedAtomic, NULL)); |
301 EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, | 317 EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
302 WasResetRecorded()); | 318 WasResetRecorded()); |
| 319 |
| 320 ExpectValidationObserved(kTrackedAtomic); |
| 321 ExpectValidationObserved(kProtectedAtomic); |
303 } | 322 } |
304 | 323 |
305 TEST_F(ProfilePrefStoreManagerTest, ResetAllPrefHashStores) { | 324 TEST_F(ProfilePrefStoreManagerTest, ResetAllPrefHashStores) { |
306 InitializePrefs(); | 325 InitializePrefs(); |
307 | 326 |
308 ProfilePrefStoreManager::ResetAllPrefHashStores(&local_state_); | 327 ProfilePrefStoreManager::ResetAllPrefHashStores(&local_state_); |
309 | 328 |
310 LoadExistingPrefs(); | 329 LoadExistingPrefs(); |
311 | 330 |
312 // kTrackedAtomic is loaded as it appears on disk. | 331 // kTrackedAtomic is loaded as it appears on disk. |
313 ExpectStringValueEquals(kTrackedAtomic, kFoobar); | 332 ExpectStringValueEquals(kTrackedAtomic, kFoobar); |
314 // If preference tracking is supported, kProtectedAtomic will be undefined | 333 // If preference tracking is supported, kProtectedAtomic will be undefined |
315 // because the value was discarded due to loss of the hash store contents. | 334 // because the value was discarded due to loss of the hash store contents. |
316 EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, | 335 EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
317 pref_store_->GetValue(kProtectedAtomic, NULL)); | 336 pref_store_->GetValue(kProtectedAtomic, NULL)); |
318 EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, | 337 EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
319 WasResetRecorded()); | 338 WasResetRecorded()); |
| 339 |
| 340 ExpectValidationObserved(kTrackedAtomic); |
| 341 ExpectValidationObserved(kProtectedAtomic); |
320 } | 342 } |
321 | 343 |
322 TEST_F(ProfilePrefStoreManagerTest, MigrateFromOneFile) { | 344 TEST_F(ProfilePrefStoreManagerTest, MigrateFromOneFile) { |
323 InitializeDeprecatedCombinedProfilePrefStore(); | 345 InitializeDeprecatedCombinedProfilePrefStore(); |
324 | 346 |
325 LoadExistingPrefs(); | 347 LoadExistingPrefs(); |
326 | 348 |
327 ExpectStringValueEquals(kTrackedAtomic, kFoobar); | 349 ExpectStringValueEquals(kTrackedAtomic, kFoobar); |
328 ExpectStringValueEquals(kProtectedAtomic, kHelloWorld); | 350 ExpectStringValueEquals(kProtectedAtomic, kHelloWorld); |
329 EXPECT_FALSE(WasResetRecorded()); | 351 EXPECT_FALSE(WasResetRecorded()); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 | 387 |
366 // Verify that InitializePrefsFromMasterPrefs correctly applied the MACs | 388 // Verify that InitializePrefsFromMasterPrefs correctly applied the MACs |
367 // necessary to authenticate these values. | 389 // necessary to authenticate these values. |
368 ExpectStringValueEquals(kTrackedAtomic, kFoobar); | 390 ExpectStringValueEquals(kTrackedAtomic, kFoobar); |
369 ExpectStringValueEquals(kProtectedAtomic, kHelloWorld); | 391 ExpectStringValueEquals(kProtectedAtomic, kHelloWorld); |
370 EXPECT_FALSE(WasResetRecorded()); | 392 EXPECT_FALSE(WasResetRecorded()); |
371 } | 393 } |
372 | 394 |
373 TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtected) { | 395 TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtected) { |
374 InitializePrefs(); | 396 InitializePrefs(); |
| 397 |
| 398 ExpectValidationObserved(kTrackedAtomic); |
| 399 ExpectValidationObserved(kProtectedAtomic); |
| 400 |
375 LoadExistingPrefs(); | 401 LoadExistingPrefs(); |
376 ExpectStringValueEquals(kUnprotectedPref, kFoobar); | 402 ExpectStringValueEquals(kUnprotectedPref, kFoobar); |
377 | 403 |
378 // Ensure everything is written out to disk. | 404 // Ensure everything is written out to disk. |
379 DestroyPrefStore(); | 405 DestroyPrefStore(); |
380 | 406 |
381 ReplaceStringInPrefs(kFoobar, kBarfoo); | 407 ReplaceStringInPrefs(kFoobar, kBarfoo); |
382 | 408 |
383 // It's unprotected, so we can load the modified value. | 409 // It's unprotected, so we can load the modified value. |
384 LoadExistingPrefs(); | 410 LoadExistingPrefs(); |
(...skipping 23 matching lines...) Expand all Loading... |
408 LoadExistingPrefs(); | 434 LoadExistingPrefs(); |
409 EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, | 435 EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
410 pref_store_->GetValue(kUnprotectedPref, NULL)); | 436 pref_store_->GetValue(kUnprotectedPref, NULL)); |
411 EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, | 437 EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
412 WasResetRecorded()); | 438 WasResetRecorded()); |
413 } | 439 } |
414 | 440 |
415 TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtectedWithoutTrust) { | 441 TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtectedWithoutTrust) { |
416 InitializePrefs(); | 442 InitializePrefs(); |
417 | 443 |
| 444 ExpectValidationObserved(kTrackedAtomic); |
| 445 ExpectValidationObserved(kProtectedAtomic); |
| 446 |
418 // Now update the configuration to protect it. | 447 // Now update the configuration to protect it. |
419 PrefHashFilter::TrackedPreferenceMetadata new_protected = { | 448 PrefHashFilter::TrackedPreferenceMetadata new_protected = { |
420 kExtraReportingId, kUnprotectedPref, PrefHashFilter::ENFORCE_ON_LOAD, | 449 kExtraReportingId, kUnprotectedPref, PrefHashFilter::ENFORCE_ON_LOAD, |
421 PrefHashFilter::TRACKING_STRATEGY_ATOMIC}; | 450 PrefHashFilter::TRACKING_STRATEGY_ATOMIC}; |
422 configuration_.push_back(new_protected); | 451 configuration_.push_back(new_protected); |
423 ReloadConfiguration(); | 452 ReloadConfiguration(); |
424 ProfilePrefStoreManager::ResetAllPrefHashStores(&local_state_); | 453 ProfilePrefStoreManager::ResetAllPrefHashStores(&local_state_); |
425 | 454 |
426 // And try loading with the new configuration. | 455 // And try loading with the new configuration. |
427 LoadExistingPrefs(); | 456 LoadExistingPrefs(); |
428 | 457 |
429 // If preference tracking is supported, kUnprotectedPref will have been | 458 // If preference tracking is supported, kUnprotectedPref will have been |
430 // discarded because new values are not accepted without a valid super MAC. | 459 // discarded because new values are not accepted without a valid super MAC. |
431 EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, | 460 EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
432 pref_store_->GetValue(kUnprotectedPref, NULL)); | 461 pref_store_->GetValue(kUnprotectedPref, NULL)); |
433 EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, | 462 EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
434 WasResetRecorded()); | 463 WasResetRecorded()); |
435 } | 464 } |
436 | 465 |
437 // This test verifies that preference values are correctly maintained when a | 466 // This test verifies that preference values are correctly maintained when a |
438 // preference's protection state changes from protected to unprotected. | 467 // preference's protection state changes from protected to unprotected. |
439 TEST_F(ProfilePrefStoreManagerTest, ProtectedToUnprotected) { | 468 TEST_F(ProfilePrefStoreManagerTest, ProtectedToUnprotected) { |
440 InitializePrefs(); | 469 InitializePrefs(); |
| 470 |
| 471 ExpectValidationObserved(kTrackedAtomic); |
| 472 ExpectValidationObserved(kProtectedAtomic); |
| 473 |
441 DestroyPrefStore(); | 474 DestroyPrefStore(); |
442 | 475 |
443 // Unconfigure protection for kProtectedAtomic | 476 // Unconfigure protection for kProtectedAtomic |
444 for (std::vector<PrefHashFilter::TrackedPreferenceMetadata>::iterator it = | 477 for (std::vector<PrefHashFilter::TrackedPreferenceMetadata>::iterator it = |
445 configuration_.begin(); | 478 configuration_.begin(); |
446 it != configuration_.end(); | 479 it != configuration_.end(); |
447 ++it) { | 480 ++it) { |
448 if (it->name == kProtectedAtomic) { | 481 if (it->name == kProtectedAtomic) { |
449 it->enforcement_level = PrefHashFilter::NO_ENFORCEMENT; | 482 it->enforcement_level = PrefHashFilter::NO_ENFORCEMENT; |
450 break; | 483 break; |
(...skipping 15 matching lines...) Expand all Loading... |
466 LoadExistingPrefs(); | 499 LoadExistingPrefs(); |
467 ExpectStringValueEquals(kProtectedAtomic, kHelloWorld); | 500 ExpectStringValueEquals(kProtectedAtomic, kHelloWorld); |
468 | 501 |
469 // Trigger the logic that migrates it back to the unprotected preferences | 502 // Trigger the logic that migrates it back to the unprotected preferences |
470 // file. | 503 // file. |
471 pref_store_->SetValue(kProtectedAtomic, new base::StringValue(kGoodbyeWorld)); | 504 pref_store_->SetValue(kProtectedAtomic, new base::StringValue(kGoodbyeWorld)); |
472 LoadExistingPrefs(); | 505 LoadExistingPrefs(); |
473 ExpectStringValueEquals(kProtectedAtomic, kGoodbyeWorld); | 506 ExpectStringValueEquals(kProtectedAtomic, kGoodbyeWorld); |
474 EXPECT_FALSE(WasResetRecorded()); | 507 EXPECT_FALSE(WasResetRecorded()); |
475 } | 508 } |
OLD | NEW |