1a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom/* 2a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * Copyright (C) 2011 The Android Open Source Project 3a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * 4a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 5a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * you may not use this file except in compliance with the License. 6a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * You may obtain a copy of the License at 7a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * 8a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 9a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * 10a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 11a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 12a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * See the License for the specific language governing permissions and 14a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom * limitations under the License. 15a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom */ 16a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 17a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#ifndef ART_RUNTIME_COMMON_RUNTIME_TEST_H_ 18a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#define ART_RUNTIME_COMMON_RUNTIME_TEST_H_ 19a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 20e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include <gtest/gtest.h> 21e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include <jni.h> 22e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers 23e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include <string> 24e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers 253e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky#include "arch/instruction_set.h" 26e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "base/mutex.h" 27e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "globals.h" 28a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "os.h" 29a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 30a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromnamespace art { 31a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 32e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersclass ClassLinker; 33e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersclass CompilerCallbacks; 34e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersclass DexFile; 35e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersclass JavaVMExt; 36e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersclass Runtime; 37e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogerstypedef std::vector<std::pair<std::string, const void*>> RuntimeOptions; 38e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers 39a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass ScratchFile { 40a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom public: 41e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers ScratchFile(); 429583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray 43e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers ScratchFile(const ScratchFile& other, const char* suffix); 44a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 45e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers explicit ScratchFile(File* file); 460e12bdc49744eb6d5c29b9611a8dbe10bac4cd53Brian Carlstrom 47e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers ~ScratchFile(); 48a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 49a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom const std::string& GetFilename() const { 50a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom return filename_; 51a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 52a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 53a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom File* GetFile() const { 54a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom return file_.get(); 55a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 56a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 57e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers int GetFd() const; 58a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 59e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe void Close(); 60e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers void Unlink(); 610e12bdc49744eb6d5c29b9611a8dbe10bac4cd53Brian Carlstrom 62a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom private: 63a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom std::string filename_; 64700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<File> file_; 65a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom}; 66a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 6791c911690868a1a109ec6d52666def5682b026e1Mathieu Chartierclass CommonRuntimeTestImpl { 68a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom public: 6991c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier CommonRuntimeTestImpl(); 7091c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier virtual ~CommonRuntimeTestImpl(); 717747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe static void SetUpAndroidRoot(); 727747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe 737747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe // Note: setting up ANDROID_DATA may create a temporary directory. If this is used in a 747747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe // non-derived class, be sure to also call the corresponding tear-down below. 757747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe static void SetUpAndroidData(std::string& android_data); 767747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe 777747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe static void TearDownAndroidData(const std::string& android_data, bool fail_on_error); 78e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers 79d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath // Gets the paths of the libcore dex files. 80d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath static std::vector<std::string> GetLibCoreDexFileNames(); 81aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin 823e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky // Returns bin directory which contains host's prebuild tools. 833e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky static std::string GetAndroidHostToolsDir(); 843e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky 8591c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier // Returns bin directory wahich contains target's prebuild tools. 863e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky static std::string GetAndroidTargetToolsDir(InstructionSet isa); 873e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky 88a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom protected: 8991c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier // Allow subclases such as CommonCompilerTest to add extra options. 9091c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier virtual void SetUpRuntimeOptions(RuntimeOptions* options ATTRIBUTE_UNUSED) {} 9191c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 9291c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier // Called before the runtime is created. 9391c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier virtual void PreRuntimeCreate() {} 9491c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 9591c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier // Called after the runtime is created. 9691c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier virtual void PostRuntimeCreate() {} 9791c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 98a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom static bool IsHost() { 99a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom return !kIsTargetBuild; 100a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 101a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 1023774335b08076117d6950cd472cdd59a167470b5Igor Murashkin // File location to core.art, e.g. $ANDROID_HOST_OUT/system/framework/core.art 1033774335b08076117d6950cd472cdd59a167470b5Igor Murashkin static std::string GetCoreArtLocation(); 1043774335b08076117d6950cd472cdd59a167470b5Igor Murashkin 1053774335b08076117d6950cd472cdd59a167470b5Igor Murashkin // File location to core.oat, e.g. $ANDROID_HOST_OUT/system/framework/core.oat 1063774335b08076117d6950cd472cdd59a167470b5Igor Murashkin static std::string GetCoreOatLocation(); 1073774335b08076117d6950cd472cdd59a167470b5Igor Murashkin 108fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler std::unique_ptr<const DexFile> LoadExpectSingleDexFile(const char* location); 109833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 110a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light void ClearDirectory(const char* dirpath); 111a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 112e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers std::string GetTestAndroidRoot(); 113a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 11466d874d96d5699bb090c59f47a5a528956ca053eRichard Uhler std::string GetTestDexFileName(const char* name); 11566d874d96d5699bb090c59f47a5a528956ca053eRichard Uhler 116fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler std::vector<std::unique_ptr<const DexFile>> OpenTestDexFiles(const char* name) 11790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 118833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 119fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler std::unique_ptr<const DexFile> OpenTestDexFile(const char* name) 12090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 121a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 12290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier jobject LoadDex(const char* dex_name) SHARED_REQUIRES(Locks::mutator_lock_); 123a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 124a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom std::string android_data_; 125a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom std::string dalvik_cache_; 126fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler 127700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<Runtime> runtime_; 128fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler 129fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler // The class_linker_, java_lang_dex_file_, and boot_class_path_ are all 130fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler // owned by the runtime. 131a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom ClassLinker* class_linker_; 132fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler const DexFile* java_lang_dex_file_; 133fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler std::vector<const DexFile*> boot_class_path_; 134a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 13581c6f8db12b203878a7d72444ead2bc7cf5c47adAndreas Gampe // Get the dex files from a PathClassLoader. This in order of the dex elements and their dex 13681c6f8db12b203878a7d72444ead2bc7cf5c47adAndreas Gampe // arrays. 13781c6f8db12b203878a7d72444ead2bc7cf5c47adAndreas Gampe std::vector<const DexFile*> GetDexFiles(jobject jclass_loader); 13881c6f8db12b203878a7d72444ead2bc7cf5c47adAndreas Gampe 13981c6f8db12b203878a7d72444ead2bc7cf5c47adAndreas Gampe // Get the first dex file from a PathClassLoader. Will abort if it is null. 14081c6f8db12b203878a7d72444ead2bc7cf5c47adAndreas Gampe const DexFile* GetFirstDexFile(jobject jclass_loader); 14181c6f8db12b203878a7d72444ead2bc7cf5c47adAndreas Gampe 142bb9c6b1c55e9e2308b4f5892a398a8837231fdbdAndreas Gampe std::unique_ptr<CompilerCallbacks> callbacks_; 143bb9c6b1c55e9e2308b4f5892a398a8837231fdbdAndreas Gampe 14491c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier void SetUp(); 14591c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 14691c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier void TearDown(); 14791c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 14891c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier void FinalizeSetup(); 14991c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 150a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom private: 1513774335b08076117d6950cd472cdd59a167470b5Igor Murashkin static std::string GetCoreFileLocation(const char* suffix); 1523774335b08076117d6950cd472cdd59a167470b5Igor Murashkin 153fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler std::vector<std::unique_ptr<const DexFile>> loaded_dex_files_; 154a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom}; 155a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 15691c911690868a1a109ec6d52666def5682b026e1Mathieu Chartiertemplate <typename TestType> 15791c911690868a1a109ec6d52666def5682b026e1Mathieu Chartierclass CommonRuntimeTestBase : public TestType, public CommonRuntimeTestImpl { 15891c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier public: 15991c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier CommonRuntimeTestBase() {} 16091c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier virtual ~CommonRuntimeTestBase() {} 16191c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 16291c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier protected: 16391c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier virtual void SetUp() { 16491c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier CommonRuntimeTestImpl::SetUp(); 16591c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier } 16691c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 16791c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier virtual void TearDown() { 16891c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier CommonRuntimeTestImpl::TearDown(); 16991c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier } 17091c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 17191c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier // Called to finish up runtime creation and filling test fields. By default runs root 17291c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier // initializers, initialize well-known classes, and creates the heap thread pool. 17391c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier virtual void FinalizeSetup() { 17491c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier CommonRuntimeTestImpl::FinalizeSetup(); 17591c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier } 17691c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier}; 17791c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 17891c911690868a1a109ec6d52666def5682b026e1Mathieu Chartierusing CommonRuntimeTest = CommonRuntimeTestBase<testing::Test>; 17991c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 18091c911690868a1a109ec6d52666def5682b026e1Mathieu Chartiertemplate <typename Param> 18191c911690868a1a109ec6d52666def5682b026e1Mathieu Chartierusing CommonRuntimeTestWithParam = CommonRuntimeTestBase<testing::TestWithParam<Param>>; 18291c911690868a1a109ec6d52666def5682b026e1Mathieu Chartier 183a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom// Sets a CheckJni abort hook to catch failures. Note that this will cause CheckJNI to carry on 184a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom// rather than aborting, so be careful! 185a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass CheckJniAbortCatcher { 186a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom public: 187e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers CheckJniAbortCatcher(); 188a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 189e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers ~CheckJniAbortCatcher(); 190a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 191e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers void Check(const char* expected_text); 192a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 193a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom private: 194e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers static void Hook(void* data, const std::string& reason); 195a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 19668d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers JavaVMExt* const vm_; 197a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom std::string actual_; 198a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 199a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom DISALLOW_COPY_AND_ASSIGN(CheckJniAbortCatcher); 200a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom}; 201a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 20254accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray#define TEST_DISABLED_FOR_MIPS() \ 203d90957fbe6f41c66d5494ae5db1f60d2434d4c84Douglas Leung if (kRuntimeISA == kMips) { \ 20454accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray printf("WARNING: TEST DISABLED FOR MIPS\n"); \ 20554accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray return; \ 20654accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray } 20754accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 208a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom} // namespace art 209a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 210a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromnamespace std { 211a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 212a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom// TODO: isn't gtest supposed to be able to print STL types for itself? 213a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromtemplate <typename T> 214e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersstd::ostream& operator<<(std::ostream& os, const std::vector<T>& rhs); 215a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 216a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom} // namespace std 217a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 218a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#endif // ART_RUNTIME_COMMON_RUNTIME_TEST_H_ 219