Index: components/metrics/metrics_service_unittest.cc |
diff --git a/components/metrics/metrics_service_unittest.cc b/components/metrics/metrics_service_unittest.cc |
index e85f35121e089087c6a222869abccea9e53a0796..3e4f50416a09d85f81b2474a1ec6e9813580a606 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) { |