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