| 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 <utime.h> | 5 #include <utime.h> | 
| 6 | 6 | 
|  | 7 #include <string> | 
|  | 8 #include <vector> | 
|  | 9 | 
| 7 #include <base/file_util.h> | 10 #include <base/file_util.h> | 
| 8 #include <gtest/gtest.h> | 11 #include <gtest/gtest.h> | 
| 9 | 12 | 
| 10 #include "counter_mock.h" | 13 #include "counter_mock.h" | 
| 11 #include "metrics_daemon.h" | 14 #include "metrics_daemon.h" | 
| 12 #include "metrics_library_mock.h" | 15 #include "metrics_library_mock.h" | 
| 13 | 16 | 
| 14 using base::Time; | 17 using base::Time; | 
| 15 using base::TimeTicks; | 18 using base::TimeTicks; | 
| 16 using chromeos_metrics::FrequencyCounter; | 19 using chromeos_metrics::FrequencyCounter; | 
| 17 using chromeos_metrics::FrequencyCounterMock; | 20 using chromeos_metrics::FrequencyCounterMock; | 
| 18 using chromeos_metrics::TaggedCounterMock; | 21 using chromeos_metrics::TaggedCounterMock; | 
| 19 using chromeos_metrics::TaggedCounterReporter; | 22 using chromeos_metrics::TaggedCounterReporter; | 
| 20 using chromeos_metrics::TaggedCounterReporterMock; | 23 using chromeos_metrics::TaggedCounterReporterMock; | 
|  | 24 using std::string; | 
|  | 25 using std::vector; | 
| 21 using ::testing::_; | 26 using ::testing::_; | 
| 22 using ::testing::Return; | 27 using ::testing::Return; | 
| 23 using ::testing::StrictMock; | 28 using ::testing::StrictMock; | 
| 24 | 29 | 
| 25 static const int kSecondsPerDay = 24 * 60 * 60; | 30 static const int kSecondsPerDay = 24 * 60 * 60; | 
| 26 | 31 | 
| 27 static const char kTestDir[] = "test"; | 32 static const char kTestDir[] = "test"; | 
| 28 static const char kLastFile[] = "test/last"; | 33 static const char kLastFile[] = "test/last"; | 
| 29 static const char kCurrentFile[] = "test/current"; | 34 static const char kCurrentFile[] = "test/current"; | 
| 30 | 35 | 
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 158         .Times(1) | 163         .Times(1) | 
| 159         .RetiresOnSaturation(); | 164         .RetiresOnSaturation(); | 
| 160     EXPECT_CALL(*user_crash_interval_, Update(_, _)) | 165     EXPECT_CALL(*user_crash_interval_, Update(_, _)) | 
| 161         .Times(1) | 166         .Times(1) | 
| 162         .RetiresOnSaturation(); | 167         .RetiresOnSaturation(); | 
| 163     ExpectFrequencyFlushCalls(); | 168     ExpectFrequencyFlushCalls(); | 
| 164   } | 169   } | 
| 165 | 170 | 
| 166   // Adds a metrics library mock expectation that the specified metric | 171   // Adds a metrics library mock expectation that the specified metric | 
| 167   // will be generated. | 172   // will be generated. | 
| 168   void ExpectMetric(const std::string& name, int sample, | 173   void ExpectMetric(const string& name, int sample, | 
| 169                     int min, int max, int buckets) { | 174                     int min, int max, int buckets) { | 
| 170     EXPECT_CALL(metrics_lib_, SendToUMA(name, sample, min, max, buckets)) | 175     EXPECT_CALL(metrics_lib_, SendToUMA(name, sample, min, max, buckets)) | 
| 171         .Times(1) | 176         .Times(1) | 
| 172         .WillOnce(Return(true)) | 177         .WillOnce(Return(true)) | 
| 173         .RetiresOnSaturation(); | 178         .RetiresOnSaturation(); | 
| 174   } | 179   } | 
| 175 | 180 | 
| 176   // Adds a metrics library mock expectation that the specified daily | 181   // Adds a metrics library mock expectation that the specified daily | 
| 177   // use time metric will be generated. | 182   // use time metric will be generated. | 
| 178   void ExpectDailyUseTimeMetric(int sample) { | 183   void ExpectDailyUseTimeMetric(int sample) { | 
| 179     ExpectMetric(MetricsDaemon::kMetricDailyUseTimeName, sample, | 184     ExpectMetric(MetricsDaemon::kMetricDailyUseTimeName, sample, | 
| 180                  MetricsDaemon::kMetricDailyUseTimeMin, | 185                  MetricsDaemon::kMetricDailyUseTimeMin, | 
| 181                  MetricsDaemon::kMetricDailyUseTimeMax, | 186                  MetricsDaemon::kMetricDailyUseTimeMax, | 
| 182                  MetricsDaemon::kMetricDailyUseTimeBuckets); | 187                  MetricsDaemon::kMetricDailyUseTimeBuckets); | 
| 183   } | 188   } | 
| 184 | 189 | 
| 185   // Converts from seconds to a Time object. | 190   // Converts from seconds to a Time object. | 
| 186   Time TestTime(int64 seconds) { | 191   Time TestTime(int64 seconds) { | 
| 187     return Time::FromInternalValue(seconds * Time::kMicrosecondsPerSecond); | 192     return Time::FromInternalValue(seconds * Time::kMicrosecondsPerSecond); | 
| 188   } | 193   } | 
| 189 | 194 | 
| 190   // Creates a new DBus signal message with a single string | 195   // Creates a new DBus signal message with zero or more string arguments. | 
| 191   // argument. The message can be deallocated through | 196   // The message can be deallocated through DeleteDBusMessage. | 
| 192   // DeleteDBusMessage. |  | 
| 193   // | 197   // | 
| 194   // |path| is the object emitting the signal. | 198   // |path| is the object emitting the signal. | 
| 195   // |interface| is the interface the signal is emitted from. | 199   // |interface| is the interface the signal is emitted from. | 
| 196   // |name| is the name of the signal. | 200   // |name| is the name of the signal. | 
| 197   // |arg_value| is the value of the string argument. | 201   // |arg_values| contains the values of the string arguments. | 
| 198   DBusMessage* NewDBusSignalString(const std::string& path, | 202   DBusMessage* NewDBusSignalString(const string& path, | 
| 199                                    const std::string& interface, | 203                                    const string& interface, | 
| 200                                    const std::string& name, | 204                                    const string& name, | 
| 201                                    const std::string& arg_value) { | 205                                    const vector<string>& arg_values) { | 
| 202     DBusMessage* msg = dbus_message_new_signal(path.c_str(), | 206     DBusMessage* msg = dbus_message_new_signal(path.c_str(), | 
| 203                                                interface.c_str(), | 207                                                interface.c_str(), | 
| 204                                                name.c_str()); | 208                                                name.c_str()); | 
| 205     DBusMessageIter iter; | 209     DBusMessageIter iter; | 
| 206     dbus_message_iter_init_append(msg, &iter); | 210     dbus_message_iter_init_append(msg, &iter); | 
| 207     const char* arg_value_c = arg_value.c_str(); | 211     for (vector<string>::const_iterator it = arg_values.begin(); | 
| 208     dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &arg_value_c); | 212          it != arg_values.end(); ++it) { | 
|  | 213       const char* str_value = it->c_str(); | 
|  | 214       dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &str_value); | 
|  | 215     } | 
| 209     return msg; | 216     return msg; | 
| 210   } | 217   } | 
| 211 | 218 | 
| 212   // Deallocates the DBus message |msg| previously allocated through | 219   // Deallocates the DBus message |msg| previously allocated through | 
| 213   // dbus_message_new*. | 220   // dbus_message_new*. | 
| 214   void DeleteDBusMessage(DBusMessage* msg) { | 221   void DeleteDBusMessage(DBusMessage* msg) { | 
| 215     dbus_message_unref(msg); | 222     dbus_message_unref(msg); | 
| 216   } | 223   } | 
| 217 | 224 | 
| 218   // Get the frequency counter for the given name. | 225   // Get the frequency counter for the given name. | 
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 301       Update(1)) | 308       Update(1)) | 
| 302       .Times(1) | 309       .Times(1) | 
| 303       .RetiresOnSaturation(); | 310       .RetiresOnSaturation(); | 
| 304   EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricUserCrashesWeeklyName), | 311   EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricUserCrashesWeeklyName), | 
| 305       Update(1)) | 312       Update(1)) | 
| 306       .Times(1) | 313       .Times(1) | 
| 307       .RetiresOnSaturation(); | 314       .RetiresOnSaturation(); | 
| 308   EXPECT_CALL(*user_crash_interval_, Flush()) | 315   EXPECT_CALL(*user_crash_interval_, Flush()) | 
| 309       .Times(1) | 316       .Times(1) | 
| 310       .RetiresOnSaturation(); | 317       .RetiresOnSaturation(); | 
|  | 318   vector<string> signal_args; | 
| 311   msg = NewDBusSignalString("/", | 319   msg = NewDBusSignalString("/", | 
| 312                             "org.chromium.CrashReporter", | 320                             "org.chromium.CrashReporter", | 
| 313                             "UserCrash", | 321                             "UserCrash", | 
| 314                             ""); | 322                             signal_args); | 
| 315   res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 323   res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 
| 316   EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); | 324   EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); | 
| 317   DeleteDBusMessage(msg); | 325   DeleteDBusMessage(msg); | 
| 318 | 326 | 
|  | 327   signal_args.clear(); | 
|  | 328   signal_args.push_back("on"); | 
| 319   msg = NewDBusSignalString("/", | 329   msg = NewDBusSignalString("/", | 
| 320                             "org.chromium.PowerManager", | 330                             "org.chromium.PowerManager", | 
| 321                             "PowerStateChanged", | 331                             "PowerStateChanged", | 
| 322                             "on"); | 332                             signal_args); | 
| 323   EXPECT_EQ(MetricsDaemon::kUnknownPowerState, daemon_.power_state_); | 333   EXPECT_EQ(MetricsDaemon::kUnknownPowerState, daemon_.power_state_); | 
| 324   res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 334   res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 
| 325   EXPECT_EQ(MetricsDaemon::kPowerStateOn, daemon_.power_state_); | 335   EXPECT_EQ(MetricsDaemon::kPowerStateOn, daemon_.power_state_); | 
| 326   EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); | 336   EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); | 
| 327   DeleteDBusMessage(msg); | 337   DeleteDBusMessage(msg); | 
| 328 | 338 | 
|  | 339   signal_args.clear(); | 
| 329   IgnoreActiveUseUpdate(); | 340   IgnoreActiveUseUpdate(); | 
| 330   msg = NewDBusSignalString("/", | 341   msg = NewDBusSignalString("/", | 
| 331                             "org.chromium.PowerManager", | 342                             "org.chromium.PowerManager", | 
| 332                             "ScreenIsUnlocked", | 343                             "ScreenIsUnlocked", | 
| 333                             ""); | 344                             signal_args); | 
| 334   EXPECT_FALSE(daemon_.user_active_); | 345   EXPECT_FALSE(daemon_.user_active_); | 
| 335   res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 346   res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 
| 336   EXPECT_TRUE(daemon_.user_active_); | 347   EXPECT_TRUE(daemon_.user_active_); | 
| 337   EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); | 348   EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); | 
| 338   DeleteDBusMessage(msg); | 349   DeleteDBusMessage(msg); | 
| 339 | 350 | 
| 340   IgnoreActiveUseUpdate(); | 351   IgnoreActiveUseUpdate(); | 
|  | 352   signal_args.clear(); | 
|  | 353   signal_args.push_back("started"); | 
|  | 354   signal_args.push_back("bob");  // arbitrary username | 
| 341   msg = NewDBusSignalString("/org/chromium/SessionManager", | 355   msg = NewDBusSignalString("/org/chromium/SessionManager", | 
| 342                             "org.chromium.SessionManagerInterface", | 356                             "org.chromium.SessionManagerInterface", | 
| 343                             "SessionStateChanged", | 357                             "SessionStateChanged", | 
| 344                             "started"); | 358                             signal_args); | 
| 345   EXPECT_EQ(MetricsDaemon::kUnknownSessionState, daemon_.session_state_); | 359   EXPECT_EQ(MetricsDaemon::kUnknownSessionState, daemon_.session_state_); | 
| 346   res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 360   res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 
| 347   EXPECT_EQ(MetricsDaemon::kSessionStateStarted, daemon_.session_state_); | 361   EXPECT_EQ(MetricsDaemon::kSessionStateStarted, daemon_.session_state_); | 
| 348   EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); | 362   EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); | 
| 349   DeleteDBusMessage(msg); | 363   DeleteDBusMessage(msg); | 
| 350 | 364 | 
|  | 365   signal_args.clear(); | 
|  | 366   signal_args.push_back("randomstate"); | 
|  | 367   signal_args.push_back("bob");  // arbitrary username | 
| 351   msg = NewDBusSignalString("/", | 368   msg = NewDBusSignalString("/", | 
| 352                             "org.chromium.UnknownService.Manager", | 369                             "org.chromium.UnknownService.Manager", | 
| 353                             "StateChanged", | 370                             "StateChanged", | 
| 354                             "randomstate"); | 371                             signal_args); | 
| 355   res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 372   res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_); | 
| 356   EXPECT_EQ(DBUS_HANDLER_RESULT_NOT_YET_HANDLED, res); | 373   EXPECT_EQ(DBUS_HANDLER_RESULT_NOT_YET_HANDLED, res); | 
| 357   DeleteDBusMessage(msg); | 374   DeleteDBusMessage(msg); | 
| 358 } | 375 } | 
| 359 | 376 | 
| 360 TEST_F(MetricsDaemonTest, PowerStateChanged) { | 377 TEST_F(MetricsDaemonTest, PowerStateChanged) { | 
| 361   ExpectActiveUseUpdate(7, 0); | 378   ExpectActiveUseUpdate(7, 0); | 
| 362   daemon_.SetUserActiveState(/* active */ true, | 379   daemon_.SetUserActiveState(/* active */ true, | 
| 363                              TestTime(7 * kSecondsPerDay + 15)); | 380                              TestTime(7 * kSecondsPerDay + 15)); | 
| 364   EXPECT_TRUE(daemon_.user_active_); | 381   EXPECT_TRUE(daemon_.user_active_); | 
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 513 TEST_F(MetricsDaemonTest, GetHistogramPath) { | 530 TEST_F(MetricsDaemonTest, GetHistogramPath) { | 
| 514   EXPECT_EQ("/var/log/metrics/Logging.AnyCrashesDaily", | 531   EXPECT_EQ("/var/log/metrics/Logging.AnyCrashesDaily", | 
| 515             daemon_.GetHistogramPath( | 532             daemon_.GetHistogramPath( | 
| 516                 MetricsDaemon::kMetricAnyCrashesDailyName).value()); | 533                 MetricsDaemon::kMetricAnyCrashesDailyName).value()); | 
| 517 } | 534 } | 
| 518 | 535 | 
| 519 int main(int argc, char** argv) { | 536 int main(int argc, char** argv) { | 
| 520   testing::InitGoogleTest(&argc, argv); | 537   testing::InitGoogleTest(&argc, argv); | 
| 521   return RUN_ALL_TESTS(); | 538   return RUN_ALL_TESTS(); | 
| 522 } | 539 } | 
| OLD | NEW | 
|---|