Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <string> | |
| 6 | |
| 7 #include "base/command_line.h" | |
| 8 #include "base/file_util.h" | |
| 9 #include "base/files/file_path.h" | |
| 10 #include "base/json/json_file_value_serializer.h" | |
| 11 #include "base/metrics/histogram_base.h" | |
| 12 #include "base/metrics/histogram_samples.h" | |
| 13 #include "base/metrics/statistics_recorder.h" | |
| 14 #include "base/path_service.h" | |
| 15 #include "base/prefs/pref_service.h" | |
| 16 #include "base/strings/string_number_conversions.h" | |
| 17 #include "base/strings/string_util.h" | |
| 18 #include "base/values.h" | |
| 19 #include "build/build_config.h" | |
| 20 #include "chrome/browser/extensions/extension_browsertest.h" | |
| 21 #include "chrome/browser/extensions/extension_service.h" | |
| 22 #include "chrome/browser/prefs/chrome_pref_service_factory.h" | |
| 23 #include "chrome/browser/prefs/profile_pref_store_manager.h" | |
| 24 #include "chrome/browser/prefs/session_startup_pref.h" | |
| 25 #include "chrome/browser/profiles/profile.h" | |
| 26 #include "chrome/browser/ui/browser.h" | |
| 27 #include "chrome/common/chrome_constants.h" | |
| 28 #include "chrome/common/chrome_paths.h" | |
| 29 #include "chrome/common/pref_names.h" | |
| 30 #include "chrome/test/base/testing_profile.h" | |
| 31 #include "components/search_engines/default_search_manager.h" | |
| 32 #include "content/public/common/content_switches.h" | |
| 33 | |
| 34 #if defined(OS_CHROMEOS) | |
| 35 #include "chromeos/chromeos_switches.h" | |
| 36 #endif | |
| 37 | |
| 38 namespace { | |
| 39 | |
| 40 // Extension ID of chrome/test/data/extensions/good.crx | |
| 41 const char kGoodCrxId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; | |
| 42 | |
| 43 // Returns the number of times |histogram_name| was reported so far; adding the | |
| 44 // results of the first 100 buckets (there are only ~18 reporting IDs as of this | |
| 45 // writing; varies depending on the platform). If |expect_zero| is true, this | |
| 46 // method will explicitly report IDs that are non-zero for ease of diagnosis. | |
| 47 int GetTrackedPrefHistogramCount(const char* histogram_name, bool expect_zero) { | |
| 48 const base::HistogramBase* histogram = | |
| 49 base::StatisticsRecorder::FindHistogram(histogram_name); | |
| 50 if (!histogram) | |
| 51 return 0; | |
| 52 | |
| 53 scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples()); | |
| 54 int sum = 0; | |
| 55 for (int i = 0; i < 18; ++i) { | |
| 56 int count_for_id = samples->GetCount(i); | |
| 57 sum += count_for_id; | |
| 58 | |
| 59 //FIXME needed?! | |
| 60 // FIXME use size_t for return value here? | |
| 61 if (expect_zero) | |
| 62 EXPECT_EQ(0, count_for_id) << "Faulty reporting_id: " << i; | |
|
gab
2014/07/31 13:19:14
Please ignore this for now.
I'm using it for debu
| |
| 63 } | |
| 64 return sum; | |
| 65 } | |
| 66 | |
| 67 base::DictionaryValue* ReadPrefsDictionary( | |
| 68 JSONFileValueSerializer* serializer) { | |
| 69 int error_code = JSONFileValueSerializer::JSON_NO_ERROR; | |
| 70 std::string error_str; | |
| 71 base::Value* prefs = serializer->Deserialize(&error_code, &error_str); | |
| 72 if (!prefs || error_code != JSONFileValueSerializer::JSON_NO_ERROR) { | |
| 73 ADD_FAILURE() << "Error #" << error_code << ": " << error_str; | |
| 74 return NULL; | |
| 75 } | |
| 76 if (!prefs->IsType(base::Value::TYPE_DICTIONARY)) { | |
| 77 ADD_FAILURE(); | |
| 78 return NULL; | |
| 79 } | |
| 80 return static_cast<base::DictionaryValue*>(prefs); | |
| 81 } | |
| 82 | |
| 83 #define PREF_HASH_BROWSER_TEST(fixture, test_name) \ | |
| 84 IN_PROC_BROWSER_TEST_P(fixture, PRE_##test_name) { \ | |
| 85 SetupPreferences(); \ | |
| 86 } \ | |
| 87 IN_PROC_BROWSER_TEST_P(fixture, test_name) { \ | |
| 88 VerifyReactionToPrefAttack(); \ | |
| 89 } \ | |
| 90 INSTANTIATE_TEST_CASE_P( \ | |
| 91 fixture##Instance, \ | |
| 92 fixture, \ | |
| 93 testing::Values( \ | |
| 94 chrome_prefs::internals::kSettingsEnforcementGroupNoEnforcement, \ | |
| 95 chrome_prefs::internals::kSettingsEnforcementGroupEnforceAlways, \ | |
| 96 chrome_prefs::internals:: \ | |
| 97 kSettingsEnforcementGroupEnforceAlwaysWithDSE, \ | |
| 98 chrome_prefs::internals:: \ | |
| 99 kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE)); | |
| 100 | |
| 101 // A base fixture designed such that implementations do two things: | |
| 102 // 1) Override all three pure-virtual methods below to setup, attack, and | |
| 103 // verify preferenes throughout the tests provided by this fixture. | |
| 104 // 2) Instantiate their test via the PREF_HASH_BROWSER_TEST macro above. | |
| 105 // Based on top of ExtensionBrowserTest to allow easy interaction with the | |
| 106 // ExtensionService. | |
| 107 class PrefHashBrowserTestBase | |
| 108 : public ExtensionBrowserTest, | |
| 109 public testing::WithParamInterface<std::string> { | |
| 110 public: | |
| 111 // List of potential protection levels for this test in strict increasing | |
| 112 // order of protection levels. | |
| 113 enum SettingsProtectionLevel { | |
| 114 PROTECTION_DISABLED_ON_PLATFORM, | |
| 115 PROTECTION_DISABLED_FOR_GROUP, | |
| 116 PROTECTION_ENABLED_BASIC, | |
| 117 PROTECTION_ENABLED_DSE, | |
| 118 PROTECTION_ENABLED_EXTENSIONS, | |
| 119 }; | |
| 120 | |
| 121 PrefHashBrowserTestBase() | |
| 122 : protection_level_(PROTECTION_DISABLED_ON_PLATFORM) { | |
| 123 if (ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking) { | |
| 124 const std::string& experiment_group = GetParam(); | |
| 125 if (experiment_group == | |
| 126 chrome_prefs::internals::kSettingsEnforcementGroupNoEnforcement) { | |
| 127 protection_level_ = PROTECTION_DISABLED_FOR_GROUP; | |
| 128 } else if (experiment_group == | |
| 129 chrome_prefs::internals:: | |
| 130 kSettingsEnforcementGroupEnforceAlways) { | |
| 131 protection_level_ = PROTECTION_ENABLED_BASIC; | |
| 132 } else if (experiment_group == | |
| 133 chrome_prefs::internals:: | |
| 134 kSettingsEnforcementGroupEnforceAlwaysWithDSE) { | |
| 135 protection_level_ = PROTECTION_ENABLED_DSE; | |
| 136 } else if (experiment_group == | |
| 137 chrome_prefs::internals:: | |
| 138 kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE) { | |
| 139 protection_level_ = PROTECTION_ENABLED_EXTENSIONS; | |
| 140 } else { | |
| 141 ADD_FAILURE(); | |
| 142 } | |
| 143 } | |
| 144 } | |
| 145 | |
| 146 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | |
| 147 ExtensionBrowserTest::SetUpCommandLine(command_line); | |
| 148 EXPECT_FALSE(command_line->HasSwitch(switches::kForceFieldTrials)); | |
| 149 command_line->AppendSwitchASCII( | |
| 150 switches::kForceFieldTrials, | |
| 151 std::string(chrome_prefs::internals::kSettingsEnforcementTrialName) + | |
| 152 "/" + GetParam() + "/"); | |
| 153 #if defined(OS_CHROMEOS) | |
| 154 command_line->AppendSwitch( | |
| 155 chromeos::switches::kIgnoreUserProfileMappingForTests); | |
| 156 #endif | |
| 157 } | |
| 158 | |
| 159 virtual bool SetUpUserDataDirectory() OVERRIDE { | |
| 160 // Do the normal setup in the PRE test and attack preferences in the main | |
| 161 // test. | |
| 162 if (IsPRETest()) | |
| 163 return ExtensionBrowserTest::SetUpUserDataDirectory(); | |
| 164 | |
| 165 base::FilePath profile_dir; | |
| 166 EXPECT_TRUE(PathService::Get(chrome::DIR_USER_DATA, &profile_dir)); | |
| 167 profile_dir = profile_dir.AppendASCII(TestingProfile::kTestUserProfileDir); | |
| 168 | |
| 169 AttackPreferencesOnDisk(profile_dir); | |
| 170 | |
| 171 return true; | |
| 172 } | |
| 173 | |
| 174 // In the PRE_ test, find the number of tracked preferences that were | |
| 175 // initialized and save it to a file to be read back in the main test and used | |
| 176 // as the total number of tracked preferences. | |
| 177 virtual void SetUpOnMainThread() OVERRIDE { | |
| 178 ExtensionBrowserTest::SetUpOnMainThread(); | |
| 179 | |
| 180 // File in which the PRE_ test will save the number of tracked preferences | |
| 181 // on this platform. | |
| 182 const char kNumTrackedPrefFilename[] = "NumTrackedPrefs"; | |
| 183 | |
| 184 base::FilePath num_tracked_prefs_file; | |
| 185 ASSERT_TRUE( | |
| 186 PathService::Get(chrome::DIR_USER_DATA, &num_tracked_prefs_file)); | |
| 187 num_tracked_prefs_file = | |
| 188 num_tracked_prefs_file.AppendASCII(kNumTrackedPrefFilename); | |
| 189 | |
| 190 if (IsPRETest()) { | |
| 191 num_tracked_prefs_ = GetTrackedPrefHistogramCount( | |
| 192 "Settings.TrackedPreferenceTrustedInitialized", false); | |
| 193 EXPECT_EQ(protection_level_ > PROTECTION_DISABLED_ON_PLATFORM, | |
| 194 num_tracked_prefs_ > 0); | |
| 195 | |
| 196 // Split tracked prefs are reported as Unchanged not as TrustedInitialized | |
| 197 // when an empty dictionary is encountered on first run. | |
| 198 int num_split_tracked_prefs = GetTrackedPrefHistogramCount( | |
| 199 "Settings.TrackedPreferenceUnchanged", false); | |
| 200 EXPECT_EQ(protection_level_ > PROTECTION_DISABLED_ON_PLATFORM ? 1 : 0, | |
| 201 num_split_tracked_prefs); | |
| 202 | |
| 203 num_tracked_prefs_ += num_split_tracked_prefs; | |
| 204 | |
| 205 std::string num_tracked_prefs_str = base::IntToString(num_tracked_prefs_); | |
| 206 EXPECT_EQ(num_tracked_prefs_str.size(), | |
| 207 base::WriteFile(num_tracked_prefs_file, | |
| 208 num_tracked_prefs_str.c_str(), | |
| 209 num_tracked_prefs_str.size())); | |
| 210 } else { | |
| 211 std::string num_tracked_prefs_str; | |
| 212 EXPECT_TRUE(base::ReadFileToString(num_tracked_prefs_file, | |
| 213 &num_tracked_prefs_str)); | |
| 214 EXPECT_TRUE( | |
| 215 base::StringToInt(num_tracked_prefs_str, &num_tracked_prefs_)); | |
| 216 } | |
| 217 } | |
| 218 | |
| 219 protected: | |
| 220 // Called from the PRE_ test's body. Overrides should use it to setup | |
| 221 // preferences through Chrome. | |
| 222 virtual void SetupPreferences() = 0; | |
| 223 | |
| 224 // Called prior to the main test launching its browser. Overrides should use | |
| 225 // it to attack preferences in |profile_dir| on disk. | |
| 226 virtual void AttackPreferencesOnDisk(const base::FilePath& profile_dir) = 0; | |
| 227 | |
| 228 // Called from the body of the main test. Overrides should use it to verify | |
| 229 // that the browser had the desired reaction when faced when the attack | |
| 230 // orchestrated in AttackPreferencesOnDisk(). | |
| 231 virtual void VerifyReactionToPrefAttack() = 0; | |
| 232 | |
| 233 int num_tracked_prefs_; | |
| 234 | |
| 235 SettingsProtectionLevel protection_level_; | |
| 236 | |
| 237 private: | |
| 238 // Returns true if this is the PRE_ phase of the test. | |
| 239 bool IsPRETest() { | |
| 240 return StartsWithASCII( | |
| 241 testing::UnitTest::GetInstance()->current_test_info()->name(), | |
| 242 "PRE_", | |
| 243 true /* case_sensitive */); | |
| 244 } | |
| 245 }; | |
| 246 | |
| 247 } // namespace | |
| 248 | |
| 249 // Verifies that nothing is reset when nothing is tampered with. | |
| 250 // Also sanity checks that the expected preferences files are in place. | |
| 251 class PrefHashBrowserTestUnchangedDefault : public PrefHashBrowserTestBase { | |
| 252 public: | |
| 253 virtual void SetupPreferences() OVERRIDE { | |
| 254 // Default Chrome setup. | |
| 255 } | |
| 256 | |
| 257 virtual void AttackPreferencesOnDisk( | |
| 258 const base::FilePath& profile_dir) OVERRIDE { | |
| 259 // No attack, just sanity check pref setup on disk. | |
| 260 EXPECT_TRUE( | |
| 261 base::PathExists(profile_dir.Append(chrome::kPreferencesFilename))); | |
| 262 EXPECT_FALSE(base::PathExists( | |
| 263 profile_dir.Append(chrome::kProtectedPreferencesFilenameDeprecated))); | |
| 264 EXPECT_TRUE(base::PathExists( | |
| 265 profile_dir.Append(chrome::kSecurePreferencesFilename))); | |
| 266 } | |
| 267 | |
| 268 virtual void VerifyReactionToPrefAttack() OVERRIDE { | |
| 269 // Expect all prefs to be reported as Unchanged with no resets. | |
| 270 EXPECT_EQ(num_tracked_prefs_, | |
| 271 GetTrackedPrefHistogramCount( | |
| 272 "Settings.TrackedPreferenceUnchanged", false)); | |
| 273 EXPECT_EQ(0, | |
| 274 GetTrackedPrefHistogramCount( | |
| 275 "Settings.TrackedPreferenceWantedReset", true)); | |
| 276 EXPECT_EQ( | |
| 277 0, | |
| 278 GetTrackedPrefHistogramCount("Settings.TrackedPreferenceReset", true)); | |
| 279 | |
| 280 // Nothing else should have triggered. | |
| 281 EXPECT_EQ(0, | |
| 282 GetTrackedPrefHistogramCount("Settings.TrackedPreferenceChanged", | |
| 283 true)); | |
| 284 EXPECT_EQ(0, | |
| 285 GetTrackedPrefHistogramCount("Settings.TrackedPreferenceCleared", | |
| 286 true)); | |
| 287 EXPECT_EQ(0, | |
| 288 GetTrackedPrefHistogramCount( | |
| 289 "Settings.TrackedPreferenceInitialized", true)); | |
| 290 EXPECT_EQ(0, | |
| 291 GetTrackedPrefHistogramCount( | |
| 292 "Settings.TrackedPreferenceTrustedInitialized", true)); | |
| 293 EXPECT_EQ(0, | |
| 294 GetTrackedPrefHistogramCount( | |
| 295 "Settings.TrackedPreferenceMigratedLegacyDeviceId", true)); | |
| 296 } | |
| 297 }; | |
| 298 | |
| 299 PREF_HASH_BROWSER_TEST(PrefHashBrowserTestUnchangedDefault, UnchangedDefault); | |
| 300 | |
| 301 // Augments PrefHashBrowserTestUnchangedDefault to confirm that nothing is reset | |
| 302 // when nothing is tampered with, even if Chrome itself wrote custom prefs in | |
| 303 // its last run. | |
| 304 class PrefHashBrowserTestUnchangedCustom | |
| 305 : public PrefHashBrowserTestUnchangedDefault { | |
| 306 public: | |
| 307 virtual void SetupPreferences() OVERRIDE { | |
| 308 profile()->GetPrefs()->SetString(prefs::kHomePage, "http://example.com"); | |
| 309 | |
| 310 InstallExtensionWithUIAutoConfirm( | |
| 311 test_data_dir_.AppendASCII("good.crx"), 1, browser()); | |
| 312 } | |
| 313 | |
| 314 virtual void VerifyReactionToPrefAttack() OVERRIDE { | |
| 315 // Make sure the settings written in the last run stuck. | |
| 316 EXPECT_EQ("http://example.com", | |
| 317 profile()->GetPrefs()->GetString(prefs::kHomePage)); | |
| 318 | |
| 319 EXPECT_TRUE(extension_service()->GetExtensionById(kGoodCrxId, false)); | |
| 320 | |
| 321 // Reaction should be identical to unattacked default prefs. | |
| 322 PrefHashBrowserTestUnchangedDefault::VerifyReactionToPrefAttack(); | |
| 323 } | |
| 324 }; | |
| 325 | |
| 326 PREF_HASH_BROWSER_TEST(PrefHashBrowserTestUnchangedCustom, UnchangedCustom); | |
| 327 | |
| 328 // Verifies that cleared prefs are reported. | |
| 329 class PrefHashBrowserTestClearedAtomic : public PrefHashBrowserTestBase { | |
| 330 public: | |
| 331 virtual void SetupPreferences() OVERRIDE { | |
| 332 profile()->GetPrefs()->SetString(prefs::kHomePage, "http://example.com"); | |
| 333 } | |
| 334 | |
| 335 virtual void AttackPreferencesOnDisk( | |
| 336 const base::FilePath& profile_dir) OVERRIDE { | |
| 337 JSONFileValueSerializer serializer( | |
|
erikwright (departed)
2014/07/31 14:38:26
Presumably this stanza will appear frequently.
Wh
gab
2014/07/31 19:14:16
Great idea, done (didn't use scoped_ptr*'s in the
| |
| 338 profile_dir.Append(protection_level_ >= PROTECTION_ENABLED_BASIC | |
| 339 ? chrome::kSecurePreferencesFilename | |
| 340 : chrome::kPreferencesFilename)); | |
| 341 | |
| 342 base::DictionaryValue* prefs = ReadPrefsDictionary(&serializer); | |
| 343 EXPECT_TRUE(prefs->Remove(prefs::kHomePage, NULL)); | |
| 344 EXPECT_TRUE(serializer.Serialize(*prefs)); | |
| 345 } | |
| 346 | |
| 347 virtual void VerifyReactionToPrefAttack() OVERRIDE { | |
| 348 // The clearance of homepage should have been noticed, but shouldn't have | |
| 349 // triggered a reset (as there is nothing we can do when the pref is already | |
| 350 // gone). | |
| 351 EXPECT_EQ(1, | |
| 352 GetTrackedPrefHistogramCount("Settings.TrackedPreferenceCleared", | |
| 353 false)); | |
| 354 EXPECT_EQ(num_tracked_prefs_ - 1, | |
| 355 GetTrackedPrefHistogramCount( | |
| 356 "Settings.TrackedPreferenceUnchanged", false)); | |
| 357 EXPECT_EQ(0, | |
| 358 GetTrackedPrefHistogramCount( | |
| 359 "Settings.TrackedPreferenceWantedReset", true)); | |
| 360 EXPECT_EQ( | |
| 361 0, | |
| 362 GetTrackedPrefHistogramCount("Settings.TrackedPreferenceReset", true)); | |
| 363 | |
| 364 // Nothing else should have triggered. | |
| 365 EXPECT_EQ(0, | |
| 366 GetTrackedPrefHistogramCount("Settings.TrackedPreferenceChanged", | |
| 367 true)); | |
| 368 EXPECT_EQ(0, | |
| 369 GetTrackedPrefHistogramCount( | |
| 370 "Settings.TrackedPreferenceInitialized", true)); | |
| 371 EXPECT_EQ(0, | |
| 372 GetTrackedPrefHistogramCount( | |
| 373 "Settings.TrackedPreferenceTrustedInitialized", true)); | |
| 374 EXPECT_EQ(0, | |
| 375 GetTrackedPrefHistogramCount( | |
| 376 "Settings.TrackedPreferenceMigratedLegacyDeviceId", true)); | |
| 377 } | |
| 378 }; | |
| 379 | |
| 380 PREF_HASH_BROWSER_TEST(PrefHashBrowserTestClearedAtomic, ClearedAtomic); | |
| 381 | |
| 382 // Verifies that clearing the MACs results in untrusted Initialized pings for | |
| 383 // non-null protected prefs. | |
| 384 class PrefHashBrowserTestUntrustedInitialized : public PrefHashBrowserTestBase { | |
| 385 public: | |
| 386 virtual void SetupPreferences() OVERRIDE { | |
| 387 // Explicitly set the DSE (it's otherwise NULL by default, preventing | |
| 388 // thorough testing of the PROTECTION_ENABLED_DSE level). | |
| 389 DefaultSearchManager default_search_manager( | |
| 390 profile()->GetPrefs(), DefaultSearchManager::ObserverCallback()); | |
| 391 DefaultSearchManager::Source dse_source = | |
| 392 static_cast<DefaultSearchManager::Source>(-1); | |
| 393 | |
| 394 const TemplateURLData* default_template_url_data = | |
| 395 default_search_manager.GetDefaultSearchEngine(&dse_source); | |
| 396 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, dse_source); | |
| 397 | |
| 398 default_search_manager.SetUserSelectedDefaultSearchEngine( | |
| 399 *default_template_url_data); | |
| 400 | |
| 401 default_search_manager.GetDefaultSearchEngine(&dse_source); | |
| 402 EXPECT_EQ(DefaultSearchManager::FROM_USER, dse_source); | |
| 403 | |
| 404 // Also explicitly set an atomic pref that falls under | |
| 405 // PROTECTION_ENABLED_BASIC. | |
| 406 profile()->GetPrefs()->SetInteger(prefs::kRestoreOnStartup, | |
| 407 SessionStartupPref::URLS); | |
| 408 } | |
| 409 | |
| 410 virtual void AttackPreferencesOnDisk( | |
| 411 const base::FilePath& profile_dir) OVERRIDE { | |
| 412 static const base::FilePath::CharType* kPrefFiles[] = { | |
| 413 chrome::kPreferencesFilename, chrome::kSecurePreferencesFilename}; | |
| 414 for (size_t i = 0; i < arraysize(kPrefFiles); ++i) { | |
| 415 JSONFileValueSerializer serializer(profile_dir.Append(kPrefFiles[i])); | |
| 416 base::DictionaryValue* prefs = ReadPrefsDictionary(&serializer); | |
| 417 EXPECT_TRUE(prefs->Remove("protection.macs", NULL)); | |
| 418 EXPECT_TRUE(serializer.Serialize(*prefs)); | |
| 419 } | |
| 420 } | |
| 421 | |
| 422 virtual void VerifyReactionToPrefAttack() OVERRIDE { | |
| 423 // Preferences that are NULL by default will be TrustedInitialized. | |
| 424 int num_null_values = GetTrackedPrefHistogramCount( | |
| 425 "Settings.TrackedPreferenceTrustedInitialized", false); | |
| 426 EXPECT_EQ(protection_level_ > PROTECTION_DISABLED_ON_PLATFORM, | |
| 427 num_null_values > 0); | |
| 428 if (num_null_values > 0) { | |
| 429 // This test requires that at least 3 prefs be non-null (extensions, DSE, | |
| 430 // and 1 atomic pref explictly set for this test above). | |
| 431 EXPECT_LT(num_null_values, num_tracked_prefs_ - 3); | |
| 432 } | |
| 433 | |
| 434 // Expect all non-null prefs to be reported as Initialized (with | |
| 435 // accompanying resets or wanted resets based on the current protection | |
| 436 // level). | |
| 437 EXPECT_EQ(num_tracked_prefs_ - num_null_values, | |
| 438 GetTrackedPrefHistogramCount( | |
| 439 "Settings.TrackedPreferenceInitialized", false)); | |
| 440 | |
| 441 int num_protected_prefs = 0; | |
| 442 // A switch statement falling through each protection level in decreasing | |
| 443 // levels of protection to add expectations for each level which augments | |
| 444 // the previous one. | |
| 445 switch (protection_level_) { | |
| 446 case PROTECTION_ENABLED_EXTENSIONS: | |
| 447 ++num_protected_prefs; | |
| 448 // Falls through. | |
| 449 case PROTECTION_ENABLED_DSE: | |
| 450 ++num_protected_prefs; | |
| 451 // Falls through. | |
| 452 case PROTECTION_ENABLED_BASIC: | |
| 453 num_protected_prefs += num_tracked_prefs_ - num_null_values - 2; | |
| 454 // Falls through. | |
| 455 case PROTECTION_DISABLED_FOR_GROUP: | |
| 456 // No protection. Falls through. | |
| 457 case PROTECTION_DISABLED_ON_PLATFORM: | |
| 458 // No protection. | |
| 459 break; | |
| 460 } | |
| 461 | |
| 462 EXPECT_EQ(num_tracked_prefs_ - num_null_values - num_protected_prefs, | |
| 463 GetTrackedPrefHistogramCount( | |
| 464 "Settings.TrackedPreferenceWantedReset", false)); | |
| 465 EXPECT_EQ( | |
| 466 num_protected_prefs, | |
| 467 GetTrackedPrefHistogramCount("Settings.TrackedPreferenceReset", false)); | |
| 468 | |
| 469 DefaultSearchManager default_search_manager( | |
| 470 profile()->GetPrefs(), DefaultSearchManager::ObserverCallback()); | |
| 471 DefaultSearchManager::Source dse_source = | |
| 472 static_cast<DefaultSearchManager::Source>(-1); | |
| 473 default_search_manager.GetDefaultSearchEngine(&dse_source); | |
| 474 EXPECT_EQ(protection_level_ < PROTECTION_ENABLED_DSE | |
| 475 ? DefaultSearchManager::FROM_USER | |
| 476 : DefaultSearchManager::FROM_FALLBACK, | |
| 477 dse_source); | |
| 478 | |
| 479 EXPECT_EQ(protection_level_ < PROTECTION_ENABLED_BASIC, | |
| 480 profile()->GetPrefs()->GetInteger(prefs::kRestoreOnStartup) == | |
| 481 SessionStartupPref::URLS); | |
| 482 | |
| 483 // Nothing else should have triggered. | |
| 484 EXPECT_EQ(0, | |
| 485 GetTrackedPrefHistogramCount( | |
| 486 "Settings.TrackedPreferenceUnchanged", true)); | |
| 487 EXPECT_EQ(0, | |
| 488 GetTrackedPrefHistogramCount("Settings.TrackedPreferenceChanged", | |
| 489 true)); | |
| 490 EXPECT_EQ(0, | |
| 491 GetTrackedPrefHistogramCount("Settings.TrackedPreferenceCleared", | |
| 492 true)); | |
| 493 EXPECT_EQ(0, | |
| 494 GetTrackedPrefHistogramCount( | |
| 495 "Settings.TrackedPreferenceMigratedLegacyDeviceId", true)); | |
| 496 } | |
| 497 }; | |
| 498 | |
| 499 PREF_HASH_BROWSER_TEST(PrefHashBrowserTestUntrustedInitialized, | |
| 500 UntrustedInitialized); | |
| OLD | NEW |