blob: 6f2cb6870c0b0fbd42684af0a5f589326300e166 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// 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/core/dom/weak_identifier_map.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/heap/thread_state.h"
#include "third_party/blink/renderer/platform/testing/task_environment.h"
namespace blink {
class WeakIdentifierMapTest : public ::testing::Test {
public:
class TestClass final : public GarbageCollected<TestClass> {
public:
virtual void Trace(Visitor*) const {}
};
using TestMap = WeakIdentifierMap<TestClass>;
void SetUp() override;
void TearDown() override;
void CollectGarbage() {
ThreadState::Current()->CollectAllGarbageForTesting(
ThreadState::StackState::kNoHeapPointers);
}
test::TaskEnvironment task_environment_;
};
DECLARE_WEAK_IDENTIFIER_MAP(WeakIdentifierMapTest::TestClass);
DEFINE_WEAK_IDENTIFIER_MAP(WeakIdentifierMapTest::TestClass)
void WeakIdentifierMapTest::SetUp() {
EXPECT_EQ(0u, TestMap::GetSizeForTesting());
}
void WeakIdentifierMapTest::TearDown() {
CollectGarbage();
EXPECT_EQ(0u, TestMap::GetSizeForTesting());
}
TEST_F(WeakIdentifierMapTest, Basic) {
auto* a = MakeGarbageCollected<TestClass>();
auto* b = MakeGarbageCollected<TestClass>();
auto id_a = TestMap::Identifier(a);
EXPECT_NE(0, id_a);
EXPECT_EQ(id_a, TestMap::Identifier(a));
EXPECT_EQ(a, TestMap::Lookup(id_a));
auto id_b = TestMap::Identifier(b);
EXPECT_NE(0, id_b);
EXPECT_NE(id_a, id_b);
EXPECT_EQ(id_b, TestMap::Identifier(b));
EXPECT_EQ(b, TestMap::Lookup(id_b));
EXPECT_EQ(id_a, TestMap::Identifier(a));
EXPECT_EQ(a, TestMap::Lookup(id_a));
EXPECT_EQ(2u, TestMap::GetSizeForTesting());
}
TEST_F(WeakIdentifierMapTest, NotifyObjectDestroyed) {
auto* a = MakeGarbageCollected<TestClass>();
auto id_a = TestMap::Identifier(a);
TestMap::NotifyObjectDestroyed(a);
EXPECT_EQ(nullptr, TestMap::Lookup(id_a));
// Simulate that an object is newly allocated at the same address.
EXPECT_NE(id_a, TestMap::Identifier(a));
}
TEST_F(WeakIdentifierMapTest, GarbageCollected) {
auto* a = MakeGarbageCollected<TestClass>();
auto id_a = TestMap::Identifier(a);
a = nullptr;
CollectGarbage();
EXPECT_EQ(nullptr, TestMap::Lookup(id_a));
}
TEST_F(WeakIdentifierMapTest, UnusedID) {
auto* a = MakeGarbageCollected<TestClass>();
auto id_a = TestMap::Identifier(a);
EXPECT_EQ(nullptr, TestMap::Lookup(id_a + 1));
}
TEST_F(WeakIdentifierMapTest, Overflow) {
TestMap::SetLastIdForTesting(0);
auto* a = MakeGarbageCollected<TestClass>();
EXPECT_EQ(1, TestMap::Identifier(a));
EXPECT_EQ(a, TestMap::Lookup(1));
TestMap::SetLastIdForTesting(INT_MAX - 1);
auto* b = MakeGarbageCollected<TestClass>();
EXPECT_EQ(INT_MAX, TestMap::Identifier(b));
EXPECT_EQ(b, TestMap::Lookup(INT_MAX));
auto* c = MakeGarbageCollected<TestClass>();
EXPECT_EQ(2, TestMap::Identifier(c));
EXPECT_EQ(c, TestMap::Lookup(2));
DCHECK_EQ(3u, TestMap::GetSizeForTesting());
}
} // namespace blink