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 |