Merge "Fix PackageManagerServiceHostTests disk usage" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
f022111a13
@@ -71,7 +71,12 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "PackageManagerServiceHostTests"
|
"name": "PackageManagerServiceHostTests",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"include-annotation": "android.platform.test.annotations.Presubmit"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"postsubmit": [
|
"postsubmit": [
|
||||||
@@ -86,6 +91,9 @@
|
|||||||
{
|
{
|
||||||
"name": "CtsAppSecurityHostTestCases"
|
"name": "CtsAppSecurityHostTestCases"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "PackageManagerServiceHostTests"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "FrameworksServicesTests",
|
"name": "FrameworksServicesTests",
|
||||||
"options": [
|
"options": [
|
||||||
|
|||||||
3
services/tests/PackageManagerServiceTests/OWNERS
Normal file
3
services/tests/PackageManagerServiceTests/OWNERS
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
chiuwinson@google.com
|
||||||
|
patb@google.com
|
||||||
|
toddke@google.com
|
||||||
@@ -22,10 +22,16 @@ import java.io.File
|
|||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
|
|
||||||
internal fun SystemPreparer.pushApk(file: String, partition: Partition) =
|
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) =
|
internal fun SystemPreparer.deleteApkFolders(
|
||||||
deleteFile(partition.baseFolder.resolve(file.removeSuffix(".apk")).toString())
|
partition: Partition,
|
||||||
|
vararg javaResourceNames: String
|
||||||
|
) = apply {
|
||||||
|
javaResourceNames.forEach {
|
||||||
|
deleteFile(partition.baseAppFolder.resolve(it.removeSuffix(".apk")).toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal object HostUtils {
|
internal object HostUtils {
|
||||||
|
|
||||||
@@ -40,10 +46,9 @@ internal object HostUtils {
|
|||||||
makePathForApk(File(fileName), partition)
|
makePathForApk(File(fileName), partition)
|
||||||
|
|
||||||
fun makePathForApk(file: File, partition: Partition) =
|
fun makePathForApk(file: File, partition: Partition) =
|
||||||
partition.baseFolder
|
partition.baseAppFolder
|
||||||
.resolve(file.nameWithoutExtension)
|
.resolve(file.nameWithoutExtension)
|
||||||
.resolve(file.name)
|
.resolve(file.name)
|
||||||
.toString()
|
|
||||||
|
|
||||||
fun copyResourceToHostFile(javaResourceName: String, file: File): File {
|
fun copyResourceToHostFile(javaResourceName: String, file: File): File {
|
||||||
javaClass.classLoader!!.getResource(javaResourceName).openStream().use { input ->
|
javaClass.classLoader!!.getResource(javaResourceName).openStream().use { input ->
|
||||||
|
|||||||
@@ -45,23 +45,24 @@ class InvalidNewSystemAppTest : BaseHostJUnit4Test() {
|
|||||||
|
|
||||||
private val tempFolder = TemporaryFolder()
|
private val tempFolder = TemporaryFolder()
|
||||||
private val preparer: SystemPreparer = SystemPreparer(tempFolder,
|
private val preparer: SystemPreparer = SystemPreparer(tempFolder,
|
||||||
SystemPreparer.RebootStrategy.START_STOP, deviceRebootRule) { this.device }
|
SystemPreparer.RebootStrategy.FULL, deviceRebootRule) { this.device }
|
||||||
|
|
||||||
@get:Rule
|
@get:Rule
|
||||||
val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
|
val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
|
||||||
|
private val filePath = HostUtils.makePathForApk("PackageManagerDummyApp.apk", Partition.PRODUCT)
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@After
|
@After
|
||||||
fun uninstallDataPackage() {
|
fun removeApk() {
|
||||||
device.uninstallPackage(TEST_PKG_NAME)
|
device.uninstallPackage(TEST_PKG_NAME)
|
||||||
|
device.deleteFile(filePath.parent.toString())
|
||||||
|
device.reboot()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun verify() {
|
fun verify() {
|
||||||
// First, push a system app to the device and then update it so there's a data variant
|
// 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.toString())
|
||||||
|
|
||||||
preparer.pushResourceFile(VERSION_ONE, filePath)
|
|
||||||
.reboot()
|
.reboot()
|
||||||
|
|
||||||
val versionTwoFile = HostUtils.copyResourceToHostFile(VERSION_TWO, tempFolder.newFile())
|
val versionTwoFile = HostUtils.copyResourceToHostFile(VERSION_TWO, tempFolder.newFile())
|
||||||
@@ -69,8 +70,8 @@ class InvalidNewSystemAppTest : BaseHostJUnit4Test() {
|
|||||||
assertThat(device.installPackage(versionTwoFile, true)).isNull()
|
assertThat(device.installPackage(versionTwoFile, true)).isNull()
|
||||||
|
|
||||||
// Then push a bad update to the system, overwriting the existing file as if an OTA occurred
|
// Then push a bad update to the system, overwriting the existing file as if an OTA occurred
|
||||||
preparer.deleteFile(filePath)
|
preparer.deleteFile(filePath.toString())
|
||||||
.pushResourceFile(VERSION_THREE_INVALID, filePath)
|
.pushResourceFile(VERSION_THREE_INVALID, filePath.toString())
|
||||||
.reboot()
|
.reboot()
|
||||||
|
|
||||||
// This will remove the package from the device, which is expected
|
// 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.DeviceJUnit4ClassRunner
|
||||||
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test
|
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
import org.junit.ClassRule
|
import org.junit.ClassRule
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
@@ -43,11 +45,18 @@ class OriginalPackageMigrationTest : BaseHostJUnit4Test() {
|
|||||||
|
|
||||||
private val tempFolder = TemporaryFolder()
|
private val tempFolder = TemporaryFolder()
|
||||||
private val preparer: SystemPreparer = SystemPreparer(tempFolder,
|
private val preparer: SystemPreparer = SystemPreparer(tempFolder,
|
||||||
SystemPreparer.RebootStrategy.START_STOP, deviceRebootRule) { this.device }
|
SystemPreparer.RebootStrategy.FULL, deviceRebootRule) { this.device }
|
||||||
|
|
||||||
@get:Rule
|
@get:Rule
|
||||||
val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
|
val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
|
||||||
|
|
||||||
|
@Before
|
||||||
|
@After
|
||||||
|
fun deleteApkFolders() {
|
||||||
|
preparer.deleteApkFolders(Partition.SYSTEM, VERSION_ONE, VERSION_TWO, VERSION_THREE,
|
||||||
|
NEW_PKG)
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun lowerVersion() {
|
fun lowerVersion() {
|
||||||
runForApk(VERSION_ONE)
|
runForApk(VERSION_ONE)
|
||||||
@@ -71,28 +80,28 @@ class OriginalPackageMigrationTest : BaseHostJUnit4Test() {
|
|||||||
preparer.pushApk(apk, Partition.SYSTEM)
|
preparer.pushApk(apk, Partition.SYSTEM)
|
||||||
.reboot()
|
.reboot()
|
||||||
|
|
||||||
device.getAppPackageInfo(TEST_PKG_NAME).run {
|
assertCodePath(apk)
|
||||||
assertThat(codePath).contains(apk.removeSuffix(".apk"))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure data is preserved by writing to the original dataDir
|
// Ensure data is preserved by writing to the original dataDir
|
||||||
val file = tempFolder.newFile().apply { writeText("Test") }
|
val file = tempFolder.newFile().apply { writeText("Test") }
|
||||||
device.pushFile(file, "${HostUtils.getDataDir(device, TEST_PKG_NAME)}/files/test.txt")
|
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)
|
.pushApk(NEW_PKG, Partition.SYSTEM)
|
||||||
.reboot()
|
.reboot()
|
||||||
|
|
||||||
device.getAppPackageInfo(TEST_PKG_NAME)
|
assertCodePath(NEW_PKG)
|
||||||
.run {
|
|
||||||
assertThat(this.toString()).isNotEmpty()
|
|
||||||
assertThat(codePath)
|
|
||||||
.contains(NEW_PKG.removeSuffix(".apk"))
|
|
||||||
}
|
|
||||||
|
|
||||||
// And then reading the data contents back
|
// And then reading the data contents back
|
||||||
assertThat(device.pullFileContents(
|
assertThat(device.pullFileContents(
|
||||||
"${HostUtils.getDataDir(device, TEST_PKG_NAME)}/files/test.txt"))
|
"${HostUtils.getDataDir(device, TEST_PKG_NAME)}/files/test.txt"))
|
||||||
.isEqualTo("Test")
|
.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
|
import java.nio.file.Paths
|
||||||
|
|
||||||
// Unfortunately no easy way to access PMS SystemPartitions, so mock them here
|
// 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"),
|
SYSTEM("/system/app"),
|
||||||
VENDOR("/vendor/app"),
|
VENDOR("/vendor/app"),
|
||||||
PRODUCT("/product/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.
|
* 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.
|
* 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
|
START_STOP
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user