common_runtime_test.h revision f896965072343a2d6ad64d46a61112b10b3645dd
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ART_RUNTIME_COMMON_RUNTIME_TEST_H_ 18#define ART_RUNTIME_COMMON_RUNTIME_TEST_H_ 19 20#include <gtest/gtest.h> 21#include <jni.h> 22 23#include <string> 24 25#include "base/mutex.h" 26#include "globals.h" 27#include "os.h" 28 29namespace art { 30 31class ClassLinker; 32class CompilerCallbacks; 33class DexFile; 34class JavaVMExt; 35class Runtime; 36typedef std::vector<std::pair<std::string, const void*>> RuntimeOptions; 37 38class ScratchFile { 39 public: 40 ScratchFile(); 41 42 ScratchFile(const ScratchFile& other, const char* suffix); 43 44 explicit ScratchFile(File* file); 45 46 ~ScratchFile(); 47 48 const std::string& GetFilename() const { 49 return filename_; 50 } 51 52 File* GetFile() const { 53 return file_.get(); 54 } 55 56 int GetFd() const; 57 58 void Unlink(); 59 60 private: 61 std::string filename_; 62 std::unique_ptr<File> file_; 63}; 64 65class CommonRuntimeTest : public testing::Test { 66 public: 67 static void SetUpAndroidRoot(); 68 69 // Note: setting up ANDROID_DATA may create a temporary directory. If this is used in a 70 // non-derived class, be sure to also call the corresponding tear-down below. 71 static void SetUpAndroidData(std::string& android_data); 72 73 static void TearDownAndroidData(const std::string& android_data, bool fail_on_error); 74 75 CommonRuntimeTest(); 76 ~CommonRuntimeTest(); 77 78 protected: 79 static bool IsHost() { 80 return !kIsTargetBuild; 81 } 82 83 const DexFile* LoadExpectSingleDexFile(const char* location); 84 85 virtual void SetUp(); 86 87 // Allow subclases such as CommonCompilerTest to add extra options. 88 virtual void SetUpRuntimeOptions(RuntimeOptions* options) {} 89 90 void ClearDirectory(const char* dirpath); 91 92 virtual void TearDown(); 93 94 std::string GetLibCoreDexFileName(); 95 96 std::string GetDexFileName(const std::string& jar_prefix); 97 98 std::string GetTestAndroidRoot(); 99 100 std::vector<const DexFile*> OpenTestDexFiles(const char* name) 101 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 102 103 const DexFile* OpenTestDexFile(const char* name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 104 105 jobject LoadDex(const char* dex_name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 106 107 std::string android_data_; 108 std::string dalvik_cache_; 109 const DexFile* java_lang_dex_file_; // owned by runtime_ 110 std::vector<const DexFile*> boot_class_path_; 111 std::unique_ptr<Runtime> runtime_; 112 // Owned by the runtime 113 ClassLinker* class_linker_; 114 115 private: 116 std::unique_ptr<CompilerCallbacks> callbacks_; 117 std::vector<const DexFile*> opened_dex_files_; 118}; 119 120// Sets a CheckJni abort hook to catch failures. Note that this will cause CheckJNI to carry on 121// rather than aborting, so be careful! 122class CheckJniAbortCatcher { 123 public: 124 CheckJniAbortCatcher(); 125 126 ~CheckJniAbortCatcher(); 127 128 void Check(const char* expected_text); 129 130 private: 131 static void Hook(void* data, const std::string& reason); 132 133 JavaVMExt* vm_; 134 std::string actual_; 135 136 DISALLOW_COPY_AND_ASSIGN(CheckJniAbortCatcher); 137}; 138 139// TODO: These tests were disabled for portable when we went to having 140// MCLinker link LLVM ELF output because we no longer just have code 141// blobs in memory. We'll need to dlopen to load and relocate 142// temporary output to resurrect these tests. 143#define TEST_DISABLED_FOR_PORTABLE() \ 144 if (kUsePortableCompiler) { \ 145 printf("WARNING: TEST DISABLED FOR PORTABLE\n"); \ 146 return; \ 147 } 148 149// TODO: When heap reference poisoning works with the compiler, get rid of this. 150#define TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING() \ 151 if (kPoisonHeapReferences) { \ 152 printf("WARNING: TEST DISABLED FOR HEAP REFERENCE POISONING\n"); \ 153 return; \ 154 } 155 156} // namespace art 157 158namespace std { 159 160// TODO: isn't gtest supposed to be able to print STL types for itself? 161template <typename T> 162std::ostream& operator<<(std::ostream& os, const std::vector<T>& rhs); 163 164} // namespace std 165 166#endif // ART_RUNTIME_COMMON_RUNTIME_TEST_H_ 167