136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle/*
236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle * Copyright (C) 2017 The Android Open Source Project
336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle *
436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle * Licensed under the Apache License, Version 2.0 (the "License");
536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle * you may not use this file except in compliance with the License.
636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle * You may obtain a copy of the License at
736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle *
836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle *      http://www.apache.org/licenses/LICENSE-2.0
936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle *
1036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle * Unless required by applicable law or agreed to in writing, software
1136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle * distributed under the License is distributed on an "AS IS" BASIS,
1236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle * See the License for the specific language governing permissions and
1436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle * limitations under the License.
1536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle */
1636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
1736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle#include <gtest/gtest.h>
1836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
1936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle#include "arch/instruction_set.h"
2036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle#include "compiler_filter.h"
2136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle#include "dexopt_test.h"
2236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
2336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravlenamespace art {
2436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
2536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravleclass DexoptAnalyzerTest : public DexoptTest {
2636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle protected:
2736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string GetDexoptAnalyzerCmd() {
2836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    std::string file_path = GetTestAndroidRoot();
2936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    file_path += "/bin/dexoptanalyzer";
3036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    if (kIsDebugBuild) {
3136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      file_path += "d";
3236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    }
3336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    EXPECT_TRUE(OS::FileExists(file_path.c_str())) << file_path << " should be a valid file path";
3436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    return file_path;
3536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  }
3636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
3736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  int Analyze(const std::string& dex_file,
3836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle              CompilerFilter::Filter compiler_filter,
3936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle              bool assume_profile_changed) {
4036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    std::string dexoptanalyzer_cmd = GetDexoptAnalyzerCmd();
4136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    std::vector<std::string> argv_str;
4236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    argv_str.push_back(dexoptanalyzer_cmd);
4336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    argv_str.push_back("--dex-file=" + dex_file);
4436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    argv_str.push_back("--isa=" + std::string(GetInstructionSetString(kRuntimeISA)));
4536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    argv_str.push_back("--compiler-filter=" + CompilerFilter::NameOfFilter(compiler_filter));
4636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    if (assume_profile_changed) {
4736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      argv_str.push_back("--assume-profile-changed");
4836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    }
4936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    argv_str.push_back("--image=" + GetImageLocation());
5036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    argv_str.push_back("--android-data=" + android_data_);
5136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
5236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    std::string error;
5336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    return ExecAndReturnCode(argv_str, &error);
5436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  }
5536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
5636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  int DexoptanalyzerToOatFileAssistant(int dexoptanalyzerResult) {
5736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    switch (dexoptanalyzerResult) {
5836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      case 0: return OatFileAssistant::kNoDexOptNeeded;
5936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      case 1: return OatFileAssistant::kDex2OatFromScratch;
6036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      case 2: return OatFileAssistant::kDex2OatForBootImage;
6136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      case 3: return OatFileAssistant::kDex2OatForFilter;
6236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      case 4: return OatFileAssistant::kDex2OatForRelocation;
6336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      case 5: return -OatFileAssistant::kDex2OatForBootImage;
6436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      case 6: return -OatFileAssistant::kDex2OatForFilter;
6536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      case 7: return -OatFileAssistant::kDex2OatForRelocation;
6636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle      default: return dexoptanalyzerResult;
6736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    }
6836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  }
6936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
7036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // Verify that the output of dexoptanalyzer for the given arguments is the same
7136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // as the output of OatFileAssistant::GetDexOptNeeded.
7236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  void Verify(const std::string& dex_file,
7336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle              CompilerFilter::Filter compiler_filter,
74cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera              bool assume_profile_changed = false,
75cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera              bool downgrade = false) {
7636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    int dexoptanalyzerResult = Analyze(dex_file, compiler_filter, assume_profile_changed);
7736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    dexoptanalyzerResult = DexoptanalyzerToOatFileAssistant(dexoptanalyzerResult);
7836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    OatFileAssistant oat_file_assistant(dex_file.c_str(), kRuntimeISA, /*load_executable*/ false);
7936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    int assistantResult = oat_file_assistant.GetDexOptNeeded(
80cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera        compiler_filter, assume_profile_changed, downgrade);
8136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle    EXPECT_EQ(assistantResult, dexoptanalyzerResult);
8236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  }
8336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle};
8436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
8536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// The tests below exercise the same test case from oat_file_assistant_test.cc.
8636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
8736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a DEX file, but no OAT file for it.
8836eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, DexNoOat) {
8936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/DexNoOat.jar";
9036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
9136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
9236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
9349cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kExtract);
9449cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kQuicken);
9536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeedProfile);
9636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
9736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
9836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a DEX file and up-to-date OAT file for it.
9936eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, OatUpToDate) {
10036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/OatUpToDate.jar";
10136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
10236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GenerateOatForTest(dex_location.c_str(), CompilerFilter::kSpeed);
10336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
10436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
10549cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kQuicken);
10649cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kExtract);
10736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kEverything);
10836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
10936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
11036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a DEX file and speed-profile OAT file for it.
11136eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, ProfileOatUpToDate) {
11236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/ProfileOatUpToDate.jar";
11336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
11436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GenerateOatForTest(dex_location.c_str(), CompilerFilter::kSpeedProfile);
11536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
11636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeedProfile, false);
11749cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kQuicken, false);
11836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeedProfile, true);
11949cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kQuicken, true);
12036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
12136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
122cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham AjmeraTEST_F(DexoptAnalyzerTest, Downgrade) {
123cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera  std::string dex_location = GetScratchDir() + "/Downgrade.jar";
124cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera  Copy(GetDexSrc1(), dex_location);
125cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera  GenerateOatForTest(dex_location.c_str(), CompilerFilter::kQuicken);
126cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera
127cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera  Verify(dex_location, CompilerFilter::kSpeedProfile, false, true);
128cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera  Verify(dex_location, CompilerFilter::kQuicken, false, true);
129cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera  Verify(dex_location, CompilerFilter::kVerify, false, true);
130cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera}
131cf3d122a9234414b7cd2aab340d1450f3e9da213Shubham Ajmera
13236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a MultiDEX file and up-to-date OAT file for it.
13336eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, MultiDexOatUpToDate) {
13436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/MultiDexOatUpToDate.jar";
13536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetMultiDexSrc1(), dex_location);
13636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GenerateOatForTest(dex_location.c_str(), CompilerFilter::kSpeed);
13736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
13836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed, false);
13936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
14036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
14136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a MultiDEX file where the secondary dex file is out of date.
14236eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, MultiDexSecondaryOutOfDate) {
14336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/MultiDexSecondaryOutOfDate.jar";
14436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
14536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // Compile code for GetMultiDexSrc1.
14636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetMultiDexSrc1(), dex_location);
14736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GenerateOatForTest(dex_location.c_str(), CompilerFilter::kSpeed);
14836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
14936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // Now overwrite the dex file with GetMultiDexSrc2 so the secondary checksum
15036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // is out of date.
15136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetMultiDexSrc2(), dex_location);
15236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
15336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed, false);
15436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
15536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
15636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
15736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a DEX file and an OAT file out of date with respect to the
15836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// dex checksum.
15936eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, OatDexOutOfDate) {
16036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/OatDexOutOfDate.jar";
16136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
16236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // We create a dex, generate an oat for it, then overwrite the dex with a
16336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // different dex to make the oat out of date.
16436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
16536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GenerateOatForTest(dex_location.c_str(), CompilerFilter::kSpeed);
16636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc2(), dex_location);
16736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
16849cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kExtract);
16936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
17036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
17136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
17236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a DEX file and an OAT file out of date with respect to the
17336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// boot image.
17436eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, OatImageOutOfDate) {
17536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/OatImageOutOfDate.jar";
17636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
17736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
17836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GenerateOatForTest(dex_location.c_str(),
17936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle                     CompilerFilter::kSpeed,
18036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle                     /*relocate*/true,
18136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle                     /*pic*/false,
18236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle                     /*with_alternate_image*/true);
18336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
18449cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kExtract);
18549cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kQuicken);
18636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
18736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
18836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
18936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a DEX file and a verify-at-runtime OAT file out of date with
19036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// respect to the boot image.
19136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// It shouldn't matter that the OAT file is out of date, because it is
19236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// verify-at-runtime.
19336eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, OatVerifyAtRuntimeImageOutOfDate) {
19436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/OatVerifyAtRuntimeImageOutOfDate.jar";
19536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
19636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
19736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GenerateOatForTest(dex_location.c_str(),
19849cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray                     CompilerFilter::kExtract,
19936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle                     /*relocate*/true,
20036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle                     /*pic*/false,
20136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle                     /*with_alternate_image*/true);
20236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
20349cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kExtract);
20449cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kQuicken);
20536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
20636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
20736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a DEX file and an ODEX file, but no OAT file.
20836eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, DexOdexNoOat) {
20936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/DexOdexNoOat.jar";
21036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string odex_location = GetOdexDir() + "/DexOdexNoOat.odex";
21136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
21236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
21336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GenerateOdexForTest(dex_location, odex_location, CompilerFilter::kSpeed);
21436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
21549cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kExtract);
21636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
21736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
21836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
21936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a stripped DEX file and a PIC ODEX file, but no OAT file.
22036eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, StrippedDexOdexNoOat) {
22136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/StrippedDexOdexNoOat.jar";
22236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string odex_location = GetOdexDir() + "/StrippedDexOdexNoOat.odex";
22336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
22436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
22536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GeneratePicOdexForTest(dex_location, odex_location, CompilerFilter::kSpeed);
22636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
22736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // Strip the dex file
22836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetStrippedDexSrc1(), dex_location);
22936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
23036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
23136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
23236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
23336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a stripped DEX file, a PIC ODEX file, and an out-of-date OAT file.
23436eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, StrippedDexOdexOat) {
23536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/StrippedDexOdexOat.jar";
23636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string odex_location = GetOdexDir() + "/StrippedDexOdexOat.odex";
23736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
23836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // Create the oat file from a different dex file so it looks out of date.
23936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc2(), dex_location);
24036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GenerateOatForTest(dex_location.c_str(), CompilerFilter::kSpeed);
24136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
24236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // Create the odex file
24336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
24436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GeneratePicOdexForTest(dex_location, odex_location, CompilerFilter::kSpeed);
24536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
24636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // Strip the dex file.
24736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetStrippedDexSrc1(), dex_location);
24836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
24949cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kExtract);
25036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
25136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kEverything);
25236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
25336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
25436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a stripped (or resource-only) DEX file, no ODEX file and no
25536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// OAT file. Expect: The status is kNoDexOptNeeded.
25636eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, ResourceOnlyDex) {
25736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/ResourceOnlyDex.jar";
25836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
25936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetStrippedDexSrc1(), dex_location);
26036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
26136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
26249cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kExtract);
26349cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kQuicken);
26436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
26536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
26636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a DEX file, an ODEX file and an OAT file, where the ODEX and
26736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// OAT files both have patch delta of 0.
26836eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, OdexOatOverlap) {
26936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/OdexOatOverlap.jar";
27036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string odex_location = GetOdexDir() + "/OdexOatOverlap.odex";
27136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string oat_location = GetOdexDir() + "/OdexOatOverlap.oat";
27236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
27336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
27436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GenerateOdexForTest(dex_location, odex_location, CompilerFilter::kSpeed);
27536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
27636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // Create the oat file by copying the odex so they are located in the same
27736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  // place in memory.
27836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(odex_location, oat_location);
27936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
28036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
28136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
28236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
28336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a DEX file and a PIC ODEX file, but no OAT file.
28436eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, DexPicOdexNoOat) {
28536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/DexPicOdexNoOat.jar";
28636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string odex_location = GetOdexDir() + "/DexPicOdexNoOat.odex";
28736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
28836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
28936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  GeneratePicOdexForTest(dex_location, odex_location, CompilerFilter::kSpeed);
29036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
29136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
29236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kEverything);
29336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
29436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
29536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: We have a DEX file and a VerifyAtRuntime ODEX file, but no OAT file..
29636eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, DexVerifyAtRuntimeOdexNoOat) {
29736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/DexVerifyAtRuntimeOdexNoOat.jar";
29836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string odex_location = GetOdexDir() + "/DexVerifyAtRuntimeOdexNoOat.odex";
29936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
30036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
30149cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  GenerateOdexForTest(dex_location, odex_location, CompilerFilter::kExtract);
30236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
30349cda06d5bf003f588ba7839bbf89d606237dfa7Nicolas Geoffray  Verify(dex_location, CompilerFilter::kExtract);
30436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
30536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
30636eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
30736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: Non-standard extension for dex file.
30836eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, LongDexExtension) {
30936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = GetScratchDir() + "/LongDexExtension.jarx";
31036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Copy(GetDexSrc1(), dex_location);
31136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
31236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
31336eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
31436eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
31536eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle// Case: Very short, non-existent Dex location.
31636eb313c805713c1367e5b9d73897ade1c24174bCalin JuravleTEST_F(DexoptAnalyzerTest, ShortDexLocation) {
31736eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  std::string dex_location = "/xx";
31836eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
31936eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle  Verify(dex_location, CompilerFilter::kSpeed);
32036eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}
32136eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle
32236eb313c805713c1367e5b9d73897ade1c24174bCalin Juravle}  // namespace art
323