indirect_reference_table_test.cc revision 63818dc8b06af4a1e65c41b453f1a42166c22728
16c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes/*
26c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes * Copyright (C) 2009 The Android Open Source Project
36c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes *
46c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
56c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes * you may not use this file except in compliance with the License.
66c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes * You may obtain a copy of the License at
76c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes *
86c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
96c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes *
106c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes * Unless required by applicable law or agreed to in writing, software
116c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
126c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes * See the License for the specific language governing permissions and
146c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes * limitations under the License.
156c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes */
166c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
176c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes#include "common_test.h"
186c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
196c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes#include "indirect_reference_table.h"
206c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
216c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughesnamespace art {
226c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
23f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstromclass IndirectReferenceTableTest : public CommonTest {
246c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes};
256c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
2663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogersstatic void CheckDump(IndirectReferenceTable* irt, size_t num_objects, size_t num_unique)
2763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
2863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  std::ostringstream oss;
2963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  irt->Dump(oss);
3063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  if (num_objects == 0) {
3163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_EQ(oss.str().find("java.lang.Object"), std::string::npos) << oss.str();
3263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  } else if (num_objects == 1) {
3363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_NE(oss.str().find("1 of java.lang.Object"), std::string::npos) << oss.str();
3463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  } else {
3563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_NE(oss.str().find(StringPrintf("%zd of java.lang.Object (%zd unique instances)",
3663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers                                          num_objects, num_unique)),
3763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers              std::string::npos)
3863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers                  << "\n Expected number of objects: " << num_objects
3963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers                  << "\n Expected unique objects: " << num_unique << "\n"
4063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers                  << oss.str();
4163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  }
4263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers}
4363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers
446c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott HughesTEST_F(IndirectReferenceTableTest, BasicTest) {
4500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
466c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  static const size_t kTableInitial = 10;
476c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  static const size_t kTableMax = 20;
486c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  IndirectReferenceTable irt(kTableInitial, kTableMax, kGlobal);
496c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
506c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  Class* c = class_linker_->FindSystemClass("Ljava/lang/Object;");
516c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(c != NULL);
521f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom  Object* obj0 = c->AllocObject();
536c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(obj0 != NULL);
541f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom  Object* obj1 = c->AllocObject();
556c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(obj1 != NULL);
561f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom  Object* obj2 = c->AllocObject();
576c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(obj2 != NULL);
581f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom  Object* obj3 = c->AllocObject();
596c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(obj3 != NULL);
606c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
616c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  const uint32_t cookie = IRT_FIRST_SEGMENT;
626c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
6363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
6463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers
656c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  IndirectRef iref0 = (IndirectRef) 0x11110;
666c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_FALSE(irt.Remove(cookie, iref0)) << "unexpectedly successful removal";
676c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
686c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Add three, check, remove in the order in which they were added.
696c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref0 = irt.Add(cookie, obj0);
706c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref0 != NULL);
7163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
726c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  IndirectRef iref1 = irt.Add(cookie, obj1);
736c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref1 != NULL);
7463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 2, 2);
756c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  IndirectRef iref2 = irt.Add(cookie, obj2);
766c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref2 != NULL);
7763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 3, 3);
786c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
796c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_EQ(obj0, irt.Get(iref0));
806c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_EQ(obj1, irt.Get(iref1));
816c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_EQ(obj2, irt.Get(iref2));
826c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
836c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(irt.Remove(cookie, iref0));
8463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 2, 2);
856c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(irt.Remove(cookie, iref1));
8663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
876c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(irt.Remove(cookie, iref2));
8863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
896c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
906c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Table should be empty now.
916c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_EQ(0U, irt.Capacity());
926c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
936c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Get invalid entry (off the end of the list).
946c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_EQ(kInvalidIndirectRefObject, irt.Get(iref0));
956c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
966c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Add three, remove in the opposite order.
976c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref0 = irt.Add(cookie, obj0);
986c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref0 != NULL);
996c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref1 = irt.Add(cookie, obj1);
1006c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref1 != NULL);
1016c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref2 = irt.Add(cookie, obj2);
1026c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref2 != NULL);
10363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 3, 3);
1046c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1056c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref2));
10663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 2, 2);
1076c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref1));
10863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
1096c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref0));
11063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
1116c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1126c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Table should be empty now.
1136c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(0U, irt.Capacity());
1146c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1156c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Add three, remove middle / middle / bottom / top.  (Second attempt
1166c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // to remove middle should fail.)
1176c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref0 = irt.Add(cookie, obj0);
1186c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref0 != NULL);
1196c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref1 = irt.Add(cookie, obj1);
1206c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref1 != NULL);
1216c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref2 = irt.Add(cookie, obj2);
1226c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref2 != NULL);
12363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 3, 3);
1246c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1256c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(3U, irt.Capacity());
1266c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1276c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref1));
12863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 2, 2);
1296c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_FALSE(irt.Remove(cookie, iref1));
13063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 2, 2);
1316c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1326c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Get invalid entry (from hole).
1336c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_EQ(kInvalidIndirectRefObject, irt.Get(iref1));
1346c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1356c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref2));
13663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
1376c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref0));
13863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
1396c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1406c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Table should be empty now.
1416c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(0U, irt.Capacity());
1426c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1436c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Add four entries.  Remove #1, add new entry, verify that table size
1446c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // is still 4 (i.e. holes are getting filled).  Remove #1 and #3, verify
1456c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // that we delete one and don't hole-compact the other.
1466c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref0 = irt.Add(cookie, obj0);
1476c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref0 != NULL);
1486c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref1 = irt.Add(cookie, obj1);
1496c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref1 != NULL);
1506c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref2 = irt.Add(cookie, obj2);
1516c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref2 != NULL);
1526c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  IndirectRef iref3 = irt.Add(cookie, obj3);
1536c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref3 != NULL);
15463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 4, 4);
1556c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1566c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref1));
15763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 3, 3);
1586c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1596c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref1 = irt.Add(cookie, obj1);
1606c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref1 != NULL);
1616c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1626c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(4U, irt.Capacity()) << "hole not filled";
16363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 4, 4);
1646c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1656c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref1));
16663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 3, 3);
1676c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref3));
16863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 2, 2);
1696c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1706c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(3U, irt.Capacity()) << "should be 3 after two deletions";
1716c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1726c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref2));
17363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
1746c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref0));
17563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
1766c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1776c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(0U, irt.Capacity()) << "not empty after split remove";
1786c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1796c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Add an entry, remove it, add a new entry, and try to use the original
1806c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // iref.  They have the same slot number but are for different objects.
1816c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // With the extended checks in place, this should fail.
1826c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref0 = irt.Add(cookie, obj0);
1836c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref0 != NULL);
18463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
1856c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref0));
18663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
1876c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref1 = irt.Add(cookie, obj1);
1886c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref1 != NULL);
18963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
1906c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_FALSE(irt.Remove(cookie, iref0)) << "mismatched del succeeded";
19163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
1926c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref1)) << "switched del failed";
1936c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(0U, irt.Capacity()) << "switching del not empty";
19463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
1956c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
1966c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Same as above, but with the same object.  A more rigorous checker
1976c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // (e.g. with slot serialization) will catch this.
1986c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref0 = irt.Add(cookie, obj0);
1996c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref0 != NULL);
20063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
2016c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref0));
20263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
2036c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref1 = irt.Add(cookie, obj0);
2046c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref1 != NULL);
20563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
2066c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  if (iref0 != iref1) {
2076c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes    // Try 0, should not work.
2086c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes    ASSERT_FALSE(irt.Remove(cookie, iref0)) << "temporal del succeeded";
2096c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  }
2106c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref1)) << "temporal cleanup failed";
2116c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(0U, irt.Capacity()) << "temporal del not empty";
21263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
2136c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
2146c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // NULL isn't a valid iref.
2156c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(kInvalidIndirectRefObject, irt.Get(NULL));
2166c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
2176c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Stale lookup.
2186c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref0 = irt.Add(cookie, obj0);
2196c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_TRUE(iref0 != NULL);
22063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 1, 1);
2216c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref0));
2226c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  EXPECT_EQ(kInvalidIndirectRefObject, irt.Get(iref0)) << "stale lookup succeeded";
22363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
2246c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
2256c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Test table resizing.
2266c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // These ones fit...
2276c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  IndirectRef manyRefs[kTableInitial];
2286c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  for (size_t i = 0; i < kTableInitial; i++) {
2296c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes    manyRefs[i] = irt.Add(cookie, obj0);
2306c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes    ASSERT_TRUE(manyRefs[i] != NULL) << "Failed adding " << i;
23163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    CheckDump(&irt, i + 1, 1);
2326c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  }
2336c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // ...this one causes overflow.
2346c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  iref0 = irt.Add(cookie, obj0);
2356c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(iref0 != NULL);
2366c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(kTableInitial + 1, irt.Capacity());
23763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, kTableInitial + 1, 1);
2386c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
2396c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  for (size_t i = 0; i < kTableInitial; i++) {
2406c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes    ASSERT_TRUE(irt.Remove(cookie, manyRefs[i])) << "failed removing " << i;
24163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    CheckDump(&irt, kTableInitial - i, 1);
2426c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  }
2436c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  // Because of removal order, should have 11 entries, 10 of them holes.
2446c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(kTableInitial + 1, irt.Capacity());
2456c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
2466c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_TRUE(irt.Remove(cookie, iref0)) << "multi-remove final failed";
2476c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
2486c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes  ASSERT_EQ(0U, irt.Capacity()) << "multi-del not empty";
24963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  CheckDump(&irt, 0, 0);
2506c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes}
2516c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes
2526c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes}  // namespace art
253