From dc0f07a271c05fa66af5a6ecb1fa86409b7ec56b Mon Sep 17 00:00:00 2001 From: Pedro Loureiro Date: Tue, 12 Apr 2022 13:15:21 +0000 Subject: [PATCH] Create e2e test for apk-in-apex with a future minSdkVersion Apk in apex should not be installed. Test: atest ApkInApexTest Test: (test the test:) manually change AndroidManifest.xml of the app and set the min sdk version to 30. Repeat the test and the test should fail (because with min sdk version 30, the app should be installable). Bug: 208239394 Ignore-AOSP-First: feature not in AOSP yet Change-Id: I7caa31fe366b74d74f1d8e9e53d6ddd241a70751 --- .../com/android/modules/apkinapex/Android.bp | 37 +++++++++ .../modules/apkinapex/ApkInApexTest.java | 80 +++++++++++++++++++ .../android/modules/apkinapex/apex/Android.bp | 6 +- .../android/modules/apkinapex/apps/Android.bp | 36 +++++++++ .../apps/FutureMinSdkAndroidManifest.xml | 24 ++++++ .../apps/InstallableAndroidManifest.xml | 19 +++++ 6 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 javatests/com/android/modules/apkinapex/Android.bp create mode 100644 javatests/com/android/modules/apkinapex/ApkInApexTest.java create mode 100644 javatests/com/android/modules/apkinapex/apps/Android.bp create mode 100644 javatests/com/android/modules/apkinapex/apps/FutureMinSdkAndroidManifest.xml create mode 100644 javatests/com/android/modules/apkinapex/apps/InstallableAndroidManifest.xml diff --git a/javatests/com/android/modules/apkinapex/Android.bp b/javatests/com/android/modules/apkinapex/Android.bp new file mode 100644 index 0000000..39f1915 --- /dev/null +++ b/javatests/com/android/modules/apkinapex/Android.bp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +java_test_host { + name: "ApkInApexTest", + srcs: [ + "ApkInApexTest.java" + ], + libs: ["tradefed"], + java_resources: [ + ":test_com.android.modules.apkinapex", + ], + static_libs: [ + "compatibility-host-util", + "cts-install-lib-host", + "frameworks-base-hostutils", + "modules-utils-build-testing", + "truth-prebuilt", + ], +} diff --git a/javatests/com/android/modules/apkinapex/ApkInApexTest.java b/javatests/com/android/modules/apkinapex/ApkInApexTest.java new file mode 100644 index 0000000..7d688ac --- /dev/null +++ b/javatests/com/android/modules/apkinapex/ApkInApexTest.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.modules.apkinapex; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assume.assumeTrue; +import static org.junit.Assert.assertThrows; + +import com.android.modules.utils.build.testing.DeviceSdkLevel; +import com.android.tradefed.device.DeviceNotAvailableException; +import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; +import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.internal.util.test.SystemPreparer; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.RuleChain; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; + +import android.cts.install.lib.host.InstallUtilsHost; + +/** + * Collection of tests to test functionality of APKs in apexes. + * + *

This test installs an apex which contains APKs and then performs the tests. + */ +@RunWith(DeviceJUnit4ClassRunner.class) +public class ApkInApexTest extends BaseHostJUnit4Test { + + private final InstallUtilsHost mHostUtils = new InstallUtilsHost(this); + private final TemporaryFolder mTemporaryFolder = new TemporaryFolder(); + private final SystemPreparer mPreparer = new SystemPreparer(mTemporaryFolder, this::getDevice); + + @Rule + public final RuleChain ruleChain = RuleChain.outerRule(mTemporaryFolder).around(mPreparer); + + @Test + public void installApexAndRunTests() throws Exception { + if (!getDevice().isAdbRoot()) { + getDevice().enableAdbRoot(); + } + assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported()); + assumeTrue("Device requires root", getDevice().isAdbRoot()); + DeviceSdkLevel deviceSdkLevel = new DeviceSdkLevel(getDevice()); + assumeTrue("Test requires atLeastT", deviceSdkLevel.isDeviceAtLeastT()); + + String apex = "test_com.android.modules.apkinapex.apex"; + mPreparer.pushResourceFile(apex, "/system/apex/" + apex); + mPreparer.reboot(); + + assertValidApkInApexInstalled(); + assertApkInApexWithMinSdkVersionWithFutureCodenameFailed(); + } + + private void assertValidApkInApexInstalled() throws DeviceNotAvailableException { + String result = getDevice().executeShellCommand("pm list packages " + + "com.android.modules.apkinapex.apps.installable"); + assertThat(result).isNotEmpty(); + } + private void assertApkInApexWithMinSdkVersionWithFutureCodenameFailed() throws DeviceNotAvailableException { + String result = getDevice().executeShellCommand("pm list packages " + + "com.android.modules.apkinapex.apps.futureminsdk"); + assertThat(result).isEmpty(); + } +} diff --git a/javatests/com/android/modules/apkinapex/apex/Android.bp b/javatests/com/android/modules/apkinapex/apex/Android.bp index 3301d46..29c2a2c 100644 --- a/javatests/com/android/modules/apkinapex/apex/Android.bp +++ b/javatests/com/android/modules/apkinapex/apex/Android.bp @@ -30,8 +30,12 @@ android_app_certificate { apex_test { name: "test_com.android.modules.apkinapex", manifest: "manifest.json", - file_contexts: ":apex.test-file_contexts", // Default, please edit, see go/android-apex-howto + file_contexts: ":apex.test-file_contexts", key: "test_com.android.modules.apkinapex.key", certificate: ":test_com.android.modules.apkinapex.certificate", updatable: false, + apps: [ + "com.android.modules.apkinapex.apps.installable", + "com.android.modules.apkinapex.apps.futureminsdk", + ], } diff --git a/javatests/com/android/modules/apkinapex/apps/Android.bp b/javatests/com/android/modules/apkinapex/apps/Android.bp new file mode 100644 index 0000000..c538cef --- /dev/null +++ b/javatests/com/android/modules/apkinapex/apps/Android.bp @@ -0,0 +1,36 @@ +// Copyright (C) 2022 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +android_test_helper_app { + name: "com.android.modules.apkinapex.apps.futureminsdk", + target_sdk_version: "Tiramisu", + + // min sdk is overridden in the AndroidManifest.xml - but it is required to have a value here + // so the build system uses the value from the manifest! + min_sdk_version: "23", + apex_available: [ "test_com.android.modules.apkinapex" ], + manifest: "FutureMinSdkAndroidManifest.xml" +} + +android_test_helper_app { + name: "com.android.modules.apkinapex.apps.installable", + target_sdk_version: "Tiramisu", + min_sdk_version: "23", + apex_available: [ "test_com.android.modules.apkinapex" ], + manifest: "InstallableAndroidManifest.xml" +} diff --git a/javatests/com/android/modules/apkinapex/apps/FutureMinSdkAndroidManifest.xml b/javatests/com/android/modules/apkinapex/apps/FutureMinSdkAndroidManifest.xml new file mode 100644 index 0000000..0dd97db --- /dev/null +++ b/javatests/com/android/modules/apkinapex/apps/FutureMinSdkAndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/javatests/com/android/modules/apkinapex/apps/InstallableAndroidManifest.xml b/javatests/com/android/modules/apkinapex/apps/InstallableAndroidManifest.xml new file mode 100644 index 0000000..ee8ef92 --- /dev/null +++ b/javatests/com/android/modules/apkinapex/apps/InstallableAndroidManifest.xml @@ -0,0 +1,19 @@ + + + +