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