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