indirect_reference_table_test.cc revision da0a69edb24122d3d35ce1483c5ab94de919d714
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 17c56057e40938c587a74984651a510e320a8cb4fdMathieu Chartier#include "indirect_reference_table-inl.h" 18a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 193481ba2c4e4f3aa80d8c6d50a9f85dacb56b508bVladimir Marko#include "class_linker-inl.h" 20a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "common_runtime_test.h" 21967a0adf8b93a23d2a8fef82e06bd913db94ac19Hiroshi Yamauchi#include "mirror/object-inl.h" 220795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier#include "scoped_thread_state_change-inl.h" 236c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 246c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughesnamespace art { 256c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 26a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass IndirectReferenceTableTest : public CommonRuntimeTest {}; 276c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 2863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogersstatic void CheckDump(IndirectReferenceTable* irt, size_t num_objects, size_t num_unique) 29bdf7f1c3ab65ccb70f62db5ab31dba060632d458Andreas Gampe REQUIRES_SHARED(Locks::mutator_lock_) { 3063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 3163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers irt->Dump(oss); 3263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers if (num_objects == 0) { 3363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(oss.str().find("java.lang.Object"), std::string::npos) << oss.str(); 3463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } else if (num_objects == 1) { 3563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("1 of java.lang.Object"), std::string::npos) << oss.str(); 3663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } else { 3763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find(StringPrintf("%zd of java.lang.Object (%zd unique instances)", 3863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers num_objects, num_unique)), 3963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::string::npos) 4063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers << "\n Expected number of objects: " << num_objects 4163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers << "\n Expected unique objects: " << num_unique << "\n" 4263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers << oss.str(); 4363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 4463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers} 4563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 466c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott HughesTEST_F(IndirectReferenceTableTest, BasicTest) { 47369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe // This will lead to error messages in the log. 48369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe ScopedLogSeverity sls(LogSeverity::FATAL); 49369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe 5000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 516c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes static const size_t kTableMax = 20; 52da0a69edb24122d3d35ce1483c5ab94de919d714Richard Uhler std::string error_msg; 53da0a69edb24122d3d35ce1483c5ab94de919d714Richard Uhler IndirectReferenceTable irt(kTableMax, kGlobal, &error_msg); 54da0a69edb24122d3d35ce1483c5ab94de919d714Richard Uhler ASSERT_TRUE(irt.IsValid()) << error_msg; 556c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 569837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* c = class_linker_->FindSystemClass(soa.Self(), "Ljava/lang/Object;"); 5728bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier StackHandleScope<4> hs(soa.Self()); 58c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers ASSERT_TRUE(c != nullptr); 5928bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier Handle<mirror::Object> obj0 = hs.NewHandle(c->AllocObject(soa.Self())); 6028bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier ASSERT_TRUE(obj0.Get() != nullptr); 6128bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier Handle<mirror::Object> obj1 = hs.NewHandle(c->AllocObject(soa.Self())); 6228bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier ASSERT_TRUE(obj1.Get() != nullptr); 6328bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier Handle<mirror::Object> obj2 = hs.NewHandle(c->AllocObject(soa.Self())); 6428bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier ASSERT_TRUE(obj2.Get() != nullptr); 6528bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier Handle<mirror::Object> obj3 = hs.NewHandle(c->AllocObject(soa.Self())); 6628bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier ASSERT_TRUE(obj3.Get() != nullptr); 676c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 686c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes const uint32_t cookie = IRT_FIRST_SEGMENT; 696c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 7063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 7163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 726c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes IndirectRef iref0 = (IndirectRef) 0x11110; 736c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes EXPECT_FALSE(irt.Remove(cookie, iref0)) << "unexpectedly successful removal"; 746c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 756c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Add three, check, remove in the order in which they were added. 7628bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref0 = irt.Add(cookie, obj0.Get()); 77c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref0 != nullptr); 7863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 7928bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier IndirectRef iref1 = irt.Add(cookie, obj1.Get()); 80c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref1 != nullptr); 8163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 2, 2); 8228bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier IndirectRef iref2 = irt.Add(cookie, obj2.Get()); 83c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref2 != nullptr); 8463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 3, 3); 856c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 8628bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier EXPECT_OBJ_PTR_EQ(obj0.Get(), irt.Get(iref0)); 8728bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier EXPECT_OBJ_PTR_EQ(obj1.Get(), irt.Get(iref1)); 8828bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier EXPECT_OBJ_PTR_EQ(obj2.Get(), irt.Get(iref2)); 896c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 906c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes EXPECT_TRUE(irt.Remove(cookie, iref0)); 9163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 2, 2); 926c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes EXPECT_TRUE(irt.Remove(cookie, iref1)); 9363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 946c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes EXPECT_TRUE(irt.Remove(cookie, iref2)); 9563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 966c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 976c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Table should be empty now. 986c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes EXPECT_EQ(0U, irt.Capacity()); 996c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1006c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Get invalid entry (off the end of the list). 101c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(irt.Get(iref0) == nullptr); 1026c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1036c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Add three, remove in the opposite order. 10428bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref0 = irt.Add(cookie, obj0.Get()); 105c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref0 != nullptr); 10628bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref1 = irt.Add(cookie, obj1.Get()); 107c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref1 != nullptr); 10828bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref2 = irt.Add(cookie, obj2.Get()); 109c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref2 != nullptr); 11063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 3, 3); 1116c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1126c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref2)); 11363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 2, 2); 1146c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref1)); 11563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 1166c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref0)); 11763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 1186c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1196c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Table should be empty now. 1206c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(0U, irt.Capacity()); 1216c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1226c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Add three, remove middle / middle / bottom / top. (Second attempt 1236c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // to remove middle should fail.) 12428bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref0 = irt.Add(cookie, obj0.Get()); 125c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref0 != nullptr); 12628bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref1 = irt.Add(cookie, obj1.Get()); 127c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref1 != nullptr); 12828bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref2 = irt.Add(cookie, obj2.Get()); 129c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref2 != nullptr); 13063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 3, 3); 1316c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1326c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(3U, irt.Capacity()); 1336c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1346c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref1)); 13563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 2, 2); 1366c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_FALSE(irt.Remove(cookie, iref1)); 13763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 2, 2); 1386c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1396c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Get invalid entry (from hole). 140c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(irt.Get(iref1) == nullptr); 1416c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1426c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref2)); 14363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 1446c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref0)); 14563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 1466c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1476c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Table should be empty now. 1486c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(0U, irt.Capacity()); 1496c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1506c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Add four entries. Remove #1, add new entry, verify that table size 1516c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // is still 4 (i.e. holes are getting filled). Remove #1 and #3, verify 1526c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // that we delete one and don't hole-compact the other. 15328bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref0 = irt.Add(cookie, obj0.Get()); 154c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref0 != nullptr); 15528bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref1 = irt.Add(cookie, obj1.Get()); 156c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref1 != nullptr); 15728bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref2 = irt.Add(cookie, obj2.Get()); 158c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref2 != nullptr); 15928bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier IndirectRef iref3 = irt.Add(cookie, obj3.Get()); 160c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref3 != nullptr); 16163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 4, 4); 1626c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1636c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref1)); 16463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 3, 3); 1656c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 16628bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref1 = irt.Add(cookie, obj1.Get()); 167c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref1 != nullptr); 1686c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1696c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(4U, irt.Capacity()) << "hole not filled"; 17063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 4, 4); 1716c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1726c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref1)); 17363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 3, 3); 1746c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref3)); 17563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 2, 2); 1766c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1776c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(3U, irt.Capacity()) << "should be 3 after two deletions"; 1786c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1796c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref2)); 18063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 1816c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref0)); 18263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 1836c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1846c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(0U, irt.Capacity()) << "not empty after split remove"; 1856c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 1866c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Add an entry, remove it, add a new entry, and try to use the original 1876c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // iref. They have the same slot number but are for different objects. 1886c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // With the extended checks in place, this should fail. 18928bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref0 = irt.Add(cookie, obj0.Get()); 190c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref0 != nullptr); 19163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 1926c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref0)); 19363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 19428bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref1 = irt.Add(cookie, obj1.Get()); 195c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref1 != nullptr); 19663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 1976c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_FALSE(irt.Remove(cookie, iref0)) << "mismatched del succeeded"; 19863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 1996c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref1)) << "switched del failed"; 2006c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(0U, irt.Capacity()) << "switching del not empty"; 20163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 2026c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 2036c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Same as above, but with the same object. A more rigorous checker 2046c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // (e.g. with slot serialization) will catch this. 20528bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref0 = irt.Add(cookie, obj0.Get()); 206c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref0 != nullptr); 20763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 2086c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref0)); 20963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 21028bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref1 = irt.Add(cookie, obj0.Get()); 211c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref1 != nullptr); 21263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 2136c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes if (iref0 != iref1) { 2146c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Try 0, should not work. 2156c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_FALSE(irt.Remove(cookie, iref0)) << "temporal del succeeded"; 2166c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes } 2176c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref1)) << "temporal cleanup failed"; 2186c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(0U, irt.Capacity()) << "temporal del not empty"; 21963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 2206c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 2212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // null isn't a valid iref. 222c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers ASSERT_TRUE(irt.Get(nullptr) == nullptr); 2236c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 2246c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Stale lookup. 22528bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref0 = irt.Add(cookie, obj0.Get()); 226c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(iref0 != nullptr); 22763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 1, 1); 2286c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref0)); 229c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers EXPECT_TRUE(irt.Get(iref0) == nullptr) << "stale lookup succeeded"; 23063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 2316c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 2326c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Test table resizing. 2336c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // These ones fit... 234a8e3b8622565089ff7eb86363a18214b9b2b7da8Andreas Gampe static const size_t kTableInitial = kTableMax / 2; 2356c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes IndirectRef manyRefs[kTableInitial]; 2366c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes for (size_t i = 0; i < kTableInitial; i++) { 23728bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier manyRefs[i] = irt.Add(cookie, obj0.Get()); 238c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers ASSERT_TRUE(manyRefs[i] != nullptr) << "Failed adding " << i; 23963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, i + 1, 1); 2406c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes } 2416c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // ...this one causes overflow. 24228bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier iref0 = irt.Add(cookie, obj0.Get()); 243c0542af3e2170143ba40d89136e284997e16bf64Ian Rogers ASSERT_TRUE(iref0 != nullptr); 2446c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(kTableInitial + 1, irt.Capacity()); 24563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, kTableInitial + 1, 1); 2466c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 2476c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes for (size_t i = 0; i < kTableInitial; i++) { 2486c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, manyRefs[i])) << "failed removing " << i; 24963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, kTableInitial - i, 1); 2506c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes } 2516c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes // Because of removal order, should have 11 entries, 10 of them holes. 2526c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(kTableInitial + 1, irt.Capacity()); 2536c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 2546c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_TRUE(irt.Remove(cookie, iref0)) << "multi-remove final failed"; 2556c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 2566c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes ASSERT_EQ(0U, irt.Capacity()) << "multi-del not empty"; 25763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers CheckDump(&irt, 0, 0); 2586c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes} 2596c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes 2606c1a394b47c85c8d1723fc3b156a3b1b0b29a757Elliott Hughes} // namespace art 261