Chromium Code Reviews| Index: base/trace_event/estimate_memory_usage_unittest.cc |
| diff --git a/base/trace_event/estimate_memory_usage_unittest.cc b/base/trace_event/estimate_memory_usage_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8f7355e553bc65f4a9440a27dba2cd7781eff24d |
| --- /dev/null |
| +++ b/base/trace_event/estimate_memory_usage_unittest.cc |
| @@ -0,0 +1,209 @@ |
| +// Copyright 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/trace_event/estimate_memory_usage.h" |
| + |
| +#include <stdlib.h> |
| + |
| +#include "base/memory/ptr_util.h" |
| +#include "base/strings/string16.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace base { |
| +namespace trace_event { |
| + |
| +namespace { |
| + |
| +// Test class with predictable memory usage. |
| +class Data { |
| + public: |
| + explicit Data(size_t size = 17): size_(size) { |
| + } |
| + |
| + size_t size() const { return size_; } |
| + |
| + size_t EstimateMemoryUsage() const { |
| + return size_; |
| + } |
| + |
| + bool operator < (const Data& other) const { |
| + return size_ < other.size_; |
| + } |
| + bool operator == (const Data& other) const { |
| + return size_ == other.size_; |
| + } |
| + |
| + struct Hasher { |
| + size_t operator () (const Data& data) const { |
| + return data.size(); |
| + } |
| + }; |
| + |
| + private: |
| + size_t size_; |
| +}; |
| + |
| +} // namespace |
| + |
| +TEST(EstimateMemoryUsageTest, String) { |
| + std::string string(777, 'a'); |
| + EXPECT_EQ(string.capacity() + 1, EstimateMemoryUsage(string)); |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, String16) { |
| + string16 string(777, 'a'); |
| + EXPECT_EQ(sizeof(char16) * (string.capacity() + 1), |
| + EstimateMemoryUsage(string)); |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, Arrays) { |
| + // std::array |
| + { |
| + std::array<Data, 10> array; |
| + EXPECT_EQ(170u, EstimateMemoryUsage(array)); |
| + } |
| + |
| + // T[N] |
| + { |
| + Data array[10]; |
| + EXPECT_EQ(170u, EstimateMemoryUsage(array)); |
| + } |
| + |
| + // C array |
| + { |
| + struct Item { |
| + char payload[10]; |
| + }; |
| + Item* array = new Item[7]; |
| + EXPECT_EQ(70u, EstimateMemoryUsage(array, 7)); |
| + delete[] array; |
| + } |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, UniquePtr) { |
| + // Empty |
| + { |
| + std::unique_ptr<Data> ptr; |
| + EXPECT_EQ(0u, EstimateMemoryUsage(ptr)); |
| + } |
| + |
| + // Not empty |
| + { |
| + std::unique_ptr<Data> ptr(new Data()); |
| + EXPECT_EQ(25u, EstimateMemoryUsage(ptr)); |
| + } |
| + |
| + // With a pointer |
| + { |
| + std::unique_ptr<Data*> ptr(new Data*()); |
| + EXPECT_EQ(8u, EstimateMemoryUsage(ptr)); |
|
Primiano Tucci (use gerrit)
2016/11/08 14:09:16
s/8u/sizeof(void*)/ ?
|
| + } |
| + |
| + // With an array |
| + { |
| + struct Item { |
| + int payload[10]; |
|
Primiano Tucci (use gerrit)
2016/11/08 14:09:16
s/int/uint32_t/ to keep it a bit more readable
|
| + }; |
| + std::unique_ptr<Item[]> ptr(new Item[7]); |
| + EXPECT_EQ(280u, EstimateMemoryUsage(ptr, 7)); |
| + } |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, Vector) { |
| + { |
| + std::vector<Data> vector; |
| + for (int i = 0; i != 1000; ++i) { |
| + vector.push_back(Data(i)); |
| + } |
| + EXPECT_EQ(507692u, EstimateMemoryUsage(vector)); |
| + } |
| + |
| + // Capacity |
| + { |
| + struct POD { |
| + short data; |
| + }; |
| + std::vector<POD> vector; |
| + vector.reserve(1000); |
| + EXPECT_EQ(2000u, EstimateMemoryUsage(vector)); |
| + } |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, List) { |
| + struct POD { |
| + short data; |
| + }; |
| + std::list<POD> list; |
| + for (int i = 0; i != 1000; ++i) { |
| + list.push_back(POD()); |
| + } |
| + EXPECT_EQ(24000u, EstimateMemoryUsage(list)); |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, Set) { |
| + std::set<std::pair<int, Data>> set; |
| + for (int i = 0; i != 1000; ++i) { |
| + set.insert({i, Data(i)}); |
| + } |
| + EXPECT_EQ(547500u, EstimateMemoryUsage(set)); |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, MultiSet) { |
| + std::multiset<bool> set; |
| + for (int i = 0; i != 1000; ++i) { |
| + set.insert((i & 1) != 0); |
| + } |
| + EXPECT_EQ(32000u, EstimateMemoryUsage(set)); |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, Map) { |
| + std::map<Data, int> map; |
| + for (int i = 0; i != 1000; ++i) { |
| + map.insert({Data(i), i}); |
| + } |
| + EXPECT_EQ(547500u, EstimateMemoryUsage(map)); |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, MultiMap) { |
| + std::multimap<char, Data> map; |
| + for (int i = 0; i != 1000; ++i) { |
| + map.insert({static_cast<char>(i), Data(i)}); |
| + } |
| + EXPECT_EQ(547500u, EstimateMemoryUsage(map)); |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, UnorderedSet) { |
| + std::unordered_set<Data, Data::Hasher> set; |
| + for (int i = 0; i != 1000; ++i) { |
| + set.insert(Data(i)); |
| + } |
| + EXPECT_EQ(537428u, EstimateMemoryUsage(set)); |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, UnorderedMultiSet) { |
| + std::unordered_multiset<short> set; |
| + for (int i = 0; i != 1000; ++i) { |
| + set.insert(static_cast<short>(i)); |
| + } |
| + EXPECT_EQ(37928u, EstimateMemoryUsage(set)); |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, UnorderedMap) { |
| + std::unordered_map<Data, void*, Data::Hasher> map; |
| + for (int i = 0; i != 1000; ++i) { |
| + map.insert({Data(i), reinterpret_cast<void*>(i)}); |
| + } |
| + EXPECT_EQ(545428u, EstimateMemoryUsage(map)); |
| +} |
| + |
| +TEST(EstimateMemoryUsageTest, UnorderedMultiMap) { |
| + std::unordered_multimap<char, short> map; |
| + for (int i = 0; i != 1000; ++i) { |
| + map.insert({static_cast<char>(i), 777}); |
| + } |
| + EXPECT_EQ(37928u, EstimateMemoryUsage(map)); |
| +} |
| + |
| +} // namespace trace_event |
| +} // namespace base |