reference_table_test.cc revision e401d146407d61eeb99f8d6176b2ac13c4df1e33
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 "reference_table.h" 1811e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 19a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "common_runtime_test.h" 208db4c882a8d1996852163ebec966c8b4eb1e00dfAndreas Gampe#include "mirror/array-inl.h" 21e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "mirror/class-inl.h" 22e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "mirror/string.h" 23e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "primitive.h" 24e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "scoped_thread_state_change.h" 25e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "thread-inl.h" 26a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 2711e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughesnamespace art { 2811e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 29a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass ReferenceTableTest : public CommonRuntimeTest {}; 3011e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 3111e45077acba2e757799a00b3be9d63fec36a7ccElliott HughesTEST_F(ReferenceTableTest, Basics) { 3200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Object* o1 = mirror::String::AllocFromModifiedUtf8(soa.Self(), "hello"); 3411e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 3563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers ReferenceTable rt("test", 0, 11); 3663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 3763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Check dumping the empty table. 3863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers { 3963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 4063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Dump(oss); 4163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("(empty)"), std::string::npos) << oss.str(); 4263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(0U, rt.Size()); 4363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 4463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // Check removal of all nullss in a empty table is a no-op. 462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier rt.Remove(nullptr); 4711e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes EXPECT_EQ(0U, rt.Size()); 4863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 4963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Check removal of all o1 in a empty table is a no-op. 5011e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes rt.Remove(o1); 5111e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes EXPECT_EQ(0U, rt.Size()); 5263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 5363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Add o1 and check we have 1 element and can dump. 5463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers { 5563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Add(o1); 5663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(1U, rt.Size()); 5763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 5863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Dump(oss); 5963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("1 of java.lang.String"), std::string::npos) << oss.str(); 6063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(oss.str().find("short[]"), std::string::npos) << oss.str(); 6163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 6263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 6363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Add a second object 10 times and check dumping is sane. 642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Object* o2 = mirror::ShortArray::Alloc(soa.Self(), 0); 6563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers for (size_t i = 0; i < 10; ++i) { 6663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Add(o2); 6763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(i + 2, rt.Size()); 6863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 6963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Dump(oss); 7063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find(StringPrintf("Last %zd entries (of %zd):", 7163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers i + 2 > 10 ? 10 : i + 2, 7263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers i + 2)), 7363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::string::npos) << oss.str(); 7463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("1 of java.lang.String"), std::string::npos) << oss.str(); 7563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers if (i == 0) { 7663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("1 of short[]"), std::string::npos) << oss.str(); 7763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } else { 7863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find(StringPrintf("%zd of short[] (1 unique instances)", i + 1)), 7963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::string::npos) << oss.str(); 8063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 8163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 8263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 8363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Remove o1 (first element). 8463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers { 8563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Remove(o1); 8663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(10U, rt.Size()); 8763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 8863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Dump(oss); 8963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(oss.str().find("java.lang.String"), std::string::npos) << oss.str(); 9063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 9163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers 9263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers // Remove o2 ten times. 9363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers for (size_t i = 0; i < 10; ++i) { 9463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Remove(o2); 9563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(9 - i, rt.Size()); 9663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::ostringstream oss; 9763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers rt.Dump(oss); 9863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers if (i == 9) { 9963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_EQ(oss.str().find("short[]"), std::string::npos) << oss.str(); 10063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } else if (i == 8) { 10163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find("1 of short[]"), std::string::npos) << oss.str(); 10263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } else { 10363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers EXPECT_NE(oss.str().find(StringPrintf("%zd of short[] (1 unique instances)", 10 - i - 1)), 10463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers std::string::npos) << oss.str(); 10563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 10663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers } 10711e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes} 10811e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 10911e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes} // namespace art 110