Index: runtime/vm/object_id_ring_test.cc |
diff --git a/runtime/vm/object_id_ring_test.cc b/runtime/vm/object_id_ring_test.cc |
index 745ec14a30bc59b23ebacf1ef41079fc7d428795..986757a8e9b6da81af27d04fb3033fe14cfd06e4 100644 |
--- a/runtime/vm/object_id_ring_test.cc |
+++ b/runtime/vm/object_id_ring_test.cc |
@@ -27,8 +27,16 @@ class ObjectIdRingTestHelper { |
EXPECT(!ring->IsValidId(id)); |
} |
+ static void ExpectIndexId(ObjectIdRing* ring, intptr_t index, intptr_t id) { |
+ EXPECT_EQ(id, ring->IdOfIndex(index)); |
+ } |
+ |
+ static void ExpectInvalidIndex(ObjectIdRing* ring, intptr_t index) { |
+ EXPECT_EQ(-1, ring->IdOfIndex(index)); |
+ } |
+ |
static RawObject* MakeString(const char* s) { |
- return String::New(s); |
+ return Symbols::New(s); |
} |
static void ExpectString(RawObject* obj, const char* s) { |
@@ -48,29 +56,48 @@ TEST_CASE(ObjectIdRingSerialWrapTest) { |
ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid; |
id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("0")); |
EXPECT_EQ(0, id); |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 0, 0); |
+ ObjectIdRingTestHelper::ExpectInvalidIndex(ring, 1); |
id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("1")); |
EXPECT_EQ(1, id); |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 0, 0); |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 1, 1); |
// Test that id 1 gives us the "1" string. |
ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id, &kind), "1"); |
EXPECT_EQ(ObjectIdRing::kValid, kind); |
ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0); |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 0, 0); |
ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1); |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 1, 1); |
ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2); |
ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 3); |
+ // We have wrapped, index 0 is being reused. |
id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("2")); |
EXPECT_EQ(2, id); |
ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 0); |
ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1); |
+ // Index 0 has id 2. |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 0, 2); |
ObjectIdRingTestHelper::ExpectIdIsValid(ring, 2); |
+ // Index 1 has id 1. |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 1, 1); |
ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 3); |
id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("3")); |
EXPECT_EQ(3, id); |
+ // Index 0 has id 2. |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 0, 2); |
+ // Index 1 has id 3. |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 1, 3); |
ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 0); |
ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 1); |
ObjectIdRingTestHelper::ExpectIdIsValid(ring, 2); |
ObjectIdRingTestHelper::ExpectIdIsValid(ring, 3); |
id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("4")); |
EXPECT_EQ(0, id); |
+ // Index 0 has id 0. |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 0, 0); |
+ // Index 1 has id 3. |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 1, 3); |
ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id, &kind), "4"); |
EXPECT_EQ(ObjectIdRing::kValid, kind); |
ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0); |
@@ -79,6 +106,10 @@ TEST_CASE(ObjectIdRingSerialWrapTest) { |
ObjectIdRingTestHelper::ExpectIdIsValid(ring, 3); |
id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("5")); |
EXPECT_EQ(1, id); |
+ // Index 0 has id 0. |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 0, 0); |
+ // Index 1 has id 1. |
+ ObjectIdRingTestHelper::ExpectIndexId(ring, 1, 1); |
ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id, &kind), "5"); |
EXPECT_EQ(ObjectIdRing::kValid, kind); |
ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0); |
@@ -112,8 +143,15 @@ TEST_CASE(ObjectIdRingScavengeMoveTest) { |
EXPECT_NE(Object::null(), raw_obj); |
intptr_t raw_obj_id1 = ring->GetIdForObject(raw_obj); |
EXPECT_EQ(0, raw_obj_id1); |
+ // Get id 0 again. |
+ EXPECT_EQ(raw_obj_id1, |
+ ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId)); |
+ // Add to ring a second time. |
intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj); |
EXPECT_EQ(1, raw_obj_id2); |
+ // Get id 0 again. |
+ EXPECT_EQ(raw_obj_id1, |
+ ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId)); |
RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind); |
EXPECT_EQ(ObjectIdRing::kValid, kind); |
RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind); |
@@ -142,6 +180,9 @@ TEST_CASE(ObjectIdRingScavengeMoveTest) { |
EXPECT(Dart_IsList(moved_handle)); |
EXPECT_VALID(Dart_ListLength(moved_handle, &list_length)); |
EXPECT_EQ(3, list_length); |
+ // Test id reuse. |
+ EXPECT_EQ(raw_obj_id1, |
+ ring->GetIdForObject(raw_object_moved1, ObjectIdRing::kReuseId)); |
} |