summaryrefslogtreecommitdiffstats
path: root/components/html_viewer/discardable_memory_allocator_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'components/html_viewer/discardable_memory_allocator_unittest.cc')
-rw-r--r--components/html_viewer/discardable_memory_allocator_unittest.cc76
1 files changed, 76 insertions, 0 deletions
diff --git a/components/html_viewer/discardable_memory_allocator_unittest.cc b/components/html_viewer/discardable_memory_allocator_unittest.cc
new file mode 100644
index 0000000..cc73fb0
--- /dev/null
+++ b/components/html_viewer/discardable_memory_allocator_unittest.cc
@@ -0,0 +1,76 @@
+// 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/html_viewer/discardable_memory_allocator.h"
+
+#include "base/memory/discardable_memory.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace html_viewer {
+namespace {
+
+const size_t kOneKilobyte = 1024;
+const size_t kAlmostOneMegabyte = 1023 * kOneKilobyte;
+const size_t kOneMegabyte = 1024 * kOneKilobyte;
+
+TEST(DiscardableMemoryAllocator, Basic) {
+ scoped_ptr<base::DiscardableMemory> chunk;
+
+ {
+ DiscardableMemoryAllocator allocator(kOneMegabyte);
+
+ // Make sure the chunk is locked when allocated. In debug mode, we will
+ // dcheck.
+ chunk = allocator.AllocateLockedDiscardableMemory(kOneKilobyte);
+ chunk->Unlock();
+
+ // Make sure we can lock a chunk.
+ EXPECT_TRUE(chunk->Lock());
+ chunk->Unlock();
+ }
+
+ // The chunk's backing should have disappeared with the allocator.
+ EXPECT_FALSE(chunk->Lock());
+}
+
+TEST(DiscardableMemoryAllocator, DiscardChunks) {
+ DiscardableMemoryAllocator allocator(kOneMegabyte);
+
+ scoped_ptr<base::DiscardableMemory> chunk_to_remove =
+ allocator.AllocateLockedDiscardableMemory(kAlmostOneMegabyte);
+ chunk_to_remove->Unlock();
+
+ // Allocating a second chunk should deallocate the first one due to memory
+ // pressure, since we only have one megabyte available.
+ scoped_ptr<base::DiscardableMemory> chunk_to_keep =
+ allocator.AllocateLockedDiscardableMemory(kAlmostOneMegabyte);
+
+ // Fail to get a lock because allocating the second chunk removed the first.
+ EXPECT_FALSE(chunk_to_remove->Lock());
+
+ chunk_to_keep->Unlock();
+}
+
+TEST(DiscardableMemoryAllocator, DontDiscardLiveChunks) {
+ DiscardableMemoryAllocator allocator(kOneMegabyte);
+
+ scoped_ptr<base::DiscardableMemory> chunk_one =
+ allocator.AllocateLockedDiscardableMemory(kAlmostOneMegabyte);
+ scoped_ptr<base::DiscardableMemory> chunk_two =
+ allocator.AllocateLockedDiscardableMemory(kAlmostOneMegabyte);
+ scoped_ptr<base::DiscardableMemory> chunk_three =
+ allocator.AllocateLockedDiscardableMemory(kAlmostOneMegabyte);
+
+ // These accesses will fail if the underlying weak ptr has been deallocated.
+ EXPECT_NE(nullptr, chunk_one->data());
+ EXPECT_NE(nullptr, chunk_two->data());
+ EXPECT_NE(nullptr, chunk_three->data());
+
+ chunk_one->Unlock();
+ chunk_two->Unlock();
+ chunk_three->Unlock();
+}
+
+} // namespace
+} // namespace html_viewer