Rework postinstall unittests to pass on Android.
Postinstall unittests were creating and mounting an image on each test
run. This patch adds several test scripts to one of the pre-generated
images and uses that image during postinstall testing instead.
To workaround problems with mount/umount of loop devices on Android,
this patch rewrites the `losetup` logic to make the appropriate
syscalls and create the loop device with mknod if it doesn't exists.
The tests require some extra SELinux policies to run in enforcing mode.
Bug: 26955860
TEST=Ran all Postinstall unittests.
Change-Id: I47a56b80b97596bc65ffe30cbc8118f05faff0ae
diff --git a/payload_consumer/postinstall_runner_action.cc b/payload_consumer/postinstall_runner_action.cc
index d57ef4e..9ebef53 100644
--- a/payload_consumer/postinstall_runner_action.cc
+++ b/payload_consumer/postinstall_runner_action.cc
@@ -87,9 +87,16 @@
utils::MakeTempDirectory("au_postint_mount.XXXXXX", &fs_mount_dir_));
#endif // __ANDROID__
- string abs_path = base::FilePath(fs_mount_dir_)
- .AppendASCII(partition.postinstall_path)
- .value();
+ base::FilePath postinstall_path(partition.postinstall_path);
+ if (postinstall_path.IsAbsolute()) {
+ LOG(ERROR) << "Invalid absolute path passed to postinstall, use a relative"
+ "path instead: "
+ << partition.postinstall_path;
+ return CompletePostinstall(ErrorCode::kPostinstallRunnerError);
+ }
+
+ string abs_path =
+ base::FilePath(fs_mount_dir_).Append(postinstall_path).value();
if (!base::StartsWith(
abs_path, fs_mount_dir_, base::CompareCase::SENSITIVE)) {
LOG(ERROR) << "Invalid relative postinstall path: "
@@ -171,6 +178,7 @@
}
ScopedActionCompleter completer(processor_, this);
+ completer.set_code(error_code);
if (error_code != ErrorCode::kSuccess) {
LOG(ERROR) << "Postinstall action failed.";
@@ -186,8 +194,6 @@
if (HasOutputPipe()) {
SetOutputObject(install_plan_);
}
-
- completer.set_code(ErrorCode::kSuccess);
}
} // namespace chromeos_update_engine