diff options
Diffstat (limited to 'components/metrics/metrics_service_unittest.cc')
-rw-r--r-- | components/metrics/metrics_service_unittest.cc | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/components/metrics/metrics_service_unittest.cc b/components/metrics/metrics_service_unittest.cc index e85f351..3e4f504 100644 --- a/components/metrics/metrics_service_unittest.cc +++ b/components/metrics/metrics_service_unittest.cc @@ -31,6 +31,30 @@ scoped_ptr<ClientInfo> ReturnNoBackup() { return scoped_ptr<ClientInfo>(); } +class TestMetricsProvider : public metrics::MetricsProvider { + public: + explicit TestMetricsProvider(bool has_stability_metrics) : + has_stability_metrics_(has_stability_metrics), + provide_stability_metrics_called_(false) { + } + + virtual bool HasStabilityMetrics() OVERRIDE { return has_stability_metrics_; } + virtual void ProvideStabilityMetrics( + SystemProfileProto* system_profile_proto) OVERRIDE { + provide_stability_metrics_called_ = true; + } + + bool provide_stability_metrics_called() const { + return provide_stability_metrics_called_; + } + + private: + bool has_stability_metrics_; + bool provide_stability_metrics_called_; + + DISALLOW_COPY_AND_ASSIGN(TestMetricsProvider); +}; + class TestMetricsService : public MetricsService { public: TestMetricsService(MetricsStateManager* state_manager, @@ -138,10 +162,83 @@ TEST_F(MetricsServiceTest, InitialStabilityLogAfterCleanShutDown) { TestMetricsServiceClient client; TestMetricsService service( GetMetricsStateManager(), &client, GetLocalState()); + + TestMetricsProvider* test_provider = new TestMetricsProvider(false); + service.RegisterMetricsProvider( + scoped_ptr<metrics::MetricsProvider>(test_provider)); + service.InitializeMetricsRecordingState(); // No initial stability log should be generated. EXPECT_FALSE(service.log_manager()->has_unsent_logs()); EXPECT_FALSE(service.log_manager()->has_staged_log()); + + // The test provider should not have been called upon to provide stability + // metrics. + EXPECT_FALSE(test_provider->provide_stability_metrics_called()); +} + +TEST_F(MetricsServiceTest, InitialStabilityLogAtProviderRequest) { + EnableMetricsReporting(); + + // Save an existing system profile to prefs, to correspond to what would be + // saved from a previous session. + TestMetricsServiceClient client; + TestMetricsLog log("client", 1, &client, GetLocalState()); + log.RecordEnvironment(std::vector<metrics::MetricsProvider*>(), + std::vector<variations::ActiveGroupId>(), + 0); + + // 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, + client.GetVersionString()); + + // Set the clean exit flag, as that will otherwise cause a stabilty + // log to be produced, irrespective provider requests. + GetLocalState()->SetBoolean(prefs::kStabilityExitedCleanly, true); + + TestMetricsService service( + GetMetricsStateManager(), &client, GetLocalState()); + // Add a metrics provider that requests a stability log. + TestMetricsProvider* test_provider = new TestMetricsProvider(true); + service.RegisterMetricsProvider( + scoped_ptr<MetricsProvider>(test_provider)); + + service.InitializeMetricsRecordingState(); + + // 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()); + + // The test provider should have been called upon to provide stability + // metrics. + EXPECT_TRUE(test_provider->provide_stability_metrics_called()); + + // Stage the log and retrieve it. + log_manager->StageNextLogForUpload(); + EXPECT_TRUE(log_manager->has_staged_log()); + + std::string uncompressed_log; + EXPECT_TRUE(GzipUncompress(log_manager->staged_log(), + &uncompressed_log)); + + ChromeUserMetricsExtension uma_log; + EXPECT_TRUE(uma_log.ParseFromString(uncompressed_log)); + + 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()); + + // As there wasn't an unclean shutdown, this log has zero crash count. + EXPECT_EQ(0, uma_log.system_profile().stability().crash_count()); } TEST_F(MetricsServiceTest, InitialStabilityLogAfterCrash) { |