xref: /aosp_15_r20/art/libartbase/base/common_art_test.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_LIBARTBASE_BASE_COMMON_ART_TEST_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_LIBARTBASE_BASE_COMMON_ART_TEST_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <sys/types.h>
21*795d594fSAndroid Build Coastguard Worker #include <sys/wait.h>
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker #include <functional>
24*795d594fSAndroid Build Coastguard Worker #include <string>
25*795d594fSAndroid Build Coastguard Worker #include <vector>
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker #include "android-base/logging.h"
28*795d594fSAndroid Build Coastguard Worker #include "android-base/properties.h"
29*795d594fSAndroid Build Coastguard Worker #include "android-base/scopeguard.h"
30*795d594fSAndroid Build Coastguard Worker #include "base/file_utils.h"
31*795d594fSAndroid Build Coastguard Worker #include "base/globals.h"
32*795d594fSAndroid Build Coastguard Worker #include "base/memory_tool.h"
33*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h"
34*795d594fSAndroid Build Coastguard Worker #include "base/os.h"
35*795d594fSAndroid Build Coastguard Worker #include "base/unix_file/fd_file.h"
36*795d594fSAndroid Build Coastguard Worker #include "dex/art_dex_file_loader.h"
37*795d594fSAndroid Build Coastguard Worker #include "dex/compact_dex_file.h"
38*795d594fSAndroid Build Coastguard Worker #include "gtest/gtest.h"
39*795d594fSAndroid Build Coastguard Worker 
40*795d594fSAndroid Build Coastguard Worker namespace art {
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker using LogSeverity = android::base::LogSeverity;
43*795d594fSAndroid Build Coastguard Worker using ScopedLogSeverity = android::base::ScopedLogSeverity;
44*795d594fSAndroid Build Coastguard Worker 
45*795d594fSAndroid Build Coastguard Worker class DexFile;
46*795d594fSAndroid Build Coastguard Worker 
47*795d594fSAndroid Build Coastguard Worker class ScratchDir {
48*795d594fSAndroid Build Coastguard Worker  public:
49*795d594fSAndroid Build Coastguard Worker   explicit ScratchDir(bool keep_files = false);
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker   ~ScratchDir();
52*795d594fSAndroid Build Coastguard Worker 
GetPath()53*795d594fSAndroid Build Coastguard Worker   const std::string& GetPath() const {
54*795d594fSAndroid Build Coastguard Worker     return path_;
55*795d594fSAndroid Build Coastguard Worker   }
56*795d594fSAndroid Build Coastguard Worker 
57*795d594fSAndroid Build Coastguard Worker  private:
58*795d594fSAndroid Build Coastguard Worker   std::string path_;
59*795d594fSAndroid Build Coastguard Worker   bool keep_files_;  // Useful for debugging.
60*795d594fSAndroid Build Coastguard Worker 
61*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScratchDir);
62*795d594fSAndroid Build Coastguard Worker };
63*795d594fSAndroid Build Coastguard Worker 
64*795d594fSAndroid Build Coastguard Worker class ScratchFile {
65*795d594fSAndroid Build Coastguard Worker  public:
66*795d594fSAndroid Build Coastguard Worker   ScratchFile();
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker   explicit ScratchFile(const std::string& filename);
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker   ScratchFile(const ScratchFile& other, const char* suffix);
71*795d594fSAndroid Build Coastguard Worker 
72*795d594fSAndroid Build Coastguard Worker   ScratchFile(ScratchFile&& other) noexcept;
73*795d594fSAndroid Build Coastguard Worker 
74*795d594fSAndroid Build Coastguard Worker   ScratchFile& operator=(ScratchFile&& other) noexcept;
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker   explicit ScratchFile(File* file);
77*795d594fSAndroid Build Coastguard Worker 
78*795d594fSAndroid Build Coastguard Worker   ~ScratchFile();
79*795d594fSAndroid Build Coastguard Worker 
GetFilename()80*795d594fSAndroid Build Coastguard Worker   const std::string& GetFilename() const {
81*795d594fSAndroid Build Coastguard Worker     return filename_;
82*795d594fSAndroid Build Coastguard Worker   }
83*795d594fSAndroid Build Coastguard Worker 
GetFile()84*795d594fSAndroid Build Coastguard Worker   File* GetFile() const {
85*795d594fSAndroid Build Coastguard Worker     return file_.get();
86*795d594fSAndroid Build Coastguard Worker   }
87*795d594fSAndroid Build Coastguard Worker 
88*795d594fSAndroid Build Coastguard Worker   int GetFd() const;
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker   void Close();
91*795d594fSAndroid Build Coastguard Worker   void Unlink();
92*795d594fSAndroid Build Coastguard Worker 
93*795d594fSAndroid Build Coastguard Worker  private:
94*795d594fSAndroid Build Coastguard Worker   std::string filename_;
95*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<File> file_;
96*795d594fSAndroid Build Coastguard Worker };
97*795d594fSAndroid Build Coastguard Worker 
98*795d594fSAndroid Build Coastguard Worker // Helper class that removes an environment variable whilst in scope.
99*795d594fSAndroid Build Coastguard Worker class ScopedUnsetEnvironmentVariable {
100*795d594fSAndroid Build Coastguard Worker  public:
ScopedUnsetEnvironmentVariable(const char * variable)101*795d594fSAndroid Build Coastguard Worker   explicit ScopedUnsetEnvironmentVariable(const char* variable)
102*795d594fSAndroid Build Coastguard Worker       : variable_{variable}, old_value_{GetOldValue(variable)} {
103*795d594fSAndroid Build Coastguard Worker     unsetenv(variable);
104*795d594fSAndroid Build Coastguard Worker   }
105*795d594fSAndroid Build Coastguard Worker 
~ScopedUnsetEnvironmentVariable()106*795d594fSAndroid Build Coastguard Worker   ~ScopedUnsetEnvironmentVariable() {
107*795d594fSAndroid Build Coastguard Worker     if (old_value_.has_value()) {
108*795d594fSAndroid Build Coastguard Worker       static constexpr int kReplace = 1;  // tidy-issue: replace argument has libc dependent name.
109*795d594fSAndroid Build Coastguard Worker       setenv(variable_, old_value_.value().c_str(), kReplace);
110*795d594fSAndroid Build Coastguard Worker     } else {
111*795d594fSAndroid Build Coastguard Worker       unsetenv(variable_);
112*795d594fSAndroid Build Coastguard Worker     }
113*795d594fSAndroid Build Coastguard Worker   }
114*795d594fSAndroid Build Coastguard Worker 
115*795d594fSAndroid Build Coastguard Worker  private:
GetOldValue(const char * variable)116*795d594fSAndroid Build Coastguard Worker   static std::optional<std::string> GetOldValue(const char* variable) {
117*795d594fSAndroid Build Coastguard Worker     const char* value = getenv(variable);
118*795d594fSAndroid Build Coastguard Worker     return value != nullptr ? std::optional<std::string>{value} : std::nullopt;
119*795d594fSAndroid Build Coastguard Worker   }
120*795d594fSAndroid Build Coastguard Worker 
121*795d594fSAndroid Build Coastguard Worker   const char* variable_;
122*795d594fSAndroid Build Coastguard Worker   std::optional<std::string> old_value_;
123*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScopedUnsetEnvironmentVariable);
124*795d594fSAndroid Build Coastguard Worker };
125*795d594fSAndroid Build Coastguard Worker 
126*795d594fSAndroid Build Coastguard Worker // Temporarily drops all root capabilities when the test is run as root. This is a noop otherwise.
127*795d594fSAndroid Build Coastguard Worker android::base::ScopeGuard<std::function<void()>> ScopedUnroot();
128*795d594fSAndroid Build Coastguard Worker 
129*795d594fSAndroid Build Coastguard Worker // Temporarily drops all permissions on a file/directory.
130*795d594fSAndroid Build Coastguard Worker android::base::ScopeGuard<std::function<void()>> ScopedInaccessible(const std::string& path);
131*795d594fSAndroid Build Coastguard Worker 
132*795d594fSAndroid Build Coastguard Worker class CommonArtTestImpl {
133*795d594fSAndroid Build Coastguard Worker  public:
134*795d594fSAndroid Build Coastguard Worker   CommonArtTestImpl() = default;
135*795d594fSAndroid Build Coastguard Worker   virtual ~CommonArtTestImpl() = default;
136*795d594fSAndroid Build Coastguard Worker 
137*795d594fSAndroid Build Coastguard Worker   // Set up ANDROID_BUILD_TOP, ANDROID_HOST_OUT, ANDROID_ROOT, ANDROID_I18N_ROOT,
138*795d594fSAndroid Build Coastguard Worker   // ANDROID_ART_ROOT, and ANDROID_TZDATA_ROOT environment variables using sensible defaults
139*795d594fSAndroid Build Coastguard Worker   // if not already set.
140*795d594fSAndroid Build Coastguard Worker   static void SetUpAndroidRootEnvVars();
141*795d594fSAndroid Build Coastguard Worker 
142*795d594fSAndroid Build Coastguard Worker   // Set up the ANDROID_DATA environment variable, creating the directory if required.
143*795d594fSAndroid Build Coastguard Worker   // Note: setting up ANDROID_DATA may create a temporary directory. If this is used in a
144*795d594fSAndroid Build Coastguard Worker   // non-derived class, be sure to also call the corresponding tear-down below.
145*795d594fSAndroid Build Coastguard Worker   static void SetUpAndroidDataDir(std::string& android_data);
146*795d594fSAndroid Build Coastguard Worker 
147*795d594fSAndroid Build Coastguard Worker   static void TearDownAndroidDataDir(const std::string& android_data, bool fail_on_error);
148*795d594fSAndroid Build Coastguard Worker 
149*795d594fSAndroid Build Coastguard Worker   static void ClearDirectory(const char* dirpath, bool recursive = true);
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker   // Get the names of the libcore modules.
152*795d594fSAndroid Build Coastguard Worker   virtual std::vector<std::string> GetLibCoreModuleNames() const;
153*795d594fSAndroid Build Coastguard Worker 
154*795d594fSAndroid Build Coastguard Worker   // Gets the paths of the libcore dex files for given modules.
155*795d594fSAndroid Build Coastguard Worker   std::vector<std::string> GetLibCoreDexFileNames(const std::vector<std::string>& modules) const;
156*795d594fSAndroid Build Coastguard Worker 
157*795d594fSAndroid Build Coastguard Worker   // Gets the paths of the libcore dex files.
158*795d594fSAndroid Build Coastguard Worker   std::vector<std::string> GetLibCoreDexFileNames() const;
159*795d594fSAndroid Build Coastguard Worker 
160*795d594fSAndroid Build Coastguard Worker   // Gets the on-host or on-device locations of the libcore dex files for given modules.
161*795d594fSAndroid Build Coastguard Worker   std::vector<std::string> GetLibCoreDexLocations(const std::vector<std::string>& modules) const;
162*795d594fSAndroid Build Coastguard Worker 
163*795d594fSAndroid Build Coastguard Worker   // Gets the on-host or on-device locations of the libcore dex files.
164*795d594fSAndroid Build Coastguard Worker   std::vector<std::string> GetLibCoreDexLocations() const;
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker   static std::string GetClassPathOption(const char* option,
167*795d594fSAndroid Build Coastguard Worker                                         const std::vector<std::string>& class_path);
168*795d594fSAndroid Build Coastguard Worker 
169*795d594fSAndroid Build Coastguard Worker   // Retuerns the filename for a test dex (i.e. XandY or ManyMethods).
170*795d594fSAndroid Build Coastguard Worker   std::string GetTestDexFileName(const char* name) const;
171*795d594fSAndroid Build Coastguard Worker 
172*795d594fSAndroid Build Coastguard Worker   template <typename Mutator>
MutateDexFile(File * output_dex,const std::string & input_jar,const Mutator & mutator)173*795d594fSAndroid Build Coastguard Worker   bool MutateDexFile(File* output_dex, const std::string& input_jar, const Mutator& mutator) {
174*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>> dex_files;
175*795d594fSAndroid Build Coastguard Worker     std::string error_msg;
176*795d594fSAndroid Build Coastguard Worker     ArtDexFileLoader dex_file_loader(input_jar);
177*795d594fSAndroid Build Coastguard Worker     CHECK(dex_file_loader.Open(/*verify*/ true,
178*795d594fSAndroid Build Coastguard Worker                                /*verify_checksum*/ true,
179*795d594fSAndroid Build Coastguard Worker                                &error_msg,
180*795d594fSAndroid Build Coastguard Worker                                &dex_files))
181*795d594fSAndroid Build Coastguard Worker         << error_msg;
182*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(dex_files.size(), 1u) << "Only one input dex is supported";
183*795d594fSAndroid Build Coastguard Worker     const std::unique_ptr<const DexFile>& dex = dex_files[0];
184*795d594fSAndroid Build Coastguard Worker     CHECK(dex->EnableWrite()) << "Failed to enable write";
185*795d594fSAndroid Build Coastguard Worker     DexFile* dex_file = const_cast<DexFile*>(dex.get());
186*795d594fSAndroid Build Coastguard Worker     size_t original_size = dex_file->Size();
187*795d594fSAndroid Build Coastguard Worker     mutator(dex_file);
188*795d594fSAndroid Build Coastguard Worker     // NB: mutation might have changed the DEX size in the header.
189*795d594fSAndroid Build Coastguard Worker     std::vector<uint8_t> copy(dex_file->Begin(), dex_file->Begin() + original_size);
190*795d594fSAndroid Build Coastguard Worker     copy.resize(dex_file->Size());  // Shrink/expand to new size.
191*795d594fSAndroid Build Coastguard Worker     uint32_t checksum = DexFile::CalculateChecksum(copy.data(), copy.size());
192*795d594fSAndroid Build Coastguard Worker     CHECK_GE(copy.size(), sizeof(DexFile::Header));
193*795d594fSAndroid Build Coastguard Worker     reinterpret_cast<DexFile::Header*>(copy.data())->checksum_ = checksum;
194*795d594fSAndroid Build Coastguard Worker     if (!output_dex->WriteFully(copy.data(), copy.size())) {
195*795d594fSAndroid Build Coastguard Worker       return false;
196*795d594fSAndroid Build Coastguard Worker     }
197*795d594fSAndroid Build Coastguard Worker     if (output_dex->Flush() != 0) {
198*795d594fSAndroid Build Coastguard Worker       PLOG(FATAL) << "Could not flush the output file.";
199*795d594fSAndroid Build Coastguard Worker     }
200*795d594fSAndroid Build Coastguard Worker     return true;
201*795d594fSAndroid Build Coastguard Worker   }
202*795d594fSAndroid Build Coastguard Worker 
203*795d594fSAndroid Build Coastguard Worker   struct ForkAndExecResult {
204*795d594fSAndroid Build Coastguard Worker     enum Stage {
205*795d594fSAndroid Build Coastguard Worker       kLink,
206*795d594fSAndroid Build Coastguard Worker       kFork,
207*795d594fSAndroid Build Coastguard Worker       kWaitpid,
208*795d594fSAndroid Build Coastguard Worker       kFinished,
209*795d594fSAndroid Build Coastguard Worker     };
210*795d594fSAndroid Build Coastguard Worker     Stage stage;
211*795d594fSAndroid Build Coastguard Worker     int status_code;
212*795d594fSAndroid Build Coastguard Worker 
StandardSuccessForkAndExecResult213*795d594fSAndroid Build Coastguard Worker     bool StandardSuccess() {
214*795d594fSAndroid Build Coastguard Worker       return stage == kFinished && WIFEXITED(status_code) && WEXITSTATUS(status_code) == 0;
215*795d594fSAndroid Build Coastguard Worker     }
216*795d594fSAndroid Build Coastguard Worker   };
217*795d594fSAndroid Build Coastguard Worker   using OutputHandlerFn = std::function<void(char*, size_t)>;
218*795d594fSAndroid Build Coastguard Worker   using PostForkFn = std::function<bool()>;
219*795d594fSAndroid Build Coastguard Worker   static ForkAndExecResult ForkAndExec(const std::vector<std::string>& argv,
220*795d594fSAndroid Build Coastguard Worker                                        const PostForkFn& post_fork,
221*795d594fSAndroid Build Coastguard Worker                                        const OutputHandlerFn& handler);
222*795d594fSAndroid Build Coastguard Worker   static ForkAndExecResult ForkAndExec(const std::vector<std::string>& argv,
223*795d594fSAndroid Build Coastguard Worker                                        const PostForkFn& post_fork,
224*795d594fSAndroid Build Coastguard Worker                                        std::string* output);
225*795d594fSAndroid Build Coastguard Worker 
226*795d594fSAndroid Build Coastguard Worker   // Helper - find prebuilt tool (e.g. objdump).
227*795d594fSAndroid Build Coastguard Worker   static std::string GetAndroidTool(const char* name, InstructionSet isa = InstructionSet::kX86_64);
228*795d594fSAndroid Build Coastguard Worker 
229*795d594fSAndroid Build Coastguard Worker  protected:
IsHost()230*795d594fSAndroid Build Coastguard Worker   static bool IsHost() {
231*795d594fSAndroid Build Coastguard Worker     return !kIsTargetBuild;
232*795d594fSAndroid Build Coastguard Worker   }
233*795d594fSAndroid Build Coastguard Worker 
234*795d594fSAndroid Build Coastguard Worker   // Returns ${ANDROID_BUILD_TOP}. Ensure it has tailing /.
235*795d594fSAndroid Build Coastguard Worker   static std::string GetAndroidBuildTop();
236*795d594fSAndroid Build Coastguard Worker 
237*795d594fSAndroid Build Coastguard Worker   // Returns ${ANDROID_HOST_OUT}.
238*795d594fSAndroid Build Coastguard Worker   static std::string GetAndroidHostOut();
239*795d594fSAndroid Build Coastguard Worker 
240*795d594fSAndroid Build Coastguard Worker   // Returns the path where boot classpath and boot image files are installed
241*795d594fSAndroid Build Coastguard Worker   // for host tests (by the art_common mk module, typically built through "m
242*795d594fSAndroid Build Coastguard Worker   // art-host-tests"). Different in CI where they are unpacked from the
243*795d594fSAndroid Build Coastguard Worker   // art-host-tests.zip file.
244*795d594fSAndroid Build Coastguard Worker   static std::string GetHostBootClasspathInstallRoot();
245*795d594fSAndroid Build Coastguard Worker 
246*795d594fSAndroid Build Coastguard Worker   // File location to boot.art, e.g. /apex/com.android.art/javalib/boot.art
247*795d594fSAndroid Build Coastguard Worker   static std::string GetCoreArtLocation();
248*795d594fSAndroid Build Coastguard Worker 
249*795d594fSAndroid Build Coastguard Worker   // File location to boot.oat, e.g. /apex/com.android.art/javalib/boot.oat
250*795d594fSAndroid Build Coastguard Worker   static std::string GetCoreOatLocation();
251*795d594fSAndroid Build Coastguard Worker 
252*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> LoadExpectSingleDexFile(const char* location);
253*795d594fSAndroid Build Coastguard Worker 
254*795d594fSAndroid Build Coastguard Worker   // Open a file (allows reading of framework jars).
255*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> OpenDexFiles(const char* filename);
256*795d594fSAndroid Build Coastguard Worker 
257*795d594fSAndroid Build Coastguard Worker   // Open a single dex file (aborts if there are more than one).
258*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> OpenDexFile(const char* filename);
259*795d594fSAndroid Build Coastguard Worker 
260*795d594fSAndroid Build Coastguard Worker   // Open a test file (art-gtest-*.jar).
261*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> OpenTestDexFiles(const char* name);
262*795d594fSAndroid Build Coastguard Worker 
263*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> OpenTestDexFile(const char* name);
264*795d594fSAndroid Build Coastguard Worker 
265*795d594fSAndroid Build Coastguard Worker   std::string android_data_;
266*795d594fSAndroid Build Coastguard Worker   std::string android_system_ext_;
267*795d594fSAndroid Build Coastguard Worker   std::string dalvik_cache_;
268*795d594fSAndroid Build Coastguard Worker 
269*795d594fSAndroid Build Coastguard Worker   virtual void SetUp();
270*795d594fSAndroid Build Coastguard Worker 
271*795d594fSAndroid Build Coastguard Worker   virtual void TearDown();
272*795d594fSAndroid Build Coastguard Worker 
273*795d594fSAndroid Build Coastguard Worker   // Creates the class path string for the given dex files (the list of dex file locations
274*795d594fSAndroid Build Coastguard Worker   // separated by ':').
275*795d594fSAndroid Build Coastguard Worker   std::string CreateClassPath(const std::vector<std::unique_ptr<const DexFile>>& dex_files);
276*795d594fSAndroid Build Coastguard Worker   // Same as CreateClassPath but add the dex file checksum after each location. The separator
277*795d594fSAndroid Build Coastguard Worker   // is '*'.
278*795d594fSAndroid Build Coastguard Worker   std::string CreateClassPathWithChecksums(
279*795d594fSAndroid Build Coastguard Worker       const std::vector<std::unique_ptr<const DexFile>>& dex_files);
280*795d594fSAndroid Build Coastguard Worker 
281*795d594fSAndroid Build Coastguard Worker   static std::string GetImageDirectory();
282*795d594fSAndroid Build Coastguard Worker   static std::string GetCoreFileLocation(const char* suffix);
283*795d594fSAndroid Build Coastguard Worker 
284*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> loaded_dex_files_;
285*795d594fSAndroid Build Coastguard Worker };
286*795d594fSAndroid Build Coastguard Worker 
287*795d594fSAndroid Build Coastguard Worker template <typename TestType>
288*795d594fSAndroid Build Coastguard Worker class CommonArtTestBase : public TestType, public CommonArtTestImpl {
289*795d594fSAndroid Build Coastguard Worker  public:
CommonArtTestBase()290*795d594fSAndroid Build Coastguard Worker   CommonArtTestBase() {}
~CommonArtTestBase()291*795d594fSAndroid Build Coastguard Worker   virtual ~CommonArtTestBase() {}
292*795d594fSAndroid Build Coastguard Worker 
293*795d594fSAndroid Build Coastguard Worker  protected:
SetUp()294*795d594fSAndroid Build Coastguard Worker   void SetUp() override {
295*795d594fSAndroid Build Coastguard Worker     CommonArtTestImpl::SetUp();
296*795d594fSAndroid Build Coastguard Worker   }
297*795d594fSAndroid Build Coastguard Worker 
TearDown()298*795d594fSAndroid Build Coastguard Worker   void TearDown() override {
299*795d594fSAndroid Build Coastguard Worker     CommonArtTestImpl::TearDown();
300*795d594fSAndroid Build Coastguard Worker   }
301*795d594fSAndroid Build Coastguard Worker };
302*795d594fSAndroid Build Coastguard Worker 
303*795d594fSAndroid Build Coastguard Worker using CommonArtTest = CommonArtTestBase<testing::Test>;
304*795d594fSAndroid Build Coastguard Worker 
305*795d594fSAndroid Build Coastguard Worker template <typename Param>
306*795d594fSAndroid Build Coastguard Worker using CommonArtTestWithParam = CommonArtTestBase<testing::TestWithParam<Param>>;
307*795d594fSAndroid Build Coastguard Worker 
308*795d594fSAndroid Build Coastguard Worker // Returns a list of PIDs of the processes whose process name (the first commandline argument) fully
309*795d594fSAndroid Build Coastguard Worker // matches the given name.
310*795d594fSAndroid Build Coastguard Worker std::vector<pid_t> GetPidByName(const std::string& process_name);
311*795d594fSAndroid Build Coastguard Worker 
312*795d594fSAndroid Build Coastguard Worker #define TEST_DISABLED_FOR_TARGET()                       \
313*795d594fSAndroid Build Coastguard Worker   if (kIsTargetBuild) {                                  \
314*795d594fSAndroid Build Coastguard Worker     GTEST_SKIP() << "WARNING: TEST DISABLED FOR TARGET"; \
315*795d594fSAndroid Build Coastguard Worker   }
316*795d594fSAndroid Build Coastguard Worker 
317*795d594fSAndroid Build Coastguard Worker #define TEST_DISABLED_FOR_HOST()                       \
318*795d594fSAndroid Build Coastguard Worker   if (!kIsTargetBuild) {                               \
319*795d594fSAndroid Build Coastguard Worker     GTEST_SKIP() << "WARNING: TEST DISABLED FOR HOST"; \
320*795d594fSAndroid Build Coastguard Worker   }
321*795d594fSAndroid Build Coastguard Worker 
322*795d594fSAndroid Build Coastguard Worker #define TEST_DISABLED_FOR_NON_STATIC_HOST_BUILDS()                       \
323*795d594fSAndroid Build Coastguard Worker   if (!kHostStaticBuildEnabled) {                                        \
324*795d594fSAndroid Build Coastguard Worker     GTEST_SKIP() << "WARNING: TEST DISABLED FOR NON-STATIC HOST BUILDS"; \
325*795d594fSAndroid Build Coastguard Worker   }
326*795d594fSAndroid Build Coastguard Worker 
327*795d594fSAndroid Build Coastguard Worker #define TEST_DISABLED_FOR_DEBUG_BUILD()                       \
328*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {                                        \
329*795d594fSAndroid Build Coastguard Worker     GTEST_SKIP() << "WARNING: TEST DISABLED FOR DEBUG BUILD"; \
330*795d594fSAndroid Build Coastguard Worker   }
331*795d594fSAndroid Build Coastguard Worker 
332*795d594fSAndroid Build Coastguard Worker #define TEST_DISABLED_FOR_MEMORY_TOOL()                       \
333*795d594fSAndroid Build Coastguard Worker   if (kRunningOnMemoryTool) {                                 \
334*795d594fSAndroid Build Coastguard Worker     GTEST_SKIP() << "WARNING: TEST DISABLED FOR MEMORY TOOL"; \
335*795d594fSAndroid Build Coastguard Worker   }
336*795d594fSAndroid Build Coastguard Worker 
337*795d594fSAndroid Build Coastguard Worker #define TEST_DISABLED_FOR_HEAP_POISONING()                       \
338*795d594fSAndroid Build Coastguard Worker   if (kPoisonHeapReferences) {                                   \
339*795d594fSAndroid Build Coastguard Worker     GTEST_SKIP() << "WARNING: TEST DISABLED FOR HEAP POISONING"; \
340*795d594fSAndroid Build Coastguard Worker   }
341*795d594fSAndroid Build Coastguard Worker }  // namespace art
342*795d594fSAndroid Build Coastguard Worker 
343*795d594fSAndroid Build Coastguard Worker #define TEST_DISABLED_FOR_MEMORY_TOOL_WITH_HEAP_POISONING()                       \
344*795d594fSAndroid Build Coastguard Worker   if (kRunningOnMemoryTool && kPoisonHeapReferences) {                            \
345*795d594fSAndroid Build Coastguard Worker     GTEST_SKIP() << "WARNING: TEST DISABLED FOR MEMORY TOOL WITH HEAP POISONING"; \
346*795d594fSAndroid Build Coastguard Worker   }
347*795d594fSAndroid Build Coastguard Worker 
348*795d594fSAndroid Build Coastguard Worker #define TEST_DISABLED_FOR_USER_BUILD()                                          \
349*795d594fSAndroid Build Coastguard Worker   if (std::string build_type = android::base::GetProperty("ro.build.type", ""); \
350*795d594fSAndroid Build Coastguard Worker       kIsTargetBuild && build_type != "userdebug" && build_type != "eng") {     \
351*795d594fSAndroid Build Coastguard Worker     GTEST_SKIP() << "WARNING: TEST DISABLED FOR USER BUILD";                    \
352*795d594fSAndroid Build Coastguard Worker   }
353*795d594fSAndroid Build Coastguard Worker 
354*795d594fSAndroid Build Coastguard Worker #endif  // ART_LIBARTBASE_BASE_COMMON_ART_TEST_H_
355