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",