reference_table_test.cc revision e63db27db913f1a88e2095a1ee8239b2bb9124e8
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"
20e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "mirror/array.h"
21e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "mirror/string.h"
22e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "scoped_thread_state_change.h"
23e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "thread-inl.h"
24a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
2511e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughesnamespace art {
2611e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes
27a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass ReferenceTableTest : public CommonRuntimeTest {};
2811e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes
2911e45077acba2e757799a00b3be9d63fec36a7ccElliott HughesTEST_F(ReferenceTableTest, Basics) {
3000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Object* o1 = mirror::String::AllocFromModifiedUtf8(soa.Self(), "hello");
3211e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes
3363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  ReferenceTable rt("test", 0, 11);
3463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers
3563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  // Check dumping the empty table.
3663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  {
3763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    std::ostringstream oss;
3863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    rt.Dump(oss);
3963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_NE(oss.str().find("(empty)"), std::string::npos) << oss.str();
4063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_EQ(0U, rt.Size());
4163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  }
4263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers
4363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  // Check removal of all NULLs in a empty table is a no-op.
4411e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes  rt.Remove(NULL);
4511e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes  EXPECT_EQ(0U, rt.Size());
4663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers
4763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  // Check removal of all o1 in a empty table is a no-op.
4811e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes  rt.Remove(o1);
4911e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes  EXPECT_EQ(0U, rt.Size());
5063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers
5163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  // Add o1 and check we have 1 element and can dump.
5263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  {
5363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    rt.Add(o1);
5463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_EQ(1U, rt.Size());
5563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    std::ostringstream oss;
5663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    rt.Dump(oss);
5763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_NE(oss.str().find("1 of java.lang.String"), std::string::npos) << oss.str();
5863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_EQ(oss.str().find("short[]"), std::string::npos) << oss.str();
5963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  }
6063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers
6163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  // Add a second object 10 times and check dumping is sane.
622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Object* o2 = mirror::ShortArray::Alloc(soa.Self(), 0);
6363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  for (size_t i = 0; i < 10; ++i) {
6463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    rt.Add(o2);
6563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_EQ(i + 2, rt.Size());
6663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    std::ostringstream oss;
6763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    rt.Dump(oss);
6863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_NE(oss.str().find(StringPrintf("Last %zd entries (of %zd):",
6963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers                                          i + 2 > 10 ? 10 : i + 2,
7063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers                                          i + 2)),
7163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers              std::string::npos) << oss.str();
7263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_NE(oss.str().find("1 of java.lang.String"), std::string::npos) << oss.str();
7363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    if (i == 0) {
7463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers      EXPECT_NE(oss.str().find("1 of short[]"), std::string::npos) << oss.str();
7563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    } else {
7663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers      EXPECT_NE(oss.str().find(StringPrintf("%zd of short[] (1 unique instances)", i + 1)),
7763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers                std::string::npos) << oss.str();
7863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    }
7963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  }
8063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers
8163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  // Remove o1 (first element).
8263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  {
8363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    rt.Remove(o1);
8463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_EQ(10U, rt.Size());
8563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    std::ostringstream oss;
8663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    rt.Dump(oss);
8763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_EQ(oss.str().find("java.lang.String"), std::string::npos) << oss.str();
8863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  }
8963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers
9063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  // Remove o2 ten times.
9163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  for (size_t i = 0; i < 10; ++i) {
9263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    rt.Remove(o2);
9363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    EXPECT_EQ(9 - i, rt.Size());
9463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    std::ostringstream oss;
9563818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    rt.Dump(oss);
9663818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    if (i == 9) {
9763818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers      EXPECT_EQ(oss.str().find("short[]"), std::string::npos) << oss.str();
9863818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    } else if (i == 8) {
9963818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers      EXPECT_NE(oss.str().find("1 of short[]"), std::string::npos) << oss.str();
10063818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    } else {
10163818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers      EXPECT_NE(oss.str().find(StringPrintf("%zd of short[] (1 unique instances)", 10 - i - 1)),
10263818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers                std::string::npos) << oss.str();
10363818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers    }
10463818dc8b06af4a1e65c41b453f1a42166c22728Ian Rogers  }
10511e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes}
10611e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes
10711e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes}  // namespace art
108