diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/heap/worklist_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/heap/worklist_test.cc | 352 |
1 files changed, 0 insertions, 352 deletions
diff --git a/chromium/third_party/blink/renderer/platform/heap/worklist_test.cc b/chromium/third_party/blink/renderer/platform/heap/worklist_test.cc deleted file mode 100644 index 1030cbab9ac..00000000000 --- a/chromium/third_party/blink/renderer/platform/heap/worklist_test.cc +++ /dev/null @@ -1,352 +0,0 @@ -// Copyright 2018 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. -// -// Copied and adopted from V8. -// -// Copyright 2017 the V8 project 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 "third_party/blink/renderer/platform/heap/worklist.h" - -#include "testing/gtest/include/gtest/gtest.h" - -namespace blink { - -namespace { -class SomeObject {}; -} // namespace - -using TestWorklist = Worklist<SomeObject*, 64 /* entries */, 8 /* tasks */>; - -TEST(WorklistTest, SegmentCreate) { - TestWorklist::Segment segment; - EXPECT_TRUE(segment.IsEmpty()); - EXPECT_EQ(0u, segment.Size()); - EXPECT_FALSE(segment.IsFull()); -} - -TEST(WorklistTest, SegmentPush) { - TestWorklist::Segment segment; - EXPECT_EQ(0u, segment.Size()); - EXPECT_TRUE(segment.Push(nullptr)); - EXPECT_EQ(1u, segment.Size()); -} - -TEST(WorklistTest, SegmentPushPop) { - TestWorklist::Segment segment; - EXPECT_TRUE(segment.Push(nullptr)); - EXPECT_EQ(1u, segment.Size()); - SomeObject dummy; - SomeObject* object = &dummy; - EXPECT_TRUE(segment.Pop(&object)); - EXPECT_EQ(0u, segment.Size()); - EXPECT_EQ(nullptr, object); -} - -TEST(WorklistTest, SegmentIsEmpty) { - TestWorklist::Segment segment; - EXPECT_TRUE(segment.IsEmpty()); - EXPECT_TRUE(segment.Push(nullptr)); - EXPECT_FALSE(segment.IsEmpty()); -} - -TEST(WorklistTest, SegmentIsFull) { - TestWorklist::Segment segment; - EXPECT_FALSE(segment.IsFull()); - for (size_t i = 0; i < TestWorklist::Segment::kCapacity; i++) { - EXPECT_TRUE(segment.Push(nullptr)); - } - EXPECT_TRUE(segment.IsFull()); -} - -TEST(WorklistTest, SegmentClear) { - TestWorklist::Segment segment; - EXPECT_TRUE(segment.Push(nullptr)); - EXPECT_FALSE(segment.IsEmpty()); - segment.Clear(); - EXPECT_TRUE(segment.IsEmpty()); - for (size_t i = 0; i < TestWorklist::Segment::kCapacity; i++) { - EXPECT_TRUE(segment.Push(nullptr)); - } -} - -TEST(WorklistTest, SegmentFullPushFails) { - TestWorklist::Segment segment; - EXPECT_FALSE(segment.IsFull()); - for (size_t i = 0; i < TestWorklist::Segment::kCapacity; i++) { - EXPECT_TRUE(segment.Push(nullptr)); - } - EXPECT_TRUE(segment.IsFull()); - EXPECT_FALSE(segment.Push(nullptr)); -} - -TEST(WorklistTest, SegmentEmptyPopFails) { - TestWorklist::Segment segment; - EXPECT_TRUE(segment.IsEmpty()); - SomeObject* object; - EXPECT_FALSE(segment.Pop(&object)); -} - -TEST(WorklistTest, SegmentUpdateFalse) { - TestWorklist::Segment segment; - SomeObject* object; - object = reinterpret_cast<SomeObject*>(&object); - EXPECT_TRUE(segment.Push(object)); - segment.Update([](SomeObject* object, SomeObject** out) { return false; }); - EXPECT_TRUE(segment.IsEmpty()); -} - -TEST(WorklistTest, SegmentUpdate) { - TestWorklist::Segment segment; - SomeObject* objectA; - objectA = reinterpret_cast<SomeObject*>(&objectA); - SomeObject* objectB; - objectB = reinterpret_cast<SomeObject*>(&objectB); - EXPECT_TRUE(segment.Push(objectA)); - segment.Update([objectB](SomeObject* object, SomeObject** out) { - *out = objectB; - return true; - }); - SomeObject* object; - EXPECT_TRUE(segment.Pop(&object)); - EXPECT_EQ(object, objectB); -} - -TEST(WorklistTest, CreateEmpty) { - TestWorklist worklist; - TestWorklist::View worklist_view(&worklist, 0); - EXPECT_TRUE(worklist_view.IsLocalEmpty()); - EXPECT_TRUE(worklist.IsGlobalEmpty()); -} - -TEST(WorklistTest, LocalPushPop) { - TestWorklist worklist; - TestWorklist::View worklist_view(&worklist, 0); - SomeObject dummy; - SomeObject* retrieved = nullptr; - EXPECT_TRUE(worklist_view.Push(&dummy)); - EXPECT_FALSE(worklist_view.IsLocalEmpty()); - EXPECT_TRUE(worklist_view.Pop(&retrieved)); - EXPECT_EQ(&dummy, retrieved); -} - -TEST(WorklistTest, LocalIsBasedOnId) { - TestWorklist worklist; - // Use the same id. - TestWorklist::View worklist_view1(&worklist, 0); - TestWorklist::View worklist_view2(&worklist, 0); - SomeObject dummy; - SomeObject* retrieved = nullptr; - EXPECT_TRUE(worklist_view1.Push(&dummy)); - EXPECT_FALSE(worklist_view1.IsLocalEmpty()); - EXPECT_FALSE(worklist_view2.IsLocalEmpty()); - EXPECT_TRUE(worklist_view2.Pop(&retrieved)); - EXPECT_EQ(&dummy, retrieved); - EXPECT_TRUE(worklist_view1.IsLocalEmpty()); - EXPECT_TRUE(worklist_view2.IsLocalEmpty()); -} - -TEST(WorklistTest, LocalPushStaysPrivate) { - TestWorklist worklist; - TestWorklist::View worklist_view1(&worklist, 0); - TestWorklist::View worklist_view2(&worklist, 1); - SomeObject dummy; - SomeObject* retrieved = nullptr; - EXPECT_TRUE(worklist.IsGlobalEmpty()); - EXPECT_EQ(0U, worklist.GlobalPoolSize()); - EXPECT_TRUE(worklist_view1.Push(&dummy)); - EXPECT_FALSE(worklist.IsGlobalEmpty()); - EXPECT_EQ(0U, worklist.GlobalPoolSize()); - EXPECT_FALSE(worklist_view2.Pop(&retrieved)); - EXPECT_EQ(nullptr, retrieved); - EXPECT_TRUE(worklist_view1.Pop(&retrieved)); - EXPECT_EQ(&dummy, retrieved); - EXPECT_TRUE(worklist.IsGlobalEmpty()); - EXPECT_EQ(0U, worklist.GlobalPoolSize()); -} - -TEST(WorklistTest, GlobalUpdateNull) { - TestWorklist worklist; - TestWorklist::View worklist_view(&worklist, 0); - SomeObject* object; - object = reinterpret_cast<SomeObject*>(&object); - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view.Push(object)); - } - EXPECT_TRUE(worklist_view.Push(object)); - worklist.Update([](SomeObject* object, SomeObject** out) { return false; }); - EXPECT_TRUE(worklist.IsGlobalEmpty()); - EXPECT_EQ(0U, worklist.GlobalPoolSize()); -} - -TEST(WorklistTest, GlobalUpdate) { - TestWorklist worklist; - TestWorklist::View worklist_view(&worklist, 0); - SomeObject* objectA = nullptr; - objectA = reinterpret_cast<SomeObject*>(&objectA); - SomeObject* objectB = nullptr; - objectB = reinterpret_cast<SomeObject*>(&objectB); - SomeObject* objectC = nullptr; - objectC = reinterpret_cast<SomeObject*>(&objectC); - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view.Push(objectA)); - } - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view.Push(objectB)); - } - EXPECT_TRUE(worklist_view.Push(objectA)); - worklist.Update([objectA, objectC](SomeObject* object, SomeObject** out) { - if (object != objectA) { - *out = objectC; - return true; - } - return false; - }); - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - SomeObject* object; - EXPECT_TRUE(worklist_view.Pop(&object)); - EXPECT_EQ(object, objectC); - } -} - -TEST(WorklistTest, FlushToGlobalPushSegment) { - TestWorklist worklist; - TestWorklist::View worklist_view0(&worklist, 0); - TestWorklist::View worklist_view1(&worklist, 1); - SomeObject* object = nullptr; - SomeObject* objectA = nullptr; - objectA = reinterpret_cast<SomeObject*>(&objectA); - EXPECT_TRUE(worklist_view0.Push(objectA)); - worklist.FlushToGlobal(0); - EXPECT_EQ(1U, worklist.GlobalPoolSize()); - EXPECT_TRUE(worklist_view1.Pop(&object)); -} - -TEST(WorklistTest, FlushToGlobalPopSegment) { - TestWorklist worklist; - TestWorklist::View worklist_view0(&worklist, 0); - TestWorklist::View worklist_view1(&worklist, 1); - SomeObject* object = nullptr; - SomeObject* objectA = nullptr; - objectA = reinterpret_cast<SomeObject*>(&objectA); - EXPECT_TRUE(worklist_view0.Push(objectA)); - EXPECT_TRUE(worklist_view0.Push(objectA)); - EXPECT_TRUE(worklist_view0.Pop(&object)); - worklist.FlushToGlobal(0); - EXPECT_EQ(1U, worklist.GlobalPoolSize()); - EXPECT_TRUE(worklist_view1.Pop(&object)); -} - -TEST(WorklistTest, Clear) { - TestWorklist worklist; - TestWorklist::View worklist_view(&worklist, 0); - SomeObject* object; - object = reinterpret_cast<SomeObject*>(&object); - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view.Push(object)); - } - EXPECT_TRUE(worklist_view.Push(object)); - EXPECT_EQ(1U, worklist.GlobalPoolSize()); - worklist.Clear(); - EXPECT_TRUE(worklist.IsGlobalEmpty()); - EXPECT_EQ(0U, worklist.GlobalPoolSize()); -} - -TEST(WorklistTest, SingleSegmentSteal) { - TestWorklist worklist; - TestWorklist::View worklist_view1(&worklist, 0); - TestWorklist::View worklist_view2(&worklist, 1); - SomeObject dummy; - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view1.Push(&dummy)); - } - SomeObject* retrieved = nullptr; - // One more push/pop to publish the full segment. - EXPECT_TRUE(worklist_view1.Push(nullptr)); - EXPECT_TRUE(worklist_view1.Pop(&retrieved)); - EXPECT_EQ(nullptr, retrieved); - EXPECT_EQ(1U, worklist.GlobalPoolSize()); - // Stealing. - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view2.Pop(&retrieved)); - EXPECT_EQ(&dummy, retrieved); - EXPECT_FALSE(worklist_view1.Pop(&retrieved)); - } - EXPECT_TRUE(worklist.IsGlobalEmpty()); - EXPECT_EQ(0U, worklist.GlobalPoolSize()); -} - -TEST(WorklistTest, MultipleSegmentsStolen) { - TestWorklist worklist; - TestWorklist::View worklist_view1(&worklist, 0); - TestWorklist::View worklist_view2(&worklist, 1); - TestWorklist::View worklist_view3(&worklist, 2); - SomeObject dummy1; - SomeObject dummy2; - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view1.Push(&dummy1)); - } - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view1.Push(&dummy2)); - } - SomeObject* retrieved = nullptr; - SomeObject dummy3; - // One more push/pop to publish the full segment. - EXPECT_TRUE(worklist_view1.Push(&dummy3)); - EXPECT_TRUE(worklist_view1.Pop(&retrieved)); - EXPECT_EQ(&dummy3, retrieved); - EXPECT_EQ(2U, worklist.GlobalPoolSize()); - // Stealing. - EXPECT_TRUE(worklist_view2.Pop(&retrieved)); - SomeObject* const expect_bag2 = retrieved; - EXPECT_TRUE(worklist_view3.Pop(&retrieved)); - SomeObject* const expect_bag3 = retrieved; - EXPECT_EQ(0U, worklist.GlobalPoolSize()); - EXPECT_NE(expect_bag2, expect_bag3); - EXPECT_TRUE(expect_bag2 == &dummy1 || expect_bag2 == &dummy2); - EXPECT_TRUE(expect_bag3 == &dummy1 || expect_bag3 == &dummy2); - for (size_t i = 1; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view2.Pop(&retrieved)); - EXPECT_EQ(expect_bag2, retrieved); - EXPECT_FALSE(worklist_view1.Pop(&retrieved)); - } - for (size_t i = 1; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view3.Pop(&retrieved)); - EXPECT_EQ(expect_bag3, retrieved); - EXPECT_FALSE(worklist_view1.Pop(&retrieved)); - } - EXPECT_TRUE(worklist.IsGlobalEmpty()); -} - -TEST(WorklistTest, MergeGlobalPool) { - TestWorklist worklist1; - TestWorklist::View worklist_view1(&worklist1, 0); - SomeObject dummy; - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view1.Push(&dummy)); - } - SomeObject* retrieved = nullptr; - // One more push/pop to publish the full segment. - EXPECT_TRUE(worklist_view1.Push(nullptr)); - EXPECT_TRUE(worklist_view1.Pop(&retrieved)); - EXPECT_EQ(nullptr, retrieved); - EXPECT_EQ(1U, worklist1.GlobalPoolSize()); - // Merging global pool into a new Worklist. - TestWorklist worklist2; - TestWorklist::View worklist_view2(&worklist2, 0); - EXPECT_EQ(0U, worklist2.GlobalPoolSize()); - worklist2.MergeGlobalPool(&worklist1); - EXPECT_EQ(1U, worklist2.GlobalPoolSize()); - EXPECT_FALSE(worklist2.IsGlobalEmpty()); - for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) { - EXPECT_TRUE(worklist_view2.Pop(&retrieved)); - EXPECT_EQ(&dummy, retrieved); - EXPECT_FALSE(worklist_view1.Pop(&retrieved)); - } - EXPECT_TRUE(worklist1.IsGlobalEmpty()); - EXPECT_TRUE(worklist2.IsGlobalEmpty()); -} - -} // namespace blink |