summaryrefslogtreecommitdiffstats
path: root/o3d/statsreport/persistent_iterator-win32_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'o3d/statsreport/persistent_iterator-win32_unittest.cc')
-rw-r--r--o3d/statsreport/persistent_iterator-win32_unittest.cc164
1 files changed, 164 insertions, 0 deletions
diff --git a/o3d/statsreport/persistent_iterator-win32_unittest.cc b/o3d/statsreport/persistent_iterator-win32_unittest.cc
new file mode 100644
index 0000000..69e6f55
--- /dev/null
+++ b/o3d/statsreport/persistent_iterator-win32_unittest.cc
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2009, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#include <atlbase.h>
+#include <atlcom.h>
+#include <iterator>
+#include <map>
+#include "gtest/gtest.h"
+#include "const-win32.h"
+#include "aggregator-win32_unittest.h"
+#include "persistent_iterator-win32.h"
+
+using ::stats_report::BoolMetric;
+using ::stats_report::CountMetric;
+using ::stats_report::IntegerMetric;
+using ::stats_report::MetricBase;
+using ::stats_report::MetricCollection;
+using ::stats_report::MetricCollectionBase;
+using ::stats_report::MetricIterator;
+using ::stats_report::MetricsAggregatorWin32;
+using ::stats_report::PersistentMetricsIteratorWin32;
+using ::stats_report::TimingMetric;
+using ::stats_report::TimingSample;
+using ::stats_report::kBoolType;
+using ::stats_report::kCountType;
+using ::stats_report::kIntegerType;
+using ::stats_report::kInvalidType;
+using ::stats_report::kTimingType;
+
+namespace {
+
+class PersistentMetricsIteratorWin32Test: public MetricsAggregatorWin32Test {
+ public:
+ bool WriteStats() {
+ // put some persistent metrics into the registry
+ MetricsAggregatorWin32 agg(coll_, kAppName);
+ AddStats();
+ bool ret = agg.AggregateMetrics();
+
+ // Reset the stats, we should now have the same stats
+ // in our collection as in registry.
+ AddStats();
+
+ return ret;
+ }
+
+ typedef std::map<std::string, MetricBase*> MetricsMap;
+ void IndexMetrics(MetricsMap *metrics) {
+ // build a map over the metrics in our collection
+ MetricIterator it(coll_), end;
+
+ for (; it != end; ++it) {
+ metrics->insert(std::make_pair(std::string(it->name()), *it));
+ }
+ }
+};
+
+// compare two metrics instances for equality
+bool equals(MetricBase *a, MetricBase *b) {
+ if (!a || !b)
+ return false;
+
+ if (a->type() != b->type() || 0 != strcmp(a->name(), b->name()))
+ return false;
+
+ switch (a->type()) {
+ case kCountType:
+ return a->AsCount()->value() == b->AsCount()->value();
+ break;
+ case kTimingType: {
+ TimingMetric *at = a->AsTiming();
+ TimingMetric *bt = b->AsTiming();
+
+ return at->count() == bt->count() &&
+ at->sum() == bt->sum() &&
+ at->minimum() == bt->minimum() &&
+ at->maximum() == bt->maximum();
+ break;
+ }
+ case kIntegerType:
+ return a->AsInteger()->value() == b->AsInteger()->value();
+ break;
+ case kBoolType:
+ return a->AsBool()->value() == b->AsBool()->value();
+ break;
+ case kInvalidType:
+ default:
+ LOG(FATAL) << "Impossible metric type";
+ }
+
+ return false;
+}
+
+} // namespace
+
+TEST_F(PersistentMetricsIteratorWin32Test, Basic) {
+ EXPECT_TRUE(WriteStats());
+ PersistentMetricsIteratorWin32 a;
+ PersistentMetricsIteratorWin32 b;
+ PersistentMetricsIteratorWin32 c(kAppName);
+
+ EXPECT_TRUE(a == b);
+ EXPECT_TRUE(b == a);
+
+ EXPECT_FALSE(a == c);
+ EXPECT_FALSE(b == c);
+ EXPECT_FALSE(c == a);
+ EXPECT_FALSE(c == b);
+
+ ++a;
+ EXPECT_TRUE(a == b);
+ EXPECT_TRUE(b == a);
+}
+
+// Test to see whether we can reliably roundtrip metrics through
+// the registry without molestation
+TEST_F(PersistentMetricsIteratorWin32Test, UnmolestedValues) {
+ EXPECT_TRUE(WriteStats());
+
+ MetricsMap metrics;
+ IndexMetrics(&metrics);
+
+ PersistentMetricsIteratorWin32 it(kAppName), end;
+ int count = 0;
+ for (; it != end; ++it) {
+ MetricsMap::iterator found = metrics.find(it->name());
+
+ // make sure we found it, and that it's unmolested in value
+ EXPECT_TRUE(found != metrics.end() && equals(found->second, *it));
+ count++;
+ }
+
+ // Did we visit all metrics?
+ EXPECT_EQ(count, metrics.size());
+}