Chromium Code Reviews| Index: components/metrics/leak_detector/ranked_list_unittest.cc |
| diff --git a/components/metrics/leak_detector/ranked_list_unittest.cc b/components/metrics/leak_detector/ranked_list_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b41dbcc278f1cf4bbecc84f1a130c05309429432 |
| --- /dev/null |
| +++ b/components/metrics/leak_detector/ranked_list_unittest.cc |
| @@ -0,0 +1,301 @@ |
| +// Copyright 2015 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 "components/metrics/leak_detector/ranked_list.h" |
| + |
| +#include <gperftools/custom_allocator.h> |
| + |
| +#include <utility> |
| + |
| +#include "base/macros.h" |
| +#include "components/metrics/leak_detector/leak_detector_value_type.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace leak_detector { |
| + |
| +namespace { |
| + |
| +// Makes it easier to instantiate LeakDetectorValueTypes. |
| +LeakDetectorValueType Value(uint32_t value) { |
| + return LeakDetectorValueType(value); |
| +} |
| + |
| +} // namespace |
| + |
| +class RankedListTest : public ::testing::Test { |
| + public: |
| + RankedListTest() {} |
| + |
| + void SetUp() override { |
| + CustomAllocator::InitializeForUnitTest(); |
| + } |
| + void TearDown() override { |
| + CustomAllocator::Shutdown(); |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(RankedListTest); |
| +}; |
| + |
| +TEST_F(RankedListTest, Iterators) { |
| + RankedList list(10); |
| + EXPECT_TRUE(list.begin() == list.end()); |
| + |
| + list.Add(Value(0x1234), 100); |
| + EXPECT_FALSE(list.begin() == list.end()); |
| +} |
| + |
| +TEST_F(RankedListTest, SingleInsertion) { |
| + RankedList list(10); |
| + EXPECT_EQ(0U, list.size()); |
| + |
| + list.Add(Value(0x1234), 100); |
| + EXPECT_EQ(1U, list.size()); |
| + |
| + auto iter = list.begin(); |
| + EXPECT_EQ(0x1234U, iter->value.size()); |
| + EXPECT_EQ(100, iter->count); |
| +} |
| + |
| +TEST_F(RankedListTest, InOrderInsertion) { |
| + RankedList list(10); |
| + EXPECT_EQ(0U, list.size()); |
| + |
| + list.Add(Value(0x1234), 100); |
| + EXPECT_EQ(1U, list.size()); |
| + list.Add(Value(0x2345), 95); |
| + EXPECT_EQ(2U, list.size()); |
| + list.Add(Value(0x3456), 90); |
| + EXPECT_EQ(3U, list.size()); |
| + list.Add(Value(0x4567), 85); |
| + EXPECT_EQ(4U, list.size()); |
| + list.Add(Value(0x5678), 80); |
| + EXPECT_EQ(5U, list.size()); |
| + |
| + // Iterate through the contents to make sure they match what went in. |
| + const RankedList::Entry kExpectedValues[] = { |
| + { Value(0x1234), 100 }, |
| + { Value(0x2345), 95 }, |
| + { Value(0x3456), 90 }, |
| + { Value(0x4567), 85 }, |
| + { Value(0x5678), 80 }, |
| + }; |
| + |
| + size_t index = 0; |
| + for (const auto& entry : list) { |
| + EXPECT_LT(index, arraysize(kExpectedValues)); |
| + EXPECT_EQ(kExpectedValues[index].value.size(), entry.value.size()); |
| + EXPECT_EQ(kExpectedValues[index].count, entry.count); |
| + ++index; |
| + } |
| +} |
| + |
| +TEST_F(RankedListTest, ReverseOrderInsertion) { |
| + RankedList list(10); |
| + EXPECT_EQ(0U, list.size()); |
| + |
| + list.Add(Value(0x1234), 0); |
| + EXPECT_EQ(1U, list.size()); |
| + list.Add(Value(0x2345), 5); |
| + EXPECT_EQ(2U, list.size()); |
| + list.Add(Value(0x3456), 10); |
| + EXPECT_EQ(3U, list.size()); |
| + list.Add(Value(0x4567), 15); |
| + EXPECT_EQ(4U, list.size()); |
| + list.Add(Value(0x5678), 20); |
| + EXPECT_EQ(5U, list.size()); |
| + |
| + // Iterate through the contents to make sure they match what went in. |
| + const RankedList::Entry kExpectedValues[] = { |
| + { Value(0x5678), 20 }, |
| + { Value(0x4567), 15 }, |
| + { Value(0x3456), 10 }, |
| + { Value(0x2345), 5 }, |
| + { Value(0x1234), 0 }, |
| + }; |
| + |
| + size_t index = 0; |
| + for (const auto& entry : list) { |
| + EXPECT_LT(index, arraysize(kExpectedValues)); |
| + EXPECT_EQ(kExpectedValues[index].value.size(), entry.value.size()); |
| + EXPECT_EQ(kExpectedValues[index].count, entry.count); |
| + ++index; |
| + } |
| +} |
| + |
| +TEST_F(RankedListTest, UnorderedInsertion) { |
| + RankedList list(10); |
| + EXPECT_EQ(0U, list.size()); |
| + |
| + list.Add(Value(0x1234), 15); |
| + list.Add(Value(0x2345), 20); |
| + list.Add(Value(0x3456), 10); |
| + list.Add(Value(0x4567), 30); |
| + list.Add(Value(0x5678), 25); |
| + EXPECT_EQ(5U, list.size()); |
| + |
| + // Iterate through the contents to make sure they match what went in. |
| + const RankedList::Entry kExpectedValues1[] = { |
| + { Value(0x4567), 30 }, |
| + { Value(0x5678), 25 }, |
| + { Value(0x2345), 20 }, |
| + { Value(0x1234), 15 }, |
| + { Value(0x3456), 10 }, |
| + }; |
| + |
| + size_t index = 0; |
| + for (const auto& entry : list) { |
| + EXPECT_LT(index, arraysize(kExpectedValues1)); |
| + EXPECT_EQ(kExpectedValues1[index].value.size(), entry.value.size()); |
| + EXPECT_EQ(kExpectedValues1[index].count, entry.count); |
| + ++index; |
| + } |
| + |
| + // Add more items. |
| + list.Add(Value(0x6789), 35); |
| + list.Add(Value(0x789a), 40); |
| + list.Add(Value(0x89ab), 50); |
| + list.Add(Value(0x9abc), 5); |
| + list.Add(Value(0xabcd), 0); |
| + EXPECT_EQ(10U, list.size()); |
| + |
| + // Iterate through the contents to make sure they match what went in. |
| + const RankedList::Entry kExpectedValues2[] = { |
| + { Value(0x89ab), 50 }, |
| + { Value(0x789a), 40 }, |
| + { Value(0x6789), 35 }, |
| + { Value(0x4567), 30 }, |
| + { Value(0x5678), 25 }, |
| + { Value(0x2345), 20 }, |
| + { Value(0x1234), 15 }, |
| + { Value(0x3456), 10 }, |
| + { Value(0x9abc), 5 }, |
| + { Value(0xabcd), 0 }, |
| + }; |
| + |
| + index = 0; |
| + for (const auto& entry : list) { |
| + EXPECT_LT(index, arraysize(kExpectedValues2)); |
| + EXPECT_EQ(kExpectedValues2[index].value.size(), entry.value.size()); |
| + EXPECT_EQ(kExpectedValues2[index].count, entry.count); |
| + ++index; |
| + } |
| +} |
| + |
| +TEST_F(RankedListTest, InsertionWithOverflow) { |
| + RankedList list(5); |
| + EXPECT_EQ(0U, list.size()); |
| + |
| + list.Add(Value(0x1234), 15); |
| + list.Add(Value(0x2345), 20); |
| + list.Add(Value(0x3456), 10); |
| + list.Add(Value(0x4567), 30); |
| + list.Add(Value(0x5678), 25); |
| + EXPECT_EQ(5U, list.size()); |
| + |
| + // These values will not make it into the list, which is now full. |
| + list.Add(Value(0x6789), 0); |
| + EXPECT_EQ(5U, list.size()); |
| + list.Add(Value(0x789a), 5); |
| + EXPECT_EQ(5U, list.size()); |
| + |
| + // Iterate through the contents to make sure they match what went in. |
| + const RankedList::Entry kExpectedValues1[] = { |
| + { Value(0x4567), 30 }, |
| + { Value(0x5678), 25 }, |
| + { Value(0x2345), 20 }, |
| + { Value(0x1234), 15 }, |
| + { Value(0x3456), 10 }, |
| + }; |
| + |
| + size_t index = 0; |
| + for (const auto& entry : list) { |
| + EXPECT_LT(index, arraysize(kExpectedValues1)); |
| + EXPECT_EQ(kExpectedValues1[index].value.size(), entry.value.size()); |
| + EXPECT_EQ(kExpectedValues1[index].count, entry.count); |
| + ++index; |
| + } |
| + |
| + // Insert some more values that go in the middle of the list. |
| + list.Add(Value(0x89ab), 27); |
| + EXPECT_EQ(5U, list.size()); |
| + list.Add(Value(0x9abc), 22); |
| + EXPECT_EQ(5U, list.size()); |
| + |
| + // Iterate through the contents to make sure they match what went in. |
| + const RankedList::Entry kExpectedValues2[] = { |
| + { Value(0x4567), 30 }, |
| + { Value(0x89ab), 27 }, |
| + { Value(0x5678), 25 }, |
| + { Value(0x9abc), 22 }, |
| + { Value(0x2345), 20 }, |
| + }; |
| + |
| + index = 0; |
| + for (const auto& entry : list) { |
| + EXPECT_LT(index, arraysize(kExpectedValues2)); |
| + EXPECT_EQ(kExpectedValues2[index].value.size(), entry.value.size()); |
| + EXPECT_EQ(kExpectedValues2[index].count, entry.count); |
| + ++index; |
| + } |
| + |
| + // Insert some more values at the front of the list. |
| + list.Add(Value(0xabcd), 40); |
| + EXPECT_EQ(5U, list.size()); |
| + list.Add(Value(0xbcde), 35); |
| + EXPECT_EQ(5U, list.size()); |
| + |
| + // Iterate through the contents to make sure they match what went in. |
| + const RankedList::Entry kExpectedValues3[] = { |
| + { Value(0xabcd), 40 }, |
| + { Value(0xbcde), 35 }, |
| + { Value(0x4567), 30 }, |
| + { Value(0x89ab), 27 }, |
| + { Value(0x5678), 25 }, |
| + }; |
| + |
| + index = 0; |
| + for (const auto& entry : list) { |
| + EXPECT_LT(index, arraysize(kExpectedValues3)); |
| + EXPECT_EQ(kExpectedValues3[index].value.size(), entry.value.size()); |
| + EXPECT_EQ(kExpectedValues3[index].count, entry.count); |
| + ++index; |
| + } |
| +} |
| + |
| +TEST_F(RankedListTest, MoveOperation) { |
|
Simon Que
2015/08/23 23:30:53
Test RankedList std::move support.
|
| + const RankedList::Entry kExpectedValues[] = { |
| + { Value(0x89ab), 50 }, |
| + { Value(0x789a), 40 }, |
| + { Value(0x6789), 35 }, |
| + { Value(0x4567), 30 }, |
| + { Value(0x5678), 25 }, |
| + { Value(0x2345), 20 }, |
| + { Value(0x1234), 15 }, |
| + { Value(0x3456), 10 }, |
| + { Value(0x9abc), 5 }, |
| + { Value(0xabcd), 0 }, |
| + }; |
| + |
| + RankedList source_list(10); |
| + for (const RankedList::Entry& entry : kExpectedValues) { |
| + source_list.Add(entry.value, entry.count); |
| + } |
| + EXPECT_EQ(10U, source_list.size()); |
| + |
| + RankedList dest_list(25); // This should be changed by the move. |
| + dest_list = std::move(source_list); |
| + EXPECT_EQ(10U, dest_list.size()); |
| + EXPECT_EQ(10U, dest_list.max_size()); |
| + |
| + size_t index = 0; |
| + for (const auto& entry : dest_list) { |
| + EXPECT_LT(index, arraysize(kExpectedValues)); |
| + EXPECT_EQ(kExpectedValues[index].value.size(), entry.value.size()); |
| + EXPECT_EQ(kExpectedValues[index].count, entry.count); |
| + ++index; |
| + } |
| +} |
| + |
| +} // namespace leak_detector |