Index: metrics_daemon_test.cc |
diff --git a/metrics_daemon_test.cc b/metrics_daemon_test.cc |
index 49acd3164ad992d8a39ddd3970c4972b94692a1f..7119c8506f51332091b5b19357f1e261444bb52b 100644 |
--- a/metrics_daemon_test.cc |
+++ b/metrics_daemon_test.cc |
@@ -2,26 +2,19 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <gtest/gtest.h> |
+ |
+#include "counter_mock.h" |
#include "metrics_daemon.h" |
#include "metrics_library_mock.h" |
-#include <sys/file.h> |
- |
-#include <base/eintr_wrapper.h> |
-#include <base/file_util.h> |
-#include <base/logging.h> |
-#include <base/string_util.h> |
-#include <gtest/gtest.h> |
- |
using base::Time; |
using base::TimeTicks; |
-using ::testing::Mock; |
+using chromeos_metrics::TaggedCounterMock; |
+using ::testing::_; |
using ::testing::Return; |
using ::testing::StrictMock; |
-static const char kTestDailyUseRecordFile[] = "daily-usage-test"; |
-static const char kDoesNotExistFile[] = "/does/not/exist"; |
- |
static const int kSecondsPerDay = 24 * 60 * 60; |
// This class allows a TimeTicks object to be initialized with seconds |
@@ -48,46 +41,29 @@ static std::ostream& operator<<(std::ostream& o, const Time& time) { |
class MetricsDaemonTest : public testing::Test { |
protected: |
virtual void SetUp() { |
- EXPECT_EQ(NULL, daemon_.daily_use_record_file_); |
+ EXPECT_EQ(NULL, daemon_.daily_use_.get()); |
daemon_.Init(true, &metrics_lib_); |
- // Tests constructor initialization. Switches to a test daily use |
- // record file. |
- EXPECT_TRUE(NULL != daemon_.daily_use_record_file_); |
- daemon_.daily_use_record_file_ = kTestDailyUseRecordFile; |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
- EXPECT_EQ(0, daemon_.daily_use_day_last_); |
+ // Tests constructor initialization. Switches to mock counters. |
+ EXPECT_TRUE(NULL != daemon_.daily_use_.get()); |
+ daily_use_ = new StrictMock<TaggedCounterMock>(); |
+ daemon_.daily_use_.reset(daily_use_); // Transfers ownership. |
EXPECT_FALSE(daemon_.user_active_); |
EXPECT_TRUE(daemon_.user_active_last_.is_null()); |
EXPECT_EQ(MetricsDaemon::kUnknownNetworkState, daemon_.network_state_); |
EXPECT_TRUE(daemon_.network_state_last_.is_null()); |
EXPECT_EQ(MetricsDaemon::kUnknownPowerState, daemon_.power_state_); |
EXPECT_EQ(MetricsDaemon::kUnknownSessionState, daemon_.session_state_); |
- |
- // The test fixture object will be used by the log message handler. |
- daemon_test_ = this; |
- logging::SetLogMessageHandler(HandleLogMessages); |
- } |
- |
- virtual void TearDown() { |
- logging::SetLogMessageHandler(NULL); |
- daemon_test_ = NULL; |
- file_util::Delete(FilePath(kTestDailyUseRecordFile), false); |
} |
- // Collects log messages in the |daemon_log_| member string so that |
- // they can be analyzed for errors and expected behavior. |
- static bool HandleLogMessages(int severity, const std::string& str) { |
- daemon_test_->daemon_log_.append(str); |
- daemon_test_->daemon_log_.append("\n"); |
- |
- // Returning true would mute the log. |
- return false; |
- } |
+ virtual void TearDown() {} |
- // Returns true if the daemon log contains |pattern|, false otherwise. |
- bool LogContains(const std::string& pattern) { |
- return daemon_log_.find(pattern) != std::string::npos; |
+ // Adds a daily use aggregation counter expectation that the |
+ // specified tag/count update will be generated. |
+ void ExpectDailyUseUpdate(int tag, int count) { |
+ EXPECT_CALL(*daily_use_, Update(tag, count)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
} |
// Adds a metrics library mock expectation that the specified metric |
@@ -118,55 +94,11 @@ class MetricsDaemonTest : public testing::Test { |
MetricsDaemon::kMetricTimeToNetworkDropBuckets); |
} |
+ // Converts from seconds to a Time object. |
Time TestTime(int64 seconds) { |
return Time::FromInternalValue(seconds * Time::kMicrosecondsPerSecond); |
} |
- // Asserts that the daily use record file contains the specified |
- // contents. |
- testing::AssertionResult AssertDailyUseRecord(const char* expr_day, |
- const char* expr_seconds, |
- int expected_day, |
- int expected_seconds) { |
- int fd = HANDLE_EINTR(open(daemon_.daily_use_record_file_, O_RDONLY)); |
- if (fd < 0) { |
- testing::Message msg; |
- msg << "Unable to open " << daemon_.daily_use_record_file_; |
- return testing::AssertionFailure(msg); |
- } |
- |
- MetricsDaemon::UseRecord record; |
- if (!file_util::ReadFromFD(fd, reinterpret_cast<char*>(&record), |
- sizeof(record))) { |
- testing::Message msg; |
- msg << "Unable to read " << sizeof(record) << " bytes from " |
- << daemon_.daily_use_record_file_; |
- HANDLE_EINTR(close(fd)); |
- return testing::AssertionFailure(msg); |
- } |
- |
- if (record.day_ != expected_day || record.seconds_ != expected_seconds) { |
- testing::Message msg; |
- msg << "actual use record (" << record.day_ << ", " << record.seconds_ |
- << ") expected (" << expected_day << ", " << expected_seconds << ")"; |
- HANDLE_EINTR(close(fd)); |
- return testing::AssertionFailure(msg); |
- } |
- |
- HANDLE_EINTR(close(fd)); |
- return testing::AssertionSuccess(); |
- } |
- |
- // Returns true if the daily use record file does not exist or is |
- // empty, false otherwise. |
- bool AssertNoOrEmptyUseRecordFile() { |
- FilePath record_file(daemon_.daily_use_record_file_); |
- int64 record_file_size; |
- return !file_util::PathExists(record_file) || |
- (file_util::GetFileSize(record_file, &record_file_size) && |
- record_file_size == 0); |
- } |
- |
// Creates a new DBus signal message with a single string |
// argument. The message can be deallocated through |
// DeleteDBusMessage. |
@@ -195,9 +127,6 @@ class MetricsDaemonTest : public testing::Test { |
dbus_message_unref(msg); |
} |
- // Pointer to the current test fixture. |
- static MetricsDaemonTest* daemon_test_; |
- |
// The MetricsDaemon under test. |
MetricsDaemon daemon_; |
@@ -205,67 +134,19 @@ class MetricsDaemonTest : public testing::Test { |
// metric generation calls are marked as failures. |
StrictMock<MetricsLibraryMock> metrics_lib_; |
- // The accumulated metrics daemon log. |
- std::string daemon_log_; |
+ // Daily use time aggregation counter mock. It's a strict mock so |
+ // that all unexpected update calls are marked as failures. It's a |
+ // pointer so that it can replace the scoped_ptr allocated by the |
+ // daemon. |
+ StrictMock<TaggedCounterMock>* daily_use_; |
}; |
-// static |
-MetricsDaemonTest* MetricsDaemonTest::daemon_test_ = NULL; |
- |
-TEST_F(MetricsDaemonTest, LogDailyUseRecordBadFileLocation) { |
- // Checks that the daemon doesn't die badly if the file can't be |
- // created. |
- daemon_.daily_use_record_file_ = kDoesNotExistFile; |
- daemon_.LogDailyUseRecord(10, 20); |
- EXPECT_TRUE(LogContains("Unable to open the daily use file: " |
- "No such file or directory")); |
- EXPECT_EQ(0, daemon_.daily_use_day_last_); |
- file_util::Delete(FilePath(kDoesNotExistFile), false); |
-} |
- |
-TEST_F(MetricsDaemonTest, LogDailyUseRecordOnLogin) { |
- daemon_.LogDailyUseRecord(/* day */ 5, /* seconds */ 120); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 5, /* seconds */ 120); |
- EXPECT_EQ(5, daemon_.daily_use_day_last_); |
- |
- daemon_.LogDailyUseRecord(/* day */ 5, /* seconds */ 0); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 5, /* seconds */ 120); |
- EXPECT_EQ(5, daemon_.daily_use_day_last_); |
- |
- daemon_.LogDailyUseRecord(/* day */ 5, /* seconds */ 240); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 5, /* seconds */ 360); |
- EXPECT_EQ(5, daemon_.daily_use_day_last_); |
- |
- ExpectDailyUseTimeMetric(/* sample */ 6); |
- daemon_.LogDailyUseRecord(/* day */ 6, /* seconds */ 0); |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
- EXPECT_EQ(6, daemon_.daily_use_day_last_); |
-} |
- |
-TEST_F(MetricsDaemonTest, LogDailyUseRecordRoundDown) { |
- daemon_.LogDailyUseRecord(/* day */ 7, /* seconds */ 89); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 7, /* seconds */ 89); |
- EXPECT_EQ(7, daemon_.daily_use_day_last_); |
+TEST_F(MetricsDaemonTest, DailyUseReporter) { |
+ ExpectDailyUseTimeMetric(/* sample */ 2); |
+ MetricsDaemon::DailyUseReporter(&daemon_, /* tag */ 20, /* count */ 90); |
ExpectDailyUseTimeMetric(/* sample */ 1); |
- daemon_.LogDailyUseRecord(/* day */ 6, /* seconds */ 15); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 6, /* seconds */ 15); |
- EXPECT_EQ(6, daemon_.daily_use_day_last_); |
-} |
- |
-TEST_F(MetricsDaemonTest, LogDailyUseRecordRoundUp) { |
- daemon_.LogDailyUseRecord(/* day */ 6, /* seconds */ 0); |
- EXPECT_EQ(6, daemon_.daily_use_day_last_); |
- |
- // Tests rounding use time to the closest minute. |
- daemon_.LogDailyUseRecord(/* day */ 6, /* seconds */ 90); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 6, /* seconds */ 90); |
- EXPECT_EQ(6, daemon_.daily_use_day_last_); |
- |
- ExpectDailyUseTimeMetric(/* sample */ 2); |
- daemon_.LogDailyUseRecord(/* day */ 7, /* seconds */ 89); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 7, /* seconds */ 89); |
- EXPECT_EQ(7, daemon_.daily_use_day_last_); |
+ MetricsDaemon::DailyUseReporter(&daemon_, /* tag */ 23, /* count */ 89); |
} |
TEST_F(MetricsDaemonTest, LookupNetworkState) { |
@@ -322,6 +203,9 @@ TEST_F(MetricsDaemonTest, MessageFilter) { |
EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); |
DeleteDBusMessage(msg); |
+ EXPECT_CALL(*daily_use_, Update(_, 0)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
msg = NewDBusSignalString("/", |
"org.chromium.PowerManager", |
"ScreenIsUnlocked", |
@@ -332,6 +216,9 @@ TEST_F(MetricsDaemonTest, MessageFilter) { |
EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res); |
DeleteDBusMessage(msg); |
+ EXPECT_CALL(*daily_use_, Update(_, 0)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
msg = NewDBusSignalString("/org/chromium/SessionManager", |
"org.chromium.SessionManagerInterface", |
"SessionStateChanged", |
@@ -396,30 +283,28 @@ TEST_F(MetricsDaemonTest, NetStateChangedSuspend) { |
} |
TEST_F(MetricsDaemonTest, PowerStateChanged) { |
+ ExpectDailyUseUpdate(7, 0); |
daemon_.SetUserActiveState(/* active */ true, |
TestTime(7 * kSecondsPerDay + 15)); |
EXPECT_TRUE(daemon_.user_active_); |
EXPECT_EQ(TestTime(7 * kSecondsPerDay + 15), daemon_.user_active_last_); |
- EXPECT_EQ(7, daemon_.daily_use_day_last_); |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
+ ExpectDailyUseUpdate(7, 30); |
daemon_.PowerStateChanged("mem", TestTime(7 * kSecondsPerDay + 45)); |
EXPECT_EQ(MetricsDaemon::kPowerStateMem, daemon_.power_state_); |
EXPECT_FALSE(daemon_.user_active_); |
EXPECT_EQ(TestTime(7 * kSecondsPerDay + 45), daemon_.user_active_last_); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 7, /* seconds */ 30); |
daemon_.PowerStateChanged("on", TestTime(7 * kSecondsPerDay + 85)); |
EXPECT_EQ(MetricsDaemon::kPowerStateOn, daemon_.power_state_); |
EXPECT_FALSE(daemon_.user_active_); |
EXPECT_EQ(TestTime(7 * kSecondsPerDay + 45), daemon_.user_active_last_); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 7, /* seconds */ 30); |
+ ExpectDailyUseUpdate(7, 0); |
daemon_.PowerStateChanged("otherstate", TestTime(7 * kSecondsPerDay + 185)); |
EXPECT_EQ(MetricsDaemon::kUnknownPowerState, daemon_.power_state_); |
EXPECT_FALSE(daemon_.user_active_); |
EXPECT_EQ(TestTime(7 * kSecondsPerDay + 185), daemon_.user_active_last_); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 7, /* seconds */ 30); |
} |
TEST_F(MetricsDaemonTest, SendMetric) { |
@@ -429,117 +314,76 @@ TEST_F(MetricsDaemonTest, SendMetric) { |
} |
TEST_F(MetricsDaemonTest, SessionStateChanged) { |
+ ExpectDailyUseUpdate(15, 0); |
daemon_.SessionStateChanged("started", TestTime(15 * kSecondsPerDay + 20)); |
EXPECT_EQ(MetricsDaemon::kSessionStateStarted, daemon_.session_state_); |
EXPECT_TRUE(daemon_.user_active_); |
EXPECT_EQ(TestTime(15 * kSecondsPerDay + 20), daemon_.user_active_last_); |
- EXPECT_EQ(15, daemon_.daily_use_day_last_); |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
+ ExpectDailyUseUpdate(15, 130); |
daemon_.SessionStateChanged("stopped", TestTime(15 * kSecondsPerDay + 150)); |
EXPECT_EQ(MetricsDaemon::kSessionStateStopped, daemon_.session_state_); |
EXPECT_FALSE(daemon_.user_active_); |
EXPECT_EQ(TestTime(15 * kSecondsPerDay + 150), daemon_.user_active_last_); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 15, /* seconds */ 130); |
+ ExpectDailyUseUpdate(15, 0); |
daemon_.SessionStateChanged("otherstate", |
TestTime(15 * kSecondsPerDay + 300)); |
EXPECT_EQ(MetricsDaemon::kUnknownSessionState, daemon_.session_state_); |
EXPECT_FALSE(daemon_.user_active_); |
EXPECT_EQ(TestTime(15 * kSecondsPerDay + 300), daemon_.user_active_last_); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 15, /* seconds */ 130); |
} |
-TEST_F(MetricsDaemonTest, SetUserActiveStateSendOnLogin) { |
+TEST_F(MetricsDaemonTest, SetUserActiveState) { |
+ ExpectDailyUseUpdate(5, 0); |
daemon_.SetUserActiveState(/* active */ false, |
TestTime(5 * kSecondsPerDay + 10)); |
EXPECT_FALSE(daemon_.user_active_); |
EXPECT_EQ(TestTime(5 * kSecondsPerDay + 10), daemon_.user_active_last_); |
- EXPECT_EQ(5, daemon_.daily_use_day_last_); |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
+ ExpectDailyUseUpdate(6, 0); |
daemon_.SetUserActiveState(/* active */ true, |
TestTime(6 * kSecondsPerDay + 20)); |
EXPECT_TRUE(daemon_.user_active_); |
EXPECT_EQ(TestTime(6 * kSecondsPerDay + 20), daemon_.user_active_last_); |
- EXPECT_EQ(6, daemon_.daily_use_day_last_); |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
+ ExpectDailyUseUpdate(6, 100); |
daemon_.SetUserActiveState(/* active */ true, |
TestTime(6 * kSecondsPerDay + 120)); |
EXPECT_TRUE(daemon_.user_active_); |
EXPECT_EQ(TestTime(6 * kSecondsPerDay + 120), daemon_.user_active_last_); |
- EXPECT_EQ(6, daemon_.daily_use_day_last_); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 6, /* seconds */ 100); |
+ ExpectDailyUseUpdate(6, 110); |
daemon_.SetUserActiveState(/* active */ false, |
- TestTime(6 * kSecondsPerDay + 220)); |
+ TestTime(6 * kSecondsPerDay + 230)); |
EXPECT_FALSE(daemon_.user_active_); |
- EXPECT_EQ(TestTime(6 * kSecondsPerDay + 220), daemon_.user_active_last_); |
- EXPECT_EQ(6, daemon_.daily_use_day_last_); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 6, /* seconds */ 200); |
- |
- ExpectDailyUseTimeMetric(/* sample */ 3); |
- daemon_.SetUserActiveState(/* active */ true, |
- TestTime(8 * kSecondsPerDay - 300)); |
- EXPECT_TRUE(daemon_.user_active_); |
- EXPECT_EQ(TestTime(8 * kSecondsPerDay - 300), daemon_.user_active_last_); |
- EXPECT_EQ(7, daemon_.daily_use_day_last_); |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
-} |
- |
-TEST_F(MetricsDaemonTest, SetUserActiveStateSendOnMonitor) { |
- daemon_.SetUserActiveState(/* active */ true, |
- TestTime(8 * kSecondsPerDay - 300)); |
- EXPECT_TRUE(daemon_.user_active_); |
- EXPECT_EQ(TestTime(8 * kSecondsPerDay - 300), daemon_.user_active_last_); |
- EXPECT_EQ(7, daemon_.daily_use_day_last_); |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
+ EXPECT_EQ(TestTime(6 * kSecondsPerDay + 230), daemon_.user_active_last_); |
+ ExpectDailyUseUpdate(6, 0); |
daemon_.SetUserActiveState(/* active */ false, |
- TestTime(8 * kSecondsPerDay + 300)); |
+ TestTime(6 * kSecondsPerDay + 260)); |
EXPECT_FALSE(daemon_.user_active_); |
- EXPECT_EQ(TestTime(8 * kSecondsPerDay + 300), daemon_.user_active_last_); |
- EXPECT_EQ(8, daemon_.daily_use_day_last_); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 8, /* seconds */ 600); |
- |
- daemon_.SetUserActiveState(/* active */ true, |
- TestTime(9 * kSecondsPerDay - 200)); |
- EXPECT_TRUE(daemon_.user_active_); |
- EXPECT_EQ(TestTime(9 * kSecondsPerDay - 200), daemon_.user_active_last_); |
- EXPECT_EQ(8, daemon_.daily_use_day_last_); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 8, /* seconds */ 600); |
- |
- ExpectDailyUseTimeMetric(/* sample */ 10); |
- daemon_.SetUserActiveState(/* active */ true, |
- TestTime(9 * kSecondsPerDay + 200)); |
- EXPECT_TRUE(daemon_.user_active_); |
- EXPECT_EQ(TestTime(9 * kSecondsPerDay + 200), daemon_.user_active_last_); |
- EXPECT_EQ(9, daemon_.daily_use_day_last_); |
- EXPECT_PRED_FORMAT2(AssertDailyUseRecord, /* day */ 9, /* seconds */ 400); |
+ EXPECT_EQ(TestTime(6 * kSecondsPerDay + 260), daemon_.user_active_last_); |
} |
TEST_F(MetricsDaemonTest, SetUserActiveStateTimeJump) { |
+ ExpectDailyUseUpdate(10, 0); |
daemon_.SetUserActiveState(/* active */ true, |
TestTime(10 * kSecondsPerDay + 500)); |
EXPECT_TRUE(daemon_.user_active_); |
EXPECT_EQ(TestTime(10 * kSecondsPerDay + 500), daemon_.user_active_last_); |
- EXPECT_EQ(10, daemon_.daily_use_day_last_); |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
+ ExpectDailyUseUpdate(10, 0); |
daemon_.SetUserActiveState(/* active */ true, |
TestTime(10 * kSecondsPerDay + 300)); |
EXPECT_TRUE(daemon_.user_active_); |
EXPECT_EQ(TestTime(10 * kSecondsPerDay + 300), daemon_.user_active_last_); |
- EXPECT_EQ(10, daemon_.daily_use_day_last_); |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
+ ExpectDailyUseUpdate(10, 0); |
daemon_.SetUserActiveState(/* active */ true, |
TestTime(10 * kSecondsPerDay + 1000)); |
EXPECT_TRUE(daemon_.user_active_); |
EXPECT_EQ(TestTime(10 * kSecondsPerDay + 1000), daemon_.user_active_last_); |
- EXPECT_EQ(10, daemon_.daily_use_day_last_); |
- EXPECT_TRUE(AssertNoOrEmptyUseRecordFile()); |
} |
int main(int argc, char** argv) { |