Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/metrics/metrics_log.h" | 5 #include "components/metrics/metrics_log.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/basictypes.h" | |
| 11 #include "base/command_line.h" | |
|
Alexei Svitkine (slow)
2014/06/11 00:59:19
Is this include needed?
blundell
2014/06/11 09:36:30
Done.
| |
| 10 #include "base/metrics/bucket_ranges.h" | 12 #include "base/metrics/bucket_ranges.h" |
| 11 #include "base/metrics/sample_vector.h" | 13 #include "base/metrics/sample_vector.h" |
| 14 #include "base/port.h" | |
| 15 #include "base/prefs/pref_service.h" | |
| 12 #include "base/prefs/testing_pref_service.h" | 16 #include "base/prefs/testing_pref_service.h" |
| 17 #include "base/strings/string_number_conversions.h" | |
| 18 #include "base/strings/string_util.h" | |
| 19 #include "base/strings/stringprintf.h" | |
| 20 #include "base/threading/sequenced_worker_pool.h" | |
| 21 #include "base/time/time.h" | |
| 22 #include "components/metrics/metrics_hashes.h" | |
| 23 #include "components/metrics/metrics_pref_names.h" | |
| 24 #include "components/metrics/metrics_provider.h" | |
| 25 #include "components/metrics/metrics_state_manager.h" | |
| 13 #include "components/metrics/proto/chrome_user_metrics_extension.pb.h" | 26 #include "components/metrics/proto/chrome_user_metrics_extension.pb.h" |
| 27 #include "components/metrics/proto/profiler_event.pb.h" | |
| 28 #include "components/metrics/proto/system_profile.pb.h" | |
| 14 #include "components/metrics/test_metrics_service_client.h" | 29 #include "components/metrics/test_metrics_service_client.h" |
| 30 #include "components/variations/active_field_trials.h" | |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
| 32 #include "url/gurl.h" | |
|
Alexei Svitkine (slow)
2014/06/11 00:59:19
Is this include needed?
Maybe check all the other
blundell
2014/06/11 09:36:30
Done.
| |
| 33 | |
| 34 using base::TimeDelta; | |
|
Alexei Svitkine (slow)
2014/06/11 00:59:19
Nit: Remove this using declaration. Prefix things
blundell
2014/06/11 09:36:30
Done.
| |
| 16 | 35 |
| 17 namespace metrics { | 36 namespace metrics { |
| 18 | 37 |
| 19 namespace { | 38 namespace { |
| 20 | 39 |
| 40 const char kClientId[] = "bogus client ID"; | |
| 41 const int64 kInstallDate = 1373051956; | |
| 42 const int64 kInstallDateExpected = 1373050800; // Computed from kInstallDate. | |
| 43 const int64 kEnabledDate = 1373001211; | |
| 44 const int64 kEnabledDateExpected = 1373000400; // Computed from kEnabledDate. | |
| 45 const int kSessionId = 127; | |
| 46 const variations::ActiveGroupId kFieldTrialIds[] = { | |
| 47 {37, 43}, | |
| 48 {13, 47}, | |
| 49 {23, 17} | |
| 50 }; | |
| 51 const variations::ActiveGroupId kSyntheticTrials[] = { | |
| 52 {55, 15}, | |
| 53 {66, 16} | |
| 54 }; | |
| 55 | |
| 21 class TestMetricsLog : public MetricsLog { | 56 class TestMetricsLog : public MetricsLog { |
| 22 public: | 57 public: |
| 23 TestMetricsLog(TestMetricsServiceClient* client, | 58 TestMetricsLog(const std::string& client_id, |
| 59 int session_id, | |
| 60 LogType log_type, | |
| 61 metrics::MetricsServiceClient* client, | |
| 24 TestingPrefServiceSimple* prefs) | 62 TestingPrefServiceSimple* prefs) |
| 25 : MetricsLog("client_id", 1, MetricsLog::ONGOING_LOG, client, prefs) { | 63 : MetricsLog(client_id, session_id, log_type, client, prefs), |
| 26 } | 64 prefs_(prefs) { |
| 65 InitPrefs(); | |
| 66 } | |
| 67 | |
| 27 virtual ~TestMetricsLog() {} | 68 virtual ~TestMetricsLog() {} |
| 28 | 69 |
| 29 using MetricsLog::uma_proto; | 70 const metrics::ChromeUserMetricsExtension& uma_proto() const { |
| 71 return *MetricsLog::uma_proto(); | |
| 72 } | |
| 73 | |
| 74 const metrics::SystemProfileProto& system_profile() const { | |
| 75 return uma_proto().system_profile(); | |
| 76 } | |
| 30 | 77 |
| 31 private: | 78 private: |
| 79 void InitPrefs() { | |
| 80 prefs_->SetString(metrics::prefs::kMetricsReportingEnabledTimestamp, | |
| 81 base::Int64ToString(kEnabledDate)); | |
| 82 } | |
| 83 | |
| 84 virtual void GetFieldTrialIds( | |
| 85 std::vector<variations::ActiveGroupId>* field_trial_ids) const | |
| 86 OVERRIDE { | |
| 87 ASSERT_TRUE(field_trial_ids->empty()); | |
| 88 | |
| 89 for (size_t i = 0; i < arraysize(kFieldTrialIds); ++i) { | |
| 90 field_trial_ids->push_back(kFieldTrialIds[i]); | |
| 91 } | |
| 92 } | |
| 93 | |
| 94 // Weak pointer to the PrefsService used by this log. | |
| 95 TestingPrefServiceSimple* prefs_; | |
| 96 | |
| 32 DISALLOW_COPY_AND_ASSIGN(TestMetricsLog); | 97 DISALLOW_COPY_AND_ASSIGN(TestMetricsLog); |
| 33 }; | 98 }; |
| 34 | 99 |
| 35 } // namespace | 100 } // namespace |
| 36 | 101 |
| 37 TEST(MetricsLogTest, LogType) { | 102 class MetricsLogTest : public testing::Test { |
| 103 public: | |
| 104 MetricsLogTest() { | |
| 105 MetricsLog::RegisterPrefs(prefs_.registry()); | |
| 106 metrics::MetricsStateManager::RegisterPrefs(prefs_.registry()); | |
| 107 } | |
| 108 | |
| 109 virtual ~MetricsLogTest() { | |
| 110 } | |
| 111 | |
| 112 protected: | |
| 113 // Check that the values in |system_values| correspond to the test data | |
| 114 // defined at the top of this file. | |
| 115 void CheckSystemProfile(const metrics::SystemProfileProto& system_profile) { | |
| 116 EXPECT_EQ(kInstallDateExpected, system_profile.install_date()); | |
| 117 EXPECT_EQ(kEnabledDateExpected, system_profile.uma_enabled_date()); | |
| 118 | |
| 119 ASSERT_EQ(arraysize(kFieldTrialIds) + arraysize(kSyntheticTrials), | |
| 120 static_cast<size_t>(system_profile.field_trial_size())); | |
| 121 for (size_t i = 0; i < arraysize(kFieldTrialIds); ++i) { | |
| 122 const metrics::SystemProfileProto::FieldTrial& field_trial = | |
| 123 system_profile.field_trial(i); | |
| 124 EXPECT_EQ(kFieldTrialIds[i].name, field_trial.name_id()); | |
| 125 EXPECT_EQ(kFieldTrialIds[i].group, field_trial.group_id()); | |
| 126 } | |
| 127 // Verify the right data is present for the synthetic trials. | |
| 128 for (size_t i = 0; i < arraysize(kSyntheticTrials); ++i) { | |
| 129 const metrics::SystemProfileProto::FieldTrial& field_trial = | |
| 130 system_profile.field_trial(i + arraysize(kFieldTrialIds)); | |
| 131 EXPECT_EQ(kSyntheticTrials[i].name, field_trial.name_id()); | |
| 132 EXPECT_EQ(kSyntheticTrials[i].group, field_trial.group_id()); | |
| 133 } | |
| 134 | |
| 135 EXPECT_EQ(metrics::TestMetricsServiceClient::kBrandForTesting, | |
| 136 system_profile.brand_code()); | |
| 137 | |
| 138 const metrics::SystemProfileProto::Hardware& hardware = | |
| 139 system_profile.hardware(); | |
| 140 | |
| 141 EXPECT_TRUE(hardware.has_cpu()); | |
| 142 EXPECT_TRUE(hardware.cpu().has_vendor_name()); | |
| 143 EXPECT_TRUE(hardware.cpu().has_signature()); | |
| 144 | |
| 145 // TODO(isherman): Verify other data written into the protobuf as a result | |
| 146 // of this call. | |
| 147 } | |
| 148 | |
| 149 protected: | |
| 150 TestingPrefServiceSimple prefs_; | |
| 151 | |
| 152 private: | |
| 153 DISALLOW_COPY_AND_ASSIGN(MetricsLogTest); | |
| 154 }; | |
| 155 | |
| 156 TEST_F(MetricsLogTest, LogType) { | |
| 38 TestMetricsServiceClient client; | 157 TestMetricsServiceClient client; |
| 39 TestingPrefServiceSimple prefs; | 158 TestingPrefServiceSimple prefs; |
| 40 | 159 |
| 41 MetricsLog log1("id", 0, MetricsLog::ONGOING_LOG, &client, &prefs); | 160 MetricsLog log1("id", 0, MetricsLog::ONGOING_LOG, &client, &prefs); |
| 42 EXPECT_EQ(MetricsLog::ONGOING_LOG, log1.log_type()); | 161 EXPECT_EQ(MetricsLog::ONGOING_LOG, log1.log_type()); |
| 43 | 162 |
| 44 MetricsLog log2("id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &prefs); | 163 MetricsLog log2("id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &prefs); |
| 45 EXPECT_EQ(MetricsLog::INITIAL_STABILITY_LOG, log2.log_type()); | 164 EXPECT_EQ(MetricsLog::INITIAL_STABILITY_LOG, log2.log_type()); |
| 46 } | 165 } |
| 47 | 166 |
| 48 TEST(MetricsLogTest, EmptyRecord) { | 167 TEST_F(MetricsLogTest, EmptyRecord) { |
| 49 TestMetricsServiceClient client; | 168 TestMetricsServiceClient client; |
| 50 client.set_version_string("bogus version"); | 169 client.set_version_string("bogus version"); |
| 51 TestingPrefServiceSimple prefs; | 170 TestingPrefServiceSimple prefs; |
| 52 MetricsLog log("totally bogus client ID", 137, MetricsLog::ONGOING_LOG, | 171 MetricsLog log("totally bogus client ID", 137, MetricsLog::ONGOING_LOG, |
| 53 &client, &prefs); | 172 &client, &prefs); |
| 54 log.CloseLog(); | 173 log.CloseLog(); |
| 55 | 174 |
| 56 std::string encoded; | 175 std::string encoded; |
| 57 log.GetEncodedLog(&encoded); | 176 log.GetEncodedLog(&encoded); |
| 58 | 177 |
| 59 // A couple of fields are hard to mock, so these will be copied over directly | 178 // A couple of fields are hard to mock, so these will be copied over directly |
| 60 // for the expected output. | 179 // for the expected output. |
| 61 ChromeUserMetricsExtension parsed; | 180 ChromeUserMetricsExtension parsed; |
| 62 ASSERT_TRUE(parsed.ParseFromString(encoded)); | 181 ASSERT_TRUE(parsed.ParseFromString(encoded)); |
| 63 | 182 |
| 64 ChromeUserMetricsExtension expected; | 183 ChromeUserMetricsExtension expected; |
| 65 expected.set_client_id(5217101509553811875); // Hashed bogus client ID | 184 expected.set_client_id(5217101509553811875); // Hashed bogus client ID |
| 66 expected.set_session_id(137); | 185 expected.set_session_id(137); |
| 67 expected.mutable_system_profile()->set_build_timestamp( | 186 expected.mutable_system_profile()->set_build_timestamp( |
| 68 parsed.system_profile().build_timestamp()); | 187 parsed.system_profile().build_timestamp()); |
| 69 expected.mutable_system_profile()->set_app_version("bogus version"); | 188 expected.mutable_system_profile()->set_app_version("bogus version"); |
| 70 expected.mutable_system_profile()->set_channel(client.GetChannel()); | 189 expected.mutable_system_profile()->set_channel(client.GetChannel()); |
| 71 | 190 |
| 72 EXPECT_EQ(expected.SerializeAsString(), encoded); | 191 EXPECT_EQ(expected.SerializeAsString(), encoded); |
| 73 } | 192 } |
| 74 | 193 |
| 75 TEST(MetricsLogTest, HistogramBucketFields) { | 194 TEST_F(MetricsLogTest, HistogramBucketFields) { |
| 76 // Create buckets: 1-5, 5-7, 7-8, 8-9, 9-10, 10-11, 11-12. | 195 // Create buckets: 1-5, 5-7, 7-8, 8-9, 9-10, 10-11, 11-12. |
| 77 base::BucketRanges ranges(8); | 196 base::BucketRanges ranges(8); |
| 78 ranges.set_range(0, 1); | 197 ranges.set_range(0, 1); |
| 79 ranges.set_range(1, 5); | 198 ranges.set_range(1, 5); |
| 80 ranges.set_range(2, 7); | 199 ranges.set_range(2, 7); |
| 81 ranges.set_range(3, 8); | 200 ranges.set_range(3, 8); |
| 82 ranges.set_range(4, 9); | 201 ranges.set_range(4, 9); |
| 83 ranges.set_range(5, 10); | 202 ranges.set_range(5, 10); |
| 84 ranges.set_range(6, 11); | 203 ranges.set_range(6, 11); |
| 85 ranges.set_range(7, 12); | 204 ranges.set_range(7, 12); |
| 86 | 205 |
| 87 base::SampleVector samples(&ranges); | 206 base::SampleVector samples(&ranges); |
| 88 samples.Accumulate(3, 1); // Bucket 1-5. | 207 samples.Accumulate(3, 1); // Bucket 1-5. |
| 89 samples.Accumulate(6, 1); // Bucket 5-7. | 208 samples.Accumulate(6, 1); // Bucket 5-7. |
| 90 samples.Accumulate(8, 1); // Bucket 8-9. (7-8 skipped) | 209 samples.Accumulate(8, 1); // Bucket 8-9. (7-8 skipped) |
| 91 samples.Accumulate(10, 1); // Bucket 10-11. (9-10 skipped) | 210 samples.Accumulate(10, 1); // Bucket 10-11. (9-10 skipped) |
| 92 samples.Accumulate(11, 1); // Bucket 11-12. | 211 samples.Accumulate(11, 1); // Bucket 11-12. |
| 93 | 212 |
| 94 TestMetricsServiceClient client; | 213 TestMetricsServiceClient client; |
| 95 TestingPrefServiceSimple prefs; | 214 TestingPrefServiceSimple prefs; |
| 96 TestMetricsLog log(&client, &prefs); | 215 TestMetricsLog log( |
| 216 kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client, &prefs_); | |
| 97 log.RecordHistogramDelta("Test", samples); | 217 log.RecordHistogramDelta("Test", samples); |
| 98 | 218 |
| 99 const metrics::ChromeUserMetricsExtension* uma_proto = log.uma_proto(); | 219 const ChromeUserMetricsExtension& uma_proto = log.uma_proto(); |
| 100 const metrics::HistogramEventProto& histogram_proto = | 220 const HistogramEventProto& histogram_proto = |
| 101 uma_proto->histogram_event(uma_proto->histogram_event_size() - 1); | 221 uma_proto.histogram_event(uma_proto.histogram_event_size() - 1); |
| 102 | 222 |
| 103 // Buckets with samples: 1-5, 5-7, 8-9, 10-11, 11-12. | 223 // Buckets with samples: 1-5, 5-7, 8-9, 10-11, 11-12. |
| 104 // Should become: 1-/, 5-7, /-9, 10-/, /-12. | 224 // Should become: 1-/, 5-7, /-9, 10-/, /-12. |
| 105 ASSERT_EQ(5, histogram_proto.bucket_size()); | 225 ASSERT_EQ(5, histogram_proto.bucket_size()); |
| 106 | 226 |
| 107 // 1-5 becomes 1-/ (max is same as next min). | 227 // 1-5 becomes 1-/ (max is same as next min). |
| 108 EXPECT_TRUE(histogram_proto.bucket(0).has_min()); | 228 EXPECT_TRUE(histogram_proto.bucket(0).has_min()); |
| 109 EXPECT_FALSE(histogram_proto.bucket(0).has_max()); | 229 EXPECT_FALSE(histogram_proto.bucket(0).has_max()); |
| 110 EXPECT_EQ(1, histogram_proto.bucket(0).min()); | 230 EXPECT_EQ(1, histogram_proto.bucket(0).min()); |
| 111 | 231 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 124 EXPECT_TRUE(histogram_proto.bucket(3).has_min()); | 244 EXPECT_TRUE(histogram_proto.bucket(3).has_min()); |
| 125 EXPECT_FALSE(histogram_proto.bucket(3).has_max()); | 245 EXPECT_FALSE(histogram_proto.bucket(3).has_max()); |
| 126 EXPECT_EQ(10, histogram_proto.bucket(3).min()); | 246 EXPECT_EQ(10, histogram_proto.bucket(3).min()); |
| 127 | 247 |
| 128 // 11-12 becomes /-12 (last record must keep max, min is same as max - 1). | 248 // 11-12 becomes /-12 (last record must keep max, min is same as max - 1). |
| 129 EXPECT_FALSE(histogram_proto.bucket(4).has_min()); | 249 EXPECT_FALSE(histogram_proto.bucket(4).has_min()); |
| 130 EXPECT_TRUE(histogram_proto.bucket(4).has_max()); | 250 EXPECT_TRUE(histogram_proto.bucket(4).has_max()); |
| 131 EXPECT_EQ(12, histogram_proto.bucket(4).max()); | 251 EXPECT_EQ(12, histogram_proto.bucket(4).max()); |
| 132 } | 252 } |
| 133 | 253 |
| 254 TEST_F(MetricsLogTest, RecordEnvironment) { | |
| 255 TestMetricsServiceClient client; | |
| 256 client.set_install_date(kInstallDate); | |
| 257 TestMetricsLog log( | |
| 258 kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client, &prefs_); | |
| 259 | |
| 260 std::vector<variations::ActiveGroupId> synthetic_trials; | |
| 261 // Add two synthetic trials. | |
| 262 synthetic_trials.push_back(kSyntheticTrials[0]); | |
| 263 synthetic_trials.push_back(kSyntheticTrials[1]); | |
| 264 | |
| 265 log.RecordEnvironment(std::vector<MetricsProvider*>(), | |
| 266 synthetic_trials); | |
| 267 // Check that the system profile on the log has the correct values set. | |
| 268 CheckSystemProfile(log.system_profile()); | |
| 269 | |
| 270 // Check that the system profile has also been written to prefs. | |
| 271 const std::string base64_system_profile = | |
| 272 prefs_.GetString(prefs::kStabilitySavedSystemProfile); | |
| 273 EXPECT_FALSE(base64_system_profile.empty()); | |
| 274 std::string serialied_system_profile; | |
| 275 EXPECT_TRUE(base::Base64Decode(base64_system_profile, | |
| 276 &serialied_system_profile)); | |
| 277 SystemProfileProto decoded_system_profile; | |
| 278 EXPECT_TRUE(decoded_system_profile.ParseFromString(serialied_system_profile)); | |
| 279 CheckSystemProfile(decoded_system_profile); | |
| 280 } | |
| 281 | |
| 282 TEST_F(MetricsLogTest, LoadSavedEnvironmentFromPrefs) { | |
| 283 const char* kSystemProfilePref = prefs::kStabilitySavedSystemProfile; | |
| 284 const char* kSystemProfileHashPref = | |
| 285 prefs::kStabilitySavedSystemProfileHash; | |
| 286 | |
| 287 TestMetricsServiceClient client; | |
| 288 client.set_install_date(kInstallDate); | |
| 289 | |
| 290 // The pref value is empty, so loading it from prefs should fail. | |
| 291 { | |
| 292 TestMetricsLog log( | |
| 293 kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client, &prefs_); | |
| 294 EXPECT_FALSE(log.LoadSavedEnvironmentFromPrefs()); | |
| 295 } | |
| 296 | |
| 297 // Do a RecordEnvironment() call and check whether the pref is recorded. | |
| 298 { | |
| 299 TestMetricsLog log( | |
| 300 kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client, &prefs_); | |
| 301 log.RecordEnvironment(std::vector<MetricsProvider*>(), | |
| 302 std::vector<variations::ActiveGroupId>()); | |
| 303 EXPECT_FALSE(prefs_.GetString(kSystemProfilePref).empty()); | |
| 304 EXPECT_FALSE(prefs_.GetString(kSystemProfileHashPref).empty()); | |
| 305 } | |
| 306 | |
| 307 { | |
| 308 TestMetricsLog log( | |
| 309 kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client, &prefs_); | |
| 310 EXPECT_TRUE(log.LoadSavedEnvironmentFromPrefs()); | |
| 311 // Check some values in the system profile. | |
| 312 EXPECT_EQ(kInstallDateExpected, log.system_profile().install_date()); | |
| 313 EXPECT_EQ(kEnabledDateExpected, log.system_profile().uma_enabled_date()); | |
| 314 // Ensure that the call cleared the prefs. | |
| 315 EXPECT_TRUE(prefs_.GetString(kSystemProfilePref).empty()); | |
| 316 EXPECT_TRUE(prefs_.GetString(kSystemProfileHashPref).empty()); | |
| 317 } | |
| 318 | |
| 319 // Ensure that a non-matching hash results in the pref being invalid. | |
| 320 { | |
| 321 TestMetricsLog log( | |
| 322 kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client, &prefs_); | |
| 323 // Call RecordEnvironment() to record the pref again. | |
| 324 log.RecordEnvironment(std::vector<MetricsProvider*>(), | |
| 325 std::vector<variations::ActiveGroupId>()); | |
| 326 } | |
| 327 | |
| 328 { | |
| 329 // Set the hash to a bad value. | |
| 330 prefs_.SetString(kSystemProfileHashPref, "deadbeef"); | |
| 331 TestMetricsLog log( | |
| 332 kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client, &prefs_); | |
| 333 EXPECT_FALSE(log.LoadSavedEnvironmentFromPrefs()); | |
| 334 // Ensure that the prefs are cleared, even if the call failed. | |
| 335 EXPECT_TRUE(prefs_.GetString(kSystemProfilePref).empty()); | |
| 336 EXPECT_TRUE(prefs_.GetString(kSystemProfileHashPref).empty()); | |
| 337 } | |
| 338 } | |
| 339 | |
| 340 TEST_F(MetricsLogTest, InitialLogStabilityMetrics) { | |
| 341 TestMetricsServiceClient client; | |
| 342 TestMetricsLog log(kClientId, | |
| 343 kSessionId, | |
| 344 MetricsLog::INITIAL_STABILITY_LOG, | |
| 345 &client, | |
| 346 &prefs_); | |
| 347 std::vector<MetricsProvider*> metrics_providers; | |
| 348 log.RecordEnvironment(metrics_providers, | |
| 349 std::vector<variations::ActiveGroupId>()); | |
| 350 log.RecordStabilityMetrics(metrics_providers, base::TimeDelta(), | |
| 351 base::TimeDelta()); | |
| 352 const SystemProfileProto_Stability& stability = | |
| 353 log.system_profile().stability(); | |
| 354 // Required metrics: | |
| 355 EXPECT_TRUE(stability.has_launch_count()); | |
| 356 EXPECT_TRUE(stability.has_crash_count()); | |
| 357 // Initial log metrics: | |
| 358 EXPECT_TRUE(stability.has_incomplete_shutdown_count()); | |
| 359 EXPECT_TRUE(stability.has_breakpad_registration_success_count()); | |
| 360 EXPECT_TRUE(stability.has_breakpad_registration_failure_count()); | |
| 361 EXPECT_TRUE(stability.has_debugger_present_count()); | |
| 362 EXPECT_TRUE(stability.has_debugger_not_present_count()); | |
| 363 } | |
| 364 | |
| 365 TEST_F(MetricsLogTest, OngoingLogStabilityMetrics) { | |
| 366 TestMetricsServiceClient client; | |
| 367 TestMetricsLog log( | |
| 368 kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client, &prefs_); | |
| 369 std::vector<MetricsProvider*> metrics_providers; | |
| 370 log.RecordEnvironment(metrics_providers, | |
| 371 std::vector<variations::ActiveGroupId>()); | |
| 372 log.RecordStabilityMetrics(metrics_providers, base::TimeDelta(), | |
| 373 base::TimeDelta()); | |
| 374 const SystemProfileProto_Stability& stability = | |
| 375 log.system_profile().stability(); | |
| 376 // Required metrics: | |
| 377 EXPECT_TRUE(stability.has_launch_count()); | |
| 378 EXPECT_TRUE(stability.has_crash_count()); | |
| 379 // Initial log metrics: | |
| 380 EXPECT_FALSE(stability.has_incomplete_shutdown_count()); | |
| 381 EXPECT_FALSE(stability.has_breakpad_registration_success_count()); | |
| 382 EXPECT_FALSE(stability.has_breakpad_registration_failure_count()); | |
| 383 EXPECT_FALSE(stability.has_debugger_present_count()); | |
| 384 EXPECT_FALSE(stability.has_debugger_not_present_count()); | |
| 385 } | |
| 386 | |
| 387 TEST_F(MetricsLogTest, ChromeChannelWrittenToProtobuf) { | |
| 388 TestMetricsServiceClient client; | |
| 389 TestMetricsLog log( | |
| 390 "user@test.com", kSessionId, MetricsLog::ONGOING_LOG, &client, &prefs_); | |
| 391 EXPECT_TRUE(log.uma_proto().system_profile().has_channel()); | |
| 392 } | |
| 393 | |
| 134 } // namespace metrics | 394 } // namespace metrics |
| OLD | NEW |