Device gtests: Use boot.art instead of core.art.
They are essentially the same. We can use boot.art to run gtests
since it is already part of the apex, including the jar files.
This will make it easier to run the tests in atest, since we
will not have to worry about copying core.art to the device.
The long-term goal is to avoid generating core.art altogether.
Couple of tests also require "alternate" image which has no
compiled code. The tests now generate it on-demand in code.
The host gtests still use core.art for now (as there is no
boot.art on host). The plan is to add it in future CLs.
Test: m test-art-host-gtest
Test: ./art/tools/run-gtests.sh
Bug: 147817606
Change-Id: I3a750bb8e60eea0b4a7df1491285feffd5a0161c
diff --git a/runtime/common_runtime_test.cc b/runtime/common_runtime_test.cc
index 135dc7b..64d2503 100644
--- a/runtime/common_runtime_test.cc
+++ b/runtime/common_runtime_test.cc
@@ -433,22 +433,106 @@
return true;
}
+bool CommonRuntimeTestImpl::CompileBootImage(const std::vector<std::string>& extra_args,
+ const std::string& image_file_name_prefix,
+ ArrayRef<const std::string> dex_files,
+ ArrayRef<const std::string> dex_locations,
+ std::string* error_msg,
+ const std::string& use_fd_prefix) {
+ Runtime* const runtime = Runtime::Current();
+ std::vector<std::string> argv {
+ runtime->GetCompilerExecutable(),
+ "--runtime-arg",
+ "-Xms64m",
+ "--runtime-arg",
+ "-Xmx64m",
+ "--runtime-arg",
+ "-Xverify:softfail",
+ };
+ CHECK_EQ(dex_files.size(), dex_locations.size());
+ for (const std::string& dex_file : dex_files) {
+ argv.push_back("--dex-file=" + dex_file);
+ }
+ for (const std::string& dex_location : dex_locations) {
+ argv.push_back("--dex-location=" + dex_location);
+ }
+ if (runtime->IsJavaDebuggable()) {
+ argv.push_back("--debuggable");
+ }
+ runtime->AddCurrentRuntimeFeaturesAsDex2OatArguments(&argv);
+
+ if (!kIsTargetBuild) {
+ argv.push_back("--host");
+ }
+
+ std::unique_ptr<File> art_file;
+ std::unique_ptr<File> vdex_file;
+ std::unique_ptr<File> oat_file;
+ if (!use_fd_prefix.empty()) {
+ art_file.reset(OS::CreateEmptyFile((use_fd_prefix + ".art").c_str()));
+ vdex_file.reset(OS::CreateEmptyFile((use_fd_prefix + ".vdex").c_str()));
+ oat_file.reset(OS::CreateEmptyFile((use_fd_prefix + ".oat").c_str()));
+ argv.push_back("--image-fd=" + std::to_string(art_file->Fd()));
+ argv.push_back("--output-vdex-fd=" + std::to_string(vdex_file->Fd()));
+ argv.push_back("--oat-fd=" + std::to_string(oat_file->Fd()));
+ argv.push_back("--oat-location=" + image_file_name_prefix + ".oat");
+ } else {
+ argv.push_back("--image=" + image_file_name_prefix + ".art");
+ argv.push_back("--oat-file=" + image_file_name_prefix + ".oat");
+ argv.push_back("--oat-location=" + image_file_name_prefix + ".oat");
+ }
+
+ std::vector<std::string> compiler_options = runtime->GetCompilerOptions();
+ argv.insert(argv.end(), compiler_options.begin(), compiler_options.end());
+
+ // We must set --android-root.
+ const char* android_root = getenv("ANDROID_ROOT");
+ CHECK(android_root != nullptr);
+ argv.push_back("--android-root=" + std::string(android_root));
+ argv.insert(argv.end(), extra_args.begin(), extra_args.end());
+
+ bool result = RunDex2Oat(argv, error_msg);
+ if (art_file != nullptr) {
+ CHECK_EQ(0, art_file->FlushClose());
+ }
+ if (vdex_file != nullptr) {
+ CHECK_EQ(0, vdex_file->FlushClose());
+ }
+ if (oat_file != nullptr) {
+ CHECK_EQ(0, oat_file->FlushClose());
+ }
+ return result;
+}
+
+bool CommonRuntimeTestImpl::RunDex2Oat(const std::vector<std::string>& args,
+ std::string* error_msg) {
+ // We only want fatal logging for the error message.
+ auto post_fork_fn = []() { return setenv("ANDROID_LOG_TAGS", "*:f", 1) == 0; };
+ ForkAndExecResult res = ForkAndExec(args, post_fork_fn, error_msg);
+ if (res.stage != ForkAndExecResult::kFinished) {
+ *error_msg = strerror(errno);
+ return false;
+ }
+ return res.StandardSuccess();
+}
+
std::string CommonRuntimeTestImpl::GetImageDirectory() {
if (IsHost()) {
const char* host_dir = getenv("ANDROID_HOST_OUT");
CHECK(host_dir != nullptr);
return std::string(host_dir) + "/framework";
} else {
- return std::string("/data/art-test");
+ return std::string("/apex/com.android.art/javalib");
}
}
std::string CommonRuntimeTestImpl::GetImageLocation() {
- return GetImageDirectory() + "/core.art";
+ return GetImageDirectory() + (IsHost() ? "/core.art" : "/boot.art");
}
std::string CommonRuntimeTestImpl::GetSystemImageFile() {
- return GetImageDirectory() + "/" + GetInstructionSetString(kRuntimeISA) + "/core.art";
+ std::string isa = GetInstructionSetString(kRuntimeISA);
+ return GetImageDirectory() + "/" + isa + (IsHost() ? "/core.art" : "/boot.art");
}
void CommonRuntimeTestImpl::EnterTransactionMode() {