common_runtime_test.h revision 68d8b42ddec39ec0174162d90d4abaa004d1983e
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 25e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "base/mutex.h" 26e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "globals.h" 27a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "os.h" 28a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 29a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromnamespace art { 30a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 31e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersclass ClassLinker; 32e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersclass CompilerCallbacks; 33e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersclass DexFile; 34e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersclass JavaVMExt; 35e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersclass Runtime; 36e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogerstypedef std::vector<std::pair<std::string, const void*>> RuntimeOptions; 37e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers 38a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass ScratchFile { 39a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom public: 40e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers ScratchFile(); 419583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray 42e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers ScratchFile(const ScratchFile& other, const char* suffix); 43a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 44e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers explicit ScratchFile(File* file); 450e12bdc49744eb6d5c29b9611a8dbe10bac4cd53Brian Carlstrom 46e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers ~ScratchFile(); 47a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 48a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom const std::string& GetFilename() const { 49a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom return filename_; 50a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 51a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 52a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom File* GetFile() const { 53a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom return file_.get(); 54a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 55a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 56e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers int GetFd() const; 57a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 58e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers void Unlink(); 590e12bdc49744eb6d5c29b9611a8dbe10bac4cd53Brian Carlstrom 60a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom private: 61a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom std::string filename_; 62700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<File> file_; 63a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom}; 64a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 65a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass CommonRuntimeTest : public testing::Test { 66a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom public: 677747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe static void SetUpAndroidRoot(); 687747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe 697747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe // Note: setting up ANDROID_DATA may create a temporary directory. If this is used in a 707747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe // non-derived class, be sure to also call the corresponding tear-down below. 717747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe static void SetUpAndroidData(std::string& android_data); 727747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe 737747c8de402f64e3009ca3bcccebddbb70f617eeAndreas Gampe static void TearDownAndroidData(const std::string& android_data, bool fail_on_error); 74e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers 75e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers CommonRuntimeTest(); 76e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers ~CommonRuntimeTest(); 77a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 78a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom protected: 79a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom static bool IsHost() { 80a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom return !kIsTargetBuild; 81a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 82a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 83e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers const DexFile* LoadExpectSingleDexFile(const char* location); 84833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 85e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers virtual void SetUp(); 86a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 87a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom // Allow subclases such as CommonCompilerTest to add extra options. 88e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers virtual void SetUpRuntimeOptions(RuntimeOptions* options) {} 89a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 90a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light void ClearDirectory(const char* dirpath); 91a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 92e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers virtual void TearDown(); 93a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 94f0a3f09c3d54646166a55c05a6b39c7dd504129cJeff Hao // Gets the path of the libcore dex file. 95e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers std::string GetLibCoreDexFileName(); 96a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 97f0a3f09c3d54646166a55c05a6b39c7dd504129cJeff Hao // Gets the path of the specified dex file for host or target. 98e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers std::string GetDexFileName(const std::string& jar_prefix); 99e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers 100f0a3f09c3d54646166a55c05a6b39c7dd504129cJeff Hao // Gets the path of the libcore oat file. 101f0a3f09c3d54646166a55c05a6b39c7dd504129cJeff Hao std::string GetLibCoreOatFileName(); 102f0a3f09c3d54646166a55c05a6b39c7dd504129cJeff Hao 103f0a3f09c3d54646166a55c05a6b39c7dd504129cJeff Hao // Gets the path of the specified oat file for host or target. 104f0a3f09c3d54646166a55c05a6b39c7dd504129cJeff Hao std::string GetOatFileName(const std::string& oat_prefix); 105f0a3f09c3d54646166a55c05a6b39c7dd504129cJeff Hao 106e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers std::string GetTestAndroidRoot(); 107a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 108833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::vector<const DexFile*> OpenTestDexFiles(const char* name) 109e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 110833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 111e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers const DexFile* OpenTestDexFile(const char* name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 112a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 113e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers jobject LoadDex(const char* dex_name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 114a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 115a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom std::string android_data_; 116a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom std::string dalvik_cache_; 117a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom const DexFile* java_lang_dex_file_; // owned by runtime_ 118a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom std::vector<const DexFile*> boot_class_path_; 119700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<Runtime> runtime_; 120a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom // Owned by the runtime 121a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom ClassLinker* class_linker_; 122a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 123a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom private: 124e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers std::unique_ptr<CompilerCallbacks> callbacks_; 125a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom std::vector<const DexFile*> opened_dex_files_; 126a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom}; 127a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 128a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom// Sets a CheckJni abort hook to catch failures. Note that this will cause CheckJNI to carry on 129a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom// rather than aborting, so be careful! 130a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass CheckJniAbortCatcher { 131a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom public: 132e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers CheckJniAbortCatcher(); 133a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 134e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers ~CheckJniAbortCatcher(); 135a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 136e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers void Check(const char* expected_text); 137a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 138a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom private: 139e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers static void Hook(void* data, const std::string& reason); 140a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 14168d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers JavaVMExt* const vm_; 142a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom std::string actual_; 143a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 144a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom DISALLOW_COPY_AND_ASSIGN(CheckJniAbortCatcher); 145a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom}; 146a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 147a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom// TODO: These tests were disabled for portable when we went to having 148a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom// MCLinker link LLVM ELF output because we no longer just have code 149a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom// blobs in memory. We'll need to dlopen to load and relocate 150a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom// temporary output to resurrect these tests. 151a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#define TEST_DISABLED_FOR_PORTABLE() \ 152a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom if (kUsePortableCompiler) { \ 153a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom printf("WARNING: TEST DISABLED FOR PORTABLE\n"); \ 154a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom return; \ 155a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 156a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 15705b15d6e896af7ae0075a690ea791e2e92ecf443Hiroshi Yamauchi// TODO: When heap reference poisoning works with the compiler, get rid of this. 15805b15d6e896af7ae0075a690ea791e2e92ecf443Hiroshi Yamauchi#define TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING() \ 15905b15d6e896af7ae0075a690ea791e2e92ecf443Hiroshi Yamauchi if (kPoisonHeapReferences) { \ 16005b15d6e896af7ae0075a690ea791e2e92ecf443Hiroshi Yamauchi printf("WARNING: TEST DISABLED FOR HEAP REFERENCE POISONING\n"); \ 16105b15d6e896af7ae0075a690ea791e2e92ecf443Hiroshi Yamauchi return; \ 16205b15d6e896af7ae0075a690ea791e2e92ecf443Hiroshi Yamauchi } 16305b15d6e896af7ae0075a690ea791e2e92ecf443Hiroshi Yamauchi 164a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom} // namespace art 165a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 166a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromnamespace std { 167a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 168a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom// TODO: isn't gtest supposed to be able to print STL types for itself? 169a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromtemplate <typename T> 170e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogersstd::ostream& operator<<(std::ostream& os, const std::vector<T>& rhs); 171a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 172a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom} // namespace std 173a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 174a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#endif // ART_RUNTIME_COMMON_RUNTIME_TEST_H_ 175