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 
29 namespace art {
30 
31 class ClassLinker;
32 class CompilerCallbacks;
33 class DexFile;
34 class JavaVMExt;
35 class Runtime;
36 typedef std::vector<std::pair<std::string, const void*>> RuntimeOptions;
37 
38 class ScratchFile {
39  public:
40   ScratchFile();
41 
42   ScratchFile(const ScratchFile& other, const char* suffix);
43 
44   explicit ScratchFile(File* file);
45 
46   ~ScratchFile();
47 
GetFilename()48   const std::string& GetFilename() const {
49     return filename_;
50   }
51 
GetFile()52   File* GetFile() const {
53     return file_.get();
54   }
55 
56   int GetFd() const;
57 
58   void Close();
59   void Unlink();
60 
61  private:
62   std::string filename_;
63   std::unique_ptr<File> file_;
64 };
65 
66 class CommonRuntimeTest : public testing::Test {
67  public:
68   static void SetUpAndroidRoot();
69 
70   // Note: setting up ANDROID_DATA may create a temporary directory. If this is used in a
71   // non-derived class, be sure to also call the corresponding tear-down below.
72   static void SetUpAndroidData(std::string& android_data);
73 
74   static void TearDownAndroidData(const std::string& android_data, bool fail_on_error);
75 
76   CommonRuntimeTest();
77   ~CommonRuntimeTest();
78 
79  protected:
IsHost()80   static bool IsHost() {
81     return !kIsTargetBuild;
82   }
83 
84   const DexFile* LoadExpectSingleDexFile(const char* location);
85 
86   virtual void SetUp();
87 
88   // Allow subclases such as CommonCompilerTest to add extra options.
SetUpRuntimeOptions(RuntimeOptions * options)89   virtual void SetUpRuntimeOptions(RuntimeOptions* options) {}
90 
91   void ClearDirectory(const char* dirpath);
92 
93   virtual void TearDown();
94 
95   // Gets the path of the libcore dex file.
96   std::string GetLibCoreDexFileName();
97 
98   // Gets the path of the specified dex file for host or target.
99   std::string GetDexFileName(const std::string& jar_prefix);
100 
101   std::string GetTestAndroidRoot();
102 
103   std::vector<const DexFile*> OpenTestDexFiles(const char* name)
104       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
105 
106   const DexFile* OpenTestDexFile(const char* name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
107 
108   jobject LoadDex(const char* dex_name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
109 
110   std::string android_data_;
111   std::string dalvik_cache_;
112   const DexFile* java_lang_dex_file_;  // owned by runtime_
113   std::vector<const DexFile*> boot_class_path_;
114   std::unique_ptr<Runtime> runtime_;
115   // Owned by the runtime
116   ClassLinker* class_linker_;
117 
118  private:
119   std::unique_ptr<CompilerCallbacks> callbacks_;
120   std::vector<const DexFile*> opened_dex_files_;
121 };
122 
123 // Sets a CheckJni abort hook to catch failures. Note that this will cause CheckJNI to carry on
124 // rather than aborting, so be careful!
125 class CheckJniAbortCatcher {
126  public:
127   CheckJniAbortCatcher();
128 
129   ~CheckJniAbortCatcher();
130 
131   void Check(const char* expected_text);
132 
133  private:
134   static void Hook(void* data, const std::string& reason);
135 
136   JavaVMExt* vm_;
137   std::string actual_;
138 
139   DISALLOW_COPY_AND_ASSIGN(CheckJniAbortCatcher);
140 };
141 
142 // TODO: These tests were disabled for portable when we went to having
143 // MCLinker link LLVM ELF output because we no longer just have code
144 // blobs in memory. We'll need to dlopen to load and relocate
145 // temporary output to resurrect these tests.
146 #define TEST_DISABLED_FOR_PORTABLE() \
147   if (kUsePortableCompiler) { \
148     printf("WARNING: TEST DISABLED FOR PORTABLE\n"); \
149     return; \
150   }
151 
152 // TODO: When heap reference poisoning works with the compiler, get rid of this.
153 #define TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING() \
154   if (kPoisonHeapReferences) { \
155     printf("WARNING: TEST DISABLED FOR HEAP REFERENCE POISONING\n"); \
156     return; \
157   }
158 
159 #define TEST_DISABLED_FOR_MIPS() \
160   if (kRuntimeISA == kMips || kRuntimeISA == kMips64) { \
161     printf("WARNING: TEST DISABLED FOR MIPS\n"); \
162     return; \
163   }
164 
165 }  // namespace art
166 
167 namespace std {
168 
169 // TODO: isn't gtest supposed to be able to print STL types for itself?
170 template <typename T>
171 std::ostream& operator<<(std::ostream& os, const std::vector<T>& rhs);
172 
173 }  // namespace std
174 
175 #endif  // ART_RUNTIME_COMMON_RUNTIME_TEST_H_
176