Fix PackageManagerServiceHostTests disk usage
It seems adb shell stop/start has a bug with taking up disk
space. For now, use a full reboot of the device for each
test step.
This will double the already extremely long test time, so the
entire PackageManagerServiceHostTests module has been moved
to postsubmit, except for tests annotated @Presubmit, of which
there are none as of this change.
Bug: 159540015
Bug: 159256824
Test: atest PackageManagerServiceHostTests
Change-Id: I67da61cb02baa572fc298e6f617d6e53ec2c4724
diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING
index eb51cc3..4b83d70 100644
--- a/services/core/java/com/android/server/pm/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/TEST_MAPPING
@@ -71,7 +71,12 @@
]
},
{
- "name": "PackageManagerServiceHostTests"
+ "name": "PackageManagerServiceHostTests",
+ "options": [
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ }
+ ]
}
],
"postsubmit": [
@@ -87,6 +92,9 @@
"name": "CtsAppSecurityHostTestCases"
},
{
+ "name": "PackageManagerServiceHostTests"
+ },
+ {
"name": "FrameworksServicesTests",
"options": [
{
diff --git a/services/tests/PackageManagerServiceTests/OWNERS b/services/tests/PackageManagerServiceTests/OWNERS
new file mode 100644
index 0000000..182dfe8
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/OWNERS
@@ -0,0 +1,3 @@
+chiuwinson@google.com
+patb@google.com
+toddke@google.com
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/HostUtils.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/HostUtils.kt
index 490f96d..234fcf1 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/HostUtils.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/HostUtils.kt
@@ -22,10 +22,16 @@
import java.io.FileOutputStream
internal fun SystemPreparer.pushApk(file: String, partition: Partition) =
- pushResourceFile(file, HostUtils.makePathForApk(file, partition))
+ pushResourceFile(file, HostUtils.makePathForApk(file, partition).toString())
-internal fun SystemPreparer.deleteApk(file: String, partition: Partition) =
- deleteFile(partition.baseFolder.resolve(file.removeSuffix(".apk")).toString())
+internal fun SystemPreparer.deleteApkFolders(
+ partition: Partition,
+ vararg javaResourceNames: String
+) = apply {
+ javaResourceNames.forEach {
+ deleteFile(partition.baseAppFolder.resolve(it.removeSuffix(".apk")).toString())
+ }
+}
internal object HostUtils {
@@ -40,10 +46,9 @@
makePathForApk(File(fileName), partition)
fun makePathForApk(file: File, partition: Partition) =
- partition.baseFolder
+ partition.baseAppFolder
.resolve(file.nameWithoutExtension)
.resolve(file.name)
- .toString()
fun copyResourceToHostFile(javaResourceName: String, file: File): File {
javaClass.classLoader!!.getResource(javaResourceName).openStream().use { input ->
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/InvalidNewSystemAppTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/InvalidNewSystemAppTest.kt
index 98e045d..39b40d8 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/InvalidNewSystemAppTest.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/InvalidNewSystemAppTest.kt
@@ -45,23 +45,24 @@
private val tempFolder = TemporaryFolder()
private val preparer: SystemPreparer = SystemPreparer(tempFolder,
- SystemPreparer.RebootStrategy.START_STOP, deviceRebootRule) { this.device }
+ SystemPreparer.RebootStrategy.FULL, deviceRebootRule) { this.device }
@get:Rule
val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
+ private val filePath = HostUtils.makePathForApk("PackageManagerDummyApp.apk", Partition.PRODUCT)
@Before
@After
- fun uninstallDataPackage() {
+ fun removeApk() {
device.uninstallPackage(TEST_PKG_NAME)
+ device.deleteFile(filePath.parent.toString())
+ device.reboot()
}
@Test
fun verify() {
// First, push a system app to the device and then update it so there's a data variant
- val filePath = HostUtils.makePathForApk("PackageManagerDummyApp.apk", Partition.PRODUCT)
-
- preparer.pushResourceFile(VERSION_ONE, filePath)
+ preparer.pushResourceFile(VERSION_ONE, filePath.toString())
.reboot()
val versionTwoFile = HostUtils.copyResourceToHostFile(VERSION_TWO, tempFolder.newFile())
@@ -69,8 +70,8 @@
assertThat(device.installPackage(versionTwoFile, true)).isNull()
// Then push a bad update to the system, overwriting the existing file as if an OTA occurred
- preparer.deleteFile(filePath)
- .pushResourceFile(VERSION_THREE_INVALID, filePath)
+ preparer.deleteFile(filePath.toString())
+ .pushResourceFile(VERSION_THREE_INVALID, filePath.toString())
.reboot()
// This will remove the package from the device, which is expected
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/OriginalPackageMigrationTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/OriginalPackageMigrationTest.kt
index 90494c5..fb0348c 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/OriginalPackageMigrationTest.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/OriginalPackageMigrationTest.kt
@@ -20,6 +20,8 @@
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test
import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
import org.junit.ClassRule
import org.junit.Rule
import org.junit.Test
@@ -43,11 +45,18 @@
private val tempFolder = TemporaryFolder()
private val preparer: SystemPreparer = SystemPreparer(tempFolder,
- SystemPreparer.RebootStrategy.START_STOP, deviceRebootRule) { this.device }
+ SystemPreparer.RebootStrategy.FULL, deviceRebootRule) { this.device }
@get:Rule
val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
+ @Before
+ @After
+ fun deleteApkFolders() {
+ preparer.deleteApkFolders(Partition.SYSTEM, VERSION_ONE, VERSION_TWO, VERSION_THREE,
+ NEW_PKG)
+ }
+
@Test
fun lowerVersion() {
runForApk(VERSION_ONE)
@@ -71,28 +80,28 @@
preparer.pushApk(apk, Partition.SYSTEM)
.reboot()
- device.getAppPackageInfo(TEST_PKG_NAME).run {
- assertThat(codePath).contains(apk.removeSuffix(".apk"))
- }
+ assertCodePath(apk)
// Ensure data is preserved by writing to the original dataDir
val file = tempFolder.newFile().apply { writeText("Test") }
device.pushFile(file, "${HostUtils.getDataDir(device, TEST_PKG_NAME)}/files/test.txt")
- preparer.deleteApk(apk, Partition.SYSTEM)
+ preparer.deleteApkFolders(Partition.SYSTEM, apk)
.pushApk(NEW_PKG, Partition.SYSTEM)
.reboot()
- device.getAppPackageInfo(TEST_PKG_NAME)
- .run {
- assertThat(this.toString()).isNotEmpty()
- assertThat(codePath)
- .contains(NEW_PKG.removeSuffix(".apk"))
- }
+ assertCodePath(NEW_PKG)
// And then reading the data contents back
assertThat(device.pullFileContents(
"${HostUtils.getDataDir(device, TEST_PKG_NAME)}/files/test.txt"))
.isEqualTo("Test")
}
+
+ private fun assertCodePath(apk: String) {
+ // dumpsys package and therefore device.getAppPackageInfo doesn't work here for some reason,
+ // so parse the package dump directly to see if the path matches.
+ assertThat(device.executeShellCommand("pm dump $TEST_PKG_NAME"))
+ .contains(HostUtils.makePathForApk(apk, Partition.SYSTEM).parent.toString())
+ }
}
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/Partition.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/Partition.kt
index 35192a7..654c11c 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/Partition.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/Partition.kt
@@ -20,7 +20,7 @@
import java.nio.file.Paths
// Unfortunately no easy way to access PMS SystemPartitions, so mock them here
-internal enum class Partition(val baseFolder: Path) {
+internal enum class Partition(val baseAppFolder: Path) {
SYSTEM("/system/app"),
VENDOR("/vendor/app"),
PRODUCT("/product/app"),
diff --git a/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java b/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java
index 6bd6985..f30c35a 100644
--- a/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java
+++ b/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java
@@ -356,6 +356,9 @@
/**
* Uses shell stop && start to "reboot" the device. May leave invalid state after each test.
* Whether this matters or not depends on what's being tested.
+ *
+ * TODO(b/159540015): There's a bug with this causing unnecessary disk space usage, which
+ * can eventually lead to an insufficient storage space error.
*/
START_STOP
}