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