| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS 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 <base/file_util.h> | 5 #include <base/file_util.h> |
| 6 #include <gtest/gtest.h> | 6 #include <gtest/gtest.h> |
| 7 | 7 |
| 8 #include "counter_mock.h" | 8 #include "counter_mock.h" |
| 9 #include "metrics_daemon.h" | 9 #include "metrics_daemon.h" |
| 10 #include "metrics_library_mock.h" | 10 #include "metrics_library_mock.h" |
| 11 | 11 |
| 12 using base::Time; | 12 using base::Time; |
| 13 using base::TimeTicks; | 13 using base::TimeTicks; |
| 14 using chromeos_metrics::FrequencyCounterMock; |
| 14 using chromeos_metrics::TaggedCounterMock; | 15 using chromeos_metrics::TaggedCounterMock; |
| 15 using ::testing::_; | 16 using ::testing::_; |
| 16 using ::testing::Return; | 17 using ::testing::Return; |
| 17 using ::testing::StrictMock; | 18 using ::testing::StrictMock; |
| 18 | 19 |
| 19 static const int kSecondsPerDay = 24 * 60 * 60; | 20 static const int kSecondsPerDay = 24 * 60 * 60; |
| 20 | 21 |
| 21 // This class allows a TimeTicks object to be initialized with seconds | 22 // This class allows a TimeTicks object to be initialized with seconds |
| 22 // (rather than microseconds) through the protected TimeTicks(int64) | 23 // (rather than microseconds) through the protected TimeTicks(int64) |
| 23 // constructor. | 24 // constructor. |
| (...skipping 28 matching lines...) Expand all Loading... |
| 52 EXPECT_TRUE(NULL != daemon_.kernel_crash_interval_.get()); | 53 EXPECT_TRUE(NULL != daemon_.kernel_crash_interval_.get()); |
| 53 EXPECT_TRUE(NULL != daemon_.user_crash_interval_.get()); | 54 EXPECT_TRUE(NULL != daemon_.user_crash_interval_.get()); |
| 54 | 55 |
| 55 // Allocates mock counter and transfers ownership. | 56 // Allocates mock counter and transfers ownership. |
| 56 daily_use_ = new StrictMock<TaggedCounterMock>(); | 57 daily_use_ = new StrictMock<TaggedCounterMock>(); |
| 57 daemon_.daily_use_.reset(daily_use_); | 58 daemon_.daily_use_.reset(daily_use_); |
| 58 kernel_crash_interval_ = new StrictMock<TaggedCounterMock>(); | 59 kernel_crash_interval_ = new StrictMock<TaggedCounterMock>(); |
| 59 daemon_.kernel_crash_interval_.reset(kernel_crash_interval_); | 60 daemon_.kernel_crash_interval_.reset(kernel_crash_interval_); |
| 60 user_crash_interval_ = new StrictMock<TaggedCounterMock>(); | 61 user_crash_interval_ = new StrictMock<TaggedCounterMock>(); |
| 61 daemon_.user_crash_interval_.reset(user_crash_interval_); | 62 daemon_.user_crash_interval_.reset(user_crash_interval_); |
| 63 unclean_shutdown_interval_ = new StrictMock<TaggedCounterMock>(); |
| 64 daemon_.unclean_shutdown_interval_.reset(unclean_shutdown_interval_); |
| 65 kernel_crashes_daily_ = new StrictMock<FrequencyCounterMock>(); |
| 66 daemon_.kernel_crashes_daily_.reset(kernel_crashes_daily_); |
| 67 user_crashes_daily_ = new StrictMock<FrequencyCounterMock>(); |
| 68 daemon_.user_crashes_daily_.reset(user_crashes_daily_); |
| 69 unclean_shutdowns_daily_ = new StrictMock<FrequencyCounterMock>(); |
| 70 daemon_.unclean_shutdowns_daily_.reset(unclean_shutdowns_daily_); |
| 71 any_crashes_daily_ = new StrictMock<FrequencyCounterMock>(); |
| 72 daemon_.any_crashes_daily_.reset(any_crashes_daily_); |
| 62 | 73 |
| 63 EXPECT_FALSE(daemon_.user_active_); | 74 EXPECT_FALSE(daemon_.user_active_); |
| 64 EXPECT_TRUE(daemon_.user_active_last_.is_null()); | 75 EXPECT_TRUE(daemon_.user_active_last_.is_null()); |
| 65 EXPECT_EQ(MetricsDaemon::kUnknownNetworkState, daemon_.network_state_); | 76 EXPECT_EQ(MetricsDaemon::kUnknownNetworkState, daemon_.network_state_); |
| 66 EXPECT_TRUE(daemon_.network_state_last_.is_null()); | 77 EXPECT_TRUE(daemon_.network_state_last_.is_null()); |
| 67 EXPECT_EQ(MetricsDaemon::kUnknownPowerState, daemon_.power_state_); | 78 EXPECT_EQ(MetricsDaemon::kUnknownPowerState, daemon_.power_state_); |
| 68 EXPECT_EQ(MetricsDaemon::kUnknownSessionState, daemon_.session_state_); | 79 EXPECT_EQ(MetricsDaemon::kUnknownSessionState, daemon_.session_state_); |
| 69 } | 80 } |
| 70 | 81 |
| 71 virtual void TearDown() {} | 82 virtual void TearDown() {} |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 // Metrics library mock. It's a strict mock so that all unexpected | 176 // Metrics library mock. It's a strict mock so that all unexpected |
| 166 // metric generation calls are marked as failures. | 177 // metric generation calls are marked as failures. |
| 167 StrictMock<MetricsLibraryMock> metrics_lib_; | 178 StrictMock<MetricsLibraryMock> metrics_lib_; |
| 168 | 179 |
| 169 // Counter mocks. They are strict mocks so that all unexpected | 180 // Counter mocks. They are strict mocks so that all unexpected |
| 170 // update calls are marked as failures. They are pointers so that | 181 // update calls are marked as failures. They are pointers so that |
| 171 // they can replace the scoped_ptr's allocated by the daemon. | 182 // they can replace the scoped_ptr's allocated by the daemon. |
| 172 StrictMock<TaggedCounterMock>* daily_use_; | 183 StrictMock<TaggedCounterMock>* daily_use_; |
| 173 StrictMock<TaggedCounterMock>* kernel_crash_interval_; | 184 StrictMock<TaggedCounterMock>* kernel_crash_interval_; |
| 174 StrictMock<TaggedCounterMock>* user_crash_interval_; | 185 StrictMock<TaggedCounterMock>* user_crash_interval_; |
| 186 StrictMock<TaggedCounterMock>* unclean_shutdown_interval_; |
| 187 |
| 188 StrictMock<FrequencyCounterMock>* kernel_crashes_daily_; |
| 189 StrictMock<FrequencyCounterMock>* user_crashes_daily_; |
| 190 StrictMock<FrequencyCounterMock>* unclean_shutdowns_daily_; |
| 191 StrictMock<FrequencyCounterMock>* any_crashes_daily_; |
| 175 }; | 192 }; |
| 176 | 193 |
| 177 TEST_F(MetricsDaemonTest, CheckKernelCrash) { | 194 TEST_F(MetricsDaemonTest, CheckSystemCrash) { |
| 178 static const char kKernelCrashDetected[] = "test-kernel-crash-detected"; | 195 static const char kKernelCrashDetected[] = "test-kernel-crash-detected"; |
| 179 daemon_.CheckKernelCrash(kKernelCrashDetected); | 196 EXPECT_FALSE(daemon_.CheckSystemCrash(kKernelCrashDetected)); |
| 180 | 197 |
| 181 FilePath crash_detected(kKernelCrashDetected); | 198 FilePath crash_detected(kKernelCrashDetected); |
| 182 file_util::WriteFile(crash_detected, "", 0); | 199 file_util::WriteFile(crash_detected, "", 0); |
| 183 IgnoreActiveUseUpdate(); | 200 EXPECT_TRUE(file_util::PathExists(crash_detected)); |
| 184 EXPECT_CALL(*kernel_crash_interval_, Flush()) | 201 EXPECT_TRUE(daemon_.CheckSystemCrash(kKernelCrashDetected)); |
| 185 .Times(1) | 202 EXPECT_FALSE(file_util::PathExists(crash_detected)); |
| 186 .RetiresOnSaturation(); | 203 EXPECT_FALSE(daemon_.CheckSystemCrash(kKernelCrashDetected)); |
| 187 daemon_.CheckKernelCrash(kKernelCrashDetected); | 204 EXPECT_FALSE(file_util::PathExists(crash_detected)); |
| 188 file_util::Delete(crash_detected, false); | 205 file_util::Delete(crash_detected, false); |
| 189 } | 206 } |
| 190 | 207 |
| 191 TEST_F(MetricsDaemonTest, DailyUseReporter) { | 208 TEST_F(MetricsDaemonTest, ReportDailyUse) { |
| 192 ExpectDailyUseTimeMetric(/* sample */ 2); | 209 ExpectDailyUseTimeMetric(/* sample */ 2); |
| 193 MetricsDaemon::DailyUseReporter(&daemon_, /* tag */ 20, /* count */ 90); | 210 MetricsDaemon::ReportDailyUse(&daemon_, /* tag */ 20, /* count */ 90); |
| 194 | 211 |
| 195 ExpectDailyUseTimeMetric(/* sample */ 1); | 212 ExpectDailyUseTimeMetric(/* sample */ 1); |
| 196 MetricsDaemon::DailyUseReporter(&daemon_, /* tag */ 23, /* count */ 89); | 213 MetricsDaemon::ReportDailyUse(&daemon_, /* tag */ 23, /* count */ 89); |
| 197 | 214 |
| 198 // There should be no metrics generated for the calls below. | 215 // There should be no metrics generated for the calls below. |
| 199 MetricsDaemon::DailyUseReporter(&daemon_, /* tag */ 50, /* count */ 0); | 216 MetricsDaemon::ReportDailyUse(&daemon_, /* tag */ 50, /* count */ 0); |
| 200 MetricsDaemon::DailyUseReporter(&daemon_, /* tag */ 60, /* count */ -5); | 217 MetricsDaemon::ReportDailyUse(&daemon_, /* tag */ 60, /* count */ -5); |
| 201 } | 218 } |
| 202 | 219 |
| 203 TEST_F(MetricsDaemonTest, KernelCrashIntervalReporter) { | 220 TEST_F(MetricsDaemonTest, ReportKernelCrashInterval) { |
| 204 ExpectMetric(MetricsDaemon::kMetricKernelCrashIntervalName, 50, | 221 ExpectMetric(MetricsDaemon::kMetricKernelCrashIntervalName, 50, |
| 205 MetricsDaemon::kMetricKernelCrashIntervalMin, | 222 MetricsDaemon::kMetricCrashIntervalMin, |
| 206 MetricsDaemon::kMetricKernelCrashIntervalMax, | 223 MetricsDaemon::kMetricCrashIntervalMax, |
| 207 MetricsDaemon::kMetricKernelCrashIntervalBuckets); | 224 MetricsDaemon::kMetricCrashIntervalBuckets); |
| 208 MetricsDaemon::KernelCrashIntervalReporter(&daemon_, 0, 50); | 225 MetricsDaemon::ReportKernelCrashInterval(&daemon_, 0, 50); |
| 226 } |
| 227 |
| 228 TEST_F(MetricsDaemonTest, ReportUncleanShutdownInterval) { |
| 229 ExpectMetric(MetricsDaemon::kMetricUncleanShutdownIntervalName, 50, |
| 230 MetricsDaemon::kMetricCrashIntervalMin, |
| 231 MetricsDaemon::kMetricCrashIntervalMax, |
| 232 MetricsDaemon::kMetricCrashIntervalBuckets); |
| 233 MetricsDaemon::ReportUncleanShutdownInterval(&daemon_, 0, 50); |
| 209 } | 234 } |
| 210 | 235 |
| 211 TEST_F(MetricsDaemonTest, LookupNetworkState) { | 236 TEST_F(MetricsDaemonTest, LookupNetworkState) { |
| 212 EXPECT_EQ(MetricsDaemon::kNetworkStateOnline, | 237 EXPECT_EQ(MetricsDaemon::kNetworkStateOnline, |
| 213 daemon_.LookupNetworkState("online")); | 238 daemon_.LookupNetworkState("online")); |
| 214 EXPECT_EQ(MetricsDaemon::kNetworkStateOffline, | 239 EXPECT_EQ(MetricsDaemon::kNetworkStateOffline, |
| 215 daemon_.LookupNetworkState("offline")); | 240 daemon_.LookupNetworkState("offline")); |
| 216 EXPECT_EQ(MetricsDaemon::kUnknownNetworkState, | 241 EXPECT_EQ(MetricsDaemon::kUnknownNetworkState, |
| 217 daemon_.LookupNetworkState("somestate")); | 242 daemon_.LookupNetworkState("somestate")); |
| 218 } | 243 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 239 DBusMessage* msg = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL); | 264 DBusMessage* msg = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL); |
| 240 DBusHandlerResult res = | 265 DBusHandlerResult res = |
| 241 MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 266 MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); |
| 242 EXPECT_EQ(DBUS_HANDLER_RESULT_NOT_YET_HANDLED, res); | 267 EXPECT_EQ(DBUS_HANDLER_RESULT_NOT_YET_HANDLED, res); |
| 243 DeleteDBusMessage(msg); | 268 DeleteDBusMessage(msg); |
| 244 | 269 |
| 245 IgnoreActiveUseUpdate(); | 270 IgnoreActiveUseUpdate(); |
| 246 EXPECT_CALL(*user_crash_interval_, Flush()) | 271 EXPECT_CALL(*user_crash_interval_, Flush()) |
| 247 .Times(1) | 272 .Times(1) |
| 248 .RetiresOnSaturation(); | 273 .RetiresOnSaturation(); |
| 274 EXPECT_CALL(*user_crashes_daily_, Update(1)) |
| 275 .Times(1) |
| 276 .RetiresOnSaturation(); |
| 277 EXPECT_CALL(*any_crashes_daily_, Update(1)) |
| 278 .Times(1) |
| 279 .RetiresOnSaturation(); |
| 249 msg = NewDBusSignalString("/", | 280 msg = NewDBusSignalString("/", |
| 250 "org.chromium.CrashReporter", | 281 "org.chromium.CrashReporter", |
| 251 "UserCrash", | 282 "UserCrash", |
| 252 ""); | 283 ""); |
| 253 res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 284 res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); |
| 254 EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); | 285 EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); |
| 255 DeleteDBusMessage(msg); | 286 DeleteDBusMessage(msg); |
| 256 | 287 |
| 257 msg = NewDBusSignalString("/", | 288 msg = NewDBusSignalString("/", |
| 258 "org.chromium.flimflam.Manager", | 289 "org.chromium.flimflam.Manager", |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 EXPECT_EQ(MetricsDaemon::kUnknownPowerState, daemon_.power_state_); | 403 EXPECT_EQ(MetricsDaemon::kUnknownPowerState, daemon_.power_state_); |
| 373 EXPECT_FALSE(daemon_.user_active_); | 404 EXPECT_FALSE(daemon_.user_active_); |
| 374 EXPECT_EQ(TestTime(7 * kSecondsPerDay + 185), daemon_.user_active_last_); | 405 EXPECT_EQ(TestTime(7 * kSecondsPerDay + 185), daemon_.user_active_last_); |
| 375 } | 406 } |
| 376 | 407 |
| 377 TEST_F(MetricsDaemonTest, ProcessKernelCrash) { | 408 TEST_F(MetricsDaemonTest, ProcessKernelCrash) { |
| 378 IgnoreActiveUseUpdate(); | 409 IgnoreActiveUseUpdate(); |
| 379 EXPECT_CALL(*kernel_crash_interval_, Flush()) | 410 EXPECT_CALL(*kernel_crash_interval_, Flush()) |
| 380 .Times(1) | 411 .Times(1) |
| 381 .RetiresOnSaturation(); | 412 .RetiresOnSaturation(); |
| 413 EXPECT_CALL(*kernel_crashes_daily_, Update(1)); |
| 414 EXPECT_CALL(*any_crashes_daily_, Update(1)); |
| 382 daemon_.ProcessKernelCrash(); | 415 daemon_.ProcessKernelCrash(); |
| 383 } | 416 } |
| 384 | 417 |
| 418 TEST_F(MetricsDaemonTest, ProcessUncleanShutdown) { |
| 419 IgnoreActiveUseUpdate(); |
| 420 EXPECT_CALL(*unclean_shutdown_interval_, Flush()) |
| 421 .Times(1) |
| 422 .RetiresOnSaturation(); |
| 423 EXPECT_CALL(*unclean_shutdowns_daily_, Update(1)); |
| 424 EXPECT_CALL(*any_crashes_daily_, Update(1)); |
| 425 daemon_.ProcessUncleanShutdown(); |
| 426 } |
| 427 |
| 385 TEST_F(MetricsDaemonTest, ProcessUserCrash) { | 428 TEST_F(MetricsDaemonTest, ProcessUserCrash) { |
| 386 IgnoreActiveUseUpdate(); | 429 IgnoreActiveUseUpdate(); |
| 387 EXPECT_CALL(*user_crash_interval_, Flush()) | 430 EXPECT_CALL(*user_crash_interval_, Flush()) |
| 388 .Times(1) | 431 .Times(1) |
| 389 .RetiresOnSaturation(); | 432 .RetiresOnSaturation(); |
| 433 EXPECT_CALL(*user_crashes_daily_, Update(1)); |
| 434 EXPECT_CALL(*any_crashes_daily_, Update(1)); |
| 390 daemon_.ProcessUserCrash(); | 435 daemon_.ProcessUserCrash(); |
| 391 } | 436 } |
| 392 | 437 |
| 393 TEST_F(MetricsDaemonTest, SendMetric) { | 438 TEST_F(MetricsDaemonTest, SendMetric) { |
| 394 ExpectMetric("Dummy.Metric", 3, 1, 100, 50); | 439 ExpectMetric("Dummy.Metric", 3, 1, 100, 50); |
| 395 daemon_.SendMetric("Dummy.Metric", /* sample */ 3, | 440 daemon_.SendMetric("Dummy.Metric", /* sample */ 3, |
| 396 /* min */ 1, /* max */ 100, /* buckets */ 50); | 441 /* min */ 1, /* max */ 100, /* buckets */ 50); |
| 397 } | 442 } |
| 398 | 443 |
| 399 TEST_F(MetricsDaemonTest, SessionStateChanged) { | 444 TEST_F(MetricsDaemonTest, SessionStateChanged) { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 EXPECT_TRUE(daemon_.user_active_); | 507 EXPECT_TRUE(daemon_.user_active_); |
| 463 EXPECT_EQ(TestTime(10 * kSecondsPerDay + 300), daemon_.user_active_last_); | 508 EXPECT_EQ(TestTime(10 * kSecondsPerDay + 300), daemon_.user_active_last_); |
| 464 | 509 |
| 465 ExpectActiveUseUpdate(10, 0); | 510 ExpectActiveUseUpdate(10, 0); |
| 466 daemon_.SetUserActiveState(/* active */ true, | 511 daemon_.SetUserActiveState(/* active */ true, |
| 467 TestTime(10 * kSecondsPerDay + 1000)); | 512 TestTime(10 * kSecondsPerDay + 1000)); |
| 468 EXPECT_TRUE(daemon_.user_active_); | 513 EXPECT_TRUE(daemon_.user_active_); |
| 469 EXPECT_EQ(TestTime(10 * kSecondsPerDay + 1000), daemon_.user_active_last_); | 514 EXPECT_EQ(TestTime(10 * kSecondsPerDay + 1000), daemon_.user_active_last_); |
| 470 } | 515 } |
| 471 | 516 |
| 472 TEST_F(MetricsDaemonTest, UserCrashIntervalReporter) { | 517 TEST_F(MetricsDaemonTest, ReportUserCrashInterval) { |
| 473 ExpectMetric(MetricsDaemon::kMetricUserCrashIntervalName, 50, | 518 ExpectMetric(MetricsDaemon::kMetricUserCrashIntervalName, 50, |
| 474 MetricsDaemon::kMetricUserCrashIntervalMin, | 519 MetricsDaemon::kMetricCrashIntervalMin, |
| 475 MetricsDaemon::kMetricUserCrashIntervalMax, | 520 MetricsDaemon::kMetricCrashIntervalMax, |
| 476 MetricsDaemon::kMetricUserCrashIntervalBuckets); | 521 MetricsDaemon::kMetricCrashIntervalBuckets); |
| 477 MetricsDaemon::UserCrashIntervalReporter(&daemon_, 0, 50); | 522 MetricsDaemon::ReportUserCrashInterval(&daemon_, 0, 50); |
| 523 } |
| 524 |
| 525 TEST_F(MetricsDaemonTest, ReportCrashesDailyFrequency) { |
| 526 ExpectMetric("foobar", 50, |
| 527 MetricsDaemon::kMetricCrashesDailyMin, |
| 528 MetricsDaemon::kMetricCrashesDailyMax, |
| 529 MetricsDaemon::kMetricCrashesDailyBuckets); |
| 530 MetricsDaemon::ReportCrashesDailyFrequency("foobar", &daemon_, 50); |
| 478 } | 531 } |
| 479 | 532 |
| 480 int main(int argc, char** argv) { | 533 int main(int argc, char** argv) { |
| 481 testing::InitGoogleTest(&argc, argv); | 534 testing::InitGoogleTest(&argc, argv); |
| 482 return RUN_ALL_TESTS(); | 535 return RUN_ALL_TESTS(); |
| 483 } | 536 } |
| OLD | NEW |