Move StagePackages tests from apexservice_test to apexd_test
apexservice_test require test apexes to be pre-installed on the device,
and only way to cleanup is brutally deleting directories under
/data/apex, which might impact other tests. So, instead we are moving
tests to apexd_test which should be more hermetic.
Test: atest ApexTestCase
Change-Id: Ieebf5b2eb8fc5fca015d617d0a8a6aad3db21f69
diff --git a/apexd/apexd_test.cpp b/apexd/apexd_test.cpp
index 4712ef3..2029692 100644
--- a/apexd/apexd_test.cpp
+++ b/apexd/apexd_test.cpp
@@ -20,12 +20,14 @@
#include <android-base/file.h>
#include <android-base/properties.h>
+#include <android-base/result-gmock.h>
#include <android-base/scopeguard.h>
#include <android-base/stringprintf.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <libdm/dm.h>
#include <microdroid/metadata.h>
+#include <sys/stat.h>
#include "apex_database.h"
#include "apex_file_repository.h"
@@ -56,6 +58,9 @@
using android::base::StringPrintf;
using android::base::unique_fd;
using android::base::WriteStringToFile;
+using android::base::testing::HasError;
+using android::base::testing::Ok;
+using android::base::testing::WithMessage;
using android::dm::DeviceMapper;
using ::apex::proto::SessionState;
using com::android::apex::testing::ApexInfoXmlEq;
@@ -3756,5 +3761,119 @@
dm.GetState("com.android.apex.compressed"));
}
+TEST_F(ApexdUnitTest, StagePackagesFailKey) {
+ auto status =
+ StagePackages({GetTestFile("apex.apexd_test_no_inst_key.apex")});
+
+ ASSERT_THAT(
+ status,
+ HasError(WithMessage(("No preinstalled apex found for package "
+ "com.android.apex.test_package.no_inst_key"))));
+}
+
+TEST_F(ApexdUnitTest, StagePackagesSuccess) {
+ AddPreInstalledApex("apex.apexd_test.apex");
+ auto& instance = ApexFileRepository::GetInstance();
+ ASSERT_THAT(instance.AddPreInstalledApex({GetBuiltInDir()}), Ok());
+
+ auto status = StagePackages({GetTestFile("apex.apexd_test.apex")});
+ ASSERT_THAT(status, Ok());
+
+ auto staged_path = StringPrintf("%s/com.android.apex.test_package@1.apex",
+ GetDataDir().c_str());
+ ASSERT_EQ(0, access(staged_path.c_str(), F_OK));
+}
+
+TEST_F(ApexdUnitTest, StagePackagesClearsPreviouslyActivePackage) {
+ AddPreInstalledApex("apex.apexd_test.apex");
+ auto& instance = ApexFileRepository::GetInstance();
+ ASSERT_THAT(instance.AddPreInstalledApex({GetBuiltInDir()}), Ok());
+
+ auto current_apex = AddDataApex("apex.apexd_test.apex");
+ ASSERT_EQ(0, access(current_apex.c_str(), F_OK));
+
+ auto status = StagePackages({GetTestFile("apex.apexd_test_v2.apex")});
+ ASSERT_THAT(status, Ok());
+
+ auto staged_path = StringPrintf("%s/com.android.apex.test_package@2.apex",
+ GetDataDir().c_str());
+ ASSERT_EQ(0, access(staged_path.c_str(), F_OK));
+ ASSERT_EQ(-1, access(current_apex.c_str(), F_OK));
+ ASSERT_EQ(ENOENT, errno);
+}
+
+TEST_F(ApexdUnitTest, StagePackagesClearsPreviouslyActivePackageDowngrade) {
+ AddPreInstalledApex("apex.apexd_test.apex");
+ auto& instance = ApexFileRepository::GetInstance();
+ ASSERT_THAT(instance.AddPreInstalledApex({GetBuiltInDir()}), Ok());
+
+ auto current_apex = AddDataApex("apex.apexd_test_v2.apex");
+ ASSERT_EQ(0, access(current_apex.c_str(), F_OK));
+
+ auto status = StagePackages({GetTestFile("apex.apexd_test.apex")});
+ ASSERT_THAT(status, Ok());
+
+ auto staged_path = StringPrintf("%s/com.android.apex.test_package@1.apex",
+ GetDataDir().c_str());
+ ASSERT_EQ(0, access(staged_path.c_str(), F_OK));
+ ASSERT_EQ(-1, access(current_apex.c_str(), F_OK));
+ ASSERT_EQ(ENOENT, errno);
+}
+
+TEST_F(ApexdUnitTest, StagePackagesAlreadyStagedPackage) {
+ AddPreInstalledApex("apex.apexd_test.apex");
+ auto& instance = ApexFileRepository::GetInstance();
+ ASSERT_THAT(instance.AddPreInstalledApex({GetBuiltInDir()}), Ok());
+
+ auto status = StagePackages({GetTestFile("apex.apexd_test.apex")});
+ ASSERT_THAT(status, Ok());
+
+ auto staged_path = StringPrintf("%s/com.android.apex.test_package@1.apex",
+ GetDataDir().c_str());
+ struct stat stat1;
+ ASSERT_EQ(0, stat(staged_path.c_str(), &stat1));
+ ASSERT_TRUE(S_ISREG(stat1.st_mode));
+
+ {
+ auto apex = ApexFile::Open(staged_path);
+ ASSERT_THAT(apex, Ok());
+ ASSERT_FALSE(apex->GetManifest().nocode());
+ }
+
+ auto status2 = StagePackages({GetTestFile("apex.apexd_test_nocode.apex")});
+ ASSERT_THAT(status2, Ok());
+
+ struct stat stat2;
+ ASSERT_EQ(0, stat(staged_path.c_str(), &stat2));
+ ASSERT_TRUE(S_ISREG(stat2.st_mode));
+
+ ASSERT_NE(stat1.st_ino, stat2.st_ino);
+
+ {
+ auto apex = ApexFile::Open(staged_path);
+ ASSERT_THAT(apex, Ok());
+ ASSERT_TRUE(apex->GetManifest().nocode());
+ }
+}
+
+TEST_F(ApexdUnitTest, StagePackagesMultiplePackages) {
+ AddPreInstalledApex("apex.apexd_test.apex");
+ AddPreInstalledApex("apex.apexd_test_different_app.apex");
+ auto& instance = ApexFileRepository::GetInstance();
+ ASSERT_THAT(instance.AddPreInstalledApex({GetBuiltInDir()}), Ok());
+
+ auto status =
+ StagePackages({GetTestFile("apex.apexd_test_v2.apex"),
+ GetTestFile("apex.apexd_test_different_app.apex")});
+ ASSERT_THAT(status, Ok());
+
+ auto staged_path1 = StringPrintf("%s/com.android.apex.test_package@2.apex",
+ GetDataDir().c_str());
+ auto staged_path2 = StringPrintf("%s/com.android.apex.test_package_2@1.apex",
+ GetDataDir().c_str());
+ ASSERT_EQ(0, access(staged_path1.c_str(), F_OK));
+ ASSERT_EQ(0, access(staged_path2.c_str(), F_OK));
+}
+
} // namespace apex
} // namespace android
diff --git a/apexd/apexservice_test.cpp b/apexd/apexservice_test.cpp
index 9b2aed6..3a76339 100644
--- a/apexd/apexservice_test.cpp
+++ b/apexd/apexservice_test.cpp
@@ -594,66 +594,6 @@
EXPECT_TRUE(IsSelinuxEnforced() || kIsX86);
}
-TEST_F(ApexServiceTest, StageFailAccess) {
- if (!IsSelinuxEnforced()) {
- LOG(WARNING) << "Skipping InstallFailAccess because of selinux";
- return;
- }
-
- // Use an extra copy, so that even if this test fails (incorrectly installs),
- // we have the testdata file still around.
- std::string orig_test_file = GetTestFile("apex.apexd_test.apex");
- std::string test_file = orig_test_file + ".2";
- ASSERT_EQ(0, link(orig_test_file.c_str(), test_file.c_str()))
- << strerror(errno);
- struct Deleter {
- std::string to_delete;
- explicit Deleter(std::string t) : to_delete(std::move(t)) {}
- ~Deleter() {
- if (unlink(to_delete.c_str()) != 0) {
- PLOG(ERROR) << "Could not unlink " << to_delete;
- }
- }
- };
- Deleter del(test_file);
-
- android::binder::Status st = service_->stagePackages({test_file});
- ASSERT_FALSE(IsOk(st));
- std::string error = st.exceptionMessage().c_str();
- EXPECT_NE(std::string::npos, error.find("Failed to open package")) << error;
- EXPECT_NE(std::string::npos, error.find("I/O error")) << error;
-}
-
-TEST_F(ApexServiceTest, StageFailKey) {
- PrepareTestApexForInstall installer(
- GetTestFile("apex.apexd_test_no_inst_key.apex"));
- if (!installer.Prepare()) {
- return;
- }
- ASSERT_EQ(std::string("com.android.apex.test_package.no_inst_key"),
- installer.package);
-
- android::binder::Status st = service_->stagePackages({installer.test_file});
- ASSERT_FALSE(IsOk(st));
-
- // May contain one of two errors.
- std::string error = st.exceptionMessage().c_str();
-
- ASSERT_THAT(error, HasSubstr("No preinstalled apex found for package "
- "com.android.apex.test_package.no_inst_key"));
-}
-
-TEST_F(ApexServiceTest, StageSuccess) {
- PrepareTestApexForInstall installer(GetTestFile("apex.apexd_test.apex"));
- if (!installer.Prepare()) {
- return;
- }
- ASSERT_EQ(std::string("com.android.apex.test_package"), installer.package);
-
- ASSERT_TRUE(IsOk(service_->stagePackages({installer.test_file})));
- EXPECT_TRUE(RegularFileExists(installer.test_installed_file));
-}
-
TEST_F(ApexServiceTest,
SubmitStagegSessionSuccessDoesNotLeakTempVerityDevices) {
PrepareTestApexForInstall installer(GetTestFile("apex.apexd_test.apex"),
@@ -715,85 +655,6 @@
}
}
-TEST_F(ApexServiceTest, StageSuccessClearsPreviouslyActivePackage) {
- PrepareTestApexForInstall installer1(GetTestFile("apex.apexd_test_v2.apex"));
- PrepareTestApexForInstall installer2(
- GetTestFile("apex.apexd_test_different_app.apex"));
- PrepareTestApexForInstall installer3(GetTestFile("apex.apexd_test.apex"));
- auto install_fn = [&](PrepareTestApexForInstall& installer) {
- if (!installer.Prepare()) {
- return;
- }
- ASSERT_TRUE(IsOk(service_->stagePackages({installer.test_file})));
- EXPECT_TRUE(RegularFileExists(installer.test_installed_file));
- };
- install_fn(installer1);
- install_fn(installer2);
- // Simulating a revert. After this call test_v2_apex_path should be removed.
- install_fn(installer3);
-
- EXPECT_FALSE(RegularFileExists(installer1.test_installed_file));
- EXPECT_TRUE(RegularFileExists(installer2.test_installed_file));
- EXPECT_TRUE(RegularFileExists(installer3.test_installed_file));
-}
-
-TEST_F(ApexServiceTest, StageAlreadyStagedPackageSuccess) {
- PrepareTestApexForInstall installer(GetTestFile("apex.apexd_test.apex"));
- if (!installer.Prepare()) {
- return;
- }
- ASSERT_EQ(std::string("com.android.apex.test_package"), installer.package);
-
- ASSERT_TRUE(IsOk(service_->stagePackages({installer.test_file})));
- ASSERT_TRUE(RegularFileExists(installer.test_installed_file));
-
- ASSERT_TRUE(IsOk(service_->stagePackages({installer.test_file})));
- ASSERT_TRUE(RegularFileExists(installer.test_installed_file));
-}
-
-TEST_F(ApexServiceTest, StageAlreadyStagedPackageSuccessNewWins) {
- PrepareTestApexForInstall installer(GetTestFile("apex.apexd_test.apex"));
- PrepareTestApexForInstall installer2(
- GetTestFile("apex.apexd_test_nocode.apex"));
- if (!installer.Prepare() || !installer2.Prepare()) {
- return;
- }
- ASSERT_EQ(std::string("com.android.apex.test_package"), installer.package);
- ASSERT_EQ(installer.test_installed_file, installer2.test_installed_file);
-
- ASSERT_TRUE(IsOk(service_->stagePackages({installer.test_file})));
- const auto& apex = ApexFile::Open(installer.test_installed_file);
- ASSERT_TRUE(IsOk(apex));
- ASSERT_FALSE(apex->GetManifest().nocode());
-
- ASSERT_TRUE(IsOk(service_->stagePackages({installer2.test_file})));
- const auto& new_apex = ApexFile::Open(installer.test_installed_file);
- ASSERT_TRUE(IsOk(new_apex));
- ASSERT_TRUE(new_apex->GetManifest().nocode());
-}
-
-TEST_F(ApexServiceTest, MultiStageSuccess) {
- PrepareTestApexForInstall installer(GetTestFile("apex.apexd_test.apex"));
- if (!installer.Prepare()) {
- return;
- }
- ASSERT_EQ(std::string("com.android.apex.test_package"), installer.package);
-
- PrepareTestApexForInstall installer2(GetTestFile("apex.apexd_test_v2.apex"));
- if (!installer2.Prepare()) {
- return;
- }
- ASSERT_EQ(std::string("com.android.apex.test_package"), installer2.package);
-
- std::vector<std::string> packages;
- packages.push_back(installer.test_file);
- packages.push_back(installer2.test_file);
-
- ASSERT_TRUE(IsOk(service_->stagePackages(packages)));
- EXPECT_TRUE(RegularFileExists(installer.test_installed_file));
- EXPECT_TRUE(RegularFileExists(installer2.test_installed_file));
-}
-
TEST_F(ApexServiceTest, CannotBeRollbackAndHaveRollbackEnabled) {
PrepareTestApexForInstall installer(GetTestFile("apex.apexd_test.apex"),
"/data/app-staging/session_1543",