Skip to content
Snippets Groups Projects
Commit db6d1df7 authored by Winson's avatar Winson
Browse files

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
parent 06ba19ff
No related branches found
No related tags found
No related merge requests found
......@@ -71,7 +71,12 @@
]
},
{
"name": "PackageManagerServiceHostTests"
"name": "PackageManagerServiceHostTests",
"options": [
{
"include-annotation": "android.platform.test.annotations.Presubmit"
}
]
}
],
"postsubmit": [
......@@ -86,6 +91,9 @@
{
"name": "CtsAppSecurityHostTestCases"
},
{
"name": "PackageManagerServiceHostTests"
},
{
"name": "FrameworksServicesTests",
"options": [
......
chiuwinson@google.com
patb@google.com
toddke@google.com
......@@ -22,10 +22,16 @@ import java.io.File
import java.io.FileOutputStream
internal fun SystemPreparer.pushApk(file: String, partition: Partition) =
pushResourceFile(file, HostUtils.makePathForApk(file, partition))
internal fun SystemPreparer.deleteApk(file: String, partition: Partition) =
deleteFile(partition.baseFolder.resolve(file.removeSuffix(".apk")).toString())
pushResourceFile(file, HostUtils.makePathForApk(file, partition).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 @@ internal object HostUtils {
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 ->
......
......@@ -45,23 +45,24 @@ class InvalidNewSystemAppTest : BaseHostJUnit4Test() {
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 @@ class InvalidNewSystemAppTest : BaseHostJUnit4Test() {
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
......
......@@ -20,6 +20,8 @@ import com.android.internal.util.test.SystemPreparer
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 @@ class OriginalPackageMigrationTest : BaseHostJUnit4Test() {
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 @@ class OriginalPackageMigrationTest : BaseHostJUnit4Test() {
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())
}
}
......@@ -20,7 +20,7 @@ import java.nio.file.Path
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"),
......
......@@ -356,6 +356,9 @@ public class SystemPreparer extends ExternalResource {
/**
* 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
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment