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