Index: chrome/browser/prefs/pref_hash_browsertest.cc |
diff --git a/chrome/browser/prefs/pref_hash_browsertest.cc b/chrome/browser/prefs/pref_hash_browsertest.cc |
index 1bcc0fd27f0f47d50d9bc44bf6841c8bc2a20d3f..b99ed7216bd03cf7de000375c192257d3c080711 100644 |
--- a/chrome/browser/prefs/pref_hash_browsertest.cc |
+++ b/chrome/browser/prefs/pref_hash_browsertest.cc |
@@ -7,11 +7,16 @@ |
#include "base/bind.h" |
#include "base/files/file_path.h" |
+#include "base/macros.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/metrics/histogram_base.h" |
+#include "base/metrics/histogram_samples.h" |
+#include "base/metrics/statistics_recorder.h" |
#include "base/prefs/pref_service.h" |
#include "base/strings/string16.h" |
#include "base/values.h" |
#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/prefs/pref_hash_store.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/profiles/profile_impl.h" |
#include "chrome/browser/profiles/profile_info_cache.h" |
@@ -58,6 +63,28 @@ base::FilePath GetUnloadedProfilePath() { |
return base::FilePath(); |
} |
+// Returns the number of times |histogram_name| was reported so far; adding the |
+// results of the first 100 buckets (there are only ~14 reporting IDs as of this |
+// writting; varies depending on the platform). If |expect_zero| is true, this |
+// method will explicitly report IDs that are non-zero for ease of diagnosis. |
+int GetTrackedPrefHistogramCount(const char* histogram_name, bool expect_zero) { |
+ const base::HistogramBase* histogram = |
+ base::StatisticsRecorder::FindHistogram(histogram_name); |
+ if (!histogram) |
+ return 0; |
+ |
+ scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples()); |
+ int sum = 0; |
+ for (int i = 0; i < 100; ++i) { |
+ int count_for_id = samples->GetCount(i); |
+ sum += count_for_id; |
+ |
+ if (expect_zero) |
+ EXPECT_EQ(0, count_for_id) << "Faulty reporting_id: " << i; |
+ } |
+ return sum; |
+} |
+ |
} // namespace |
typedef InProcessBrowserTest PrefHashBrowserTest; |
@@ -83,6 +110,13 @@ IN_PROC_BROWSER_TEST_F(PrefHashBrowserTest, |
// Spin to allow profile creation to take place, loop is terminated |
// by OnUnblockOnProfileCreation when the profile is created. |
runner->Run(); |
+ |
+ // No profile should have gone through the unloaded profile initialization in |
+ // this phase as both profiles should have been loaded normally. |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferencesInitializedForUnloadedProfile", |
+ true)); |
} |
IN_PROC_BROWSER_TEST_F(PrefHashBrowserTest, |
@@ -111,6 +145,15 @@ IN_PROC_BROWSER_TEST_F(PrefHashBrowserTest, |
// One of the profile hash collections should be gone. |
ASSERT_EQ(2U, hashes->size()); |
+ |
+ // No profile should have gone through the unloaded profile initialization in |
+ // this phase as both profiles were already initialized at the beginning of |
+ // this phase (resetting the unloaded profile's PrefHashStore should only |
+ // force initialization in the next phase's startup). |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferencesInitializedForUnloadedProfile", |
+ true)); |
} |
IN_PROC_BROWSER_TEST_F(PrefHashBrowserTest, |
@@ -125,13 +168,65 @@ IN_PROC_BROWSER_TEST_F(PrefHashBrowserTest, |
// The deleted hash collection should be restored. |
ASSERT_EQ(3U, hashes->size()); |
+ // Verify that the initialization truly did occur in this phase's startup; |
+ // rather than in the previous phase's shutdown. |
+ EXPECT_EQ( |
+ 1, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferencesInitializedForUnloadedProfile", |
+ false)); |
+ |
ProfileManager* profile_manager = g_browser_process->profile_manager(); |
- const std::vector<Profile*> loaded_profiles = |
- profile_manager->GetLoadedProfiles(); |
// Verify that only one profile was loaded. We assume that the unloaded |
// profile is the same one that wasn't loaded in the last launch (i.e., it's |
// the one whose hash store we reset, and the fact that it is now restored is |
// evidence that we restored the hashes of an unloaded profile.). |
- ASSERT_EQ(1U, loaded_profiles.size()); |
+ ASSERT_EQ(1U, profile_manager->GetLoadedProfiles().size()); |
+ |
+ // Loading the first profile should only have produced unchanged reports. |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferenceChanged", true)); |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferenceCleared", true)); |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferenceInitialized", true)); |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferenceTrustedInitialized", true)); |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferenceMigrated", true)); |
+ int initial_unchanged_count = |
+ GetTrackedPrefHistogramCount("Settings.TrackedPreferenceUnchanged", |
+ false); |
+ EXPECT_GT(initial_unchanged_count, 0); |
+ |
+ // Explicitly load the unloaded profile. |
+ profile_manager->GetProfile(GetUnloadedProfilePath()); |
+ ASSERT_EQ(2U, profile_manager->GetLoadedProfiles().size()); |
+ |
+ // Loading the unexpected profile should only generate unchanged pings; and |
+ // should have produced as many of them as loading the first profile. |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferenceChanged", true)); |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferenceCleared", true)); |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferenceInitialized", true)); |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferenceTrustedInitialized", true)); |
+ EXPECT_EQ( |
+ 0, GetTrackedPrefHistogramCount( |
+ "Settings.TrackedPreferenceMigrated", true)); |
+ EXPECT_EQ( |
+ initial_unchanged_count * 2, |
+ GetTrackedPrefHistogramCount("Settings.TrackedPreferenceUnchanged", |
+ false)); |
} |