dex_file_test.cc revision 5b8e6e36e96d6d1921dd356fa46191d1e6a18082
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 */
161fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
17578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_file.h"
181fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
19700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <memory>
20700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers
21e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "base/stl_util.h"
22e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "base/unix_file/fd_file.h"
23a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "common_runtime_test.h"
24e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "os.h"
25e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "scoped_thread_state_change.h"
26e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "thread-inl.h"
2790a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes
281fb8620309a4e94d11879aabc33364acfa733904Carl Shapironamespace art {
291fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
30a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass DexFileTest : public CommonRuntimeTest {};
319f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom
329f30b38d74990286ce27c3a45368f73dbe3638f0Brian CarlstromTEST_F(DexFileTest, Open) {
3333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  ScopedObjectAccess soa(Thread::Current());
344d6850c47515fe2a4f9de923befb6287bb863c8cElliott Hughes  const DexFile* dex(OpenTestDexFile("Nested"));
354d6850c47515fe2a4f9de923befb6287bb863c8cElliott Hughes  ASSERT_TRUE(dex != NULL);
367e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom}
377e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
38a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromstatic const byte kBase64Map[256] = {
39a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
40a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
41a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
42a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255,  62, 255, 255, 255,  63,
43a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  52,  53,  54,  55,  56,  57,  58,  59,  60,  61, 255, 255,
44a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 254, 255, 255, 255,   0,   1,   2,   3,   4,   5,   6,
45a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,  // NOLINT
46a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom   19,  20,  21,  22,  23,  24,  25, 255, 255, 255, 255, 255,  // NOLINT
47a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,
48a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom   37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  // NOLINT
49a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom   49,  50,  51, 255, 255, 255, 255, 255, 255, 255, 255, 255,  // NOLINT
50a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
51a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
52a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
53a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
54a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
55a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
56a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
57a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
58a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
59a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
60a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  255, 255, 255, 255
61a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom};
62a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
63a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromstatic inline byte* DecodeBase64(const char* src, size_t* dst_size) {
64a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  std::vector<byte> tmp;
65a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  uint32_t t = 0, y = 0;
66a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  int g = 3;
67a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  for (size_t i = 0; src[i] != '\0'; ++i) {
68a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    byte c = kBase64Map[src[i] & 0xFF];
69a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    if (c == 255) continue;
70a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    // the final = symbols are read and used to trim the remaining bytes
71a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    if (c == 254) {
72a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      c = 0;
73a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      // prevent g < 0 which would potentially allow an overflow later
74a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      if (--g < 0) {
75a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom        *dst_size = 0;
76a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom        return nullptr;
77a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      }
78a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    } else if (g != 3) {
79a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      // we only allow = to be at the end
80a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      *dst_size = 0;
81a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      return nullptr;
82a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    }
83a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    t = (t << 6) | c;
84a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    if (++y == 4) {
85a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      tmp.push_back((t >> 16) & 255);
86a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      if (g > 1) {
87a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom        tmp.push_back((t >> 8) & 255);
88a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      }
89a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      if (g > 2) {
90a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom        tmp.push_back(t & 255);
91a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      }
92a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      y = t = 0;
93a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    }
94a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
95a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  if (y != 0) {
96a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    *dst_size = 0;
97a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    return nullptr;
98a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
99700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers  std::unique_ptr<byte[]> dst(new byte[tmp.size()]);
100a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  if (dst_size != nullptr) {
101a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    *dst_size = tmp.size();
102a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  } else {
103a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    *dst_size = 0;
104a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
105a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  std::copy(tmp.begin(), tmp.end(), dst.get());
106a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  return dst.release();
107a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom}
108a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
1099f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom// Although this is the same content logically as the Nested test dex,
1109f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom// the DexFileHeader test is sensitive to subtle changes in the
1119f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom// contents due to the checksum etc, so we embed the exact input here.
1129f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom//
1139f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom// class Nested {
1149f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom//     class Inner {
1159f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom//     }
1169f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom// }
1179f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstromstatic const char kRawDex[] =
1189f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
1199f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
1209f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
1219f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
1229f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
1239f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
1249f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
1259f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
1269f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
1279f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
1289f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
1299f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
1309f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
1319f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
1329f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
1339f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom  "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
1349f30b38d74990286ce27c3a45368f73dbe3638f0Brian Carlstrom
13533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogersstatic const DexFile* OpenDexFileBase64(const char* base64,
1368d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                        const char* location) {
13733e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  // decode base64
13833e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  CHECK(base64 != NULL);
13933e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  size_t length;
140700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers  std::unique_ptr<byte[]> dex_bytes(DecodeBase64(base64, &length));
14133e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  CHECK(dex_bytes.get() != NULL);
14233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers
14333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  // write to provided file
144700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers  std::unique_ptr<File> file(OS::CreateEmptyFile(location));
14533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  CHECK(file.get() != NULL);
14633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  if (!file->WriteFully(dex_bytes.get(), length)) {
14733e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers    PLOG(FATAL) << "Failed to write base64 as dex file";
14833e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  }
1499433ec60b325b708b9fa87e699ab4a6565741494Andreas Gampe  if (file->FlushCloseOrErase() != 0) {
1509433ec60b325b708b9fa87e699ab4a6565741494Andreas Gampe    PLOG(FATAL) << "Could not flush and close test file.";
1519433ec60b325b708b9fa87e699ab4a6565741494Andreas Gampe  }
15233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  file.reset();
15333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers
15433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  // read dex file
15533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  ScopedObjectAccess soa(Thread::Current());
1568d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  std::string error_msg;
157833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  std::vector<const DexFile*> tmp;
158833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  bool success = DexFile::Open(location, location, &error_msg, &tmp);
159833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  CHECK(success) << error_msg;
160833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  EXPECT_EQ(1U, tmp.size());
161833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  const DexFile* dex_file = tmp[0];
162e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrom  EXPECT_EQ(PROT_READ, dex_file->GetPermissions());
163e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrom  EXPECT_TRUE(dex_file->IsReadOnly());
16433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  return dex_file;
16533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers}
16633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers
1679f30b38d74990286ce27c3a45368f73dbe3638f0Brian CarlstromTEST_F(DexFileTest, Header) {
16833f741eefef8f8012f6c190b39355f2e0430d535Brian Carlstrom  ScratchFile tmp;
169700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers  std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex, tmp.GetFilename().c_str()));
17090a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes  ASSERT_TRUE(raw.get() != NULL);
1717e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
172f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  const DexFile::Header& header = raw->GetHeader();
1737e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // TODO: header.magic_
1747e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(0x00d87910U, header.checksum_);
1757e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // TODO: header.signature_
1767e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(904U, header.file_size_);
1777e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(112U, header.header_size_);
1787e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(0U, header.link_size_);
1797e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(0U, header.link_off_);
1807e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(15U, header.string_ids_size_);
1817e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(112U, header.string_ids_off_);
1827e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(7U, header.type_ids_size_);
1837e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(172U, header.type_ids_off_);
1847e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(2U, header.proto_ids_size_);
1857e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(200U, header.proto_ids_off_);
1867e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(1U, header.field_ids_size_);
1877e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(224U, header.field_ids_off_);
1887e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(3U, header.method_ids_size_);
1897e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(232U, header.method_ids_off_);
1907e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(2U, header.class_defs_size_);
1917e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(256U, header.class_defs_off_);
1927e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(584U, header.data_size_);
1937e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(320U, header.data_off_);
1945b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom
1955b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  EXPECT_EQ(header.checksum_, raw->GetLocationChecksum());
1965b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom}
1975b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom
1985b332c89fa3fdd7dc184b22c2587d28af304d019Brian CarlstromTEST_F(DexFileTest, GetLocationChecksum) {
19933e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  ScopedObjectAccess soa(Thread::Current());
2005b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  const DexFile* raw(OpenTestDexFile("Main"));
2015b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  EXPECT_NE(raw->GetHeader().checksum_, raw->GetLocationChecksum());
2025b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom}
2035b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom
2045b332c89fa3fdd7dc184b22c2587d28af304d019Brian CarlstromTEST_F(DexFileTest, GetChecksum) {
2055b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  uint32_t checksum;
20633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  ScopedObjectAccess soa(Thread::Current());
2078d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  std::string error_msg;
2085b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak  EXPECT_TRUE(DexFile::GetChecksum(GetLibCoreDexFileNames()[0].c_str(), &checksum, &error_msg))
2098d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      << error_msg;
2105b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  EXPECT_EQ(java_lang_dex_file_->GetLocationChecksum(), checksum);
2117e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom}
2127e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
2139f30b38d74990286ce27c3a45368f73dbe3638f0Brian CarlstromTEST_F(DexFileTest, ClassDefs) {
21433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  ScopedObjectAccess soa(Thread::Current());
2154d6850c47515fe2a4f9de923befb6287bb863c8cElliott Hughes  const DexFile* raw(OpenTestDexFile("Nested"));
2164d6850c47515fe2a4f9de923befb6287bb863c8cElliott Hughes  ASSERT_TRUE(raw != NULL);
2177e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_EQ(2U, raw->NumClassDefs());
218578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
219f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  const DexFile::ClassDef& c0 = raw->GetClassDef(0);
2207e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_STREQ("LNested$Inner;", raw->GetClassDescriptor(c0));
221578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
222f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  const DexFile::ClassDef& c1 = raw->GetClassDef(1);
2237e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  EXPECT_STREQ("LNested;", raw->GetClassDescriptor(c1));
2241fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro}
2251fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
226d91d6d6a80748f277fd938a412211e5af28913b1Ian RogersTEST_F(DexFileTest, GetMethodSignature) {
22733e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  ScopedObjectAccess soa(Thread::Current());
228d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  const DexFile* raw(OpenTestDexFile("GetMethodSignature"));
2294d6850c47515fe2a4f9de923befb6287bb863c8cElliott Hughes  ASSERT_TRUE(raw != NULL);
230419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  EXPECT_EQ(1U, raw->NumClassDefs());
231419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
232419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  const DexFile::ClassDef& class_def = raw->GetClassDef(0);
233d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  ASSERT_STREQ("LGetMethodSignature;", raw->GetClassDescriptor(class_def));
234419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
235419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  const byte* class_data = raw->GetClassData(class_def);
236419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  ASSERT_TRUE(class_data != NULL);
2374d6850c47515fe2a4f9de923befb6287bb863c8cElliott Hughes  ClassDataItemIterator it(*raw, class_data);
238419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
2390571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  EXPECT_EQ(1u, it.NumDirectMethods());
240419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
2410571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Check the signature for the static initializer.
242419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  {
2430571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    ASSERT_EQ(1U, it.NumDirectMethods());
2440571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex());
2450571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const char* name = raw->StringDataByIdx(method_id.name_idx_);
246419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro    ASSERT_STREQ("<init>", name);
247d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    std::string signature(raw->GetMethodSignature(method_id).ToString());
2480571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    ASSERT_EQ("()V", signature);
249419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  }
250419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
251419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  // Check both virtual methods.
2520571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  ASSERT_EQ(2U, it.NumVirtualMethods());
253419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  {
2540571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    it.Next();
2550571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex());
256419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
2570571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const char* name = raw->StringDataByIdx(method_id.name_idx_);
258419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro    ASSERT_STREQ("m1", name);
259419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
260d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    std::string signature(raw->GetMethodSignature(method_id).ToString());
2610571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    ASSERT_EQ("(IDJLjava/lang/Object;)Ljava/lang/Float;", signature);
262419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  }
263419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
264419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  {
2650571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    it.Next();
2660571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex());
267419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
2680571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const char* name = raw->StringDataByIdx(method_id.name_idx_);
269419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro    ASSERT_STREQ("m2", name);
270419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
271d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    std::string signature(raw->GetMethodSignature(method_id).ToString());
272d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    ASSERT_EQ("(ZSC)LGetMethodSignature;", signature);
2730571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
2740571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
2750571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
2760571d357843c53e042f370f5f2c2e9aa3fe803a9Ian RogersTEST_F(DexFileTest, FindStringId) {
27733e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  ScopedObjectAccess soa(Thread::Current());
278d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  const DexFile* raw(OpenTestDexFile("GetMethodSignature"));
2794d6850c47515fe2a4f9de923befb6287bb863c8cElliott Hughes  ASSERT_TRUE(raw != NULL);
2800571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  EXPECT_EQ(1U, raw->NumClassDefs());
2810571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
282d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  const char* strings[] = { "LGetMethodSignature;", "Ljava/lang/Float;", "Ljava/lang/Object;",
2830571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      "D", "I", "J", NULL };
2840571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  for (size_t i = 0; strings[i] != NULL; i++) {
2850571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const char* str = strings[i];
2860571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::StringId* str_id = raw->FindStringId(str);
2870571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const char* dex_str = raw->GetStringData(*str_id);
2880571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    EXPECT_STREQ(dex_str, str);
2890571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
2900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
2910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
2920571d357843c53e042f370f5f2c2e9aa3fe803a9Ian RogersTEST_F(DexFileTest, FindTypeId) {
2930571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  for (size_t i = 0; i < java_lang_dex_file_->NumTypeIds(); i++) {
2940571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const char* type_str = java_lang_dex_file_->StringByTypeIdx(i);
2950571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::StringId* type_str_id = java_lang_dex_file_->FindStringId(type_str);
2960571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    ASSERT_TRUE(type_str_id != NULL);
2970571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t type_str_idx = java_lang_dex_file_->GetIndexForStringId(*type_str_id);
2980571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::TypeId* type_id = java_lang_dex_file_->FindTypeId(type_str_idx);
2990571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    ASSERT_TRUE(type_id != NULL);
3000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    EXPECT_EQ(java_lang_dex_file_->GetIndexForTypeId(*type_id), i);
3010571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
3020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
3030571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
3040571d357843c53e042f370f5f2c2e9aa3fe803a9Ian RogersTEST_F(DexFileTest, FindProtoId) {
3050571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  for (size_t i = 0; i < java_lang_dex_file_->NumProtoIds(); i++) {
3060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::ProtoId& to_find = java_lang_dex_file_->GetProtoId(i);
3070571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::TypeList* to_find_tl = java_lang_dex_file_->GetProtoParameters(to_find);
3080571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    std::vector<uint16_t> to_find_types;
3090571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (to_find_tl != NULL) {
3100571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      for (size_t j = 0; j < to_find_tl->Size(); j++) {
3110571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        to_find_types.push_back(to_find_tl->GetTypeItem(j).type_idx_);
3120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      }
3130571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
3140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::ProtoId* found =
3150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        java_lang_dex_file_->FindProtoId(to_find.return_type_idx_, to_find_types);
3160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    ASSERT_TRUE(found != NULL);
3170571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    EXPECT_EQ(java_lang_dex_file_->GetIndexForProtoId(*found), i);
3180571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
3190571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
3200571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
3210571d357843c53e042f370f5f2c2e9aa3fe803a9Ian RogersTEST_F(DexFileTest, FindMethodId) {
3220571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  for (size_t i = 0; i < java_lang_dex_file_->NumMethodIds(); i++) {
3230571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::MethodId& to_find = java_lang_dex_file_->GetMethodId(i);
3240571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::TypeId& klass = java_lang_dex_file_->GetTypeId(to_find.class_idx_);
3250571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::StringId& name = java_lang_dex_file_->GetStringId(to_find.name_idx_);
3260571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::ProtoId& signature = java_lang_dex_file_->GetProtoId(to_find.proto_idx_);
3270571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::MethodId* found = java_lang_dex_file_->FindMethodId(klass, name, signature);
3280571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    ASSERT_TRUE(found != NULL) << "Didn't find method " << i << ": "
3290571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        << java_lang_dex_file_->StringByTypeIdx(to_find.class_idx_) << "."
3300571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        << java_lang_dex_file_->GetStringData(name)
331d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers        << java_lang_dex_file_->GetMethodSignature(to_find);
3320571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    EXPECT_EQ(java_lang_dex_file_->GetIndexForMethodId(*found), i);
333419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  }
334419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro}
335419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
3369b1a4f425711c26d0465d54a1cb95ec4a813322aIan RogersTEST_F(DexFileTest, FindFieldId) {
3379b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  for (size_t i = 0; i < java_lang_dex_file_->NumFieldIds(); i++) {
3389b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    const DexFile::FieldId& to_find = java_lang_dex_file_->GetFieldId(i);
3399b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    const DexFile::TypeId& klass = java_lang_dex_file_->GetTypeId(to_find.class_idx_);
3409b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    const DexFile::StringId& name = java_lang_dex_file_->GetStringId(to_find.name_idx_);
3419b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    const DexFile::TypeId& type = java_lang_dex_file_->GetTypeId(to_find.type_idx_);
3429b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    const DexFile::FieldId* found = java_lang_dex_file_->FindFieldId(klass, name, type);
3439b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    ASSERT_TRUE(found != NULL) << "Didn't find field " << i << ": "
3449b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers        << java_lang_dex_file_->StringByTypeIdx(to_find.type_idx_) << " "
3459b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers        << java_lang_dex_file_->StringByTypeIdx(to_find.class_idx_) << "."
3469b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers        << java_lang_dex_file_->GetStringData(name);
3479b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    EXPECT_EQ(java_lang_dex_file_->GetIndexForFieldId(*found), i);
3489b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  }
3499b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers}
3509b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers
3514e1d579d6401fef2dd57b16f8d406e33221a69d9Calin JuravleTEST_F(DexFileTest, GetMultiDexClassesDexName) {
3524e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  std::string dex_location_str = "/system/app/framework.jar";
3534e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  const char* dex_location = dex_location_str.c_str();
3544e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  ASSERT_EQ("/system/app/framework.jar", DexFile::GetMultiDexClassesDexName(0, dex_location));
3554e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  ASSERT_EQ("/system/app/framework.jar:classes2.dex", DexFile::GetMultiDexClassesDexName(1, dex_location));
3564e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  ASSERT_EQ("/system/app/framework.jar:classes101.dex", DexFile::GetMultiDexClassesDexName(100, dex_location));
3574e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle}
3584e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
3594e1d579d6401fef2dd57b16f8d406e33221a69d9Calin JuravleTEST_F(DexFileTest, GetDexCanonicalLocation) {
3604e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  ScratchFile file;
361be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko  UniqueCPtr<const char[]> dex_location_real(realpath(file.GetFilename().c_str(), nullptr));
362be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko  std::string dex_location(dex_location_real.get());
3634e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
364a06fff224fcc16da61e9e81c7e2cb85a8ca15471Calin Juravle  ASSERT_EQ(dex_location, DexFile::GetDexCanonicalLocation(dex_location.c_str()));
3654e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  std::string multidex_location = DexFile::GetMultiDexClassesDexName(1, dex_location.c_str());
3664e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  ASSERT_EQ(multidex_location, DexFile::GetDexCanonicalLocation(multidex_location.c_str()));
3674e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
3684e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  std::string dex_location_sym = dex_location + "symlink";
3694e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  ASSERT_EQ(0, symlink(dex_location.c_str(), dex_location_sym.c_str()));
3704e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
3714e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  ASSERT_EQ(dex_location, DexFile::GetDexCanonicalLocation(dex_location_sym.c_str()));
3724e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
3734e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  std::string multidex_location_sym = DexFile::GetMultiDexClassesDexName(1, dex_location_sym.c_str());
3744e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  ASSERT_EQ(multidex_location, DexFile::GetDexCanonicalLocation(multidex_location_sym.c_str()));
3754e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
3764e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  ASSERT_EQ(0, unlink(dex_location_sym.c_str()));
3774e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle}
3784e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
3791fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro}  // namespace art
380