reference_table_test.cc revision 63818dc8b06af4a1e65c41b453f1a42166c22728
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 1611e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 1711e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes#include "common_test.h" 1811e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 1911e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes#include "reference_table.h" 2011e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 2111e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughesnamespace art { 2211e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 23f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstromclass ReferenceTableTest : public CommonTest { 2411e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes}; 2511e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 2611e45077acba2e757799a00b3be9d63fec36a7ccElliott HughesTEST_F(ReferenceTableTest, Basics) { 2700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 28bfaadc83460726b049614a8616effbb03a247552Elliott Hughes Object* o1 = String::AllocFromModifiedUtf8("hello"); 2911e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 3063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers ReferenceTable rt("test", 0, 11); 3163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 3263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Check dumping the empty table. 3363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers { 3463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 3563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Dump(oss); 3663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("(empty)"), std::string::npos) << oss.str(); 3763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(0U, rt.Size()); 3863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 3963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 4063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Check removal of all NULLs in a empty table is a no-op. 4111e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes rt.Remove(NULL); 4211e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes EXPECT_EQ(0U, rt.Size()); 4363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 4463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Check removal of all o1 in a empty table is a no-op. 4511e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes rt.Remove(o1); 4611e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes EXPECT_EQ(0U, rt.Size()); 4763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 4863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Add o1 and check we have 1 element and can dump. 4963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers { 5063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Add(o1); 5163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(1U, rt.Size()); 5263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 5363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Dump(oss); 5463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("1 of java.lang.String"), std::string::npos) << oss.str(); 5563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(oss.str().find("short[]"), std::string::npos) << oss.str(); 5663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 5763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 5863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Add a second object 10 times and check dumping is sane. 5963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers Object* o2 = ShortArray::Alloc(0); 6063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers for (size_t i = 0; i < 10; ++i) { 6163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Add(o2); 6263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(i + 2, rt.Size()); 6363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 6463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Dump(oss); 6563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find(StringPrintf("Last %zd entries (of %zd):", 6663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers i + 2 > 10 ? 10 : i + 2, 6763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers i + 2)), 6863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::string::npos) << oss.str(); 6963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("1 of java.lang.String"), std::string::npos) << oss.str(); 7063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers if (i == 0) { 7163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("1 of short[]"), std::string::npos) << oss.str(); 7263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } else { 7363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find(StringPrintf("%zd of short[] (1 unique instances)", i + 1)), 7463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::string::npos) << oss.str(); 7563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 7663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 7763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 7863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Remove o1 (first element). 7963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers { 8063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Remove(o1); 8163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(10U, rt.Size()); 8263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 8363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Dump(oss); 8463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(oss.str().find("java.lang.String"), std::string::npos) << oss.str(); 8563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 8663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 8763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Remove o2 ten times. 8863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers for (size_t i = 0; i < 10; ++i) { 8963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Remove(o2); 9063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(9 - i, rt.Size()); 9163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 9263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Dump(oss); 9363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers if (i == 9) { 9463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(oss.str().find("short[]"), std::string::npos) << oss.str(); 9563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } else if (i == 8) { 9663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("1 of short[]"), std::string::npos) << oss.str(); 9763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } else { 9863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find(StringPrintf("%zd of short[] (1 unique instances)", 10 - i - 1)), 9963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::string::npos) << oss.str(); 10063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 10163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 10211e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes} 10311e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 10411e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes} // namespace art 105