Index: metrics_daemon_test.cc |
diff --git a/metrics_daemon_test.cc b/metrics_daemon_test.cc |
index e551cf990733db7498837a60987fdb3bd7b4df0d..9ba63e80fac7b8a4370f833fd178eb5a8f035a50 100644 |
--- a/metrics_daemon_test.cc |
+++ b/metrics_daemon_test.cc |
@@ -2,6 +2,8 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <utime.h> |
+ |
#include <base/file_util.h> |
#include <gtest/gtest.h> |
@@ -11,14 +13,21 @@ |
using base::Time; |
using base::TimeTicks; |
+using chromeos_metrics::FrequencyCounter; |
using chromeos_metrics::FrequencyCounterMock; |
using chromeos_metrics::TaggedCounterMock; |
+using chromeos_metrics::TaggedCounterReporter; |
+using chromeos_metrics::TaggedCounterReporterMock; |
using ::testing::_; |
using ::testing::Return; |
using ::testing::StrictMock; |
static const int kSecondsPerDay = 24 * 60 * 60; |
+static const char kTestDir[] = "test"; |
+static const char kLastFile[] = "test/last"; |
+static const char kCurrentFile[] = "test/current"; |
+ |
// This class allows a TimeTicks object to be initialized with seconds |
// (rather than microseconds) through the protected TimeTicks(int64) |
// constructor. |
@@ -48,6 +57,38 @@ class MetricsDaemonTest : public testing::Test { |
EXPECT_EQ(NULL, daemon_.user_crash_interval_.get()); |
daemon_.Init(true, &metrics_lib_); |
+ // Check configuration of a few histograms. |
+ FrequencyCounter* frequency_counter = |
+ daemon_.frequency_counters_[MetricsDaemon::kMetricAnyCrashesDailyName]; |
+ const TaggedCounterReporter* reporter = GetReporter(frequency_counter); |
+ EXPECT_EQ(MetricsDaemon::kMetricAnyCrashesDailyName, |
+ reporter->histogram_name()); |
+ EXPECT_EQ(chromeos_metrics::kSecondsPerDay, |
+ frequency_counter->cycle_duration()); |
+ EXPECT_EQ(MetricsDaemon::kMetricCrashFrequencyMin, reporter->min()); |
+ EXPECT_EQ(MetricsDaemon::kMetricCrashFrequencyMax, reporter->max()); |
+ EXPECT_EQ(MetricsDaemon::kMetricCrashFrequencyBuckets, reporter->buckets()); |
+ |
+ frequency_counter = |
+ daemon_.frequency_counters_[MetricsDaemon::kMetricAnyCrashesWeeklyName]; |
+ reporter = GetReporter(frequency_counter); |
+ EXPECT_EQ(MetricsDaemon::kMetricAnyCrashesWeeklyName, |
+ reporter->histogram_name()); |
+ EXPECT_EQ(chromeos_metrics::kSecondsPerWeek, |
+ frequency_counter->cycle_duration()); |
+ |
+ EXPECT_EQ(MetricsDaemon::kMetricKernelCrashIntervalName, |
+ daemon_.kernel_crash_interval_->histogram_name()); |
+ EXPECT_EQ(MetricsDaemon::kMetricCrashIntervalMin, |
+ daemon_.kernel_crash_interval_->min()); |
+ EXPECT_EQ(MetricsDaemon::kMetricCrashIntervalMax, |
+ daemon_.kernel_crash_interval_->max()); |
+ EXPECT_EQ(MetricsDaemon::kMetricCrashIntervalBuckets, |
+ daemon_.kernel_crash_interval_->buckets()); |
+ |
+ EXPECT_EQ(MetricsDaemon::kMetricUncleanShutdownIntervalName, |
+ daemon_.unclean_shutdown_interval_->histogram_name()); |
+ |
// Tests constructor initialization. Switches to mock counters. |
EXPECT_TRUE(NULL != daemon_.daily_use_.get()); |
EXPECT_TRUE(NULL != daemon_.kernel_crash_interval_.get()); |
@@ -56,20 +97,20 @@ class MetricsDaemonTest : public testing::Test { |
// Allocates mock counter and transfers ownership. |
daily_use_ = new StrictMock<TaggedCounterMock>(); |
daemon_.daily_use_.reset(daily_use_); |
- kernel_crash_interval_ = new StrictMock<TaggedCounterMock>(); |
+ kernel_crash_interval_ = new StrictMock<TaggedCounterReporterMock>(); |
daemon_.kernel_crash_interval_.reset(kernel_crash_interval_); |
- user_crash_interval_ = new StrictMock<TaggedCounterMock>(); |
+ user_crash_interval_ = new StrictMock<TaggedCounterReporterMock>(); |
daemon_.user_crash_interval_.reset(user_crash_interval_); |
- unclean_shutdown_interval_ = new StrictMock<TaggedCounterMock>(); |
+ unclean_shutdown_interval_ = new StrictMock<TaggedCounterReporterMock>(); |
daemon_.unclean_shutdown_interval_.reset(unclean_shutdown_interval_); |
- kernel_crashes_daily_ = new StrictMock<FrequencyCounterMock>(); |
- daemon_.kernel_crashes_daily_.reset(kernel_crashes_daily_); |
- user_crashes_daily_ = new StrictMock<FrequencyCounterMock>(); |
- daemon_.user_crashes_daily_.reset(user_crashes_daily_); |
- unclean_shutdowns_daily_ = new StrictMock<FrequencyCounterMock>(); |
- daemon_.unclean_shutdowns_daily_.reset(unclean_shutdowns_daily_); |
- any_crashes_daily_ = new StrictMock<FrequencyCounterMock>(); |
- daemon_.any_crashes_daily_.reset(any_crashes_daily_); |
+ |
+ // Reset all frequency counter reporters to mocks for further testing. |
+ MetricsDaemon::FrequencyCounters::iterator i; |
+ for (i = daemon_.frequency_counters_.begin(); |
+ i != daemon_.frequency_counters_.end(); ++i) { |
+ delete i->second; |
+ i->second = new StrictMock<FrequencyCounterMock>(); |
+ } |
EXPECT_FALSE(daemon_.user_active_); |
EXPECT_TRUE(daemon_.user_active_last_.is_null()); |
@@ -77,10 +118,29 @@ class MetricsDaemonTest : public testing::Test { |
EXPECT_TRUE(daemon_.network_state_last_.is_null()); |
EXPECT_EQ(MetricsDaemon::kUnknownPowerState, daemon_.power_state_); |
EXPECT_EQ(MetricsDaemon::kUnknownSessionState, daemon_.session_state_); |
+ |
+ file_util::Delete(FilePath(kTestDir), true); |
+ file_util::CreateDirectory(FilePath(kTestDir)); |
} |
virtual void TearDown() {} |
+ const TaggedCounterReporter* |
+ GetReporter(FrequencyCounter* frequency_counter) const { |
+ return static_cast<const TaggedCounterReporter*>( |
+ &frequency_counter->tagged_counter()); |
+ } |
+ |
+ void ExpectFrequencyFlushCalls() { |
+ MetricsDaemon::FrequencyCounters::iterator i; |
+ for (i = daemon_.frequency_counters_.begin(); |
+ i != daemon_.frequency_counters_.end(); ++i) { |
+ FrequencyCounterMock* mock = |
+ static_cast<FrequencyCounterMock*>(i->second); |
+ EXPECT_CALL(*mock, FlushFinishedCycles()); |
+ } |
+ } |
+ |
// Adds active use aggregation counters update expectations that the |
// specified tag/count update will be generated. |
void ExpectActiveUseUpdate(int daily_tag, int count) { |
@@ -93,6 +153,7 @@ class MetricsDaemonTest : public testing::Test { |
EXPECT_CALL(*user_crash_interval_, Update(0, count)) |
.Times(1) |
.RetiresOnSaturation(); |
+ ExpectFrequencyFlushCalls(); |
} |
// Adds active use aggregation counters update expectations that |
@@ -107,6 +168,7 @@ class MetricsDaemonTest : public testing::Test { |
EXPECT_CALL(*user_crash_interval_, Update(_, _)) |
.Times(1) |
.RetiresOnSaturation(); |
+ ExpectFrequencyFlushCalls(); |
} |
// Adds a metrics library mock expectation that the specified metric |
@@ -170,6 +232,12 @@ class MetricsDaemonTest : public testing::Test { |
dbus_message_unref(msg); |
} |
+ // Get the frequency counter for the given name. |
+ FrequencyCounterMock& GetFrequencyMock(const char* histogram_name) { |
+ return *static_cast<FrequencyCounterMock*>( |
+ daemon_.frequency_counters_[histogram_name]); |
+ } |
+ |
// The MetricsDaemon under test. |
MetricsDaemon daemon_; |
@@ -181,14 +249,9 @@ class MetricsDaemonTest : public testing::Test { |
// update calls are marked as failures. They are pointers so that |
// they can replace the scoped_ptr's allocated by the daemon. |
StrictMock<TaggedCounterMock>* daily_use_; |
- StrictMock<TaggedCounterMock>* kernel_crash_interval_; |
- StrictMock<TaggedCounterMock>* user_crash_interval_; |
- StrictMock<TaggedCounterMock>* unclean_shutdown_interval_; |
- |
- StrictMock<FrequencyCounterMock>* kernel_crashes_daily_; |
- StrictMock<FrequencyCounterMock>* user_crashes_daily_; |
- StrictMock<FrequencyCounterMock>* unclean_shutdowns_daily_; |
- StrictMock<FrequencyCounterMock>* any_crashes_daily_; |
+ StrictMock<TaggedCounterReporterMock>* kernel_crash_interval_; |
+ StrictMock<TaggedCounterReporterMock>* user_crash_interval_; |
+ StrictMock<TaggedCounterReporterMock>* unclean_shutdown_interval_; |
}; |
TEST_F(MetricsDaemonTest, CheckSystemCrash) { |
@@ -217,22 +280,6 @@ TEST_F(MetricsDaemonTest, ReportDailyUse) { |
MetricsDaemon::ReportDailyUse(&daemon_, /* tag */ 60, /* count */ -5); |
} |
-TEST_F(MetricsDaemonTest, ReportKernelCrashInterval) { |
- ExpectMetric(MetricsDaemon::kMetricKernelCrashIntervalName, 50, |
- MetricsDaemon::kMetricCrashIntervalMin, |
- MetricsDaemon::kMetricCrashIntervalMax, |
- MetricsDaemon::kMetricCrashIntervalBuckets); |
- MetricsDaemon::ReportKernelCrashInterval(&daemon_, 0, 50); |
-} |
- |
-TEST_F(MetricsDaemonTest, ReportUncleanShutdownInterval) { |
- ExpectMetric(MetricsDaemon::kMetricUncleanShutdownIntervalName, 50, |
- MetricsDaemon::kMetricCrashIntervalMin, |
- MetricsDaemon::kMetricCrashIntervalMax, |
- MetricsDaemon::kMetricCrashIntervalBuckets); |
- MetricsDaemon::ReportUncleanShutdownInterval(&daemon_, 0, 50); |
-} |
- |
TEST_F(MetricsDaemonTest, LookupNetworkState) { |
EXPECT_EQ(MetricsDaemon::kNetworkStateOnline, |
daemon_.LookupNetworkState("online")); |
@@ -268,13 +315,23 @@ TEST_F(MetricsDaemonTest, MessageFilter) { |
DeleteDBusMessage(msg); |
IgnoreActiveUseUpdate(); |
- EXPECT_CALL(*user_crash_interval_, Flush()) |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricAnyCrashesDailyName), |
+ Update(1)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricAnyCrashesWeeklyName), |
+ Update(1)) |
.Times(1) |
.RetiresOnSaturation(); |
- EXPECT_CALL(*user_crashes_daily_, Update(1)) |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricUserCrashesDailyName), |
+ Update(1)) |
.Times(1) |
.RetiresOnSaturation(); |
- EXPECT_CALL(*any_crashes_daily_, Update(1)) |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricUserCrashesWeeklyName), |
+ Update(1)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*user_crash_interval_, Flush()) |
.Times(1) |
.RetiresOnSaturation(); |
msg = NewDBusSignalString("/", |
@@ -410,8 +467,14 @@ TEST_F(MetricsDaemonTest, ProcessKernelCrash) { |
EXPECT_CALL(*kernel_crash_interval_, Flush()) |
.Times(1) |
.RetiresOnSaturation(); |
- EXPECT_CALL(*kernel_crashes_daily_, Update(1)); |
- EXPECT_CALL(*any_crashes_daily_, Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricAnyCrashesDailyName), |
+ Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricAnyCrashesWeeklyName), |
+ Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricKernelCrashesDailyName), |
+ Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricKernelCrashesWeeklyName), |
+ Update(1)); |
daemon_.ProcessKernelCrash(); |
} |
@@ -420,8 +483,15 @@ TEST_F(MetricsDaemonTest, ProcessUncleanShutdown) { |
EXPECT_CALL(*unclean_shutdown_interval_, Flush()) |
.Times(1) |
.RetiresOnSaturation(); |
- EXPECT_CALL(*unclean_shutdowns_daily_, Update(1)); |
- EXPECT_CALL(*any_crashes_daily_, Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricAnyCrashesDailyName), |
+ Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricAnyCrashesWeeklyName), |
+ Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricUncleanShutdownsDailyName), |
+ Update(1)); |
+ EXPECT_CALL( |
+ GetFrequencyMock(MetricsDaemon::kMetricUncleanShutdownsWeeklyName), |
+ Update(1)); |
daemon_.ProcessUncleanShutdown(); |
} |
@@ -430,8 +500,14 @@ TEST_F(MetricsDaemonTest, ProcessUserCrash) { |
EXPECT_CALL(*user_crash_interval_, Flush()) |
.Times(1) |
.RetiresOnSaturation(); |
- EXPECT_CALL(*user_crashes_daily_, Update(1)); |
- EXPECT_CALL(*any_crashes_daily_, Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricAnyCrashesDailyName), |
+ Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricAnyCrashesWeeklyName), |
+ Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricUserCrashesDailyName), |
+ Update(1)); |
+ EXPECT_CALL(GetFrequencyMock(MetricsDaemon::kMetricUserCrashesWeeklyName), |
+ Update(1)); |
daemon_.ProcessUserCrash(); |
} |
@@ -514,20 +590,10 @@ TEST_F(MetricsDaemonTest, SetUserActiveStateTimeJump) { |
EXPECT_EQ(TestTime(10 * kSecondsPerDay + 1000), daemon_.user_active_last_); |
} |
-TEST_F(MetricsDaemonTest, ReportUserCrashInterval) { |
- ExpectMetric(MetricsDaemon::kMetricUserCrashIntervalName, 50, |
- MetricsDaemon::kMetricCrashIntervalMin, |
- MetricsDaemon::kMetricCrashIntervalMax, |
- MetricsDaemon::kMetricCrashIntervalBuckets); |
- MetricsDaemon::ReportUserCrashInterval(&daemon_, 0, 50); |
-} |
- |
-TEST_F(MetricsDaemonTest, ReportCrashesDailyFrequency) { |
- ExpectMetric("foobar", 50, |
- MetricsDaemon::kMetricCrashesDailyMin, |
- MetricsDaemon::kMetricCrashesDailyMax, |
- MetricsDaemon::kMetricCrashesDailyBuckets); |
- MetricsDaemon::ReportCrashesDailyFrequency("foobar", &daemon_, 50); |
+TEST_F(MetricsDaemonTest, GetHistogramPath) { |
+ EXPECT_EQ("/var/log/metrics/Logging.AnyCrashesDaily", |
+ daemon_.GetHistogramPath( |
+ MetricsDaemon::kMetricAnyCrashesDailyName).value()); |
} |
int main(int argc, char** argv) { |