Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1552)

Unified Diff: chrome/browser/metrics/metrics_state_manager_unittest.cc

Issue 256143006: Refactor MetricsStateManager class out of MetricsService. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/metrics/metrics_state_manager_unittest.cc
===================================================================
--- chrome/browser/metrics/metrics_state_manager_unittest.cc (working copy)
+++ chrome/browser/metrics/metrics_state_manager_unittest.cc (working copy)
@@ -1,141 +1,44 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/metrics/metrics_service.h"
+#include "chrome/browser/metrics/metrics_state_manager.h"
#include <ctype.h>
#include <string>
#include "base/command_line.h"
-#include "base/threading/platform_thread.h"
+#include "base/prefs/testing_pref_service.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/common/metrics/caching_permuted_entropy_provider.h"
#include "chrome/common/pref_names.h"
-#include "chrome/test/base/scoped_testing_local_state.h"
-#include "chrome/test/base/testing_browser_process.h"
-#include "components/variations/metrics_util.h"
-#include "content/public/common/process_type.h"
-#include "content/public/common/webplugininfo.h"
-#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/size.h"
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/metrics/metrics_log_chromeos.h"
-#endif // OS_CHROMEOS
+namespace metrics {
-namespace {
-
-class TestMetricsService : public MetricsService {
+class MetricsStateManagerTest : public testing::Test {
public:
- TestMetricsService() {}
- virtual ~TestMetricsService() {}
-
- MetricsLogManager* log_manager() {
- return &log_manager_;
+ MetricsStateManagerTest() {
+ MetricsStateManager::RegisterPrefs(prefs_.registry());
}
- private:
- DISALLOW_COPY_AND_ASSIGN(TestMetricsService);
-};
-
-#if defined(OS_CHROMEOS)
-class TestMetricsLogChromeOS : public MetricsLogChromeOS {
- public:
- explicit TestMetricsLogChromeOS(
- metrics::ChromeUserMetricsExtension* uma_proto)
- : MetricsLogChromeOS(uma_proto) {
- }
-
protected:
- // Don't touch bluetooth information, as it won't be correctly initialized.
- virtual void WriteBluetoothProto() OVERRIDE {
- }
-};
-#endif // OS_CHROMEOS
+ TestingPrefServiceSimple prefs_;
-class TestMetricsLog : public MetricsLog {
- public:
- TestMetricsLog(const std::string& client_id, int session_id)
- : MetricsLog(client_id, session_id, MetricsLog::ONGOING_LOG) {
-#if defined(OS_CHROMEOS)
- metrics_log_chromeos_.reset(new TestMetricsLogChromeOS(
- MetricsLog::uma_proto()));
-#endif // OS_CHROMEOS
- }
- virtual ~TestMetricsLog() {}
-
private:
- virtual gfx::Size GetScreenSize() const OVERRIDE {
- return gfx::Size(1024, 768);
- }
-
- virtual float GetScreenDeviceScaleFactor() const OVERRIDE {
- return 1.0f;
- }
-
- virtual int GetScreenCount() const OVERRIDE {
- return 1;
- }
-
- DISALLOW_COPY_AND_ASSIGN(TestMetricsLog);
+ DISALLOW_COPY_AND_ASSIGN(MetricsStateManagerTest);
};
-class MetricsServiceTest : public testing::Test {
- public:
- MetricsServiceTest()
- : testing_local_state_(TestingBrowserProcess::GetGlobal()) {
- }
+// Ensure the ClientId is formatted as expected.
+TEST_F(MetricsStateManagerTest, ClientIdCorrectlyFormatted) {
+ MetricsStateManager state_manager(&prefs_);
+ state_manager.ForceClientIdCreation();
- virtual ~MetricsServiceTest() {
- MetricsService::SetExecutionPhase(MetricsService::UNINITIALIZED_PHASE);
- }
+ const std::string client_id = state_manager.client_id();
+ EXPECT_EQ(36U, client_id.length());
- PrefService* GetLocalState() {
- return testing_local_state_.Get();
- }
-
- // Waits until base::TimeTicks::Now() no longer equals |value|. This should
- // take between 1-15ms per the documented resolution of base::TimeTicks.
- void WaitUntilTimeChanges(const base::TimeTicks& value) {
- while (base::TimeTicks::Now() == value) {
- base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
- }
- }
-
- // Returns true if there is a synthetic trial in the given vector that matches
- // the given trial name and trial group; returns false otherwise.
- bool HasSyntheticTrial(
- const std::vector<chrome_variations::ActiveGroupId>& synthetic_trials,
- const std::string& trial_name,
- const std::string& trial_group) {
- uint32 trial_name_hash = metrics::HashName(trial_name);
- uint32 trial_group_hash = metrics::HashName(trial_group);
- for (std::vector<chrome_variations::ActiveGroupId>::const_iterator it =
- synthetic_trials.begin();
- it != synthetic_trials.end(); ++it) {
- if ((*it).name == trial_name_hash && (*it).group == trial_group_hash)
- return true;
- }
- return false;
- }
-
- private:
- content::TestBrowserThreadBundle thread_bundle_;
- ScopedTestingLocalState testing_local_state_;
-
- DISALLOW_COPY_AND_ASSIGN(MetricsServiceTest);
-};
-
-} // namespace
-
-// Ensure the ClientId is formatted as expected.
-TEST_F(MetricsServiceTest, ClientIdCorrectlyFormatted) {
- std::string clientid = MetricsService::GenerateClientID();
- EXPECT_EQ(36U, clientid.length());
-
- for (size_t i = 0; i < clientid.length(); ++i) {
- char current = clientid[i];
+ for (size_t i = 0; i < client_id.length(); ++i) {
+ char current = client_id[i];
if (i == 8 || i == 13 || i == 18 || i == 23)
EXPECT_EQ('-', current);
else
@@ -143,31 +46,40 @@
}
}
-TEST_F(MetricsServiceTest, IsPluginProcess) {
- EXPECT_TRUE(
- MetricsService::IsPluginProcess(content::PROCESS_TYPE_PLUGIN));
- EXPECT_TRUE(
- MetricsService::IsPluginProcess(content::PROCESS_TYPE_PPAPI_PLUGIN));
- EXPECT_FALSE(
- MetricsService::IsPluginProcess(content::PROCESS_TYPE_GPU));
+TEST_F(MetricsStateManagerTest, EntropySourceUsed_Low) {
+ MetricsStateManager state_manager(&prefs_);
+ state_manager.CreateEntropyProvider();
+ EXPECT_EQ(MetricsStateManager::ENTROPY_SOURCE_LOW,
+ state_manager.entropy_source_returned());
}
-TEST_F(MetricsServiceTest, LowEntropySource0NotReset) {
- MetricsService service;
+TEST_F(MetricsStateManagerTest, EntropySourceUsed_High) {
+ CommandLine::ForCurrentProcess()->AppendSwitch(
+ switches::kEnableMetricsReportingForTesting);
+ MetricsStateManager state_manager(&prefs_);
+ state_manager.CreateEntropyProvider();
+ EXPECT_EQ(MetricsStateManager::ENTROPY_SOURCE_HIGH,
+ state_manager.entropy_source_returned());
+}
+
+TEST_F(MetricsStateManagerTest, LowEntropySource0NotReset) {
+ MetricsStateManager state_manager(&prefs_);
+
// Get the low entropy source once, to initialize it.
- service.GetLowEntropySource();
+ state_manager.GetLowEntropySource();
// Now, set it to 0 and ensure it doesn't get reset.
- service.low_entropy_source_ = 0;
- EXPECT_EQ(0, service.GetLowEntropySource());
+ state_manager.low_entropy_source_ = 0;
+ EXPECT_EQ(0, state_manager.GetLowEntropySource());
// Call it another time, just to make sure.
- EXPECT_EQ(0, service.GetLowEntropySource());
+ EXPECT_EQ(0, state_manager.GetLowEntropySource());
}
-TEST_F(MetricsServiceTest, PermutedEntropyCacheClearedWhenLowEntropyReset) {
+TEST_F(MetricsStateManagerTest,
+ PermutedEntropyCacheClearedWhenLowEntropyReset) {
const PrefService::Preference* low_entropy_pref =
- GetLocalState()->FindPreference(prefs::kMetricsLowEntropySource);
+ prefs_.FindPreference(prefs::kMetricsLowEntropySource);
const char* kCachePrefName = prefs::kMetricsPermutedEntropyCache;
int low_entropy_value = -1;
@@ -175,9 +87,8 @@
{
EXPECT_TRUE(low_entropy_pref->IsDefaultValue());
- MetricsService::SetExecutionPhase(MetricsService::UNINITIALIZED_PHASE);
- MetricsService service;
- service.GetLowEntropySource();
+ MetricsStateManager state_manager(&prefs_);
+ state_manager.GetLowEntropySource();
EXPECT_FALSE(low_entropy_pref->IsDefaultValue());
EXPECT_TRUE(low_entropy_pref->GetValue()->GetAsInteger(&low_entropy_value));
@@ -187,15 +98,14 @@
// another call to GetLowEntropySource() doesn't clobber it when
// --reset-variation-state wasn't specified.
{
- GetLocalState()->SetString(kCachePrefName, "test");
+ prefs_.SetString(kCachePrefName, "test");
- MetricsService::SetExecutionPhase(MetricsService::UNINITIALIZED_PHASE);
- MetricsService service;
- service.GetLowEntropySource();
+ MetricsStateManager state_manager(&prefs_);
+ state_manager.GetLowEntropySource();
- EXPECT_EQ("test", GetLocalState()->GetString(kCachePrefName));
+ EXPECT_EQ("test", prefs_.GetString(kCachePrefName));
EXPECT_EQ(low_entropy_value,
- GetLocalState()->GetInteger(prefs::kMetricsLowEntropySource));
+ prefs_.GetInteger(prefs::kMetricsLowEntropySource));
}
// Verify that the cache does get reset if --reset-variations-state is passed.
@@ -203,212 +113,44 @@
CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kResetVariationState);
- MetricsService::SetExecutionPhase(MetricsService::UNINITIALIZED_PHASE);
- MetricsService service;
- service.GetLowEntropySource();
+ MetricsStateManager state_manager(&prefs_);
+ state_manager.GetLowEntropySource();
- EXPECT_TRUE(GetLocalState()->GetString(kCachePrefName).empty());
+ EXPECT_TRUE(prefs_.GetString(kCachePrefName).empty());
}
}
-TEST_F(MetricsServiceTest, InitialStabilityLogAfterCleanShutDown) {
- base::FieldTrialList field_trial_list(NULL);
- base::FieldTrialList::CreateFieldTrial("UMAStability", "SeparateLog");
-
- GetLocalState()->SetBoolean(prefs::kStabilityExitedCleanly, true);
-
- TestMetricsService service;
- service.InitializeMetricsRecordingState(MetricsService::REPORTING_ENABLED);
- // No initial stability log should be generated.
- EXPECT_FALSE(service.log_manager()->has_unsent_logs());
- EXPECT_FALSE(service.log_manager()->has_staged_log());
-}
-
-TEST_F(MetricsServiceTest, InitialStabilityLogAfterCrash) {
- base::FieldTrialList field_trial_list(NULL);
- base::FieldTrialList::CreateFieldTrial("UMAStability", "SeparateLog");
-
- GetLocalState()->ClearPref(prefs::kStabilityExitedCleanly);
-
- // Set up prefs to simulate restarting after a crash.
-
- // Save an existing system profile to prefs, to correspond to what would be
- // saved from a previous session.
- TestMetricsLog log("client", 1);
- log.RecordEnvironment(std::vector<content::WebPluginInfo>(),
- GoogleUpdateMetrics(),
- std::vector<chrome_variations::ActiveGroupId>());
-
- // Record stability build time and version from previous session, so that
- // stability metrics (including exited cleanly flag) won't be cleared.
- GetLocalState()->SetInt64(prefs::kStabilityStatsBuildTime,
- MetricsLog::GetBuildTime());
- GetLocalState()->SetString(prefs::kStabilityStatsVersion,
- MetricsLog::GetVersionString());
-
- GetLocalState()->SetBoolean(prefs::kStabilityExitedCleanly, false);
-
- TestMetricsService service;
- service.InitializeMetricsRecordingState(MetricsService::REPORTING_ENABLED);
-
- // The initial stability log should be generated and persisted in unsent logs.
- MetricsLogManager* log_manager = service.log_manager();
- EXPECT_TRUE(log_manager->has_unsent_logs());
- EXPECT_FALSE(log_manager->has_staged_log());
-
- // Stage the log and retrieve it.
- log_manager->StageNextLogForUpload();
- EXPECT_TRUE(log_manager->has_staged_log());
-
- metrics::ChromeUserMetricsExtension uma_log;
- EXPECT_TRUE(uma_log.ParseFromString(log_manager->staged_log_text()));
-
- EXPECT_TRUE(uma_log.has_client_id());
- EXPECT_TRUE(uma_log.has_session_id());
- EXPECT_TRUE(uma_log.has_system_profile());
- EXPECT_EQ(0, uma_log.user_action_event_size());
- EXPECT_EQ(0, uma_log.omnibox_event_size());
- EXPECT_EQ(0, uma_log.histogram_event_size());
- EXPECT_EQ(0, uma_log.profiler_event_size());
- EXPECT_EQ(0, uma_log.perf_data_size());
-
- EXPECT_EQ(1, uma_log.system_profile().stability().crash_count());
-}
-
-TEST_F(MetricsServiceTest, RegisterSyntheticTrial) {
- MetricsService service;
-
- // Add two synthetic trials and confirm that they show up in the list.
- SyntheticTrialGroup trial1(metrics::HashName("TestTrial1"),
- metrics::HashName("Group1"));
- service.RegisterSyntheticFieldTrial(trial1);
-
- SyntheticTrialGroup trial2(metrics::HashName("TestTrial2"),
- metrics::HashName("Group2"));
- service.RegisterSyntheticFieldTrial(trial2);
- // Ensure that time has advanced by at least a tick before proceeding.
- WaitUntilTimeChanges(base::TimeTicks::Now());
-
- service.log_manager_.BeginLoggingWithLog(
- new MetricsLog("clientID", 1, MetricsLog::INITIAL_STABILITY_LOG));
- // Save the time when the log was started (it's okay for this to be greater
- // than the time recorded by the above call since it's used to ensure the
- // value changes).
- const base::TimeTicks begin_log_time = base::TimeTicks::Now();
-
- std::vector<chrome_variations::ActiveGroupId> synthetic_trials;
- service.GetCurrentSyntheticFieldTrials(&synthetic_trials);
- EXPECT_EQ(2U, synthetic_trials.size());
- EXPECT_TRUE(HasSyntheticTrial(synthetic_trials, "TestTrial1", "Group1"));
- EXPECT_TRUE(HasSyntheticTrial(synthetic_trials, "TestTrial2", "Group2"));
-
- // Ensure that time has advanced by at least a tick before proceeding.
- WaitUntilTimeChanges(begin_log_time);
-
- // Change the group for the first trial after the log started.
- // TODO(asvitkine): Assumption that this is > than BeginLoggingWithLog() time.
- SyntheticTrialGroup trial3(metrics::HashName("TestTrial1"),
- metrics::HashName("Group2"));
- service.RegisterSyntheticFieldTrial(trial3);
- service.GetCurrentSyntheticFieldTrials(&synthetic_trials);
- EXPECT_EQ(1U, synthetic_trials.size());
- EXPECT_TRUE(HasSyntheticTrial(synthetic_trials, "TestTrial2", "Group2"));
-
- // Add a new trial after the log started and confirm that it doesn't show up.
- SyntheticTrialGroup trial4(metrics::HashName("TestTrial3"),
- metrics::HashName("Group3"));
- service.RegisterSyntheticFieldTrial(trial4);
- service.GetCurrentSyntheticFieldTrials(&synthetic_trials);
- EXPECT_EQ(1U, synthetic_trials.size());
- EXPECT_TRUE(HasSyntheticTrial(synthetic_trials, "TestTrial2", "Group2"));
-
- // Ensure that time has advanced by at least a tick before proceeding.
- WaitUntilTimeChanges(base::TimeTicks::Now());
-
- // Start a new log and ensure all three trials appear in it.
- service.log_manager_.FinishCurrentLog();
- service.log_manager_.BeginLoggingWithLog(
- new MetricsLog("clientID", 1, MetricsLog::ONGOING_LOG));
- service.GetCurrentSyntheticFieldTrials(&synthetic_trials);
- EXPECT_EQ(3U, synthetic_trials.size());
- EXPECT_TRUE(HasSyntheticTrial(synthetic_trials, "TestTrial1", "Group2"));
- EXPECT_TRUE(HasSyntheticTrial(synthetic_trials, "TestTrial2", "Group2"));
- EXPECT_TRUE(HasSyntheticTrial(synthetic_trials, "TestTrial3", "Group3"));
- service.log_manager_.FinishCurrentLog();
-}
-
-TEST_F(MetricsServiceTest, MetricsReportingEnabled) {
-#if !defined(OS_CHROMEOS)
- GetLocalState()->SetBoolean(prefs::kMetricsReportingEnabled, false);
- EXPECT_FALSE(MetricsServiceHelper::IsMetricsReportingEnabled());
- GetLocalState()->SetBoolean(prefs::kMetricsReportingEnabled, true);
- EXPECT_TRUE(MetricsServiceHelper::IsMetricsReportingEnabled());
- GetLocalState()->ClearPref(prefs::kMetricsReportingEnabled);
- EXPECT_FALSE(MetricsServiceHelper::IsMetricsReportingEnabled());
-#else
- // ChromeOS does not register prefs::kMetricsReportingEnabled and uses
- // device settings for metrics reporting.
- EXPECT_FALSE(MetricsServiceHelper::IsMetricsReportingEnabled());
-#endif
-}
-
-TEST_F(MetricsServiceTest, CrashReportingEnabled) {
-#if defined(GOOGLE_CHROME_BUILD)
-// ChromeOS has different device settings for crash reporting.
-#if !defined(OS_CHROMEOS)
-#if defined(OS_ANDROID)
- const char* crash_pref = prefs::kCrashReportingEnabled;
-#else
- const char* crash_pref = prefs::kMetricsReportingEnabled;
-#endif
- GetLocalState()->SetBoolean(crash_pref, false);
- EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled());
- GetLocalState()->SetBoolean(crash_pref, true);
- EXPECT_TRUE(MetricsServiceHelper::IsCrashReportingEnabled());
- GetLocalState()->ClearPref(crash_pref);
- EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled());
-#endif // !defined(OS_CHROMEOS)
-#else // defined(GOOGLE_CHROME_BUILD)
- // Chromium branded browsers never have crash reporting enabled.
- EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled());
-#endif // defined(GOOGLE_CHROME_BUILD)
-}
-
// Check that setting the kMetricsResetIds pref to true causes the client id to
// be reset. We do not check that the low entropy source is reset because we
-// cannot ensure that metrics service won't generate the same id again.
-TEST_F(MetricsServiceTest, ResetMetricsIDs) {
+// cannot ensure that metrics state manager won't generate the same id again.
+TEST_F(MetricsStateManagerTest, ResetMetricsIDs) {
// Set an initial client id in prefs. It should not be possible for the
- // metrics service to generate this id randomly.
+ // metrics state manager to generate this id randomly.
const std::string kInitialClientId = "initial client id";
- GetLocalState()->SetString(prefs::kMetricsClientID, kInitialClientId);
+ prefs_.SetString(prefs::kMetricsClientID, kInitialClientId);
- // Make sure the initial client id isn't reset by the metrics service.
+ // Make sure the initial client id isn't reset by the metrics state manager.
{
- MetricsService service;
- service.ForceClientIdCreation();
- EXPECT_TRUE(service.metrics_ids_reset_check_performed_);
- EXPECT_EQ(kInitialClientId, service.client_id_);
+ MetricsStateManager state_manager(&prefs_);
+ state_manager.ForceClientIdCreation();
+ EXPECT_EQ(kInitialClientId, state_manager.client_id());
}
-
// Set the reset pref to cause the IDs to be reset.
- GetLocalState()->SetBoolean(prefs::kMetricsResetIds, true);
+ prefs_.SetBoolean(prefs::kMetricsResetIds, true);
// Cause the actual reset to happen.
{
- MetricsService service;
- service.ForceClientIdCreation();
- EXPECT_TRUE(service.metrics_ids_reset_check_performed_);
- EXPECT_NE(kInitialClientId, service.client_id_);
+ MetricsStateManager state_manager(&prefs_);
+ state_manager.ForceClientIdCreation();
+ EXPECT_NE(kInitialClientId, state_manager.client_id());
- service.GetLowEntropySource();
+ state_manager.GetLowEntropySource();
- EXPECT_FALSE(GetLocalState()->GetBoolean(prefs::kMetricsResetIds));
+ EXPECT_FALSE(prefs_.GetBoolean(prefs::kMetricsResetIds));
}
- std::string new_client_id =
- GetLocalState()->GetString(prefs::kMetricsClientID);
+ EXPECT_NE(kInitialClientId, prefs_.GetString(prefs::kMetricsClientID));
+}
- EXPECT_NE(kInitialClientId, new_client_id);
-}
+} // namespace metrics

Powered by Google App Engine
This is Rietveld 408576698