Index: statsreport/metrics_unittest.cc |
diff --git a/statsreport/metrics_unittest.cc b/statsreport/metrics_unittest.cc |
deleted file mode 100644 |
index 155d049a519bd19f1bcdce09b98e517474f43956..0000000000000000000000000000000000000000 |
--- a/statsreport/metrics_unittest.cc |
+++ /dev/null |
@@ -1,361 +0,0 @@ |
-// Copyright 2006-2009 Google Inc. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
-// ======================================================================== |
-// |
-// metrics report unit testing |
-#include "omaha/third_party/gtest/include/gtest/gtest.h" |
-#include "metrics.h" |
-#include <algorithm> |
-#include <new> |
- |
-DECLARE_METRIC_count(count); |
-DEFINE_METRIC_count(count); |
- |
-DECLARE_METRIC_timing(timing); |
-DEFINE_METRIC_timing(timing); |
- |
-DECLARE_METRIC_integer(integer); |
-DEFINE_METRIC_integer(integer); |
- |
-DECLARE_METRIC_bool(bool); |
-DEFINE_METRIC_bool(bool); |
- |
-using namespace stats_report; |
- |
-namespace { |
- |
-class MetricsTest: public testing::Test { |
-protected: |
- MetricCollection coll_; |
-}; |
- |
-class MetricsEnumTest: public MetricsTest { |
-public: |
- virtual void SetUp() { |
- coll_.Initialize(); |
- } |
- |
- virtual void TearDown() { |
- coll_.Uninitialize(); |
- } |
- |
-protected: |
- MetricsEnumTest(): count_("count", &coll_), timing_("timing", &coll_), |
- integer_("integer", &coll_), bool_("bool", &coll_){ |
- } |
- |
- CountMetric count_; |
- TimingMetric timing_; |
- IntegerMetric integer_; |
- BoolMetric bool_; |
-}; |
- |
-} // namespace |
- |
-// Validates that the above-declared metrics are available |
-// in the expected namespace |
-TEST_F(MetricsTest, Globals) { |
- EXPECT_EQ(0, ::metric_count.Reset()); |
- TimingMetric::TimingData data = ::metric_timing.Reset(); |
- EXPECT_EQ(0, data.count); |
- EXPECT_EQ(0, data.maximum); |
- EXPECT_EQ(0, data.minimum); |
- EXPECT_EQ(0, data.sum); |
- |
- EXPECT_EQ(0, ::metric_integer.value()); |
- EXPECT_EQ(BoolMetric::kBoolUnset, ::metric_bool.Reset()); |
- |
- // Check for correct initialization |
- EXPECT_STREQ("count", metric_count.name()); |
- EXPECT_STREQ("timing", metric_timing.name()); |
- EXPECT_STREQ("integer", metric_integer.name()); |
- EXPECT_STREQ("bool", metric_bool.name()); |
-} |
- |
- |
-// make GTest happy |
-inline std::ostream &operator << (std::ostream &str, const MetricIterator &it) { |
- str << std::hex << (void*)*it; |
- return str; |
-} |
- |
-TEST_F(MetricsTest, CollectionInitialization) { |
- // The global MetricCollection is aliased to zero memory so as to ensure |
- // no initialization order snafus. If an initialized MetricCollection |
- // sets any of its storage to non-zero, there's a good chance that e.g. a |
- // vtbl has snuck in there, which must not happen |
- char buf1[sizeof(MetricCollection)] = { 0 }; |
- char buf2[sizeof(MetricCollection)] = { 0 }; |
- |
- // Placement new a MetricCollection to one of the buffers |
- new (buf1) MetricCollection(); |
- |
- // and check they're still equivalent |
- EXPECT_EQ(0, memcmp(buf1, buf2, sizeof(MetricCollection))); |
- |
- // MetricCollection must not extend MetricCollectionBase in size |
- EXPECT_EQ(sizeof(MetricCollection), sizeof(MetricCollectionBase)); |
-} |
- |
-TEST_F(MetricsTest, Count) { |
- CountMetric foo("foo", &coll_); |
- |
- EXPECT_EQ(0, foo.Reset()); |
- EXPECT_EQ(kCountType, foo.type()); |
- CountMetric &foo_ref = foo.AsCount(); |
- |
- ++foo; |
- EXPECT_EQ(1, foo.value()); |
- foo++; |
- EXPECT_EQ(2, foo.value()); |
- |
- foo += 100; |
- EXPECT_EQ(102, foo.value()); |
-} |
- |
-TEST_F(MetricsTest, Timing) { |
- TimingMetric foo("foo", &coll_); |
- |
- EXPECT_EQ(kTimingType, foo.type()); |
- TimingMetric &foo_ref = foo.AsTiming(); |
- |
- foo.AddSample(100); |
- foo.AddSample(50); |
- |
- EXPECT_EQ(2, foo.count()); |
- EXPECT_EQ(150, foo.sum()); |
- EXPECT_EQ(100, foo.maximum()); |
- EXPECT_EQ(50, foo.minimum()); |
- EXPECT_EQ(75, foo.average()); |
- |
- TimingMetric::TimingData data = foo.Reset(); |
- EXPECT_EQ(2, data.count); |
- EXPECT_EQ(150, data.sum); |
- EXPECT_EQ(100, data.maximum); |
- EXPECT_EQ(50, data.minimum); |
- |
- EXPECT_EQ(0, foo.count()); |
- EXPECT_EQ(0, foo.sum()); |
- EXPECT_EQ(0, foo.maximum()); |
- EXPECT_EQ(0, foo.minimum()); |
- EXPECT_EQ(0, foo.average()); |
- |
- // Test counted samples |
- foo.AddSamples(10, 1000); |
- foo.AddSamples(10, 500); |
- EXPECT_EQ(20, foo.count()); |
- EXPECT_EQ(1500, foo.sum()); |
- EXPECT_EQ(100, foo.maximum()); |
- EXPECT_EQ(50, foo.minimum()); |
- EXPECT_EQ(75, foo.average()); |
-} |
- |
-TEST_F(MetricsTest, TimingSample) { |
- TimingMetric foo("foo", &coll_); |
- |
- // add a sample to foo |
- { |
- TimingSample sample(foo); |
- |
- ::Sleep(30); |
- } |
- |
- TimingMetric::TimingData data = foo.Reset(); |
- |
- // Should be precisely one sample in there |
- EXPECT_EQ(1, data.count); |
- |
- // Let's hope the scheduler doesn't leave us hanging more than 10 ms. |
- // Increased time from 40 to 100 because test failed intermittently on Pulse. |
- EXPECT_GE(30 + 70, data.sum); |
- // The sleep above seems to often terminate early on the build server, |
- // I've observed captured times down to 18 ms, which is strange. |
- // TODO(omaha): figure out whether the timer is broken or whether |
- // sleep is breaking its promise, or whether e.g. we're getting different |
- // walltimes on different CPUs due to BIOS bugs on the build server |
- EXPECT_LE(14, data.sum); |
- |
- // again, this time with a non-unity count |
- { |
- TimingSample sample(foo, 2); |
- |
- EXPECT_EQ(2, sample.count()); |
- ::Sleep(30); |
- } |
- |
- data = foo.Reset(); |
- |
- // Should be precisely two samples in there |
- EXPECT_EQ(2, data.count); |
- |
- // Let's hope the scheduler doesn't leave us hanging more than 10 ms. |
- // Increased time from 40 to 100 because test failed intermittently on Pulse. |
- EXPECT_GE(30 + 70, data.sum); |
- EXPECT_LE(14, data.sum); |
- |
- // now with zero count |
- { |
- TimingSample sample(foo, 0); |
- } |
- |
- data = foo.Reset(); |
- |
- // Should be no samples in there |
- EXPECT_EQ(0, data.count); |
-} |
- |
-TEST_F(MetricsTest, Integer) { |
- IntegerMetric foo("foo", &coll_); |
- |
- EXPECT_EQ(kIntegerType, foo.type()); |
- IntegerMetric &foo_ref = foo.AsInteger(); |
- |
- EXPECT_EQ(0, foo.value()); |
- foo.Set(1005); |
- EXPECT_EQ(1005, foo.value()); |
- foo = 1009UL; |
- EXPECT_EQ(1009, foo.value()); |
- |
- foo.Set(0); |
- |
- ++foo; |
- EXPECT_EQ(1, foo.value()); |
- foo++; |
- EXPECT_EQ(2, foo.value()); |
- |
- foo += 100; |
- EXPECT_EQ(102, foo.value()); |
- |
- foo -= 100; |
- EXPECT_EQ(2, foo.value()); |
- foo--; |
- EXPECT_EQ(1, foo.value()); |
- --foo; |
- EXPECT_EQ(0, foo.value()); |
-} |
- |
-TEST_F(MetricsTest, Bool) { |
- BoolMetric foo("foo", &coll_); |
- |
- EXPECT_EQ(kBoolType, foo.type()); |
- BoolMetric &foo_ref = foo.AsBool(); |
- |
- EXPECT_EQ(BoolMetric::kBoolUnset, foo.Reset()); |
- foo.Set(true); |
- EXPECT_EQ(BoolMetric::kBoolTrue, foo.Reset()); |
- foo.Set(false); |
- EXPECT_EQ(BoolMetric::kBoolFalse, foo.Reset()); |
- EXPECT_EQ(BoolMetric::kBoolUnset, foo.Reset()); |
-} |
- |
-TEST_F(MetricsEnumTest, Enumeration) { |
- MetricBase *metrics[] = { |
- &count_, |
- &timing_, |
- &integer_, |
- &bool_, |
- }; |
- |
- for (int i = 0; i < sizeof(metrics) / sizeof(metrics[0]); ++i) { |
- MetricBase *stat = metrics[i]; |
- MetricBase *curr = coll_.first(); |
- |
- for (; NULL != curr; curr = curr->next()) { |
- if (stat == curr) |
- break; |
- } |
- |
- // if NULL, we didn't find our counter |
- EXPECT_TRUE(NULL != curr); |
- } |
-} |
- |
-TEST_F(MetricsEnumTest, Iterator) { |
- typedef MetricBase *MetricBasePtr; |
- MetricBasePtr metrics[] = { &count_, &timing_, &integer_, &bool_, }; |
- int num_stats = sizeof(metrics) / sizeof(metrics[0]); |
- |
- MetricIterator it(coll_), end; |
- EXPECT_NE(it, end); |
- |
- // copy construction |
- EXPECT_EQ(it, MetricIterator(it)); |
- EXPECT_EQ(end, MetricIterator(end)); |
- |
- // # of iterations |
- int i = 0; |
- while (it++ != end) |
- ++i; |
- DCHECK_EQ(i, num_stats); |
- DCHECK_EQ(it, end); |
- |
- // increment past end is idempotent |
- ++it; |
- DCHECK_EQ(it, end); |
- |
- // Check that we return no garbage or nonsense |
- for (it = MetricIterator(coll_); it != end; ++it) { |
- MetricBasePtr *stats_end = &metrics[num_stats]; |
- EXPECT_NE(stats_end, std::find(metrics, stats_end, *it)); |
- } |
- |
- // and that all metrics can be found |
- for (int i = 0; i < sizeof(metrics) / sizeof(metrics[0]); ++i) { |
- MetricBase *stat = metrics[i]; |
- |
- EXPECT_EQ(stat, *std::find(MetricIterator(coll_), end, stat)); |
- } |
-} |
- |
-TEST_F(MetricsTest, SimpleConstruction) { |
- const CountMetric c("c", 100); |
- |
- EXPECT_EQ(100, c.value()); |
- EXPECT_EQ(kCountType, c.type()); |
- EXPECT_STREQ("c", c.name()); |
- EXPECT_TRUE(NULL == c.next()); |
- |
- TimingMetric::TimingData data = { 10, 0, 1000, 10, 500 }; |
- const TimingMetric t("t", data); |
- |
- EXPECT_EQ(10, t.count()); |
- EXPECT_EQ(1000, t.sum()); |
- EXPECT_EQ(10, t.minimum()); |
- EXPECT_EQ(500, t.maximum()); |
- EXPECT_EQ(kTimingType, t.type()); |
- EXPECT_STREQ("t", t.name()); |
- EXPECT_TRUE(NULL == t.next()); |
- |
- const IntegerMetric i("i", 200); |
- |
- EXPECT_EQ(200, i.value()); |
- EXPECT_EQ(kIntegerType, i.type()); |
- EXPECT_STREQ("i", i.name()); |
- EXPECT_TRUE(NULL == i.next()); |
- |
- const BoolMetric bool_true("bool_true", BoolMetric::kBoolTrue); |
- |
- EXPECT_EQ(BoolMetric::kBoolTrue, bool_true.value()); |
- EXPECT_EQ(kBoolType, bool_true.type()); |
- EXPECT_STREQ("bool_true", bool_true.name()); |
- EXPECT_TRUE(NULL == bool_true.next()); |
- |
- const BoolMetric bool_false("bool_false", BoolMetric::kBoolFalse); |
- |
- EXPECT_EQ(BoolMetric::kBoolFalse, bool_false.value()); |
- EXPECT_EQ(kBoolType, bool_false.type()); |
- EXPECT_STREQ("bool_false", bool_false.name()); |
- EXPECT_TRUE(NULL == bool_false.next()); |
-} |
- |