Index: base/metrics/persistent_histogram_allocator_unittest.cc |
diff --git a/base/metrics/persistent_histogram_allocator_unittest.cc b/base/metrics/persistent_histogram_allocator_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..52060ab1145fa9275a86b3445bfe760995a8c3e8 |
--- /dev/null |
+++ b/base/metrics/persistent_histogram_allocator_unittest.cc |
@@ -0,0 +1,128 @@ |
+// Copyright (c) 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/metrics/persistent_histogram_allocator.h" |
+ |
+#include "base/logging.h" |
+#include "base/metrics/bucket_ranges.h" |
+#include "base/metrics/histogram_macros.h" |
+#include "base/metrics/persistent_memory_allocator.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace base { |
+ |
+class PersistentHistogramAllocatorTest : public testing::Test { |
+ protected: |
+ const int32_t kAllocatorMemorySize = 64 << 10; // 64 KiB |
+ |
+ PersistentHistogramAllocatorTest() {} |
+ |
+ void SetUp() override { CreatePersistentHistogramAllocator(); } |
+ |
+ void TearDown() override { DestroyPersistentHistogramAllocator(); } |
+ |
+ void CreatePersistentHistogramAllocator() { |
+ if (!allocator_memory_) |
+ allocator_memory_.reset(new char[kAllocatorMemorySize]); |
+ |
+ PersistentHistogramAllocator::ReleaseGlobalAllocatorForTesting(); |
+ memset(allocator_memory_.get(), 0, kAllocatorMemorySize); |
+ PersistentHistogramAllocator::GetCreateHistogramResultHistogram(); |
+ PersistentHistogramAllocator::CreateGlobalAllocatorOnPersistentMemory( |
+ allocator_memory_.get(), kAllocatorMemorySize, 0, 0, |
+ "PersistentHistogramAllocatorTest"); |
+ allocator_ = |
+ PersistentHistogramAllocator::GetGlobalAllocator()->memory_allocator(); |
+ } |
+ |
+ void DestroyPersistentHistogramAllocator() { |
+ allocator_ = nullptr; |
+ PersistentHistogramAllocator::ReleaseGlobalAllocatorForTesting(); |
+ } |
+ |
+ scoped_ptr<char[]> allocator_memory_; |
+ PersistentMemoryAllocator* allocator_ = nullptr; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(PersistentHistogramAllocatorTest); |
+}; |
+ |
+TEST_F(PersistentHistogramAllocatorTest, CreateAndIterateTest) { |
+ PersistentMemoryAllocator::MemoryInfo meminfo0; |
+ allocator_->GetMemoryInfo(&meminfo0); |
+ |
+ // Try basic construction |
+ HistogramBase* histogram = Histogram::FactoryGet( |
+ "TestHistogram", 1, 1000, 10, HistogramBase::kIsPersistent); |
+ EXPECT_TRUE(histogram); |
+ histogram->CheckName("TestHistogram"); |
+ PersistentMemoryAllocator::MemoryInfo meminfo1; |
+ allocator_->GetMemoryInfo(&meminfo1); |
+ EXPECT_GT(meminfo0.free, meminfo1.free); |
+ |
+ HistogramBase* linear_histogram = LinearHistogram::FactoryGet( |
+ "TestLinearHistogram", 1, 1000, 10, HistogramBase::kIsPersistent); |
+ EXPECT_TRUE(linear_histogram); |
+ linear_histogram->CheckName("TestLinearHistogram"); |
+ PersistentMemoryAllocator::MemoryInfo meminfo2; |
+ allocator_->GetMemoryInfo(&meminfo2); |
+ EXPECT_GT(meminfo1.free, meminfo2.free); |
+ |
+ HistogramBase* boolean_histogram = BooleanHistogram::FactoryGet( |
+ "TestBooleanHistogram", HistogramBase::kIsPersistent); |
+ EXPECT_TRUE(boolean_histogram); |
+ boolean_histogram->CheckName("TestBooleanHistogram"); |
+ PersistentMemoryAllocator::MemoryInfo meminfo3; |
+ allocator_->GetMemoryInfo(&meminfo3); |
+ EXPECT_GT(meminfo2.free, meminfo3.free); |
+ |
+ std::vector<int> custom_ranges; |
+ custom_ranges.push_back(1); |
+ custom_ranges.push_back(5); |
+ HistogramBase* custom_histogram = CustomHistogram::FactoryGet( |
+ "TestCustomHistogram", custom_ranges, HistogramBase::kIsPersistent); |
+ EXPECT_TRUE(custom_histogram); |
+ custom_histogram->CheckName("TestCustomHistogram"); |
+ PersistentMemoryAllocator::MemoryInfo meminfo4; |
+ allocator_->GetMemoryInfo(&meminfo4); |
+ EXPECT_GT(meminfo3.free, meminfo4.free); |
+ |
+ PersistentMemoryAllocator::Iterator iter; |
+ uint32_t type; |
+ allocator_->CreateIterator(&iter); |
+ EXPECT_NE(0U, allocator_->GetNextIterable(&iter, &type)); // Histogram |
+ EXPECT_NE(0U, allocator_->GetNextIterable(&iter, &type)); // LinearHistogram |
+ EXPECT_NE(0U, allocator_->GetNextIterable(&iter, &type)); // BooleanHistogram |
+ EXPECT_NE(0U, allocator_->GetNextIterable(&iter, &type)); // CustomHistogram |
+ EXPECT_EQ(0U, allocator_->GetNextIterable(&iter, &type)); |
+ |
+ // Create a second allocator and have it access the memory of the first. |
+ scoped_ptr<HistogramBase> recovered; |
+ PersistentHistogramAllocator recovery( |
+ make_scoped_ptr(new PersistentMemoryAllocator( |
+ allocator_memory_.get(), kAllocatorMemorySize, 0, 0, "", false))); |
+ PersistentHistogramAllocator::Iterator histogram_iter; |
+ recovery.CreateIterator(&histogram_iter); |
+ |
+ recovered = recovery.GetNextHistogram(&histogram_iter); |
+ ASSERT_TRUE(recovered); |
+ recovered->CheckName("TestHistogram"); |
+ |
+ recovered = recovery.GetNextHistogram(&histogram_iter); |
+ ASSERT_TRUE(recovered); |
+ recovered->CheckName("TestLinearHistogram"); |
+ |
+ recovered = recovery.GetNextHistogram(&histogram_iter); |
+ ASSERT_TRUE(recovered); |
+ recovered->CheckName("TestBooleanHistogram"); |
+ |
+ recovered = recovery.GetNextHistogram(&histogram_iter); |
+ ASSERT_TRUE(recovered); |
+ recovered->CheckName("TestCustomHistogram"); |
+ |
+ recovered = recovery.GetNextHistogram(&histogram_iter); |
+ EXPECT_FALSE(recovered); |
+} |
+ |
+} // namespace base |