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