Merge "Make EphemeralTest test apks target API 26" into pi-dev-plus-aosp
diff --git a/apps/CtsVerifier/Android.mk b/apps/CtsVerifier/Android.mk
index 98b95f4..2bbf66c 100644
--- a/apps/CtsVerifier/Android.mk
+++ b/apps/CtsVerifier/Android.mk
@@ -81,6 +81,7 @@
LOCAL_MODULE := cts-verifier-framework
LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages android.support.v4
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 19
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_SRC_FILES := \
$(call java-files-in, src/com/android/cts/verifier) \
diff --git a/apps/CtsVerifierUSBCompanion/Android.mk b/apps/CtsVerifierUSBCompanion/Android.mk
index 2e08142..c505b13 100644
--- a/apps/CtsVerifierUSBCompanion/Android.mk
+++ b/apps/CtsVerifierUSBCompanion/Android.mk
@@ -28,6 +28,7 @@
LOCAL_PACKAGE_NAME := CtsVerifierUSBCompanion
LOCAL_SDK_VERSION := 25
+#LOCAL_MIN_SDK_VERSION := 12
LOCAL_DEX_PREOPT := false
diff --git a/apps/EmptyDeviceAdmin/Android.mk b/apps/EmptyDeviceAdmin/Android.mk
index 1d68fbb..ec4c4a3 100644
--- a/apps/EmptyDeviceAdmin/Android.mk
+++ b/apps/EmptyDeviceAdmin/Android.mk
@@ -27,6 +27,7 @@
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 12
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/apps/EmptyDeviceOwner/Android.mk b/apps/EmptyDeviceOwner/Android.mk
index 714e996..0d85bb7 100644
--- a/apps/EmptyDeviceOwner/Android.mk
+++ b/apps/EmptyDeviceOwner/Android.mk
@@ -27,6 +27,7 @@
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 12
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/apps/NotificationBot/Android.mk b/apps/NotificationBot/Android.mk
index 9d9c9f9..8a89b1a 100644
--- a/apps/NotificationBot/Android.mk
+++ b/apps/NotificationBot/Android.mk
@@ -28,6 +28,7 @@
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 19
LOCAL_DEX_PREOPT := false
diff --git a/apps/PermissionApp/Android.mk b/apps/PermissionApp/Android.mk
index cf4186d..026c803 100644
--- a/apps/PermissionApp/Android.mk
+++ b/apps/PermissionApp/Android.mk
@@ -27,6 +27,7 @@
LOCAL_PACKAGE_NAME := CtsPermissionApp
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 23
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := arcts cts vts general-tests
diff --git a/apps/VpnApp/api23/Android.mk b/apps/VpnApp/api23/Android.mk
index e25cb91..67fbf6b 100755
--- a/apps/VpnApp/api23/Android.mk
+++ b/apps/VpnApp/api23/Android.mk
@@ -27,6 +27,7 @@
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/../res
#LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 22
LOCAL_PRIVATE_PLATFORM_APIS := true
# tag this module as a cts test artifact
diff --git a/apps/VpnApp/api24/Android.mk b/apps/VpnApp/api24/Android.mk
index ec36333..7d03f16 100755
--- a/apps/VpnApp/api24/Android.mk
+++ b/apps/VpnApp/api24/Android.mk
@@ -27,6 +27,7 @@
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/../res
#LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 22
LOCAL_PRIVATE_PLATFORM_APIS := true
# tag this module as a cts test artifact
diff --git a/apps/VpnApp/latest/Android.mk b/apps/VpnApp/latest/Android.mk
index 0431bef..317d8b0 100755
--- a/apps/VpnApp/latest/Android.mk
+++ b/apps/VpnApp/latest/Android.mk
@@ -27,6 +27,7 @@
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/../res
#LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 22
LOCAL_PRIVATE_PLATFORM_APIS := true
# tag this module as a cts test artifact
diff --git a/apps/VpnApp/notalwayson/Android.mk b/apps/VpnApp/notalwayson/Android.mk
index 06731f8..799056a 100755
--- a/apps/VpnApp/notalwayson/Android.mk
+++ b/apps/VpnApp/notalwayson/Android.mk
@@ -27,6 +27,7 @@
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/../res
#LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 22
LOCAL_PRIVATE_PLATFORM_APIS := true
# tag this module as a cts test artifact
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java
index 72958fe..d8a280e 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java
@@ -25,6 +25,8 @@
import static org.junit.Assert.fail;
+import android.platform.test.annotations.AppModeFull;
+
import com.android.tradefed.device.CollectingOutputReceiver;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
@@ -42,6 +44,7 @@
* Set of tests that verify behavior of adopted storage media, if supported.
*/
@RunWith(DeviceJUnit4ClassRunner.class)
+@AppModeFull(reason = "Instant applications can only be installed on internal storage")
public class AdoptableHostTest extends BaseHostJUnit4Test {
public static final String FEATURE_ADOPTABLE_STORAGE = "feature:android.software.adoptable_storage";
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/AppSecurityTests.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/AppSecurityTests.java
index 02e62d3..1754dcd 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/AppSecurityTests.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/AppSecurityTests.java
@@ -16,31 +16,24 @@
package android.appsecurity.cts;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.AppModeInstant;
import com.android.ddmlib.Log;
-import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
-import com.android.tradefed.util.AbiUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.io.File;
-import java.io.FileNotFoundException;
-
/**
* Set of tests that verify various security checks involving multiple apps are
* properly enforced.
*/
@RunWith(DeviceJUnit4ClassRunner.class)
-public class AppSecurityTests extends BaseHostJUnit4Test {
+public class AppSecurityTests extends BaseAppSecurityTest {
// testSharedUidDifferentCerts constants
private static final String SHARED_UI_APK = "CtsSharedUidInstall.apk";
@@ -71,7 +64,9 @@
private static final String TARGET_INSTRUMENT_PKG = "com.android.cts.targetinstrumentationapp";
private static final String INSTRUMENT_DIFF_CERT_APK = "CtsInstrumentationAppDiffCert.apk";
private static final String INSTRUMENT_DIFF_CERT_PKG =
- "com.android.cts.instrumentationdiffcertapp";
+ "com.android.cts.instrumentationdiffcertapp";
+ private static final String INSTRUMENT_DIFF_CERT_CLASS =
+ "com.android.cts.instrumentationdiffcertapp.InstrumentationFailToRunTest";
// testPermissionDiffCert constants
private static final String DECLARE_PERMISSION_APK = "CtsPermissionDeclareApp.apk";
@@ -85,11 +80,6 @@
private static final String LOG_TAG = "AppSecurityTests";
- private File getTestAppFile(String fileName) throws FileNotFoundException {
- CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(getBuild());
- return buildHelper.getTestFile(fileName);
- }
-
@Before
public void setUp() throws Exception {
Utils.prepareSingleUser(getDevice());
@@ -101,24 +91,16 @@
* if it is signed with a different certificate.
*/
@Test
+ @AppModeFull(reason = "Instant applications can't define shared UID")
public void testSharedUidDifferentCerts() throws Exception {
Log.i(LOG_TAG, "installing apks with shared uid, but different certs");
try {
- // cleanup test apps that might be installed from previous partial test run
getDevice().uninstallPackage(SHARED_UI_PKG);
getDevice().uninstallPackage(SHARED_UI_DIFF_CERT_PKG);
- String[] options = {AbiUtils.createAbiFlag(getAbi().getName())};
- String installResult = getDevice().installPackage(getTestAppFile(SHARED_UI_APK),
- false, options);
- assertNull(String.format("failed to install shared uid app, Reason: %s", installResult),
- installResult);
- installResult = getDevice().installPackage(getTestAppFile(SHARED_UI_DIFF_CERT_APK),
- false, options);
- assertNotNull("shared uid app with different cert than existing app installed " +
- "successfully", installResult);
- assertEquals("INSTALL_FAILED_SHARED_USER_INCOMPATIBLE",
- installResult.substring(0, installResult.indexOf(':')));
+ new InstallMultiple().addApk(SHARED_UI_APK).run();
+ new InstallMultiple().addApk(SHARED_UI_DIFF_CERT_APK)
+ .runExpectingFailure("INSTALL_FAILED_SHARED_USER_INCOMPATIBLE");
} finally {
getDevice().uninstallPackage(SHARED_UI_PKG);
getDevice().uninstallPackage(SHARED_UI_DIFF_CERT_PKG);
@@ -130,25 +112,27 @@
* certificate.
*/
@Test
- public void testAppUpgradeDifferentCerts() throws Exception {
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testAppUpgradeDifferentCerts_full() throws Exception {
+ testAppUpgradeDifferentCerts(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testAppUpgradeDifferentCerts_instant() throws Exception {
+ testAppUpgradeDifferentCerts(true);
+ }
+ private void testAppUpgradeDifferentCerts(boolean instant) throws Exception {
Log.i(LOG_TAG, "installing app upgrade with different certs");
try {
- // cleanup test app that might be installed from previous partial test run
getDevice().uninstallPackage(SIMPLE_APP_PKG);
+ getDevice().uninstallPackage(SIMPLE_APP_DIFF_CERT_APK);
- String[] options = {AbiUtils.createAbiFlag(getAbi().getName())};
- String installResult = getDevice().installPackage(getTestAppFile(SIMPLE_APP_APK),
- false, options);
- assertNull(String.format("failed to install simple app. Reason: %s", installResult),
- installResult);
- installResult = getDevice().installPackage(getTestAppFile(SIMPLE_APP_DIFF_CERT_APK),
- true /* reinstall */, options);
- assertNotNull("app upgrade with different cert than existing app installed " +
- "successfully", installResult);
- assertEquals("INSTALL_FAILED_UPDATE_INCOMPATIBLE",
- installResult.substring(0, installResult.indexOf(':')));
+ new InstallMultiple(instant).addApk(SIMPLE_APP_APK).run();
+ new InstallMultiple(instant).addApk(SIMPLE_APP_DIFF_CERT_APK)
+ .runExpectingFailure("INSTALL_FAILED_UPDATE_INCOMPATIBLE");
} finally {
getDevice().uninstallPackage(SIMPLE_APP_PKG);
+ getDevice().uninstallPackage(SIMPLE_APP_DIFF_CERT_APK);
}
}
@@ -156,27 +140,27 @@
* Test that an app cannot access another app's private data.
*/
@Test
- public void testAppFailAccessPrivateData() throws Exception {
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testAppFailAccessPrivateData_full() throws Exception {
+ testAppFailAccessPrivateData(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testAppFailAccessPrivateData_instant() throws Exception {
+ testAppFailAccessPrivateData(true);
+ }
+ private void testAppFailAccessPrivateData(boolean instant)
+ throws Exception {
Log.i(LOG_TAG, "installing app that attempts to access another app's private data");
try {
- // cleanup test app that might be installed from previous partial test run
getDevice().uninstallPackage(APP_WITH_DATA_PKG);
getDevice().uninstallPackage(APP_ACCESS_DATA_PKG);
- String[] options = {AbiUtils.createAbiFlag(getAbi().getName())};
- String installResult = getDevice().installPackage(getTestAppFile(APP_WITH_DATA_APK),
- false, options);
- assertNull(String.format("failed to install app with data. Reason: %s", installResult),
- installResult);
- // run appwithdata's tests to create private data
+ new InstallMultiple().addApk(APP_WITH_DATA_APK).run();
runDeviceTests(APP_WITH_DATA_PKG, APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD);
- installResult = getDevice().installPackage(getTestAppFile(APP_ACCESS_DATA_APK),
- false, options);
- assertNull(String.format("failed to install app access data. Reason: %s",
- installResult), installResult);
- // run appaccessdata's tests which attempt to access appwithdata's private data
- runDeviceTests(APP_ACCESS_DATA_PKG);
+ new InstallMultiple(instant).addApk(APP_ACCESS_DATA_APK).run();
+ runDeviceTests(APP_ACCESS_DATA_PKG, null, null, instant);
} finally {
getDevice().uninstallPackage(APP_WITH_DATA_PKG);
getDevice().uninstallPackage(APP_ACCESS_DATA_PKG);
@@ -187,29 +171,29 @@
* Test that uninstall of an app removes its private data.
*/
@Test
- public void testUninstallRemovesData() throws Exception {
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testUninstallRemovesData_full() throws Exception {
+ testUninstallRemovesData(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testUninstallRemovesData_instant() throws Exception {
+ testUninstallRemovesData(true);
+ }
+ private void testUninstallRemovesData(boolean instant) throws Exception {
Log.i(LOG_TAG, "Uninstalling app, verifying data is removed.");
try {
- // cleanup test app that might be installed from previous partial test run
getDevice().uninstallPackage(APP_WITH_DATA_PKG);
- String[] options = {AbiUtils.createAbiFlag(getAbi().getName())};
- String installResult = getDevice().installPackage(getTestAppFile(APP_WITH_DATA_APK),
- false, options);
- assertNull(String.format("failed to install app with data. Reason: %s", installResult),
- installResult);
- // run appwithdata's tests to create private data
- runDeviceTests(APP_WITH_DATA_PKG, APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD);
+ new InstallMultiple(instant).addApk(APP_WITH_DATA_APK).run();
+ runDeviceTests(
+ APP_WITH_DATA_PKG, APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD);
getDevice().uninstallPackage(APP_WITH_DATA_PKG);
- installResult = getDevice().installPackage(getTestAppFile(APP_WITH_DATA_APK),
- false, options);
- assertNull(String.format("failed to install app with data second time. Reason: %s",
- installResult), installResult);
- // run appwithdata's 'check if file exists' test
- runDeviceTests(APP_WITH_DATA_PKG, APP_WITH_DATA_CLASS,
- APP_WITH_DATA_CHECK_NOEXIST_METHOD);
+ new InstallMultiple(instant).addApk(APP_WITH_DATA_APK).run();
+ runDeviceTests(
+ APP_WITH_DATA_PKG, APP_WITH_DATA_CLASS, APP_WITH_DATA_CHECK_NOEXIST_METHOD);
} finally {
getDevice().uninstallPackage(APP_WITH_DATA_PKG);
}
@@ -219,29 +203,35 @@
* Test that an app cannot instrument another app that is signed with different certificate.
*/
@Test
- public void testInstrumentationDiffCert() throws Exception {
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstrumentationDiffCert_full() throws Exception {
+ testInstrumentationDiffCert(false, false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstrumentationDiffCert_instant() throws Exception {
+ testInstrumentationDiffCert(false, true);
+ testInstrumentationDiffCert(true, false);
+ testInstrumentationDiffCert(true, true);
+ }
+ private void testInstrumentationDiffCert(boolean targetInstant, boolean instrumentInstant)
+ throws Exception {
Log.i(LOG_TAG, "installing app that attempts to instrument another app");
try {
// cleanup test app that might be installed from previous partial test run
getDevice().uninstallPackage(TARGET_INSTRUMENT_PKG);
getDevice().uninstallPackage(INSTRUMENT_DIFF_CERT_PKG);
- String[] options = {AbiUtils.createAbiFlag(getAbi().getName())};
- String installResult = getDevice().installPackage(
- getTestAppFile(TARGET_INSTRUMENT_APK), false, options);
- assertNull(String.format("failed to install target instrumentation app. Reason: %s",
- installResult), installResult);
+ new InstallMultiple(targetInstant).addApk(TARGET_INSTRUMENT_APK).run();
+ new InstallMultiple(instrumentInstant).addApk(INSTRUMENT_DIFF_CERT_APK).run();
- // the app will install, but will get error at runtime when starting instrumentation
- installResult = getDevice().installPackage(getTestAppFile(INSTRUMENT_DIFF_CERT_APK),
- false, options);
- assertNull(String.format(
- "failed to install instrumentation app with diff cert. Reason: %s",
- installResult), installResult);
- // run INSTRUMENT_DIFF_CERT_PKG tests
- // this test will attempt to call startInstrumentation directly and verify
- // SecurityException is thrown
- runDeviceTests(INSTRUMENT_DIFF_CERT_PKG);
+ // if we've installed either the instrumentation or target as an instant application,
+ // starting an instrumentation will just fail instead of throwing a security exception
+ // because neither the target nor instrumentation packages can see one another
+ final String methodName = (targetInstant|instrumentInstant)
+ ? "testInstrumentationNotAllowed_fail"
+ : "testInstrumentationNotAllowed_exception";
+ runDeviceTests(INSTRUMENT_DIFF_CERT_PKG, INSTRUMENT_DIFF_CERT_CLASS, methodName);
} finally {
getDevice().uninstallPackage(TARGET_INSTRUMENT_PKG);
getDevice().uninstallPackage(INSTRUMENT_DIFF_CERT_PKG);
@@ -253,6 +243,7 @@
* certificate than the app that declared the permission.
*/
@Test
+ @AppModeFull(reason = "Only the platform can define permissions obtainable by instant applications")
public void testPermissionDiffCert() throws Exception {
Log.i(LOG_TAG, "installing app that attempts to use permission of another app");
try {
@@ -261,24 +252,11 @@
getDevice().uninstallPackage(DECLARE_PERMISSION_COMPAT_PKG);
getDevice().uninstallPackage(PERMISSION_DIFF_CERT_PKG);
- String[] options = {AbiUtils.createAbiFlag(getAbi().getName())};
- String installResult = getDevice().installPackage(
- getTestAppFile(DECLARE_PERMISSION_APK), false, options);
- assertNull(String.format("failed to install declare permission app. Reason: %s",
- installResult), installResult);
+ new InstallMultiple().addApk(DECLARE_PERMISSION_APK).run();
+ new InstallMultiple().addApk(DECLARE_PERMISSION_COMPAT_APK).run();
- installResult = getDevice().installPackage(
- getTestAppFile(DECLARE_PERMISSION_COMPAT_APK), false, options);
- assertNull(String.format("failed to install declare permission compat app. Reason: %s",
- installResult), installResult);
-
- // the app will install, but will get error at runtime
- installResult = getDevice().installPackage(getTestAppFile(PERMISSION_DIFF_CERT_APK),
- false, options);
- assertNull(String.format("failed to install permission app with diff cert. Reason: %s",
- installResult), installResult);
- // run PERMISSION_DIFF_CERT_PKG tests which try to access the permission
- runDeviceTests(PERMISSION_DIFF_CERT_PKG);
+ new InstallMultiple().addApk(PERMISSION_DIFF_CERT_APK).run();
+ runDeviceTests(PERMISSION_DIFF_CERT_PKG, null);
} finally {
getDevice().uninstallPackage(DECLARE_PERMISSION_PKG);
getDevice().uninstallPackage(DECLARE_PERMISSION_COMPAT_PKG);
@@ -290,13 +268,20 @@
* Tests that an arbitrary file cannot be installed using the 'cmd' command.
*/
@Test
- public void testAdbInstallFile() throws Exception {
- String output = getDevice().executeShellCommand(
- "cmd package install -S 1024 /data/local/tmp/foo.apk");
- assertTrue("Error text", output.contains("Error"));
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testAdbInstallFile_full() throws Exception {
+ testAdbInstallFile(false);
}
-
- private void runDeviceTests(String packageName) throws DeviceNotAvailableException {
- runDeviceTests(packageName, null);
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testAdbInstallFile_instant() throws Exception {
+ testAdbInstallFile(true);
+ }
+ private void testAdbInstallFile(boolean instant) throws Exception {
+ String output = getDevice().executeShellCommand(
+ "cmd package install"
+ + (instant ? " --instant" : " --full")
+ + " -S 1024 /data/local/tmp/foo.apk");
+ assertTrue("Error text", output.contains("Error"));
}
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/BaseAppSecurityTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/BaseAppSecurityTest.java
index 5e2a97b..822edce 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/BaseAppSecurityTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/BaseAppSecurityTest.java
@@ -16,7 +16,6 @@
package android.appsecurity.cts;
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
@@ -24,6 +23,7 @@
import org.junit.Before;
import java.util.ArrayList;
+import java.util.HashMap;
/**
* Base class.
@@ -38,7 +38,7 @@
private ArrayList<Integer> mFixedUsers;
@Before
- public void setUp() throws Exception {
+ public void setUpBaseAppSecurityTest() throws Exception {
Assert.assertNotNull(getBuild()); // ensure build has been set before test is run.
mSupportsMultiUser = getDevice().getMaxNumberOfUsersSupported() > 1;
@@ -52,7 +52,7 @@
getDevice().switchUser(mPrimaryUserId);
}
- private boolean checkIfSplitSystemUser() throws DeviceNotAvailableException {
+ private boolean checkIfSplitSystemUser() throws Exception {
final String commandOuput = getDevice().executeShellCommand(
"getprop ro.fw.system_user_split");
return "y".equals(commandOuput) || "yes".equals(commandOuput)
@@ -61,19 +61,48 @@
}
protected void installTestAppForUser(String apk, int userId) throws Exception {
+ installTestAppForUser(apk, false, userId);
+ }
+
+ protected void installTestAppForUser(String apk, boolean instant, int userId) throws Exception {
if (userId < 0) {
userId = mPrimaryUserId;
}
- CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(getBuild());
- Assert.assertNull(getDevice().installPackageForUser(
- buildHelper.getTestFile(apk), true, false, userId, "-t"));
+ new InstallMultiple(instant)
+ .addApk(apk)
+ .allowTest()
+ .forUser(userId)
+ .run();
+ }
+
+ // TODO: We should be able to set test arguments from the BaseHostJUnit4Test methods
+ protected void runDeviceTests(String packageName, String testClassName,
+ String testMethodName, boolean instant) throws DeviceNotAvailableException {
+ final HashMap<String, String> testArgs;
+ if (instant) {
+ testArgs = new HashMap<>();
+ testArgs.put("is_instant", Boolean.TRUE.toString());
+ } else {
+ testArgs = null;
+ }
+ Utils.runDeviceTests(getDevice(), packageName, testClassName, testMethodName, testArgs);
}
protected boolean isAppVisibleForUser(String packageName, int userId,
- boolean matchUninstalled) throws DeviceNotAvailableException {
+ boolean matchUninstalled) throws Exception {
String command = "cmd package list packages --user " + userId;
if (matchUninstalled) command += " -u";
String output = getDevice().executeShellCommand(command);
return output.contains(packageName);
}
+
+ protected class InstallMultiple extends BaseInstallMultiple<InstallMultiple> {
+ public InstallMultiple() {
+ this(false);
+ }
+ public InstallMultiple(boolean instant) {
+ super(getDevice(), getBuild(), getAbi());
+ addArg(instant ? "--instant" : "");
+ }
+ }
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/BaseInstallMultiple.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/BaseInstallMultiple.java
index cc87584..b403f37 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/BaseInstallMultiple.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/BaseInstallMultiple.java
@@ -78,6 +78,11 @@
return (T) this;
}
+ T allowTest() {
+ addArg("-t");
+ return (T) this;
+ }
+
T locationAuto() {
addArg("--install-location 0");
return (T) this;
@@ -98,15 +103,24 @@
return (T) this;
}
+ T forUser(int userId) {
+ addArg("--user " + userId);
+ return (T) this;
+ }
+
void run() throws DeviceNotAvailableException {
- run(true);
+ run(true, null);
}
void runExpectingFailure() throws DeviceNotAvailableException {
- run(false);
+ run(false, null);
}
- private void run(boolean expectingSuccess) throws DeviceNotAvailableException {
+ void runExpectingFailure(String failure) throws DeviceNotAvailableException {
+ run(false, failure);
+ }
+
+ private void run(boolean expectingSuccess, String failure) throws DeviceNotAvailableException {
final ITestDevice device = mDevice;
// Create an install session
@@ -159,11 +173,15 @@
cmd.append("pm install-commit");
cmd.append(' ').append(sessionId);
- result = device.executeShellCommand(cmd.toString());
- if (expectingSuccess) {
- TestCase.assertTrue(result, result.startsWith("Success"));
+ result = device.executeShellCommand(cmd.toString()).trim();
+ if (failure == null) {
+ if (expectingSuccess) {
+ TestCase.assertTrue(result, result.startsWith("Success"));
+ } else {
+ TestCase.assertFalse(result, result.startsWith("Success"));
+ }
} else {
- TestCase.assertFalse(result, result.startsWith("Success"));
+ TestCase.assertTrue(result, result.contains(failure));
}
}
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/ClassloaderSplitsTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/ClassloaderSplitsTest.java
deleted file mode 100644
index f4f6d9e..0000000
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/ClassloaderSplitsTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2017 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 android.appsecurity.cts;
-
-import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.IBuildReceiver;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(DeviceJUnit4ClassRunner.class)
-public class ClassloaderSplitsTest extends BaseHostJUnit4Test implements IBuildReceiver {
- private static final String PKG = "com.android.cts.classloadersplitapp";
- private static final String TEST_CLASS = PKG + ".SplitAppTest";
-
- /* The feature hierarchy looks like this:
-
- APK_BASE (PathClassLoader)
- ^
- |
- APK_FEATURE_A (DelegateLastClassLoader)
- ^
- |
- APK_FEATURE_B (PathClassLoader)
-
- */
-
- private static final String APK_BASE = "CtsClassloaderSplitApp.apk";
- private static final String APK_FEATURE_A = "CtsClassloaderSplitAppFeatureA.apk";
- private static final String APK_FEATURE_B = "CtsClassloaderSplitAppFeatureB.apk";
-
- @Before
- public void setUp() throws Exception {
- Utils.prepareSingleUser(getDevice());
- getDevice().uninstallPackage(PKG);
- }
-
- @After
- public void tearDown() throws Exception {
- getDevice().uninstallPackage(PKG);
- }
-
- @Test
- public void testBaseClassLoader() throws Exception {
- new InstallMultiple().addApk(APK_BASE).run();
- runDeviceTests(getDevice(), PKG, TEST_CLASS, "testBaseClassLoader");
- }
-
- @Test
- public void testFeatureAClassLoader() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_FEATURE_A).run();
- runDeviceTests(getDevice(), PKG, TEST_CLASS, "testBaseClassLoader");
- runDeviceTests(getDevice(), PKG, TEST_CLASS, "testFeatureAClassLoader");
- }
-
- @Test
- public void testFeatureBClassLoader() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B).run();
- runDeviceTests(getDevice(), PKG, TEST_CLASS, "testBaseClassLoader");
- runDeviceTests(getDevice(), PKG, TEST_CLASS, "testFeatureAClassLoader");
- runDeviceTests(getDevice(), PKG, TEST_CLASS, "testFeatureBClassLoader");
- }
-
- @Test
- public void testReceiverClassLoaders() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B).run();
- runDeviceTests(getDevice(), PKG, TEST_CLASS, "testBaseClassLoader");
- runDeviceTests(getDevice(), PKG, TEST_CLASS, "testAllReceivers");
- }
-
- private class InstallMultiple extends BaseInstallMultiple<InstallMultiple> {
- public InstallMultiple() {
- super(getDevice(), getBuild(), null);
- }
- }
-}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/CorruptApkTests.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/CorruptApkTests.java
index d09c525..eec0878 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/CorruptApkTests.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/CorruptApkTests.java
@@ -15,15 +15,11 @@
*/
package android.appsecurity.cts;
-import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import android.platform.test.annotations.AppModeFull;
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.result.InputStreamSource;
-import com.android.tradefed.testtype.DeviceTestCase;
-import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.util.FileUtil;
import org.junit.After;
@@ -35,104 +31,81 @@
* Set of tests that verify that corrupt APKs are properly rejected by PackageManager and
* do not cause the system to crash.
*/
-@AppModeFull // TODO: Needs porting to instant
-public class CorruptApkTests extends DeviceTestCase implements IBuildReceiver {
+@AppModeFull(reason = "the corrupt APKs were provided as-is and we cannot modify them to comply with instant mode")
+public class CorruptApkTests extends BaseAppSecurityTest {
private final String B71360999_PKG = "com.android.appsecurity.b71360999";
private final String B71361168_PKG = "com.android.appsecurity.b71361168";
private final String B79488511_PKG = "com.android.appsecurity.b79488511";
- private IBuildInfo mBuildInfo;
-
- @Override
- public void setBuild(IBuildInfo buildInfo) {
- mBuildInfo = buildInfo;
- }
-
+ private final String B71360999_APK = "CtsCorruptApkTests_b71360999.apk";
+ private final String B71361168_APK = "CtsCorruptApkTests_b71361168.apk";
+ private final String B79488511_APK = "CtsCorruptApkTests_b79488511.apk";
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
- uninstall(B71360999_PKG);
- uninstall(B71361168_PKG);
- uninstall(B79488511_PKG);
+ getDevice().uninstallPackage(B71360999_PKG);
+ getDevice().uninstallPackage(B71361168_PKG);
+ getDevice().uninstallPackage(B79488511_PKG);
}
@After
- @Override
public void tearDown() throws Exception {
- super.tearDown();
- uninstall(B71360999_PKG);
- uninstall(B71361168_PKG);
- uninstall(B79488511_PKG);
- }
-
- /** Uninstall the apk if the test failed previously. */
- public void uninstall(String pkg) throws Exception {
- ITestDevice device = getDevice();
- if (device.getInstalledPackageNames().contains(pkg)) {
- device.uninstallPackage(pkg);
- }
+ getDevice().uninstallPackage(B71360999_PKG);
+ getDevice().uninstallPackage(B71361168_PKG);
+ getDevice().uninstallPackage(B79488511_PKG);
}
/**
* Tests that apks described in b/71360999 do not install successfully.
*/
public void testFailToInstallCorruptStringPoolHeader_b71360999() throws Exception {
- final String APK_PATH = "CtsCorruptApkTests_b71360999.apk";
- assertInstallNoFatalError(APK_PATH, B71360999_PKG);
+ if (getDevice().getApiLevel() < 28) {
+ return;
+ }
+ assertInstallWithoutFatalError(B71360999_APK, B71360999_PKG);
}
/**
* Tests that apks described in b/71361168 do not install successfully.
*/
public void testFailToInstallCorruptStringPoolHeader_b71361168() throws Exception {
- final String APK_PATH = "CtsCorruptApkTests_b71361168.apk";
- assertInstallNoFatalError(APK_PATH, B71361168_PKG);
+ if (getDevice().getApiLevel() < 28) {
+ return;
+ }
+ assertInstallWithoutFatalError(B71361168_APK, B71361168_PKG);
}
/**
* Tests that apks described in b/79488511 do not install successfully.
*/
public void testFailToInstallCorruptStringPoolHeader_b79488511() throws Exception {
- final String APK_PATH = "CtsCorruptApkTests_b79488511.apk";
- assertInstallNoFatalError(APK_PATH, B79488511_PKG);
+ if (getDevice().getApiLevel() < 28) {
+ return;
+ }
+ assertInstallWithoutFatalError(B79488511_APK, B79488511_PKG);
}
/**
- * Assert that installing the app does not cause a native error caused by a buffer overflow
- * or an out-of-bounds read.
- **/
- private void assertInstallNoFatalError(String filename, String pkg) throws Exception {
- ITestDevice device = getDevice();
- device.clearLogcat();
+ * Asserts that installing the application does not cause a native error [typically
+ * the result of a buffer overflow or an out-of-bounds read].
+ */
+ private void assertInstallWithoutFatalError(String apk, String pkg) throws Exception {
+ getDevice().clearLogcat();
- final String result = device.installPackage(
- new CompatibilityBuildHelper(mBuildInfo).getTestFile(filename),
- true /*reinstall*/);
-
- // Starting from P, corrupt apks should always fail to install
- if (device.getApiLevel() >= 28) {
- assertThat(result).isNotNull();
- assertThat(result).isNotEmpty();
- assertThat(device.getInstalledPackageNames()).doesNotContain(pkg);
- }
+ new InstallMultiple().addApk(apk).runExpectingFailure();
// This catches if the device fails to install the app because a segmentation fault
// or out of bounds read created by the bug occurs
- File tmpTxtFile = null;
- InputStreamSource source = device.getLogcat(200 * 1024);
+ final File tmpTxtFile = FileUtil.createTempFile("logcat", ".txt");
+ final InputStreamSource source = getDevice().getLogcat(200 * 1024);
try {
assertNotNull(source);
- tmpTxtFile = FileUtil.createTempFile("logcat", ".txt");
FileUtil.writeToFile(source.createInputStream(), tmpTxtFile);
- String s = FileUtil.readStringFromFile(tmpTxtFile);
+ final String s = FileUtil.readStringFromFile(tmpTxtFile);
assertFalse(s.contains("SIGSEGV"));
assertFalse(s.contains("==ERROR"));
} finally {
source.close();
- if (tmpTxtFile != null) {
- FileUtil.deleteFile(tmpTxtFile);
- }
+ FileUtil.deleteFile(tmpTxtFile);
}
}
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/EphemeralTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/EphemeralTest.java
index cdc412a..37a06d4 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/EphemeralTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/EphemeralTest.java
@@ -16,6 +16,7 @@
package android.appsecurity.cts;
+import android.platform.test.annotations.AppModeFull;
import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
@@ -33,6 +34,7 @@
/**
* Tests for ephemeral packages.
*/
+@AppModeFull(reason = "Already handles instant installs when needed")
public class EphemeralTest extends DeviceTestCase
implements IAbiReceiver, IBuildReceiver {
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantAppUserTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantAppUserTest.java
index 4609e8a..a22ee80 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantAppUserTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantAppUserTest.java
@@ -16,6 +16,7 @@
package android.appsecurity.cts;
+import android.platform.test.annotations.AppModeFull;
import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
@@ -29,6 +30,7 @@
/**
* Tests for ephemeral packages.
*/
+@AppModeFull(reason = "Already handles instant installs when needed")
public class InstantAppUserTest extends DeviceTestCase
implements IAbiReceiver, IBuildReceiver {
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantCookieHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantCookieHostTest.java
index 97658eb..a02edb8 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantCookieHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantCookieHostTest.java
@@ -16,6 +16,7 @@
package android.appsecurity.cts;
+import android.platform.test.annotations.AppModeFull;
import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
@@ -25,6 +26,7 @@
/**
* Tests for the instant cookie APIs
*/
+@AppModeFull(reason = "Already handles instant installs when needed")
public class InstantCookieHostTest extends DeviceTestCase implements IBuildReceiver {
private static final String INSTANT_COOKIE_APP_APK = "CtsInstantCookieApp.apk";
private static final String INSTANT_COOKIE_APP_PKG = "test.instant.cookie";
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/IsolatedSplitsTests.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/IsolatedSplitsTests.java
index 8795fe8..3bc1654 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/IsolatedSplitsTests.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/IsolatedSplitsTests.java
@@ -15,11 +15,17 @@
*/
package android.appsecurity.cts;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.testtype.DeviceTestCase;
-import com.android.tradefed.testtype.IBuildReceiver;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.AppModeInstant;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-public class IsolatedSplitsTests extends DeviceTestCase implements IBuildReceiver {
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(DeviceJUnit4ClassRunner.class)
+public class IsolatedSplitsTests extends BaseAppSecurityTest {
private static final String PKG = "com.android.cts.isolatedsplitapp";
private static final String TEST_CLASS = PKG + ".SplitAppTest";
@@ -38,68 +44,129 @@
private static final String APK_FEATURE_C = "CtsIsolatedSplitAppFeatureC.apk";
private static final String APK_FEATURE_C_pl = "CtsIsolatedSplitAppFeatureC_pl.apk";
- private IBuildInfo mBuildInfo;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
+ @Before
+ public void setUp() throws Exception {
Utils.prepareSingleUser(getDevice());
getDevice().uninstallPackage(PKG);
}
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
+ @After
+ public void tearDown() throws Exception {
getDevice().uninstallPackage(PKG);
}
- public void testInstallBase() throws Exception {
- new InstallMultiple().addApk(APK_BASE).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstallBase_full() throws Exception {
+ testInstallBase(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstallBase_instant() throws Exception {
+ testInstallBase(true);
+ }
+ private void testInstallBase(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_BASE).run();
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadDefault");
}
- public void testInstallBaseAndConfigSplit() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_BASE_pl).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstallBaseAndConfigSplit_full() throws Exception {
+ testInstallBaseAndConfigSplit(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstallBaseAndConfigSplit_instant() throws Exception {
+ testInstallBaseAndConfigSplit(true);
+ }
+ private void testInstallBaseAndConfigSplit(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_BASE).addApk(APK_BASE_pl).run();
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadPolishLocale");
}
- public void testInstallMissingDependency() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_FEATURE_B).runExpectingFailure();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstallMissingDependency_full() throws Exception {
+ testInstallMissingDependency(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstallMissingDependency_instant() throws Exception {
+ testInstallMissingDependency(true);
+ }
+ private void testInstallMissingDependency(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_BASE).addApk(APK_FEATURE_B).runExpectingFailure();
}
- public void testInstallOneFeatureSplit() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_FEATURE_A).run();
+ @Test
+ @AppModeFull(reason = "b/109878606; instant applications can't send broadcasts to manifest receivers")
+ public void testInstallOneFeatureSplit_full() throws Exception {
+ testInstallOneFeatureSplit(false);
+ }
+ private void testInstallOneFeatureSplit(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_BASE).addApk(APK_FEATURE_A).run();
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadDefault");
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureADefault");
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureAReceivers");
}
- public void testInstallOneFeatureSplitAndConfigSplits() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_BASE_pl)
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstallOneFeatureSplitAndConfigSplits_full() throws Exception {
+ testInstallOneFeatureSplitAndConfigSplits(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstallOneFeatureSplitAndConfigSplits_instant() throws Exception {
+ testInstallOneFeatureSplitAndConfigSplits(true);
+ }
+ private void testInstallOneFeatureSplitAndConfigSplits(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_BASE_pl)
.addApk(APK_FEATURE_A_pl).run();
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadPolishLocale");
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureAPolishLocale");
}
- public void testInstallDependentFeatureSplits() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B).run();
+ @Test
+ @AppModeFull(reason = "b/109878606; instant applications can't send broadcasts to manifest receivers")
+ public void testInstallDependentFeatureSplits_full() throws Exception {
+ testInstallDependentFeatureSplits(false);
+ }
+ private void testInstallDependentFeatureSplits(boolean instant) throws Exception {
+ new InstallMultiple(instant)
+ .addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B).run();
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadDefault");
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureADefault");
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureBDefault");
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureAAndBReceivers");
}
- public void testInstallDependentFeatureSplitsAndConfigSplits() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B)
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstallDependentFeatureSplitsAndConfigSplits_full() throws Exception {
+ testInstallDependentFeatureSplitsAndConfigSplits(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstallDependentFeatureSplitsAndConfigSplits_instant() throws Exception {
+ testInstallDependentFeatureSplitsAndConfigSplits(true);
+ }
+ private void testInstallDependentFeatureSplitsAndConfigSplits(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B)
.addApk(APK_BASE_pl).addApk(APK_FEATURE_A_pl).addApk(APK_FEATURE_B_pl).run();
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadPolishLocale");
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureAPolishLocale");
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureBPolishLocale");
}
- public void testInstallAllFeatureSplits() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B)
+ @Test
+ @AppModeFull(reason = "b/109878606; instant applications can't send broadcasts to manifest receivers")
+ public void testInstallAllFeatureSplits_full() throws Exception {
+ testInstallAllFeatureSplits(false);
+ }
+ private void testInstallAllFeatureSplits(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B)
.addApk(APK_FEATURE_C).run();
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadDefault");
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureADefault");
@@ -108,8 +175,18 @@
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureAAndBAndCReceivers");
}
- public void testInstallAllFeatureSplitsAndConfigSplits() throws Exception {
- new InstallMultiple().addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B)
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstallAllFeatureSplitsAndConfigSplits_full() throws Exception {
+ testInstallAllFeatureSplitsAndConfigSplits(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstallAllFeatureSplitsAndConfigSplits_instant() throws Exception {
+ testInstallAllFeatureSplitsAndConfigSplits(true);
+ }
+ private void testInstallAllFeatureSplitsAndConfigSplits(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B)
.addApk(APK_FEATURE_C).addApk(APK_BASE_pl).addApk(APK_FEATURE_A_pl)
.addApk(APK_FEATURE_C_pl).run();
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadDefault");
@@ -117,15 +194,4 @@
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureBDefault");
Utils.runDeviceTests(getDevice(), PKG, TEST_CLASS, "shouldLoadFeatureCDefault");
}
-
- @Override
- public void setBuild(IBuildInfo buildInfo) {
- mBuildInfo = buildInfo;
- }
-
- private class InstallMultiple extends BaseInstallMultiple<InstallMultiple> {
- public InstallMultiple() {
- super(getDevice(), mBuildInfo, null);
- }
- }
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/MajorVersionTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/MajorVersionTest.java
index 15c3d3c..ec113cb 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/MajorVersionTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/MajorVersionTest.java
@@ -16,118 +16,125 @@
package android.appsecurity.cts;
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.testtype.DeviceTestCase;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IAbiReceiver;
-import com.android.tradefed.testtype.IBuildReceiver;
+import static org.junit.Assert.assertTrue;
+
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.AppModeInstant;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Test that install of apps using major version codes is being handled properly.
*/
-public class MajorVersionTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
+@RunWith(DeviceJUnit4ClassRunner.class)
+public class MajorVersionTest extends BaseAppSecurityTest {
private static final String PKG = "com.android.cts.majorversion";
private static final String APK_000000000000ffff = "CtsMajorVersion000000000000ffff.apk";
private static final String APK_00000000ffffffff = "CtsMajorVersion00000000ffffffff.apk";
private static final String APK_000000ff00000000 = "CtsMajorVersion000000ff00000000.apk";
private static final String APK_000000ffffffffff = "CtsMajorVersion000000ffffffffff.apk";
- private IAbi mAbi;
- private CompatibilityBuildHelper mBuildHelper;
-
- @Override
- public void setAbi(IAbi abi) {
- mAbi = abi;
- }
-
- @Override
- public void setBuild(IBuildInfo buildInfo) {
- mBuildHelper = new CompatibilityBuildHelper(buildInfo);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
+ @Before
+ public void setUp() throws Exception {
Utils.prepareSingleUser(getDevice());
- assertNotNull(mAbi);
- assertNotNull(mBuildHelper);
-
getDevice().uninstallPackage(PKG);
}
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
-
+ @After
+ public void tearDown() throws Exception {
getDevice().uninstallPackage(PKG);
}
- public void testInstallMinorVersion() throws Exception {
- assertNull(getDevice().installPackage(
- mBuildHelper.getTestFile(APK_000000000000ffff), false, false));
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstallMinorVersion_full() throws Exception {
+ testInstallMinorVersion(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstallMinorVersion_instant() throws Exception {
+ testInstallMinorVersion(true);
+ }
+ private void testInstallMinorVersion(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_000000000000ffff).run();
assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
runVersionDeviceTests("testCheckVersion");
- getDevice().uninstallPackage(PKG);
}
- public void testInstallMajorVersion() throws Exception {
- assertNull(getDevice().installPackage(
- mBuildHelper.getTestFile(APK_000000ff00000000), false, false));
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstallMajorVersion_full() throws Exception {
+ testInstallMajorVersion(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstallMajorVersion_instant() throws Exception {
+ testInstallMajorVersion(true);
+ }
+ private void testInstallMajorVersion(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_000000ff00000000).run();
assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
runVersionDeviceTests("testCheckVersion");
- getDevice().uninstallPackage(PKG);
}
- public void testInstallUpdateAcrossMinorMajorVersion() throws Exception {
- assertNull(getDevice().installPackage(
- mBuildHelper.getTestFile(APK_000000000000ffff), false, false));
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstallUpdateAcrossMinorMajorVersion_full() throws Exception {
+ testInstallUpdateAcrossMinorMajorVersion(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstallUpdateAcrossMinorMajorVersion_instant() throws Exception {
+ testInstallUpdateAcrossMinorMajorVersion(true);
+ }
+ private void testInstallUpdateAcrossMinorMajorVersion(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_000000000000ffff).run();
assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
runVersionDeviceTests("testCheckVersion");
- assertNull(getDevice().installPackage(
- mBuildHelper.getTestFile(APK_00000000ffffffff), true, false));
+ new InstallMultiple(instant).addApk(APK_00000000ffffffff).run();
assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
runVersionDeviceTests("testCheckVersion");
- assertNull(getDevice().installPackage(
- mBuildHelper.getTestFile(APK_000000ff00000000), true, false));
+ new InstallMultiple(instant).addApk(APK_000000ff00000000).run();
assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
runVersionDeviceTests("testCheckVersion");
- assertNull(getDevice().installPackage(
- mBuildHelper.getTestFile(APK_000000ffffffffff), true, false));
+ new InstallMultiple(instant).addApk(APK_000000ffffffffff).run();
assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
runVersionDeviceTests("testCheckVersion");
- getDevice().uninstallPackage(PKG);
}
- public void testInstallDowngradeAcrossMajorMinorVersion() throws Exception {
- assertNull(getDevice().installPackage(
- mBuildHelper.getTestFile(APK_000000ffffffffff), false, false));
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testInstallDowngradeAcrossMajorMinorVersion_full() throws Exception {
+ testInstallDowngradeAcrossMajorMinorVersion(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testInstallDowngradeAcrossMajorMinorVersion_instant() throws Exception {
+ testInstallDowngradeAcrossMajorMinorVersion(true);
+ }
+ private void testInstallDowngradeAcrossMajorMinorVersion(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_000000ffffffffff).run();
assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
runVersionDeviceTests("testCheckVersion");
- assertEquals("INSTALL_FAILED_VERSION_DOWNGRADE", getDevice().installPackage(
- mBuildHelper.getTestFile(APK_00000000ffffffff), true, false));
+ new InstallMultiple(instant).addApk(APK_00000000ffffffff)
+ .runExpectingFailure("INSTALL_FAILED_VERSION_DOWNGRADE");
assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
runVersionDeviceTests("testCheckVersion");
- assertEquals("INSTALL_FAILED_VERSION_DOWNGRADE", getDevice().installPackage(
- mBuildHelper.getTestFile(APK_000000ff00000000), true, false));
+ new InstallMultiple(instant).addApk(APK_000000ff00000000)
+ .runExpectingFailure("INSTALL_FAILED_VERSION_DOWNGRADE");
assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
runVersionDeviceTests("testCheckVersion");
- assertEquals("INSTALL_FAILED_VERSION_DOWNGRADE", getDevice().installPackage(
- mBuildHelper.getTestFile(APK_000000000000ffff), true, false));
+ new InstallMultiple(instant).addApk(APK_000000000000ffff)
+ .runExpectingFailure("INSTALL_FAILED_VERSION_DOWNGRADE");
assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
runVersionDeviceTests("testCheckVersion");
- getDevice().uninstallPackage(PKG);
}
- private void runVersionDeviceTests(String testMethodName)
- throws DeviceNotAvailableException {
+ private void runVersionDeviceTests(String testMethodName) throws Exception {
runDeviceTests(PKG, PKG + ".VersionTest", testMethodName);
}
-
- private void runDeviceTests(String packageName, String testClassName, String testMethodName)
- throws DeviceNotAvailableException {
- Utils.runDeviceTests(getDevice(), packageName, testClassName, testMethodName);
- }
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/OverlayHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/OverlayHostTest.java
index cf903db..0a2c5ce 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/OverlayHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/OverlayHostTest.java
@@ -15,38 +15,38 @@
*/
package android.appsecurity.cts;
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.testtype.DeviceTestCase;
-import com.android.tradefed.testtype.IBuildReceiver;
+import static org.junit.Assert.assertFalse;
-public class OverlayHostTest extends DeviceTestCase implements IBuildReceiver {
+import android.platform.test.annotations.AppModeFull;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(DeviceJUnit4ClassRunner.class)
+@AppModeFull(reason = "Overlays cannot be instant apps")
+public class OverlayHostTest extends BaseAppSecurityTest {
private static final String PKG = "com.android.cts.overlayapp";
private static final String APK = "CtsOverlayApp.apk";
- private CompatibilityBuildHelper mBuildHelper;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
+ @Before
+ public void setUp() throws Exception {
getDevice().uninstallPackage(PKG);
}
- @Override
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
getDevice().uninstallPackage(PKG);
- super.tearDown();
}
- @Override
- public void setBuild(IBuildInfo buildInfo) {
- mBuildHelper = new CompatibilityBuildHelper(buildInfo);
- }
-
+ @Test
public void testInstallingOverlayHasNoEffect() throws Exception {
assertFalse(getDevice().getInstalledPackageNames().contains(PKG));
// Try to install the overlay, but expect an error.
- assertNotNull(getDevice().installPackage(mBuildHelper.getTestFile(APK), false, false));
+ new InstallMultiple().addApk(APK).runExpectingFailure();
// The install should have failed.
assertFalse(getDevice().getInstalledPackageNames().contains(PKG));
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageResolutionHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageResolutionHostTest.java
index 680798a..e081d62 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageResolutionHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageResolutionHostTest.java
@@ -16,11 +16,8 @@
package android.appsecurity.cts;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.tradefed.device.DeviceNotAvailableException;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.AppModeInstant;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
import org.junit.After;
@@ -38,12 +35,10 @@
private static final String TINY_PKG = "android.appsecurity.cts.orderedactivity";
private String mOldVerifierValue;
- private CompatibilityBuildHelper mBuildHelper;
@Before
public void setUp() throws Exception {
getDevice().uninstallPackage(TINY_PKG);
- mBuildHelper = new CompatibilityBuildHelper(getBuild());
}
@After
@@ -52,26 +47,56 @@
}
@Test
- public void testResolveOrderedActivity() throws Exception {
- getDevice().installPackage(mBuildHelper.getTestFile(TINY_APK), true);
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testResolveOrderedActivity_full() throws Exception {
+ testResolveOrderedActivity(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testResolveOrderedActivity_instant() throws Exception {
+ testResolveOrderedActivity(true);
+ }
+ private void testResolveOrderedActivity(boolean instant) throws Exception {
+ new InstallMultiple(instant)
+ .addApk(TINY_APK)
+ .run();
Utils.runDeviceTests(getDevice(), TINY_PKG,
".PackageResolutionTest", "queryActivityOrdered");
- getDevice().uninstallPackage(TINY_PKG);
}
@Test
- public void testResolveOrderedService() throws Exception {
- getDevice().installPackage(mBuildHelper.getTestFile(TINY_APK), true);
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testResolveOrderedService_full() throws Exception {
+ testResolveOrderedService(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testResolveOrderedService_instant() throws Exception {
+ testResolveOrderedService(true);
+ }
+ private void testResolveOrderedService(boolean instant) throws Exception {
+ new InstallMultiple(instant)
+ .addApk(TINY_APK)
+ .run();
Utils.runDeviceTests(getDevice(), TINY_PKG,
".PackageResolutionTest", "queryServiceOrdered");
- getDevice().uninstallPackage(TINY_PKG);
}
@Test
- public void testResolveOrderedReceiver() throws Exception {
- getDevice().installPackage(mBuildHelper.getTestFile(TINY_APK), true);
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testResolveOrderedReceiver_full() throws Exception {
+ testResolveOrderedReceiver(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testResolveOrderedReceiver_instant() throws Exception {
+ testResolveOrderedReceiver(true);
+ }
+ private void testResolveOrderedReceiver(boolean instant) throws Exception {
+ new InstallMultiple(instant)
+ .addApk(TINY_APK)
+ .run();
Utils.runDeviceTests(getDevice(), TINY_PKG,
".PackageResolutionTest", "queryReceiverOrdered");
- getDevice().uninstallPackage(TINY_PKG);
}
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageVisibilityTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageVisibilityTest.java
index 5bb70d1..c8c1e67 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageVisibilityTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageVisibilityTest.java
@@ -19,7 +19,8 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import com.android.tradefed.device.DeviceNotAvailableException;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.AppModeInstant;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
import org.junit.After;
@@ -66,7 +67,16 @@
}
@Test
- public void testUninstalledPackageVisibility() throws Exception {
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testUninstalledPackageVisibility_full() throws Exception {
+ testUninstalledPackageVisibility(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testUninstalledPackageVisibility_instant() throws Exception {
+ testUninstalledPackageVisibility(true);
+ }
+ private void testUninstalledPackageVisibility(boolean instant) throws Exception {
if (!mSupportsMultiUser) {
return;
}
@@ -135,8 +145,7 @@
getDevice().uninstallPackage(TEST_PKG);
}
- protected void uninstallWithKeepDataForUser(String packageName, int userId)
- throws DeviceNotAvailableException {
+ private void uninstallWithKeepDataForUser(String packageName, int userId) throws Exception {
final String command = "pm uninstall -k --user " + userId + " " + packageName;
getDevice().executeShellCommand(command);
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/PermissionsHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/PermissionsHostTest.java
index e4b0f09..d82507f 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/PermissionsHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/PermissionsHostTest.java
@@ -16,6 +16,7 @@
package android.appsecurity.cts;
+import android.platform.test.annotations.AppModeFull;
import android.platform.test.annotations.Presubmit;
import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
@@ -135,12 +136,14 @@
}
}
+ @AppModeFull(reason = "Instant applications must be at least SDK 26")
public void testCompatDefault22() throws Exception {
assertNull(getDevice().installPackage(mBuildHelper.getTestFile(APK_22), false, false));
runDeviceTests(USES_PERMISSION_PKG, "com.android.cts.usepermission.UsePermissionTest22",
"testCompatDefault");
}
+ @AppModeFull(reason = "Instant applications must be at least SDK 26")
public void testCompatRevoked22() throws Exception {
assertNull(getDevice().installPackage(mBuildHelper.getTestFile(APK_22), false, false));
boolean didThrow = false;
@@ -157,6 +160,7 @@
"testCompatRevoked_part2");
}
+ @AppModeFull(reason = "Instant applications must be at least SDK 26")
public void testNoRuntimePrompt22() throws Exception {
assertNull(getDevice().installPackage(mBuildHelper.getTestFile(APK_22), false, false));
runDeviceTests(USES_PERMISSION_PKG, "com.android.cts.usepermission.UsePermissionTest22",
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/PrivilegedUpdateTests.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/PrivilegedUpdateTests.java
index 66cee05..aa28a97 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/PrivilegedUpdateTests.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/PrivilegedUpdateTests.java
@@ -16,6 +16,7 @@
package android.appsecurity.cts;
+import android.platform.test.annotations.AppModeFull;
import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
import com.android.ddmlib.Log;
import com.android.tradefed.build.IBuildInfo;
@@ -31,6 +32,7 @@
/**
* Tests that verify intent filters.
*/
+@AppModeFull(reason="Instant applications can never be system or privileged")
public class PrivilegedUpdateTests extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
private static final String TAG = "PrivilegedUpdateTests";
private static final String SHIM_PKG = "com.android.cts.priv.ctsshim";
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/SplitTests.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/SplitTests.java
index acec1fb..051fcf8 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/SplitTests.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/SplitTests.java
@@ -16,19 +16,24 @@
package android.appsecurity.cts;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.testtype.DeviceTestCase;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IAbiReceiver;
-import com.android.tradefed.testtype.IBuildReceiver;
+import static org.junit.Assert.assertNotNull;
+
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.AppModeInstant;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
import java.util.HashMap;
/**
* Tests that verify installing of various split APKs from host side.
*/
-public class SplitTests extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
+@RunWith(DeviceJUnit4ClassRunner.class)
+public class SplitTests extends BaseAppSecurityTest {
static final String PKG_NO_RESTART = "com.android.cts.norestart";
static final String APK_NO_RESTART_BASE = "CtsNoRestartBase.apk";
static final String APK_NO_RESTART_FEATURE = "CtsNoRestartFeature.apk";
@@ -79,50 +84,61 @@
ABI_TO_APK.put("mips", APK_mips);
}
- private IAbi mAbi;
- private IBuildInfo mCtsBuild;
-
- @Override
- public void setAbi(IAbi abi) {
- mAbi = abi;
- }
-
- @Override
- public void setBuild(IBuildInfo buildInfo) {
- mCtsBuild = buildInfo;
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
+ @Before
+ public void setUp() throws Exception {
Utils.prepareSingleUser(getDevice());
- assertNotNull(mAbi);
- assertNotNull(mCtsBuild);
-
- getDevice().uninstallPackage(PKG);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
-
getDevice().uninstallPackage(PKG);
getDevice().uninstallPackage(PKG_NO_RESTART);
}
- public void testSingleBase() throws Exception {
- new InstallMultiple().addApk(APK).run();
+ @After
+ public void tearDown() throws Exception {
+ getDevice().uninstallPackage(PKG);
+ getDevice().uninstallPackage(PKG_NO_RESTART);
+ }
+
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testSingleBase_full() throws Exception {
+ testSingleBase(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testSingleBase_instant() throws Exception {
+ testSingleBase(true);
+ }
+ private void testSingleBase(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).run();
runDeviceTests(PKG, CLASS, "testSingleBase");
}
- public void testDensitySingle() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_mdpi).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDensitySingle_full() throws Exception {
+ testDensitySingle(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDensitySingle_instant() throws Exception {
+ testDensitySingle(true);
+ }
+ private void testDensitySingle(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_mdpi).run();
runDeviceTests(PKG, CLASS, "testDensitySingle");
}
- public void testDensityAll() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_mdpi).addApk(APK_hdpi).addApk(APK_xhdpi)
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDensityAll_full() throws Exception {
+ testDensityAll(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDensityAll_instant() throws Exception {
+ testDensityAll(true);
+ }
+ private void testDensityAll(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_mdpi).addApk(APK_hdpi).addApk(APK_xhdpi)
.addApk(APK_xxhdpi).run();
runDeviceTests(PKG, CLASS, "testDensityAll");
}
@@ -131,12 +147,22 @@
* Install first with low-resolution resources, then add a split that offers
* higher-resolution resources.
*/
- public void testDensityBest() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_mdpi).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDensityBest_full() throws Exception {
+ testDensityBest(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDensityBest_instant() throws Exception {
+ testDensityBest(true);
+ }
+ private void testDensityBest(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_mdpi).run();
runDeviceTests(PKG, CLASS, "testDensityBest1");
// Now splice in an additional split which offers better resources
- new InstallMultiple().inheritFrom(PKG).addApk(APK_xxhdpi).run();
+ new InstallMultiple(instant).inheritFrom(PKG).addApk(APK_xxhdpi).run();
runDeviceTests(PKG, CLASS, "testDensityBest2");
}
@@ -144,13 +170,33 @@
* Verify that an API-based split can change enabled/disabled state of
* manifest elements.
*/
- public void testApi() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_v7).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testApi_full() throws Exception {
+ testApi(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testApi_instant() throws Exception {
+ testApi(true);
+ }
+ private void testApi(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_v7).run();
runDeviceTests(PKG, CLASS, "testApi");
}
- public void testLocale() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_de).addApk(APK_fr).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testLocale_full() throws Exception {
+ testLocale(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testLocale_instant() throws Exception {
+ testLocale(true);
+ }
+ private void testLocale(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_de).addApk(APK_fr).run();
runDeviceTests(PKG, CLASS, "testLocale");
}
@@ -158,12 +204,22 @@
* Install test app with <em>single</em> split that exactly matches the
* currently active ABI. This also explicitly forces ABI when installing.
*/
- public void testNativeSingle() throws Exception {
- final String abi = mAbi.getName();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testNativeSingle_full() throws Exception {
+ testNativeSingle(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testNativeSingle_instant() throws Exception {
+ testNativeSingle(true);
+ }
+ private void testNativeSingle(boolean instant) throws Exception {
+ final String abi = getAbi().getName();
final String apk = ABI_TO_APK.get(abi);
assertNotNull("Failed to find APK for ABI " + abi, apk);
- new InstallMultiple().addApk(APK).addApk(apk).run();
+ new InstallMultiple(instant).addApk(APK).addApk(apk).run();
runDeviceTests(PKG, CLASS, "testNative");
}
@@ -173,12 +229,22 @@
* installing, instead exercising the system's ability to choose the ABI
* through inspection of the installed app.
*/
- public void testNativeSingleNatural() throws Exception {
- final String abi = mAbi.getName();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testNativeSingleNatural_full() throws Exception {
+ testNativeSingleNatural(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testNativeSingleNatural_instant() throws Exception {
+ testNativeSingleNatural(true);
+ }
+ private void testNativeSingleNatural(boolean instant) throws Exception {
+ final String abi = getAbi().getName();
final String apk = ABI_TO_APK.get(abi);
assertNotNull("Failed to find APK for ABI " + abi, apk);
- new InstallMultiple().useNaturalAbi().addApk(APK).addApk(apk).run();
+ new InstallMultiple(instant).useNaturalAbi().addApk(APK).addApk(apk).run();
runDeviceTests(PKG, CLASS, "testNative");
}
@@ -186,8 +252,18 @@
* Install test app with <em>all</em> possible ABI splits. This also
* explicitly forces ABI when installing.
*/
- public void testNativeAll() throws Exception {
- final InstallMultiple inst = new InstallMultiple().addApk(APK);
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testNativeAll_full() throws Exception {
+ testNativeAll(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testNativeAll_instant() throws Exception {
+ testNativeAll(true);
+ }
+ private void testNativeAll(boolean instant) throws Exception {
+ final InstallMultiple inst = new InstallMultiple(instant).addApk(APK);
for (String apk : ABI_TO_APK.values()) {
inst.addApk(apk);
}
@@ -201,8 +277,18 @@
* system's ability to choose the ABI through inspection of the installed
* app.
*/
- public void testNativeAllNatural() throws Exception {
- final InstallMultiple inst = new InstallMultiple().useNaturalAbi().addApk(APK);
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testNativeAllNatural_full() throws Exception {
+ testNativeAllNatural(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testNativeAllNatural_instant() throws Exception {
+ testNativeAllNatural(true);
+ }
+ private void testNativeAllNatural(boolean instant) throws Exception {
+ final InstallMultiple inst = new InstallMultiple(instant).useNaturalAbi().addApk(APK);
for (String apk : ABI_TO_APK.values()) {
inst.addApk(apk);
}
@@ -210,104 +296,241 @@
runDeviceTests(PKG, CLASS, "testNative");
}
- public void testDuplicateBase() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK).runExpectingFailure();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDuplicateBase_full() throws Exception {
+ testDuplicateBase(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDuplicateBase_instant() throws Exception {
+ testDuplicateBase(true);
+ }
+ private void testDuplicateBase(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK).runExpectingFailure();
}
- public void testDuplicateSplit() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_v7).addApk(APK_v7).runExpectingFailure();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDuplicateSplit_full() throws Exception {
+ testDuplicateSplit(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDuplicateSplit_instant() throws Exception {
+ testDuplicateSplit(true);
+ }
+ private void testDuplicateSplit(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_v7).addApk(APK_v7).runExpectingFailure();
}
- public void testDiffCert() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_DIFF_CERT_v7).runExpectingFailure();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDiffCert_full() throws Exception {
+ testDiffCert(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDiffCert_instant() throws Exception {
+ testDiffCert(true);
+ }
+ private void testDiffCert(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_DIFF_CERT_v7).runExpectingFailure();
}
- public void testDiffCertInherit() throws Exception {
- new InstallMultiple().addApk(APK).run();
- new InstallMultiple().inheritFrom(PKG).addApk(APK_DIFF_CERT_v7).runExpectingFailure();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDiffCertInherit_full() throws Exception {
+ testDiffCertInherit(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDiffCertInherit_instant() throws Exception {
+ testDiffCertInherit(true);
+ }
+ private void testDiffCertInherit(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).run();
+ new InstallMultiple(instant).inheritFrom(PKG).addApk(APK_DIFF_CERT_v7).runExpectingFailure();
}
- public void testDiffVersion() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_DIFF_VERSION_v7).runExpectingFailure();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDiffVersion_full() throws Exception {
+ testDiffVersion(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDiffVersion_instant() throws Exception {
+ testDiffVersion(true);
+ }
+ private void testDiffVersion(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_DIFF_VERSION_v7).runExpectingFailure();
}
- public void testDiffVersionInherit() throws Exception {
- new InstallMultiple().addApk(APK).run();
- new InstallMultiple().inheritFrom(PKG).addApk(APK_DIFF_VERSION_v7).runExpectingFailure();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDiffVersionInherit_full() throws Exception {
+ testDiffVersionInherit(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDiffVersionInherit_instant() throws Exception {
+ testDiffVersionInherit(true);
+ }
+ private void testDiffVersionInherit(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).run();
+ new InstallMultiple(instant).inheritFrom(PKG).addApk(APK_DIFF_VERSION_v7).runExpectingFailure();
}
- public void testDiffRevision() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_DIFF_REVISION_v7).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDiffRevision_full() throws Exception {
+ testDiffRevision(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDiffRevision_instant() throws Exception {
+ testDiffRevision(true);
+ }
+ private void testDiffRevision(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_DIFF_REVISION_v7).run();
runDeviceTests(PKG, CLASS, "testRevision0_12");
}
- public void testDiffRevisionInheritBase() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_v7).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDiffRevisionInheritBase_full() throws Exception {
+ testDiffRevisionInheritBase(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDiffRevisionInheritBase_instant() throws Exception {
+ testDiffRevisionInheritBase(true);
+ }
+ private void testDiffRevisionInheritBase(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_v7).run();
runDeviceTests(PKG, CLASS, "testRevision0_0");
- new InstallMultiple().inheritFrom(PKG).addApk(APK_DIFF_REVISION_v7).run();
+ new InstallMultiple(instant).inheritFrom(PKG).addApk(APK_DIFF_REVISION_v7).run();
runDeviceTests(PKG, CLASS, "testRevision0_12");
}
- public void testDiffRevisionInheritSplit() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_v7).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDiffRevisionInheritSplit_full() throws Exception {
+ testDiffRevisionInheritSplit(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDiffRevisionInheritSplit_instant() throws Exception {
+ testDiffRevisionInheritSplit(true);
+ }
+ private void testDiffRevisionInheritSplit(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_v7).run();
runDeviceTests(PKG, CLASS, "testRevision0_0");
- new InstallMultiple().inheritFrom(PKG).addApk(APK_DIFF_REVISION).run();
+ new InstallMultiple(instant).inheritFrom(PKG).addApk(APK_DIFF_REVISION).run();
runDeviceTests(PKG, CLASS, "testRevision12_0");
}
- public void testDiffRevisionDowngrade() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_DIFF_REVISION_v7).run();
- new InstallMultiple().inheritFrom(PKG).addApk(APK_v7).runExpectingFailure();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testDiffRevisionDowngrade_full() throws Exception {
+ testDiffRevisionDowngrade(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testDiffRevisionDowngrade_instant() throws Exception {
+ testDiffRevisionDowngrade(true);
+ }
+ private void testDiffRevisionDowngrade(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_DIFF_REVISION_v7).run();
+ new InstallMultiple(instant).inheritFrom(PKG).addApk(APK_v7).runExpectingFailure();
}
- public void testFeatureBase() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_FEATURE).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testFeatureBase_full() throws Exception {
+ testFeatureBase(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testFeatureBase_instant() throws Exception {
+ testFeatureBase(true);
+ }
+ private void testFeatureBase(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_FEATURE).run();
runDeviceTests(PKG, CLASS, "testFeatureBase");
}
- public void testFeatureApi() throws Exception {
- new InstallMultiple().addApk(APK).addApk(APK_FEATURE).addApk(APK_FEATURE_v7).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testFeatureApi_full() throws Exception {
+ testFeatureApi(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testFeatureApi_instant() throws Exception {
+ testFeatureApi(true);
+ }
+ private void testFeatureApi(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).addApk(APK_FEATURE).addApk(APK_FEATURE_v7).run();
runDeviceTests(PKG, CLASS, "testFeatureApi");
}
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
public void testInheritUpdatedBase() throws Exception {
// TODO: flesh out this test
}
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
public void testInheritUpdatedSplit() throws Exception {
// TODO: flesh out this test
}
- public void testFeatureWithoutRestart() throws Exception {
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testFeatureWithoutRestart_full() throws Exception {
+ testFeatureWithoutRestart(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testFeatureWithoutRestart_instant() throws Exception {
+ testFeatureWithoutRestart(true);
+ }
+ private void testFeatureWithoutRestart(boolean instant) throws Exception {
+ // always install as a full app; we're testing that the instant app can be
+ // updated without restarting and need a broadcast receiver to ensure the
+ // correct behaviour. So, this component must be visible to instant apps.
new InstallMultiple().addApk(APK).run();
- new InstallMultiple().addApk(APK_NO_RESTART_BASE).run();
- runDeviceTests(PKG, CLASS, "testBaseInstalled");
- new InstallMultiple()
+
+ new InstallMultiple(instant).addApk(APK_NO_RESTART_BASE).run();
+ runDeviceTests(PKG, CLASS, "testBaseInstalled", instant);
+ new InstallMultiple(instant)
.addArg("--dont-kill")
.inheritFrom(PKG_NO_RESTART)
.addApk(APK_NO_RESTART_FEATURE)
.run();
- runDeviceTests(PKG, CLASS, "testFeatureInstalled");
+ runDeviceTests(PKG, CLASS, "testFeatureInstalled", instant);
}
/**
* Verify that installing a new version of app wipes code cache.
*/
- public void testClearCodeCache() throws Exception {
- new InstallMultiple().addApk(APK).run();
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testClearCodeCache_full() throws Exception {
+ testClearCodeCache(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testClearCodeCache_instant() throws Exception {
+ testClearCodeCache(true);
+ }
+ private void testClearCodeCache(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).run();
runDeviceTests(PKG, CLASS, "testCodeCacheWrite");
- new InstallMultiple().addArg("-r").addApk(APK_DIFF_VERSION).run();
+ new InstallMultiple(instant).addArg("-r").addApk(APK_DIFF_VERSION).run();
runDeviceTests(PKG, CLASS, "testCodeCacheRead");
}
-
- private class InstallMultiple extends BaseInstallMultiple<InstallMultiple> {
- public InstallMultiple() {
- super(getDevice(), mCtsBuild, mAbi);
- }
- }
-
- public void runDeviceTests(String packageName, String testClassName, String testMethodName)
- throws DeviceNotAvailableException {
- Utils.runDeviceTests(getDevice(), packageName, testClassName, testMethodName);
- }
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/UsesLibraryHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/UsesLibraryHostTest.java
deleted file mode 100644
index 4afeb9bf..0000000
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/UsesLibraryHostTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.appsecurity.cts;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.testtype.DeviceTestCase;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IAbiReceiver;
-import com.android.tradefed.testtype.IBuildReceiver;
-
-/**
- * Set of tests that verify behavior of runtime permissions, including both
- * dynamic granting and behavior of legacy apps.
- */
-public class UsesLibraryHostTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
- private static final String PKG = "com.android.cts.useslibrary";
-
- private static final String APK = "CtsUsesLibraryApp.apk";
- private static final String APK_COMPAT = "CtsUsesLibraryAppCompat.apk";
-
- private IAbi mAbi;
- private CompatibilityBuildHelper mBuildHelper;
-
- @Override
- public void setAbi(IAbi abi) {
- mAbi = abi;
- }
-
- @Override
- public void setBuild(IBuildInfo buildInfo) {
- mBuildHelper = new CompatibilityBuildHelper(buildInfo);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- Utils.prepareSingleUser(getDevice());
- assertNotNull(mAbi);
- assertNotNull(mBuildHelper);
-
- getDevice().uninstallPackage(PKG);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
-
- getDevice().uninstallPackage(PKG);
- }
-
- public void testUsesLibrary() throws Exception {
- assertNull(getDevice().installPackage(mBuildHelper.getTestFile(APK), false, false));
- runDeviceTests(PKG, ".UsesLibraryTest", "testUsesLibrary");
- }
-
- public void testMissingLibrary() throws Exception {
- assertNull(getDevice().installPackage(mBuildHelper.getTestFile(APK), false, false));
- runDeviceTests(PKG, ".UsesLibraryTest", "testMissingLibrary");
- }
-
- public void testDuplicateLibrary() throws Exception {
- assertNull(getDevice().installPackage(mBuildHelper.getTestFile(APK), false, false));
- runDeviceTests(PKG, ".UsesLibraryTest", "testDuplicateLibrary");
- }
-
- private void runDeviceTests(String packageName, String testClassName, String testMethodName)
- throws DeviceNotAvailableException {
- Utils.runDeviceTests(getDevice(), packageName, testClassName, testMethodName);
- }
-}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/Utils.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/Utils.java
index c63720f..d5aa6e1 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/Utils.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/Utils.java
@@ -26,6 +26,7 @@
import com.android.tradefed.result.TestRunResult;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
diff --git a/hostsidetests/appsecurity/test-apps/AccessSerialLegacy/Android.mk b/hostsidetests/appsecurity/test-apps/AccessSerialLegacy/Android.mk
index bfb88f0..a85305d 100644
--- a/hostsidetests/appsecurity/test-apps/AccessSerialLegacy/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/AccessSerialLegacy/Android.mk
@@ -26,6 +26,7 @@
LOCAL_PACKAGE_NAME := CtsAccessSerialLegacy
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 27
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/appsecurity/test-apps/AccessSerialModern/Android.mk b/hostsidetests/appsecurity/test-apps/AccessSerialModern/Android.mk
index 4bdb346..dd24d5b 100644
--- a/hostsidetests/appsecurity/test-apps/AccessSerialModern/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/AccessSerialModern/Android.mk
@@ -27,6 +27,7 @@
LOCAL_PACKAGE_NAME := CtsAccessSerialModern
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 27
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/appsecurity/test-apps/AppAccessData/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/AppAccessData/AndroidManifest.xml
index 6a846fc..6fb5ce5 100644
--- a/hostsidetests/appsecurity/test-apps/AppAccessData/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/AppAccessData/AndroidManifest.xml
@@ -14,7 +14,8 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.cts.appaccessdata">
+ package="com.android.cts.appaccessdata"
+ android:targetSandboxVersion="2">
<!--
A simple app to test that other apps cannot access another app's private data.
diff --git a/hostsidetests/appsecurity/test-apps/AppAccessData/src/com/android/cts/appaccessdata/AccessPrivateDataTest.java b/hostsidetests/appsecurity/test-apps/AppAccessData/src/com/android/cts/appaccessdata/AccessPrivateDataTest.java
index 7a64583..54e3946 100644
--- a/hostsidetests/appsecurity/test-apps/AppAccessData/src/com/android/cts/appaccessdata/AccessPrivateDataTest.java
+++ b/hostsidetests/appsecurity/test-apps/AppAccessData/src/com/android/cts/appaccessdata/AccessPrivateDataTest.java
@@ -16,6 +16,10 @@
package com.android.cts.appaccessdata;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -24,7 +28,11 @@
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.SystemClock;
-import android.test.AndroidTestCase;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
import java.io.BufferedReader;
import java.io.File;
@@ -41,7 +49,8 @@
*
* Assumes that {@link #APP_WITH_DATA_PKG} has already created the private and public data.
*/
-public class AccessPrivateDataTest extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class AccessPrivateDataTest {
/**
* The Android package name of the application that owns the data
@@ -68,6 +77,7 @@
* and detailed traffic stats.
* @throws IOException
*/
+ @Test
public void testAccessPrivateData() throws IOException {
try {
// construct the absolute file path to the app's private file
@@ -84,7 +94,7 @@
private ApplicationInfo getApplicationInfo(String packageName) {
try {
- return mContext.getPackageManager().getApplicationInfo(packageName, 0);
+ return InstrumentationRegistry.getContext().getPackageManager().getApplicationInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
throw new IllegalStateException("Expected package not found: " + e);
}
@@ -94,6 +104,7 @@
* Tests that another app's public file can be accessed
* @throws IOException
*/
+ @Test
public void testAccessPublicData() throws IOException {
try {
// construct the absolute file path to the other app's public file
@@ -108,6 +119,7 @@
}
}
+ @Test
public void testAccessProcQtaguidTrafficStatsFailed() {
// For untrusted app with SDK P or above, proc/net/xt_qtaguid files are no long readable.
// They can only read their own stats from TrafficStats API. The test for TrafficStats API
@@ -116,10 +128,11 @@
new File(QTAGUID_STATS_FILE).canRead());
}
+ @Test
public void testAccessPrivateTrafficStats() {
int otherAppUid = -1;
try {
- otherAppUid = getContext()
+ otherAppUid = InstrumentationRegistry.getContext()
.createPackageContext(APP_WITH_DATA_PKG, 0 /*flags*/)
.getApplicationInfo().uid;
} catch (NameNotFoundException e) {
@@ -133,7 +146,14 @@
assertEquals(UNSUPPORTED, TrafficStats.getUidTxPackets(otherAppUid));
}
+ @Test
public void testTrafficStatsStatsUidSelf() throws Exception {
+ final boolean isInstant = Boolean.parseBoolean(
+ InstrumentationRegistry.getArguments().getString("is_instant"));
+ // test not applicable for instant applications; they cannot shift blame
+ if (isInstant) {
+ return;
+ }
final int uid = android.os.Process.myUid();
final long rxb = TrafficStats.getUidRxBytes(uid);
final long rxp = TrafficStats.getUidRxPackets(uid);
@@ -141,7 +161,7 @@
final long txp = TrafficStats.getUidTxPackets(uid);
// Start remote server
- final int port = getContext().getContentResolver().call(PRIVATE_TARGET, "start", null, null)
+ final int port = InstrumentationRegistry.getContext().getContentResolver().call(PRIVATE_TARGET, "start", null, null)
.getInt("port");
// Try talking to them, but shift blame
@@ -151,7 +171,7 @@
Bundle extras = new Bundle();
extras.putParcelable("fd", ParcelFileDescriptor.fromSocket(socket));
- getContext().getContentResolver().call(PRIVATE_TARGET, "tag", null, extras);
+ InstrumentationRegistry.getContext().getContentResolver().call(PRIVATE_TARGET, "tag", null, extras);
socket.connect(new InetSocketAddress("localhost", port));
@@ -163,7 +183,7 @@
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
- getContext().getContentResolver().call(PRIVATE_TARGET, "stop", null, null);
+ InstrumentationRegistry.getContext().getContentResolver().call(PRIVATE_TARGET, "stop", null, null);
}
SystemClock.sleep(1000);
diff --git a/hostsidetests/appsecurity/test-apps/AppWithData/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/AppWithData/AndroidManifest.xml
index 2accec1..435e636 100644
--- a/hostsidetests/appsecurity/test-apps/AppWithData/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/AppWithData/AndroidManifest.xml
@@ -14,7 +14,8 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.cts.appwithdata">
+ package="com.android.cts.appwithdata"
+ android:targetSandboxVersion="2">
<!--
A simple app to test that other apps cannot access another app's private data.
@@ -30,7 +31,8 @@
<provider
android:name="com.android.cts.appwithdata.MyProvider"
android:authorities="com.android.cts.appwithdata"
- android:exported="true" />
+ android:exported="true"
+ android:visibleToInstantApps="true" />
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/Android.mk b/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/Android.mk
deleted file mode 100644
index 1adf0f8..0000000
--- a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# Copyright (C) 2017 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.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE_TAGS := tests
-LOCAL_SDK_VERSION := current
-LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
-LOCAL_EXPORT_PACKAGE_RESOURCES := true
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner android-support-test
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := CtsClassloaderSplitApp
-
-# Tag this module as a cts test artifact
-
-include $(BUILD_CTS_SUPPORT_PACKAGE)
-
-include $(call first-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_a/Android.mk b/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_a/Android.mk
deleted file mode 100644
index f37be44..0000000
--- a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_a/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# Copyright (C) 2017 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.
-#
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE_TAGS := tests
-LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
-LOCAL_EXPORT_PACKAGE_RESOURCES := true
-LOCAL_PACKAGE_NAME := CtsClassloaderSplitAppFeatureA
-LOCAL_SDK_VERSION := current
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_APK_LIBRARIES := CtsClassloaderSplitApp
-LOCAL_RES_LIBRARIES := $(LOCAL_APK_LIBRARIES)
-
-LOCAL_AAPT_FLAGS += --custom-package com.android.cts.classloadersplitapp.feature_a
-LOCAL_AAPT_FLAGS += --package-id 0x80
-
-include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/Android.mk b/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/Android.mk
deleted file mode 100644
index 3262e15..0000000
--- a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/Android.mk
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# Copyright (C) 2017 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.
-#
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE_TAGS := tests
-LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
-LOCAL_PACKAGE_NAME := CtsClassloaderSplitAppFeatureB
-LOCAL_SDK_VERSION := current
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_APK_LIBRARIES := CtsClassloaderSplitApp CtsClassloaderSplitAppFeatureA
-LOCAL_RES_LIBRARIES := $(LOCAL_APK_LIBRARIES)
-
-LOCAL_AAPT_FLAGS := --custom-package com.android.cts.classloadersplitapp.feature_b
-LOCAL_AAPT_FLAGS += --package-id 0x81
-
-include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp1/Android.mk b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp1/Android.mk
index 90b7866..eb8a172 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp1/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp1/Android.mk
@@ -37,4 +37,6 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false
+LOCAL_MIN_SDK_VERSION := 25
+
include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp2/Android.mk b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp2/Android.mk
index 78c7970..d13d8a1 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp2/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp2/Android.mk
@@ -33,6 +33,7 @@
LOCAL_PACKAGE_NAME := CtsEphemeralTestsEphemeralApp2
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 24
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/ImplicitlyExposedApp/Android.mk b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/ImplicitlyExposedApp/Android.mk
index 8b04f9b..b9089f0 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/ImplicitlyExposedApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/ImplicitlyExposedApp/Android.mk
@@ -30,6 +30,7 @@
LOCAL_PACKAGE_NAME := CtsEphemeralTestsImplicitApp
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 24
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/NormalApp/Android.mk b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/NormalApp/Android.mk
index d2c3667..0246b88 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/NormalApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/NormalApp/Android.mk
@@ -32,6 +32,7 @@
LOCAL_PACKAGE_NAME := CtsEphemeralTestsNormalApp
LOCAL_SDK_VERSION := system_current
+LOCAL_MIN_SDK_VERSION := 24
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false
diff --git a/hostsidetests/appsecurity/test-apps/InstantUpgradeApp/Android.mk b/hostsidetests/appsecurity/test-apps/InstantUpgradeApp/Android.mk
index e0bc1cf..f4c51c9 100644
--- a/hostsidetests/appsecurity/test-apps/InstantUpgradeApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/InstantUpgradeApp/Android.mk
@@ -36,4 +36,6 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false
+LOCAL_MIN_SDK_VERSION := 25
+
include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/AndroidManifest.xml
index a958c4c..6cb2f57 100644
--- a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/AndroidManifest.xml
@@ -14,7 +14,8 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.cts.instrumentationdiffcertapp">
+ package="com.android.cts.instrumentationdiffcertapp"
+ android:targetSandboxVersion="2">
<!--
A simple app to test that an instrumentation cannot target an app signed with a different
diff --git a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/src/com/android/cts/instrumentationdiffcertapp/InstrumentationFailToRunTest.java b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/src/com/android/cts/instrumentationdiffcertapp/InstrumentationFailToRunTest.java
index 9c320d9..4cdaf55 100644
--- a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/src/com/android/cts/instrumentationdiffcertapp/InstrumentationFailToRunTest.java
+++ b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/src/com/android/cts/instrumentationdiffcertapp/InstrumentationFailToRunTest.java
@@ -16,6 +16,8 @@
package com.android.cts.instrumentationdiffcertapp;
+import static org.junit.Assert.assertFalse;
+
import android.app.Instrumentation;
import android.content.ComponentName;
import android.content.Context;
@@ -27,18 +29,27 @@
*/
public class InstrumentationFailToRunTest extends InstrumentationTestCase {
- public void testInstrumentationNotAllowed() {
- Context myContext = getInstrumentation().getContext();
+ public void testInstrumentationNotAllowed_exception() {
+ final Context myContext = getInstrumentation().getContext();
// assumes android.app.Instrumentation has been defined in this app's AndroidManifest.xml
// as targeting an app with a different cert
- ComponentName appDiffCertInstrumentation = new ComponentName(myContext,
- Instrumentation.class);
+ final ComponentName appDiffCertInstrumentation =
+ new ComponentName(myContext, Instrumentation.class);
try {
- getInstrumentation().getContext().startInstrumentation(appDiffCertInstrumentation,
- null, new Bundle());
- fail("could launch instrumentation");
- } catch (SecurityException e) {
- // expected
+ assertFalse("instrumentation started",
+ myContext.startInstrumentation(appDiffCertInstrumentation, null, new Bundle()));
+ fail("SecurityException not thrown");
+ } catch (SecurityException expected) {
}
}
+
+ public void testInstrumentationNotAllowed_fail() {
+ final Context myContext = getInstrumentation().getContext();
+ // assumes android.app.Instrumentation has been defined in this app's AndroidManifest.xml
+ // as targeting an app with a different cert
+ final ComponentName appDiffCertInstrumentation =
+ new ComponentName(myContext, Instrumentation.class);
+ assertFalse("instrumentation started",
+ myContext.startInstrumentation(appDiffCertInstrumentation, null, new Bundle()));
+ }
}
diff --git a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/AndroidManifest.xml
index 2f3a374..a903c37 100644
--- a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/AndroidManifest.xml
@@ -16,7 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.isolatedsplitapp"
- android:isolatedSplits="true">
+ android:isolatedSplits="true"
+ android:targetSandboxVersion="2">
<application android:label="IsolatedSplitApp">
diff --git a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_a/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_a/AndroidManifest.xml
index 958b8d0..d9ca271 100644
--- a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_a/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_a/AndroidManifest.xml
@@ -16,7 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.isolatedsplitapp.feature_a"
- featureSplit="feature_a">
+ featureSplit="feature_a"
+ android:targetSandboxVersion="2">
<application>
<activity android:name=".FeatureAActivity">
diff --git a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_b/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_b/AndroidManifest.xml
index d89a1f2..8b4f16d 100644
--- a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_b/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_b/AndroidManifest.xml
@@ -16,7 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.isolatedsplitapp.feature_b"
- featureSplit="feature_b">
+ featureSplit="feature_b"
+ android:targetSandboxVersion="2">
<uses-split android:name="feature_a" />
diff --git a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_c/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_c/AndroidManifest.xml
index 64b087c..012543b 100644
--- a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_c/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_c/AndroidManifest.xml
@@ -16,7 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.isolatedsplitapp.feature_c"
- featureSplit="feature_c">
+ featureSplit="feature_c"
+ android:targetSandboxVersion="2">
<application>
<activity android:name=".FeatureCActivity">
diff --git a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000000000ffff/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000000000ffff/AndroidManifest.xml
index 2a63cd7..190c5d0 100644
--- a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000000000ffff/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000000000ffff/AndroidManifest.xml
@@ -15,8 +15,9 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.majorversion"
- android:versionCodeMajor="0x00000000" android:versionCode="0x0000ffff">
-
+ android:versionCodeMajor="0x00000000" android:versionCode="0x0000ffff"
+ android:targetSandboxVersion="2">
+
<application/>
<instrumentation
diff --git a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version00000000ffffffff/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version00000000ffffffff/AndroidManifest.xml
index 934deec..a2a90fc 100644
--- a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version00000000ffffffff/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version00000000ffffffff/AndroidManifest.xml
@@ -15,8 +15,9 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.majorversion"
- android:versionCodeMajor="0x00000000" android:versionCode="0xffffffff">
-
+ android:versionCodeMajor="0x00000000" android:versionCode="0xffffffff"
+ android:targetSandboxVersion="2">
+
<application/>
<instrumentation
diff --git a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ff00000000/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ff00000000/AndroidManifest.xml
index c7b9dd0..33a1dc2 100644
--- a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ff00000000/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ff00000000/AndroidManifest.xml
@@ -15,8 +15,9 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.majorversion"
- android:versionCodeMajor="0x000000ff" android:versionCode="0x00000000">
-
+ android:versionCodeMajor="0x000000ff" android:versionCode="0x00000000"
+ android:targetSandboxVersion="2">
+
<application/>
<instrumentation
diff --git a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ffffffffff/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ffffffffff/AndroidManifest.xml
index 91d4e39..bb0a3e6 100644
--- a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ffffffffff/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ffffffffff/AndroidManifest.xml
@@ -15,7 +15,8 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.majorversion"
- android:versionCodeMajor="0x000000ff" android:versionCode="0xffffffff">
+ android:versionCodeMajor="0x000000ff" android:versionCode="0xffffffff"
+ android:targetSandboxVersion="2">
<application/>
diff --git a/hostsidetests/appsecurity/test-apps/NoRestartApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/NoRestartApp/AndroidManifest.xml
index 7140333..c7550e0 100644
--- a/hostsidetests/appsecurity/test-apps/NoRestartApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/NoRestartApp/AndroidManifest.xml
@@ -16,12 +16,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.android.cts.norestart"
+ android:targetSandboxVersion="2"
tools:ignore="MissingVersion" >
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="23" />
-
<application
tools:ignore="AllowBackup,MissingApplicationIcon" >
<activity
@@ -32,6 +29,14 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="https" />
+ <data android:host="cts.android.com" />
+ <data android:path="/norestart" />
+ </intent-filter>
+ <intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
diff --git a/hostsidetests/appsecurity/test-apps/NoRestartApp/feature/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/NoRestartApp/feature/AndroidManifest.xml
index b2fa3e8..9c71363 100644
--- a/hostsidetests/appsecurity/test-apps/NoRestartApp/feature/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/NoRestartApp/feature/AndroidManifest.xml
@@ -17,12 +17,9 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.android.cts.norestart"
split="feature"
+ android:targetSandboxVersion="2"
tools:ignore="MissingVersion" >
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="23" />
-
<application
android:allowBackup="false"
tools:ignore="MissingApplicationIcon" >
diff --git a/hostsidetests/appsecurity/test-apps/OrderedActivityApp/Android.mk b/hostsidetests/appsecurity/test-apps/OrderedActivityApp/Android.mk
index 67fe9f4..97e63d0 100644
--- a/hostsidetests/appsecurity/test-apps/OrderedActivityApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/OrderedActivityApp/Android.mk
@@ -22,7 +22,7 @@
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_SDK_VERSION := 23
+LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := CtsOrderedActivityApp
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false
diff --git a/hostsidetests/appsecurity/test-apps/OrderedActivityApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/OrderedActivityApp/AndroidManifest.xml
index 383f000..6d08f9e 100644
--- a/hostsidetests/appsecurity/test-apps/OrderedActivityApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/OrderedActivityApp/AndroidManifest.xml
@@ -16,7 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.appsecurity.cts.orderedactivity"
android:versionCode="10"
- android:versionName="1.0">
+ android:versionName="1.0"
+ android:targetSandboxVersion="2">
<application android:label="@string/app_name">
<!-- Activities used for queries -->
<activity android:name=".OrderActivity2">
diff --git a/hostsidetests/appsecurity/test-apps/PermissionPolicy25/Android.mk b/hostsidetests/appsecurity/test-apps/PermissionPolicy25/Android.mk
index a8d659b..c696530 100644
--- a/hostsidetests/appsecurity/test-apps/PermissionPolicy25/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/PermissionPolicy25/Android.mk
@@ -29,6 +29,7 @@
LOCAL_PACKAGE_NAME := CtsPermissionPolicyTest25
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 25
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/appsecurity/test-apps/SimpleAppInstall/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/AndroidManifest.xml
index 247617e..942cae0 100644
--- a/hostsidetests/appsecurity/test-apps/SimpleAppInstall/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/AndroidManifest.xml
@@ -14,7 +14,8 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.cts.simpleappinstall">
+ package="com.android.cts.simpleappinstall"
+ android:targetSandboxVersion="2">
<!--
A simple app to test that apps cannot be installed over existing app with
diff --git a/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/AndroidManifest.xml
index da48194..1491d9c 100644
--- a/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/AndroidManifest.xml
@@ -14,7 +14,8 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.cts.simpleappinstall">
+ package="com.android.cts.simpleappinstall"
+ android:targetSandboxVersion="2">
<!--
A simple second app to test that apps cannot be installed over existing app
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml
index abb7f32..a1ce506 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml
@@ -15,7 +15,8 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.cts.splitapp">
+ package="com.android.cts.splitapp"
+ android:targetSandboxVersion="2">
<!-- TODO(b/73365611) Remove targetSdkVersion once EncryptionApp tests
are fixed to no longer access SplitApp's data by path. -->
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="27" />
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/feature/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SplitApp/feature/AndroidManifest.xml
index 8ba3c2f..04a6c80 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/feature/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/feature/AndroidManifest.xml
@@ -16,7 +16,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.splitapp"
- featureName="feature">
+ split="feature">
<!-- New permission should be ignored -->
<uses-permission android:name="android.permission.INTERNET" />
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/revision/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SplitApp/revision/AndroidManifest.xml
index 8e053ba..f2617fa 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/revision/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/revision/AndroidManifest.xml
@@ -16,6 +16,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.splitapp"
+ android:targetSandboxVersion="2"
android:revisionCode="12">
<uses-permission android:name="android.permission.CAMERA" />
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/src/com/android/cts/splitapp/SplitAppTest.java b/hostsidetests/appsecurity/test-apps/SplitApp/src/com/android/cts/splitapp/SplitAppTest.java
index 4cfd7d0..8d48c16 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/src/com/android/cts/splitapp/SplitAppTest.java
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/src/com/android/cts/splitapp/SplitAppTest.java
@@ -35,10 +35,12 @@
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
import android.os.ConditionVariable;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.os.StatFs;
+import android.support.test.InstrumentationRegistry;
import android.system.Os;
import android.system.OsConstants;
import android.system.StructStat;
@@ -236,8 +238,10 @@
assertEquals("base", getXmlTestValue(r.getXml(R.xml.my_activity_meta)));
// And that we can access resources from feature
- assertEquals("red", r.getString(r.getIdentifier("feature_string", "string", PKG)));
- assertEquals(123, r.getInteger(r.getIdentifier("feature_integer", "integer", PKG)));
+ assertEquals("red", r.getString(r.getIdentifier(
+ "com.android.cts.splitapp.feature:feature_string", "string", PKG)));
+ assertEquals(123, r.getInteger(r.getIdentifier(
+ "com.android.cts.splitapp.feature:feature_integer", "integer", PKG)));
final Class<?> featR = Class.forName("com.android.cts.splitapp.FeatureR");
final int boolId = (int) featR.getDeclaredField("feature_receiver_enabled").get(null);
@@ -308,6 +312,23 @@
}
}
+ private Intent createLaunchIntent() {
+ final boolean isInstant = Boolean.parseBoolean(
+ InstrumentationRegistry.getArguments().getString("is_instant", "false"));
+ if (isInstant) {
+ final Intent i = new Intent(Intent.ACTION_VIEW);
+ i.addCategory(Intent.CATEGORY_BROWSABLE);
+ i.setData(Uri.parse("https://cts.android.com/norestart"));
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return i;
+ } else {
+ final Intent i = new Intent("com.android.cts.norestart.START");
+ i.addCategory(Intent.CATEGORY_DEFAULT);
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return i;
+ }
+ }
+
public void testBaseInstalled() throws Exception {
final ConditionVariable cv = new ConditionVariable();
final BroadcastReceiver r = new BroadcastReceiver() {
@@ -319,10 +340,8 @@
}
};
final IntentFilter filter = new IntentFilter("com.android.cts.norestart.BROADCAST");
- getContext().registerReceiver(r, filter);
- final Intent i = new Intent("com.android.cts.norestart.START");
- i.addCategory(Intent.CATEGORY_DEFAULT);
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ getContext().registerReceiver(r, filter, Context.RECEIVER_VISIBLE_TO_INSTANT_APPS);
+ final Intent i = createLaunchIntent();
getContext().startActivity(i);
assertTrue(cv.block(2000L));
getContext().unregisterReceiver(r);
@@ -345,10 +364,8 @@
}
};
final IntentFilter filter = new IntentFilter("com.android.cts.norestart.BROADCAST");
- getContext().registerReceiver(r, filter);
- final Intent i = new Intent("com.android.cts.norestart.START");
- i.addCategory(Intent.CATEGORY_DEFAULT);
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ getContext().registerReceiver(r, filter, Context.RECEIVER_VISIBLE_TO_INSTANT_APPS);
+ final Intent i = createLaunchIntent();
getContext().startActivity(i);
assertTrue(cv.block(2000L));
getContext().unregisterReceiver(r);
@@ -362,7 +379,8 @@
assertEquals(false, r.getBoolean(R.bool.my_receiver_enabled));
// And that we can access resources from feature
- assertEquals(321, r.getInteger(r.getIdentifier("feature_integer", "integer", PKG)));
+ assertEquals(321, r.getInteger(r.getIdentifier(
+ "com.android.cts.splitapp.feature:feature_integer", "integer", PKG)));
final Class<?> featR = Class.forName("com.android.cts.splitapp.FeatureR");
final int boolId = (int) featR.getDeclaredField("feature_receiver_enabled").get(null);
diff --git a/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/AndroidManifest.xml
index 8b15f1f..0410e1a 100644
--- a/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/AndroidManifest.xml
@@ -14,7 +14,8 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.cts.targetinstrumentationapp">
+ package="com.android.cts.targetinstrumentationapp"
+ android:targetSandboxVersion="2">
<!--
A simple app used to test that instrumentation cannot target an app signed with a different
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionApp22/Android.mk b/hostsidetests/appsecurity/test-apps/UsePermissionApp22/Android.mk
index 7a62f09..3712956 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionApp22/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionApp22/Android.mk
@@ -43,4 +43,6 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false
+LOCAL_MIN_SDK_VERSION := 22
+
include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionApp23/Android.mk b/hostsidetests/appsecurity/test-apps/UsePermissionApp23/Android.mk
index 58ee1c7..648b387 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionApp23/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionApp23/Android.mk
@@ -41,4 +41,6 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false
+LOCAL_MIN_SDK_VERSION := 23
+
include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionApp25/Android.mk b/hostsidetests/appsecurity/test-apps/UsePermissionApp25/Android.mk
index 8528752..59e5f91 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionApp25/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionApp25/Android.mk
@@ -42,4 +42,6 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false
+LOCAL_MIN_SDK_VERSION := 25
+
include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionApp26/Android.mk b/hostsidetests/appsecurity/test-apps/UsePermissionApp26/Android.mk
index 52c8ba4..b0d8bd9 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionApp26/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionApp26/Android.mk
@@ -32,6 +32,7 @@
LOCAL_PACKAGE_NAME := CtsUsePermissionApp26
LOCAL_PRIVATE_PLATFORM_APIS := true
+LOCAL_MIN_SDK_VERSION := 26
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/appsecurity/test-apps/UsesLibraryApp/Android.mk b/hostsidetests/appsecurity/test-apps/UsesLibraryApp/Android.mk
deleted file mode 100644
index df12f82..0000000
--- a/hostsidetests/appsecurity/test-apps/UsesLibraryApp/Android.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-#
-# Copyright (C) 2015 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.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-LOCAL_SDK_VERSION := current
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test compatibility-device-util ctstestrunner ub-uiautomator
-
-LOCAL_JAVA_LIBRARIES := android.test.base.stubs
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src) \
- ../ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
-
-LOCAL_PACKAGE_NAME := CtsUsesLibraryApp
-
-# tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
-
-LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey2
-
-LOCAL_PROGUARD_ENABLED := disabled
-LOCAL_DEX_PREOPT := false
-
-include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/tinyapp/Android.mk b/hostsidetests/appsecurity/test-apps/tinyapp/Android.mk
index 4822a11..da5eba3 100644
--- a/hostsidetests/appsecurity/test-apps/tinyapp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/tinyapp/Android.mk
@@ -21,7 +21,7 @@
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_SDK_VERSION := 23
+LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := CtsPkgInstallTinyApp
LOCAL_DEX_PREOPT := false
diff --git a/hostsidetests/appsecurity/test-apps/tinyapp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/tinyapp/AndroidManifest.xml
index def2931..1ead3a2 100644
--- a/hostsidetests/appsecurity/test-apps/tinyapp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/tinyapp/AndroidManifest.xml
@@ -16,7 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.appsecurity.cts.tinyapp"
android:versionCode="10"
- android:versionName="1.0">
+ android:versionName="1.0"
+ android:targetSandboxVersion="2">
<application android:label="@string/app_name">
<activity
android:name=".MainActivity"
diff --git a/hostsidetests/classloaders/splits/Android.bp b/hostsidetests/classloaders/splits/Android.bp
new file mode 100644
index 0000000..17f02a7
--- /dev/null
+++ b/hostsidetests/classloaders/splits/Android.bp
@@ -0,0 +1,34 @@
+// Copyright (C) 2019 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.
+
+java_test_host {
+ name: "CtsClassloaderSplitsHostTestCases",
+ defaults: [ "cts_defaults" ],
+ srcs: [ "src/**/*.java" ],
+ libs: [
+ "compatibility-host-util",
+ "cts-tradefed",
+ "tradefed",
+ ],
+ test_suites: [
+ "cts",
+ "vts",
+ "general-tests",
+ ],
+ required: [
+ "CtsClassloaderSplitApp",
+ "CtsClassloaderSplitAppFeatureA",
+ "CtsClassloaderSplitAppFeatureB",
+ ],
+}
diff --git a/hostsidetests/classloaders/splits/AndroidTest.xml b/hostsidetests/classloaders/splits/AndroidTest.xml
new file mode 100644
index 0000000..77b5bce
--- /dev/null
+++ b/hostsidetests/classloaders/splits/AndroidTest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Config for the CTS Classloader Splits host tests">
+ <option name="test-suite-tag" value="cts" />
+ <option name="config-descriptor:metadata" key="component" value="framework" />
+ <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
+ <option name="jar" value="CtsClassloaderSplitsHostTestCases.jar" />
+ <option name="runtime-hint" value="1m" />
+ </test>
+</configuration>
diff --git a/hostsidetests/classloaders/splits/TEST_MAPPING b/hostsidetests/classloaders/splits/TEST_MAPPING
new file mode 100644
index 0000000..18f00dd
--- /dev/null
+++ b/hostsidetests/classloaders/splits/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsClassloaderSplitsHostTestCases"
+ }
+ ]
+}
diff --git a/hostsidetests/classloaders/splits/apps/Android.bp b/hostsidetests/classloaders/splits/apps/Android.bp
new file mode 100644
index 0000000..ebd9318
--- /dev/null
+++ b/hostsidetests/classloaders/splits/apps/Android.bp
@@ -0,0 +1,29 @@
+// Copyright (C) 2019 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.
+
+android_test {
+ name: "CtsClassloaderSplitApp",
+ defaults: [ "cts_support_defaults" ],
+ sdk_version: "current",
+ srcs: ["src/**/*.java"],
+ static_libs: [
+ "android-support-test",
+ "ctstestrunner",
+ ],
+ test_suites: [
+ "cts",
+ "vts",
+ "general-tests",
+ ],
+}
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/AndroidManifest.xml b/hostsidetests/classloaders/splits/apps/AndroidManifest.xml
similarity index 95%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/AndroidManifest.xml
rename to hostsidetests/classloaders/splits/apps/AndroidManifest.xml
index 05f4573..cdaa469 100644
--- a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/AndroidManifest.xml
+++ b/hostsidetests/classloaders/splits/apps/AndroidManifest.xml
@@ -16,7 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.classloadersplitapp"
- android:isolatedSplits="true">
+ android:isolatedSplits="true"
+ android:targetSandboxVersion="2">
<application android:label="ClassloaderSplitApp"
android:classLoader="dalvik.system.PathClassLoader">
diff --git a/hostsidetests/classloaders/splits/apps/feature_a/Android.bp b/hostsidetests/classloaders/splits/apps/feature_a/Android.bp
new file mode 100644
index 0000000..0fd7091
--- /dev/null
+++ b/hostsidetests/classloaders/splits/apps/feature_a/Android.bp
@@ -0,0 +1,32 @@
+// Copyright (C) 2019 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.
+
+android_test_helper_app {
+ name: "CtsClassloaderSplitAppFeatureA",
+ defaults: [ "cts_support_defaults" ],
+ sdk_version: "current",
+ srcs: [ "src/**/*.java" ],
+ libs: [ "CtsClassloaderSplitApp" ],
+ aaptflags: [
+ "--custom-package",
+ "com.android.cts.classloadersplitapp.feature_a",
+ "--package-id",
+ "0x80",
+ ],
+ test_suites: [
+ "cts",
+ "vts",
+ "general-tests",
+ ],
+}
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_a/AndroidManifest.xml b/hostsidetests/classloaders/splits/apps/feature_a/AndroidManifest.xml
similarity index 94%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_a/AndroidManifest.xml
rename to hostsidetests/classloaders/splits/apps/feature_a/AndroidManifest.xml
index a334acf..96807d6 100644
--- a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_a/AndroidManifest.xml
+++ b/hostsidetests/classloaders/splits/apps/feature_a/AndroidManifest.xml
@@ -16,7 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.classloadersplitapp"
- featureSplit="feature_a">
+ featureSplit="feature_a"
+ android:targetSandboxVersion="2">
<application android:classLoader="dalvik.system.DelegateLastClassLoader">
<activity android:name=".feature_a.FeatureAActivity">
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_a/src/com/android/cts/classloadersplitapp/feature_a/FeatureAActivity.java b/hostsidetests/classloaders/splits/apps/feature_a/src/com/android/cts/classloadersplitapp/feature_a/FeatureAActivity.java
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_a/src/com/android/cts/classloadersplitapp/feature_a/FeatureAActivity.java
rename to hostsidetests/classloaders/splits/apps/feature_a/src/com/android/cts/classloadersplitapp/feature_a/FeatureAActivity.java
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_a/src/com/android/cts/classloadersplitapp/feature_a/FeatureAReceiver.java b/hostsidetests/classloaders/splits/apps/feature_a/src/com/android/cts/classloadersplitapp/feature_a/FeatureAReceiver.java
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_a/src/com/android/cts/classloadersplitapp/feature_a/FeatureAReceiver.java
rename to hostsidetests/classloaders/splits/apps/feature_a/src/com/android/cts/classloadersplitapp/feature_a/FeatureAReceiver.java
diff --git a/hostsidetests/classloaders/splits/apps/feature_b/Android.bp b/hostsidetests/classloaders/splits/apps/feature_b/Android.bp
new file mode 100644
index 0000000..2643840
--- /dev/null
+++ b/hostsidetests/classloaders/splits/apps/feature_b/Android.bp
@@ -0,0 +1,35 @@
+// Copyright (C) 2019 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.
+
+android_test_helper_app {
+ name: "CtsClassloaderSplitAppFeatureB",
+ defaults: [ "cts_support_defaults" ],
+ sdk_version: "current",
+ srcs: [ "src/**/*.java" ],
+ libs: [
+ "CtsClassloaderSplitApp",
+ "CtsClassloaderSplitAppFeatureA",
+ ],
+ aaptflags: [
+ "--custom-package",
+ "com.android.cts.classloadersplitapp.feature_a",
+ "--package-id",
+ "0x81",
+ ],
+ test_suites: [
+ "cts",
+ "vts",
+ "general-tests",
+ ],
+}
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/AndroidManifest.xml b/hostsidetests/classloaders/splits/apps/feature_b/AndroidManifest.xml
similarity index 94%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/AndroidManifest.xml
rename to hostsidetests/classloaders/splits/apps/feature_b/AndroidManifest.xml
index 8d9ac52..fa975ad 100644
--- a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/AndroidManifest.xml
+++ b/hostsidetests/classloaders/splits/apps/feature_b/AndroidManifest.xml
@@ -16,7 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.classloadersplitapp"
- featureSplit="feature_b">
+ featureSplit="feature_b"
+ android:targetSandboxVersion="2">
<uses-split android:name="feature_a" />
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/res/values-pl/values.xml b/hostsidetests/classloaders/splits/apps/feature_b/res/values-pl/values.xml
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/res/values-pl/values.xml
rename to hostsidetests/classloaders/splits/apps/feature_b/res/values-pl/values.xml
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/res/values/values.xml b/hostsidetests/classloaders/splits/apps/feature_b/res/values/values.xml
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/res/values/values.xml
rename to hostsidetests/classloaders/splits/apps/feature_b/res/values/values.xml
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/src/com/android/cts/classloadersplitapp/feature_b/FeatureBActivity.java b/hostsidetests/classloaders/splits/apps/feature_b/src/com/android/cts/classloadersplitapp/feature_b/FeatureBActivity.java
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/src/com/android/cts/classloadersplitapp/feature_b/FeatureBActivity.java
rename to hostsidetests/classloaders/splits/apps/feature_b/src/com/android/cts/classloadersplitapp/feature_b/FeatureBActivity.java
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/src/com/android/cts/classloadersplitapp/feature_b/FeatureBReceiver.java b/hostsidetests/classloaders/splits/apps/feature_b/src/com/android/cts/classloadersplitapp/feature_b/FeatureBReceiver.java
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/feature_b/src/com/android/cts/classloadersplitapp/feature_b/FeatureBReceiver.java
rename to hostsidetests/classloaders/splits/apps/feature_b/src/com/android/cts/classloadersplitapp/feature_b/FeatureBReceiver.java
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/src/com/android/cts/classloadersplitapp/BaseActivity.java b/hostsidetests/classloaders/splits/apps/src/com/android/cts/classloadersplitapp/BaseActivity.java
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/src/com/android/cts/classloadersplitapp/BaseActivity.java
rename to hostsidetests/classloaders/splits/apps/src/com/android/cts/classloadersplitapp/BaseActivity.java
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/src/com/android/cts/classloadersplitapp/BaseReceiver.java b/hostsidetests/classloaders/splits/apps/src/com/android/cts/classloadersplitapp/BaseReceiver.java
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/src/com/android/cts/classloadersplitapp/BaseReceiver.java
rename to hostsidetests/classloaders/splits/apps/src/com/android/cts/classloadersplitapp/BaseReceiver.java
diff --git a/hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/src/com/android/cts/classloadersplitapp/SplitAppTest.java b/hostsidetests/classloaders/splits/apps/src/com/android/cts/classloadersplitapp/SplitAppTest.java
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/ClassLoaderSplitApp/src/com/android/cts/classloadersplitapp/SplitAppTest.java
rename to hostsidetests/classloaders/splits/apps/src/com/android/cts/classloadersplitapp/SplitAppTest.java
diff --git a/hostsidetests/classloaders/splits/src/android/classloaders/cts/BaseInstallMultiple.java b/hostsidetests/classloaders/splits/src/android/classloaders/cts/BaseInstallMultiple.java
new file mode 100644
index 0000000..f5170e9
--- /dev/null
+++ b/hostsidetests/classloaders/splits/src/android/classloaders/cts/BaseInstallMultiple.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2017 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 android.classloaders.cts;
+
+import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.util.AbiUtils;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Base class for invoking the install-multiple command via ADB. Subclass this for less typing:
+ *
+ * <code>
+ * private class InstallMultiple extends BaseInstallMultiple<InstallMultiple> {
+ * public InstallMultiple() {
+ * super(getDevice(), null, null);
+ * }
+ * }
+ * </code>
+ */
+public class BaseInstallMultiple<T extends BaseInstallMultiple<?>> {
+ private final ITestDevice mDevice;
+ private final IBuildInfo mBuild;
+ private final IAbi mAbi;
+
+ private final List<String> mArgs = new ArrayList<>();
+ private final List<File> mApks = new ArrayList<>();
+ private boolean mUseNaturalAbi;
+
+ public BaseInstallMultiple(ITestDevice device, IBuildInfo buildInfo, IAbi abi) {
+ mDevice = device;
+ mBuild = buildInfo;
+ mAbi = abi;
+ addArg("-g");
+ }
+
+ T addArg(String arg) {
+ mArgs.add(arg);
+ return (T) this;
+ }
+
+ T addApk(String apk) throws FileNotFoundException {
+ CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mBuild);
+ mApks.add(buildHelper.getTestFile(apk));
+ return (T) this;
+ }
+
+ T inheritFrom(String packageName) {
+ addArg("-r");
+ addArg("-p " + packageName);
+ return (T) this;
+ }
+
+ T useNaturalAbi() {
+ mUseNaturalAbi = true;
+ return (T) this;
+ }
+
+ T allowTest() {
+ addArg("-t");
+ return (T) this;
+ }
+
+ T locationAuto() {
+ addArg("--install-location 0");
+ return (T) this;
+ }
+
+ T locationInternalOnly() {
+ addArg("--install-location 1");
+ return (T) this;
+ }
+
+ T locationPreferExternal() {
+ addArg("--install-location 2");
+ return (T) this;
+ }
+
+ T forceUuid(String uuid) {
+ addArg("--force-uuid " + uuid);
+ return (T) this;
+ }
+
+ T forUser(int userId) {
+ addArg("--user " + userId);
+ return (T) this;
+ }
+
+ void run() throws DeviceNotAvailableException {
+ run(true, null);
+ }
+
+ void runExpectingFailure() throws DeviceNotAvailableException {
+ run(false, null);
+ }
+
+ void runExpectingFailure(String failure) throws DeviceNotAvailableException {
+ run(false, failure);
+ }
+
+ private void run(boolean expectingSuccess, String failure) throws DeviceNotAvailableException {
+ final ITestDevice device = mDevice;
+
+ // Create an install session
+ final StringBuilder cmd = new StringBuilder();
+ cmd.append("pm install-create");
+ for (String arg : mArgs) {
+ cmd.append(' ').append(arg);
+ }
+ if (!mUseNaturalAbi && mAbi != null) {
+ cmd.append(' ').append(AbiUtils.createAbiFlag(mAbi.getName()));
+ }
+
+ String result = device.executeShellCommand(cmd.toString());
+ TestCase.assertTrue(result, result.startsWith("Success"));
+
+ final int start = result.lastIndexOf("[");
+ final int end = result.lastIndexOf("]");
+ int sessionId = -1;
+ try {
+ if (start != -1 && end != -1 && start < end) {
+ sessionId = Integer.parseInt(result.substring(start + 1, end));
+ }
+ } catch (NumberFormatException e) {
+ }
+ if (sessionId == -1) {
+ throw new IllegalStateException("Failed to create install session: " + result);
+ }
+
+ // Push our files into session. Ideally we'd use stdin streaming,
+ // but ddmlib doesn't support it yet.
+ for (int i = 0; i < mApks.size(); i++) {
+ final File apk = mApks.get(i);
+ final String remotePath = "/data/local/tmp/" + i + "_" + apk.getName();
+ if (!device.pushFile(apk, remotePath)) {
+ throw new IllegalStateException("Failed to push " + apk);
+ }
+
+ cmd.setLength(0);
+ cmd.append("pm install-write");
+ cmd.append(' ').append(sessionId);
+ cmd.append(' ').append(i + "_" + apk.getName());
+ cmd.append(' ').append(remotePath);
+
+ result = device.executeShellCommand(cmd.toString());
+ TestCase.assertTrue(result, result.startsWith("Success"));
+ }
+
+ // Everything staged; let's pull trigger
+ cmd.setLength(0);
+ cmd.append("pm install-commit");
+ cmd.append(' ').append(sessionId);
+
+ result = device.executeShellCommand(cmd.toString()).trim();
+ if (failure == null) {
+ if (expectingSuccess) {
+ TestCase.assertTrue(result, result.startsWith("Success"));
+ } else {
+ TestCase.assertFalse(result, result.startsWith("Success"));
+ }
+ } else {
+ TestCase.assertTrue(result, result.contains(failure));
+ }
+ }
+}
diff --git a/hostsidetests/classloaders/splits/src/android/classloaders/cts/ClassloaderSplitsTest.java b/hostsidetests/classloaders/splits/src/android/classloaders/cts/ClassloaderSplitsTest.java
new file mode 100644
index 0000000..1460bfc
--- /dev/null
+++ b/hostsidetests/classloaders/splits/src/android/classloaders/cts/ClassloaderSplitsTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2017 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 android.classloaders.cts;
+
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.AppModeInstant;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(DeviceJUnit4ClassRunner.class)
+public class ClassloaderSplitsTest extends BaseHostJUnit4Test {
+ private static final String PKG = "com.android.cts.classloadersplitapp";
+ private static final String TEST_CLASS = PKG + ".SplitAppTest";
+
+ /* The feature hierarchy looks like this:
+
+ APK_BASE (PathClassLoader)
+ ^
+ |
+ APK_FEATURE_A (DelegateLastClassLoader)
+ ^
+ |
+ APK_FEATURE_B (PathClassLoader)
+
+ */
+
+ private static final String APK_BASE = "CtsClassloaderSplitApp.apk";
+ private static final String APK_FEATURE_A = "CtsClassloaderSplitAppFeatureA.apk";
+ private static final String APK_FEATURE_B = "CtsClassloaderSplitAppFeatureB.apk";
+
+ @Before
+ public void setUp() throws Exception {
+ getDevice().uninstallPackage(PKG);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ getDevice().uninstallPackage(PKG);
+ }
+
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testBaseClassLoader_full() throws Exception {
+ testBaseClassLoader(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testBaseClassLoader_instant() throws Exception {
+ testBaseClassLoader(true);
+ }
+ private void testBaseClassLoader(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_BASE).run();
+ runDeviceTests(getDevice(), PKG, TEST_CLASS, "testBaseClassLoader");
+ }
+
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testFeatureAClassLoader_full() throws Exception {
+ testFeatureAClassLoader(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testFeatureAClassLoader_instant() throws Exception {
+ testFeatureAClassLoader(true);
+ }
+ private void testFeatureAClassLoader(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK_BASE).addApk(APK_FEATURE_A).run();
+ runDeviceTests(getDevice(), PKG, TEST_CLASS, "testBaseClassLoader");
+ runDeviceTests(getDevice(), PKG, TEST_CLASS, "testFeatureAClassLoader");
+ }
+
+ @Test
+ @AppModeFull(reason = "'full' portion of the hostside test")
+ public void testFeatureBClassLoader_full() throws Exception {
+ testFeatureBClassLoader(false);
+ }
+ @Test
+ @AppModeInstant(reason = "'instant' portion of the hostside test")
+ public void testFeatureBClassLoader_instant() throws Exception {
+ testFeatureBClassLoader(true);
+ }
+ private void testFeatureBClassLoader(boolean instant) throws Exception {
+ new InstallMultiple(instant)
+ .addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B).run();
+ runDeviceTests(getDevice(), PKG, TEST_CLASS, "testBaseClassLoader");
+ runDeviceTests(getDevice(), PKG, TEST_CLASS, "testFeatureAClassLoader");
+ runDeviceTests(getDevice(), PKG, TEST_CLASS, "testFeatureBClassLoader");
+ }
+
+ @Test
+ @AppModeFull(reason = "b/109878606; instant applications can't send broadcasts to manifest receivers")
+ public void testReceiverClassLoaders_full() throws Exception {
+ testReceiverClassLoaders(false);
+ }
+ private void testReceiverClassLoaders(boolean instant) throws Exception {
+ new InstallMultiple(instant)
+ .addApk(APK_BASE).addApk(APK_FEATURE_A).addApk(APK_FEATURE_B).run();
+ runDeviceTests(getDevice(), PKG, TEST_CLASS, "testBaseClassLoader");
+ runDeviceTests(getDevice(), PKG, TEST_CLASS, "testAllReceivers");
+ }
+
+ protected class InstallMultiple extends BaseInstallMultiple<InstallMultiple> {
+ public InstallMultiple() {
+ this(false);
+ }
+ public InstallMultiple(boolean instant) {
+ super(getDevice(), getBuild(), getAbi());
+ addArg(instant ? "--instant" : "");
+ }
+ }
+}
diff --git a/hostsidetests/classloaders/useslibrary/Android.bp b/hostsidetests/classloaders/useslibrary/Android.bp
new file mode 100644
index 0000000..603b2ec
--- /dev/null
+++ b/hostsidetests/classloaders/useslibrary/Android.bp
@@ -0,0 +1,30 @@
+// Copyright (C) 2019 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.
+
+java_test_host {
+ name: "CtsUsesLibraryHostTestCases",
+ defaults: [ "cts_defaults" ],
+ srcs: [ "src/**/*.java" ],
+ libs: [
+ "compatibility-host-util",
+ "cts-tradefed",
+ "tradefed",
+ ],
+ test_suites: [
+ "cts",
+ "vts",
+ "general-tests",
+ ],
+ required: [ "CtsUsesLibraryApp" ],
+}
diff --git a/hostsidetests/classloaders/useslibrary/AndroidTest.xml b/hostsidetests/classloaders/useslibrary/AndroidTest.xml
new file mode 100644
index 0000000..b7796d7
--- /dev/null
+++ b/hostsidetests/classloaders/useslibrary/AndroidTest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Config for the CTS UsesLibrary host tests">
+ <option name="test-suite-tag" value="cts" />
+ <option name="config-descriptor:metadata" key="component" value="framework" />
+ <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
+ <option name="jar" value="CtsUsesLibraryHostTestCases.jar" />
+ <option name="runtime-hint" value="1m" />
+ </test>
+</configuration>
diff --git a/hostsidetests/classloaders/useslibrary/TEST_MAPPING b/hostsidetests/classloaders/useslibrary/TEST_MAPPING
new file mode 100644
index 0000000..72ef61b
--- /dev/null
+++ b/hostsidetests/classloaders/useslibrary/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsUsesLibraryHostTestCases"
+ }
+ ]
+}
diff --git a/hostsidetests/classloaders/useslibrary/app/Android.bp b/hostsidetests/classloaders/useslibrary/app/Android.bp
new file mode 100644
index 0000000..faf7a22
--- /dev/null
+++ b/hostsidetests/classloaders/useslibrary/app/Android.bp
@@ -0,0 +1,32 @@
+// Copyright (C) 2019 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.
+
+android_test {
+ name: "CtsUsesLibraryApp",
+ defaults: [ "cts_support_defaults" ],
+ sdk_version: "current",
+ srcs: ["src/**/*.java"],
+ libs: [
+ "android.test.base.stubs",
+ ],
+ static_libs: [
+ "android-support-test",
+ "ctstestrunner",
+ ],
+ test_suites: [
+ "cts",
+ "vts",
+ "general-tests",
+ ],
+}
diff --git a/hostsidetests/appsecurity/test-apps/UsesLibraryApp/AndroidManifest.xml b/hostsidetests/classloaders/useslibrary/app/AndroidManifest.xml
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/UsesLibraryApp/AndroidManifest.xml
rename to hostsidetests/classloaders/useslibrary/app/AndroidManifest.xml
diff --git a/hostsidetests/appsecurity/test-apps/UsesLibraryApp/src/com/android/cts/useslibrary/UsesLibraryTest.java b/hostsidetests/classloaders/useslibrary/app/src/com/android/cts/useslibrary/UsesLibraryTest.java
similarity index 95%
rename from hostsidetests/appsecurity/test-apps/UsesLibraryApp/src/com/android/cts/useslibrary/UsesLibraryTest.java
rename to hostsidetests/classloaders/useslibrary/app/src/com/android/cts/useslibrary/UsesLibraryTest.java
index 73b820d..7fa8b20 100644
--- a/hostsidetests/appsecurity/test-apps/UsesLibraryApp/src/com/android/cts/useslibrary/UsesLibraryTest.java
+++ b/hostsidetests/classloaders/useslibrary/app/src/com/android/cts/useslibrary/UsesLibraryTest.java
@@ -16,11 +16,6 @@
package com.android.cts.useslibrary;
-import android.content.pm.PackageManager;
-import android.os.Environment;
-import android.support.test.uiautomator.UiDevice;
-import android.support.test.uiautomator.UiObject;
-import android.support.test.uiautomator.UiSelector;
import android.test.InstrumentationTestCase;
import dalvik.system.BaseDexClassLoader;
diff --git a/hostsidetests/classloaders/useslibrary/src/android/classloaders/cts/BaseInstallMultiple.java b/hostsidetests/classloaders/useslibrary/src/android/classloaders/cts/BaseInstallMultiple.java
new file mode 100644
index 0000000..f5170e9
--- /dev/null
+++ b/hostsidetests/classloaders/useslibrary/src/android/classloaders/cts/BaseInstallMultiple.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2017 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 android.classloaders.cts;
+
+import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.util.AbiUtils;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Base class for invoking the install-multiple command via ADB. Subclass this for less typing:
+ *
+ * <code>
+ * private class InstallMultiple extends BaseInstallMultiple<InstallMultiple> {
+ * public InstallMultiple() {
+ * super(getDevice(), null, null);
+ * }
+ * }
+ * </code>
+ */
+public class BaseInstallMultiple<T extends BaseInstallMultiple<?>> {
+ private final ITestDevice mDevice;
+ private final IBuildInfo mBuild;
+ private final IAbi mAbi;
+
+ private final List<String> mArgs = new ArrayList<>();
+ private final List<File> mApks = new ArrayList<>();
+ private boolean mUseNaturalAbi;
+
+ public BaseInstallMultiple(ITestDevice device, IBuildInfo buildInfo, IAbi abi) {
+ mDevice = device;
+ mBuild = buildInfo;
+ mAbi = abi;
+ addArg("-g");
+ }
+
+ T addArg(String arg) {
+ mArgs.add(arg);
+ return (T) this;
+ }
+
+ T addApk(String apk) throws FileNotFoundException {
+ CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mBuild);
+ mApks.add(buildHelper.getTestFile(apk));
+ return (T) this;
+ }
+
+ T inheritFrom(String packageName) {
+ addArg("-r");
+ addArg("-p " + packageName);
+ return (T) this;
+ }
+
+ T useNaturalAbi() {
+ mUseNaturalAbi = true;
+ return (T) this;
+ }
+
+ T allowTest() {
+ addArg("-t");
+ return (T) this;
+ }
+
+ T locationAuto() {
+ addArg("--install-location 0");
+ return (T) this;
+ }
+
+ T locationInternalOnly() {
+ addArg("--install-location 1");
+ return (T) this;
+ }
+
+ T locationPreferExternal() {
+ addArg("--install-location 2");
+ return (T) this;
+ }
+
+ T forceUuid(String uuid) {
+ addArg("--force-uuid " + uuid);
+ return (T) this;
+ }
+
+ T forUser(int userId) {
+ addArg("--user " + userId);
+ return (T) this;
+ }
+
+ void run() throws DeviceNotAvailableException {
+ run(true, null);
+ }
+
+ void runExpectingFailure() throws DeviceNotAvailableException {
+ run(false, null);
+ }
+
+ void runExpectingFailure(String failure) throws DeviceNotAvailableException {
+ run(false, failure);
+ }
+
+ private void run(boolean expectingSuccess, String failure) throws DeviceNotAvailableException {
+ final ITestDevice device = mDevice;
+
+ // Create an install session
+ final StringBuilder cmd = new StringBuilder();
+ cmd.append("pm install-create");
+ for (String arg : mArgs) {
+ cmd.append(' ').append(arg);
+ }
+ if (!mUseNaturalAbi && mAbi != null) {
+ cmd.append(' ').append(AbiUtils.createAbiFlag(mAbi.getName()));
+ }
+
+ String result = device.executeShellCommand(cmd.toString());
+ TestCase.assertTrue(result, result.startsWith("Success"));
+
+ final int start = result.lastIndexOf("[");
+ final int end = result.lastIndexOf("]");
+ int sessionId = -1;
+ try {
+ if (start != -1 && end != -1 && start < end) {
+ sessionId = Integer.parseInt(result.substring(start + 1, end));
+ }
+ } catch (NumberFormatException e) {
+ }
+ if (sessionId == -1) {
+ throw new IllegalStateException("Failed to create install session: " + result);
+ }
+
+ // Push our files into session. Ideally we'd use stdin streaming,
+ // but ddmlib doesn't support it yet.
+ for (int i = 0; i < mApks.size(); i++) {
+ final File apk = mApks.get(i);
+ final String remotePath = "/data/local/tmp/" + i + "_" + apk.getName();
+ if (!device.pushFile(apk, remotePath)) {
+ throw new IllegalStateException("Failed to push " + apk);
+ }
+
+ cmd.setLength(0);
+ cmd.append("pm install-write");
+ cmd.append(' ').append(sessionId);
+ cmd.append(' ').append(i + "_" + apk.getName());
+ cmd.append(' ').append(remotePath);
+
+ result = device.executeShellCommand(cmd.toString());
+ TestCase.assertTrue(result, result.startsWith("Success"));
+ }
+
+ // Everything staged; let's pull trigger
+ cmd.setLength(0);
+ cmd.append("pm install-commit");
+ cmd.append(' ').append(sessionId);
+
+ result = device.executeShellCommand(cmd.toString()).trim();
+ if (failure == null) {
+ if (expectingSuccess) {
+ TestCase.assertTrue(result, result.startsWith("Success"));
+ } else {
+ TestCase.assertFalse(result, result.startsWith("Success"));
+ }
+ } else {
+ TestCase.assertTrue(result, result.contains(failure));
+ }
+ }
+}
diff --git a/hostsidetests/classloaders/useslibrary/src/android/classloaders/cts/UsesLibraryHostTest.java b/hostsidetests/classloaders/useslibrary/src/android/classloaders/cts/UsesLibraryHostTest.java
new file mode 100644
index 0000000..aecd87b
--- /dev/null
+++ b/hostsidetests/classloaders/useslibrary/src/android/classloaders/cts/UsesLibraryHostTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2015 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 android.classloaders.cts;
+
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.AppModeInstant;
+
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Set of tests that verify behavior of runtime permissions, including both
+ * dynamic granting and behavior of legacy apps.
+ */
+@AppModeFull(reason = "TODO verify whether or not these should run in instant mode")
+@RunWith(DeviceJUnit4ClassRunner.class)
+public class UsesLibraryHostTest extends BaseHostJUnit4Test {
+ private static final String PKG = "com.android.cts.useslibrary";
+
+ private static final String APK = "CtsUsesLibraryApp.apk";
+ private static final String APK_COMPAT = "CtsUsesLibraryAppCompat.apk";
+
+
+ @Before
+ public void setUp() throws Exception {
+ Utils.prepareSingleUser(getDevice());
+ getDevice().uninstallPackage(PKG);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ getDevice().uninstallPackage(PKG);
+ }
+
+ @Test
+ @AppModeFull
+ public void testUsesLibrary_full() throws Exception {
+ testUsesLibrary(false);
+ }
+ private void testUsesLibrary(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).run();
+ Utils.runDeviceTests(getDevice(), PKG, ".UsesLibraryTest", "testUsesLibrary");
+ }
+
+ @Test
+ @AppModeFull
+ public void testMissingLibrary_full() throws Exception {
+ testMissingLibrary(false);
+ }
+ public void testMissingLibrary(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).run();
+ Utils.runDeviceTests(getDevice(), PKG, ".UsesLibraryTest", "testMissingLibrary");
+ }
+
+ @Test
+ @AppModeFull
+ public void testDuplicateLibrary_full() throws Exception {
+ testDuplicateLibrary(false);
+ }
+ public void testDuplicateLibrary(boolean instant) throws Exception {
+ new InstallMultiple(instant).addApk(APK).run();
+ Utils.runDeviceTests(getDevice(), PKG, ".UsesLibraryTest", "testDuplicateLibrary");
+ }
+
+ protected class InstallMultiple extends BaseInstallMultiple<InstallMultiple> {
+ public InstallMultiple() {
+ this(false);
+ }
+ public InstallMultiple(boolean instant) {
+ super(getDevice(), getBuild(), getAbi());
+ addArg(instant ? "--instant" : "");
+ }
+ }
+}
diff --git a/hostsidetests/classloaders/useslibrary/src/android/classloaders/cts/Utils.java b/hostsidetests/classloaders/useslibrary/src/android/classloaders/cts/Utils.java
new file mode 100644
index 0000000..48497d8
--- /dev/null
+++ b/hostsidetests/classloaders/useslibrary/src/android/classloaders/cts/Utils.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2014 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 android.classloaders.cts;
+
+import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
+import com.android.ddmlib.testrunner.TestResult.TestStatus;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.result.CollectingTestListener;
+import com.android.tradefed.result.TestDescription;
+import com.android.tradefed.result.TestResult;
+import com.android.tradefed.result.TestRunResult;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public class Utils {
+ public static final int USER_SYSTEM = 0;
+
+ public static void runDeviceTests(ITestDevice device, String packageName, String testClassName,
+ String testMethodName) throws DeviceNotAvailableException {
+ runDeviceTests(device, packageName, testClassName, testMethodName, USER_SYSTEM, null);
+ }
+
+ public static void runDeviceTests(ITestDevice device, String packageName, String testClassName,
+ String testMethodName, Map<String, String> testArgs)
+ throws DeviceNotAvailableException {
+ runDeviceTests(device, packageName, testClassName, testMethodName, USER_SYSTEM, testArgs);
+ }
+
+ public static void runDeviceTests(ITestDevice device, String packageName, String testClassName,
+ String testMethodName, int userId) throws DeviceNotAvailableException {
+ runDeviceTests(device, packageName, testClassName, testMethodName, userId, null);
+ }
+
+ public static void runDeviceTests(ITestDevice device, String packageName, String testClassName,
+ String testMethodName, int userId, Map<String, String> testArgs)
+ throws DeviceNotAvailableException {
+ // 60 min timeout per test by default
+ runDeviceTests(device, packageName, testClassName, testMethodName, userId, testArgs,
+ 60L, TimeUnit.MINUTES);
+ }
+
+ public static void runDeviceTests(ITestDevice device, String packageName, String testClassName,
+ String testMethodName, int userId, Map<String, String> testArgs, long timeout,
+ TimeUnit unit)
+ throws DeviceNotAvailableException {
+ if (testClassName != null && testClassName.startsWith(".")) {
+ testClassName = packageName + testClassName;
+ }
+ RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(packageName,
+ "android.support.test.runner.AndroidJUnitRunner", device.getIDevice());
+ // timeout_msec is the timeout per test for instrumentation
+ testRunner.addInstrumentationArg("timeout_msec", Long.toString(unit.toMillis(timeout)));
+ if (testClassName != null && testMethodName != null) {
+ testRunner.setMethodName(testClassName, testMethodName);
+ } else if (testClassName != null) {
+ testRunner.setClassName(testClassName);
+ }
+
+ if (testArgs != null && testArgs.size() > 0) {
+ for (String name : testArgs.keySet()) {
+ final String value = testArgs.get(name);
+ testRunner.addInstrumentationArg(name, value);
+ }
+ }
+ final CollectingTestListener listener = new CollectingTestListener();
+ device.runInstrumentationTestsAsUser(testRunner, userId, listener);
+
+ final TestRunResult result = listener.getCurrentRunResults();
+ if (result.isRunFailure()) {
+ throw new AssertionError("Failed to successfully run device tests for "
+ + result.getName() + ": " + result.getRunFailureMessage());
+ }
+ if (result.getNumTests() == 0) {
+ throw new AssertionError("No tests were run on the device");
+ }
+ if (result.hasFailedTests()) {
+ // build a meaningful error message
+ StringBuilder errorBuilder = new StringBuilder("on-device tests failed:\n");
+ for (Map.Entry<TestDescription, TestResult> resultEntry :
+ result.getTestResults().entrySet()) {
+ if (!resultEntry.getValue().getStatus().equals(TestStatus.PASSED)) {
+ errorBuilder.append(resultEntry.getKey().toString());
+ errorBuilder.append(":\n");
+ errorBuilder.append(resultEntry.getValue().getStackTrace());
+ }
+ }
+ throw new AssertionError(errorBuilder.toString());
+ }
+ }
+
+ /**
+ * Prepare and return a single user relevant for testing.
+ */
+ public static int[] prepareSingleUser(ITestDevice device)
+ throws DeviceNotAvailableException {
+ return prepareMultipleUsers(device, 1);
+ }
+
+ /**
+ * Prepare and return two users relevant for testing.
+ */
+ public static int[] prepareMultipleUsers(ITestDevice device)
+ throws DeviceNotAvailableException {
+ return prepareMultipleUsers(device, 2);
+ }
+
+ /**
+ * Prepare and return multiple users relevant for testing.
+ */
+ public static int[] prepareMultipleUsers(ITestDevice device, int maxUsers)
+ throws DeviceNotAvailableException {
+ final int[] userIds = getAllUsers(device);
+ for (int i = 1; i < userIds.length; i++) {
+ if (i < maxUsers) {
+ device.startUser(userIds[i]);
+ } else {
+ device.stopUser(userIds[i]);
+ }
+ }
+ if (userIds.length > maxUsers) {
+ return Arrays.copyOf(userIds, maxUsers);
+ } else {
+ return userIds;
+ }
+ }
+
+ public static int[] getAllUsers(ITestDevice device)
+ throws DeviceNotAvailableException {
+ Integer primary = device.getPrimaryUserId();
+ if (primary == null) {
+ primary = USER_SYSTEM;
+ }
+ int[] users = new int[] { primary };
+ for (Integer user : device.listUsers()) {
+ if ((user != USER_SYSTEM) && (user != primary)) {
+ users = Arrays.copyOf(users, users.length + 1);
+ users[users.length - 1] = user;
+ }
+ }
+ return users;
+ }
+}
diff --git a/hostsidetests/compilation/Android.mk b/hostsidetests/compilation/Android.mk
index 5047435..5a27baf 100644
--- a/hostsidetests/compilation/Android.mk
+++ b/hostsidetests/compilation/Android.mk
@@ -27,6 +27,8 @@
LOCAL_MODULE := CtsCompilationTestCases
+LOCAL_MIN_SDK_VERSION := 23
+
LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed compatibility-host-util guava
include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/hostsidetests/devicepolicy/app/AccountCheck/Auth/Android.mk b/hostsidetests/devicepolicy/app/AccountCheck/Auth/Android.mk
index 5746089..22f3436 100644
--- a/hostsidetests/devicepolicy/app/AccountCheck/Auth/Android.mk
+++ b/hostsidetests/devicepolicy/app/AccountCheck/Auth/Android.mk
@@ -36,5 +36,6 @@
LOCAL_JAVA_LIBRARIES := android.test.base.stubs
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 25
include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/AccountCheck/Tester/Android.mk b/hostsidetests/devicepolicy/app/AccountCheck/Tester/Android.mk
index b3adc70..7706e73 100644
--- a/hostsidetests/devicepolicy/app/AccountCheck/Tester/Android.mk
+++ b/hostsidetests/devicepolicy/app/AccountCheck/Tester/Android.mk
@@ -30,5 +30,6 @@
LOCAL_STATIC_JAVA_LIBRARIES := androidx.legacy_legacy-support-v4 ctstestrunner ub-uiautomator android-support-test
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 25
include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/AppRestrictionsTargetApp/Android.mk b/hostsidetests/devicepolicy/app/AppRestrictionsTargetApp/Android.mk
index 78795cf..3aed12d 100644
--- a/hostsidetests/devicepolicy/app/AppRestrictionsTargetApp/Android.mk
+++ b/hostsidetests/devicepolicy/app/AppRestrictionsTargetApp/Android.mk
@@ -25,6 +25,7 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 24
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := arcts cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/CertInstaller/Android.mk b/hostsidetests/devicepolicy/app/CertInstaller/Android.mk
index 86440fc..18256f6 100644
--- a/hostsidetests/devicepolicy/app/CertInstaller/Android.mk
+++ b/hostsidetests/devicepolicy/app/CertInstaller/Android.mk
@@ -27,6 +27,7 @@
LOCAL_JAVA_LIBRARIES := android.test.runner.stubs
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 22
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/CrossProfileAppsTest/Android.mk b/hostsidetests/devicepolicy/app/CrossProfileAppsTest/Android.mk
index 64034b9..009a289 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileAppsTest/Android.mk
+++ b/hostsidetests/devicepolicy/app/CrossProfileAppsTest/Android.mk
@@ -34,6 +34,7 @@
ub-uiautomator
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 21
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/CustomizationApp/Android.mk b/hostsidetests/devicepolicy/app/CustomizationApp/Android.mk
index 81d98f1..2cea654 100644
--- a/hostsidetests/devicepolicy/app/CustomizationApp/Android.mk
+++ b/hostsidetests/devicepolicy/app/CustomizationApp/Android.mk
@@ -33,5 +33,6 @@
LOCAL_JAVA_LIBRARIES := android.test.base.stubs
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 24
include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/DeviceAdmin/api23/Android.mk b/hostsidetests/devicepolicy/app/DeviceAdmin/api23/Android.mk
index 5cf7f05..2d3a367 100644
--- a/hostsidetests/devicepolicy/app/DeviceAdmin/api23/Android.mk
+++ b/hostsidetests/devicepolicy/app/DeviceAdmin/api23/Android.mk
@@ -33,6 +33,7 @@
LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 23
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/DeviceAdmin/api24/Android.mk b/hostsidetests/devicepolicy/app/DeviceAdmin/api24/Android.mk
index a7c7470..c19d0c0 100644
--- a/hostsidetests/devicepolicy/app/DeviceAdmin/api24/Android.mk
+++ b/hostsidetests/devicepolicy/app/DeviceAdmin/api24/Android.mk
@@ -33,6 +33,7 @@
LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 23
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := arcts cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/api23/Android.mk b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/api23/Android.mk
index 1599d60..3c70869 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/api23/Android.mk
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/api23/Android.mk
@@ -44,6 +44,8 @@
LOCAL_ASSET_DIR := $(LOCAL_PATH)/../assets
+LOCAL_MIN_SDK_VERSION := 23
+
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/api25/Android.mk b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/api25/Android.mk
index 481f821..68bef1b 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/api25/Android.mk
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/api25/Android.mk
@@ -44,6 +44,8 @@
LOCAL_ASSET_DIR := $(LOCAL_PATH)/../assets
+LOCAL_MIN_SDK_VERSION := 23
+
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/latest/Android.mk b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/latest/Android.mk
index 8c6d3fd..6a71be9 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/latest/Android.mk
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/latest/Android.mk
@@ -44,6 +44,8 @@
LOCAL_ASSET_DIR := $(LOCAL_PATH)/../assets
+LOCAL_MIN_SDK_VERSION := 23
+
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := arcts cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk b/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk
index a8e3b68..ecf9dbf 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk
@@ -46,6 +46,8 @@
LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.legacy_legacy-support-v4
+LOCAL_MIN_SDK_VERSION := 20
+
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := arcts cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/Android.mk b/hostsidetests/devicepolicy/app/IntentReceiver/Android.mk
index 60395c2..bb2393c 100644
--- a/hostsidetests/devicepolicy/app/IntentReceiver/Android.mk
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/Android.mk
@@ -31,6 +31,7 @@
ctstestrunner
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 19
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := arcts cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/IntentSender/Android.mk b/hostsidetests/devicepolicy/app/IntentSender/Android.mk
index 5cc3b7a..1551bea 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/Android.mk
+++ b/hostsidetests/devicepolicy/app/IntentSender/Android.mk
@@ -36,6 +36,7 @@
androidx.legacy_legacy-support-v4
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 19
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := arcts cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/LauncherTests/Android.mk b/hostsidetests/devicepolicy/app/LauncherTests/Android.mk
index e37617e..f744237 100644
--- a/hostsidetests/devicepolicy/app/LauncherTests/Android.mk
+++ b/hostsidetests/devicepolicy/app/LauncherTests/Android.mk
@@ -35,6 +35,7 @@
testng
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 21
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/LauncherTestsSupport/Android.mk b/hostsidetests/devicepolicy/app/LauncherTestsSupport/Android.mk
index ead09a4..935be3b 100644
--- a/hostsidetests/devicepolicy/app/LauncherTestsSupport/Android.mk
+++ b/hostsidetests/devicepolicy/app/LauncherTestsSupport/Android.mk
@@ -27,6 +27,7 @@
LOCAL_JAVA_LIBRARIES := junit
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 21
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk b/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk
index e876054..0cba8bd 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk
@@ -39,6 +39,7 @@
androidx.legacy_legacy-support-v4
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 20
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := arcts cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/PackageInstaller/Android.mk b/hostsidetests/devicepolicy/app/PackageInstaller/Android.mk
index a1514ff..f60242c 100644
--- a/hostsidetests/devicepolicy/app/PackageInstaller/Android.mk
+++ b/hostsidetests/devicepolicy/app/PackageInstaller/Android.mk
@@ -32,6 +32,7 @@
ub-uiautomator
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 21
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := arcts cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk b/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
index 8a024f8..98e1e87 100644
--- a/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
@@ -19,6 +19,8 @@
LOCAL_PACKAGE_NAME := CtsProfileOwnerApp
LOCAL_PRIVATE_PLATFORM_APIS := true
+LOCAL_MIN_SDK_VERSION := 24
+
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
diff --git a/hostsidetests/devicepolicy/app/TransferOwnerIncomingApp/Android.mk b/hostsidetests/devicepolicy/app/TransferOwnerIncomingApp/Android.mk
index 7064258..3941a50 100644
--- a/hostsidetests/devicepolicy/app/TransferOwnerIncomingApp/Android.mk
+++ b/hostsidetests/devicepolicy/app/TransferOwnerIncomingApp/Android.mk
@@ -35,6 +35,7 @@
testng
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 24
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/devicepolicy/app/TransferOwnerOutgoingApp/Android.mk b/hostsidetests/devicepolicy/app/TransferOwnerOutgoingApp/Android.mk
index 14f6ab5..afe245c 100644
--- a/hostsidetests/devicepolicy/app/TransferOwnerOutgoingApp/Android.mk
+++ b/hostsidetests/devicepolicy/app/TransferOwnerOutgoingApp/Android.mk
@@ -35,6 +35,7 @@
testng
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 24
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/dexmetadata/host/Android.mk b/hostsidetests/dexmetadata/host/Android.mk
index a51ddd2..cae13cd 100644
--- a/hostsidetests/dexmetadata/host/Android.mk
+++ b/hostsidetests/dexmetadata/host/Android.mk
@@ -29,6 +29,6 @@
tradefed
# tag this module as test artifact for cts
-LOCAL_COMPATIBILITY_SUITE := cts
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
include $(BUILD_CTS_HOST_JAVA_LIBRARY)
diff --git a/hostsidetests/dumpsys/apps/ProcStatsHelperApp/Android.mk b/hostsidetests/dumpsys/apps/ProcStatsHelperApp/Android.mk
index c5c846b..bd6f0d73 100644
--- a/hostsidetests/dumpsys/apps/ProcStatsHelperApp/Android.mk
+++ b/hostsidetests/dumpsys/apps/ProcStatsHelperApp/Android.mk
@@ -32,6 +32,7 @@
androidx.legacy_legacy-support-v4
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 24
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/inputmethodservice/deviceside/devicetest/Android.mk b/hostsidetests/inputmethodservice/deviceside/devicetest/Android.mk
index 1727ad7..a85b4d2 100644
--- a/hostsidetests/inputmethodservice/deviceside/devicetest/Android.mk
+++ b/hostsidetests/inputmethodservice/deviceside/devicetest/Android.mk
@@ -41,5 +41,6 @@
LOCAL_PACKAGE_NAME := CtsInputMethodServiceDeviceTests
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 19
include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/inputmethodservice/deviceside/edittextapp/Android.mk b/hostsidetests/inputmethodservice/deviceside/edittextapp/Android.mk
index 30fdb08..a089809 100644
--- a/hostsidetests/inputmethodservice/deviceside/edittextapp/Android.mk
+++ b/hostsidetests/inputmethodservice/deviceside/edittextapp/Android.mk
@@ -36,5 +36,6 @@
LOCAL_PACKAGE_NAME := EditTextApp
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 28
include $(BUILD_PACKAGE)
diff --git a/hostsidetests/inputmethodservice/deviceside/ime1/Android.mk b/hostsidetests/inputmethodservice/deviceside/ime1/Android.mk
index 850b89f..3b98a87 100644
--- a/hostsidetests/inputmethodservice/deviceside/ime1/Android.mk
+++ b/hostsidetests/inputmethodservice/deviceside/ime1/Android.mk
@@ -37,5 +37,6 @@
LOCAL_PACKAGE_NAME := CtsInputMethod1
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 19
include $(BUILD_PACKAGE)
diff --git a/hostsidetests/inputmethodservice/deviceside/ime2/Android.mk b/hostsidetests/inputmethodservice/deviceside/ime2/Android.mk
index fcd146c..7b9ebeb 100644
--- a/hostsidetests/inputmethodservice/deviceside/ime2/Android.mk
+++ b/hostsidetests/inputmethodservice/deviceside/ime2/Android.mk
@@ -37,5 +37,6 @@
LOCAL_PACKAGE_NAME := CtsInputMethod2
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 19
include $(BUILD_PACKAGE)
diff --git a/hostsidetests/inputmethodservice/deviceside/provider/Android.mk b/hostsidetests/inputmethodservice/deviceside/provider/Android.mk
index b8f308d..365f792 100644
--- a/hostsidetests/inputmethodservice/deviceside/provider/Android.mk
+++ b/hostsidetests/inputmethodservice/deviceside/provider/Android.mk
@@ -36,5 +36,6 @@
LOCAL_PACKAGE_NAME := CtsInputMethodServiceEventProvider
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 19
include $(BUILD_PACKAGE)
diff --git a/hostsidetests/media/app/MediaSessionTest/Android.mk b/hostsidetests/media/app/MediaSessionTest/Android.mk
index 174a744..5be80de 100644
--- a/hostsidetests/media/app/MediaSessionTest/Android.mk
+++ b/hostsidetests/media/app/MediaSessionTest/Android.mk
@@ -35,5 +35,6 @@
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 26
include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/sustainedperf/shadertoy_android/Android.mk b/hostsidetests/sustainedperf/shadertoy_android/Android.mk
index 2e1bbdd..190ce5d 100644
--- a/hostsidetests/sustainedperf/shadertoy_android/Android.mk
+++ b/hostsidetests/sustainedperf/shadertoy_android/Android.mk
@@ -31,6 +31,7 @@
LOCAL_PACKAGE_NAME := CtsSustainedPerformanceTestCases
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 5
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/hostsidetests/theme/app/Android.mk b/hostsidetests/theme/app/Android.mk
index de63355..c2cc382 100644
--- a/hostsidetests/theme/app/Android.mk
+++ b/hostsidetests/theme/app/Android.mk
@@ -39,5 +39,6 @@
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
LOCAL_SDK_VERSION := 23
+#LOCAL_MIN_SDK_VERSION := 17
include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/usb/SerialTestApp/Android.mk b/hostsidetests/usb/SerialTestApp/Android.mk
index 601c0ba..4baa577 100644
--- a/hostsidetests/usb/SerialTestApp/Android.mk
+++ b/hostsidetests/usb/SerialTestApp/Android.mk
@@ -29,6 +29,7 @@
LOCAL_PACKAGE_NAME := CtsUsbSerialTestApp
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 27
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests cts_instant
diff --git a/tests/app/Android.mk b/tests/app/Android.mk
index e38ad2f..52dcb69 100644
--- a/tests/app/Android.mk
+++ b/tests/app/Android.mk
@@ -47,6 +47,7 @@
LOCAL_INSTRUMENTATION_FOR := CtsAppTestStubs
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 11
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/jdwp/AndroidTest.xml b/tests/jdwp/AndroidTest.xml
index 462ed34..9b42fb9 100644
--- a/tests/jdwp/AndroidTest.xml
+++ b/tests/jdwp/AndroidTest.xml
@@ -36,6 +36,7 @@
<option name="dalvik-arg" value="-Djpda.settings.verbose=false" />
<option name="dalvik-arg" value="-Djpda.settings.timeout=10000" />
<option name="dalvik-arg" value="-Djpda.settings.waitingTime=10000" />
+ <option name="dalvik-arg" value="-Djpda.settings.dumpProcess='/system/xbin/su root /system/bin/logwrapper /system/bin/debuggerd'" />
<option name="dalvik-arg-adbconnection" value="-Djpda.settings.debuggeeAgentArgument=-agentpath:" />
<option name="dalvik-arg-adbconnection" value="-Djpda.settings.debuggeeAgentName=libjdwp.so" />
<option name="dalvik-arg-adbconnection" value="-Djpda.settings.debuggeeJavaPath='dalvikvm|#ABI#| -XXlib:libart.so -Xplugin:libopenjdkjvmti.so -Xcompiler-option --debuggable -Xusejit:true'" />
diff --git a/tests/leanbackjank/app/Android.mk b/tests/leanbackjank/app/Android.mk
index b6404fe..f23d99c 100644
--- a/tests/leanbackjank/app/Android.mk
+++ b/tests/leanbackjank/app/Android.mk
@@ -24,6 +24,7 @@
LOCAL_PACKAGE_NAME := CtsLeanbackJankApp
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 21
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/tests/openglperf2/Android.mk b/tests/openglperf2/Android.mk
index 8fa4296..02ae698 100644
--- a/tests/openglperf2/Android.mk
+++ b/tests/openglperf2/Android.mk
@@ -33,5 +33,6 @@
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
LOCAL_SDK_VERSION := 16
+#LOCAL_MIN_SDK_VERSION := 16
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/signature/api-check/android-test-base-27-api/Android.mk b/tests/signature/api-check/android-test-base-27-api/Android.mk
index 1adcb12c..dc8dea0 100644
--- a/tests/signature/api-check/android-test-base-27-api/Android.mk
+++ b/tests/signature/api-check/android-test-base-27-api/Android.mk
@@ -21,4 +21,6 @@
LOCAL_SIGNATURE_API_FILES := \
android-test-base-current.api \
+LOCAL_MIN_SDK_VERSION := 25
+
include $(LOCAL_PATH)/../build_signature_apk.mk
diff --git a/tests/signature/api-check/apache-http-legacy-27-api/Android.mk b/tests/signature/api-check/apache-http-legacy-27-api/Android.mk
index 0f2161a..4e17901 100644
--- a/tests/signature/api-check/apache-http-legacy-27-api/Android.mk
+++ b/tests/signature/api-check/apache-http-legacy-27-api/Android.mk
@@ -22,4 +22,6 @@
current.api \
apache-http-legacy-minus-current.api \
+LOCAL_MIN_SDK_VERSION := 22
+
include $(LOCAL_PATH)/../build_signature_apk.mk
diff --git a/tests/tests/alarmclock/Android.mk b/tests/tests/alarmclock/Android.mk
index 65b9f3c..5d5c4e4 100644
--- a/tests/tests/alarmclock/Android.mk
+++ b/tests/tests/alarmclock/Android.mk
@@ -21,7 +21,7 @@
# and when built explicitly put it in the data partition
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_STATIC_JAVA_LIBRARIES := CtsAlarmClockCommon ctstestrunner compatibility-device-util androidx.test.rules
+LOCAL_STATIC_JAVA_LIBRARIES := CtsAlarmClockCommon ctstestrunner compatibility-device-util
LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs
diff --git a/tests/tests/alarmclock/src/android/alarmclock/cts/DismissTimerTest.java b/tests/tests/alarmclock/src/android/alarmclock/cts/DismissTimerTest.java
index 93fca7a..a4c0d0a 100644
--- a/tests/tests/alarmclock/src/android/alarmclock/cts/DismissTimerTest.java
+++ b/tests/tests/alarmclock/src/android/alarmclock/cts/DismissTimerTest.java
@@ -4,8 +4,6 @@
import android.content.Context;
import android.media.AudioManager;
-import androidx.test.filters.Suppress;
-
public class DismissTimerTest extends AlarmClockTestBase {
private int mSavedVolume;
@@ -29,7 +27,6 @@
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, mSavedVolume, 0);
}
- @Suppress // b/120982312 - Flaky on AOSP
public void testAll() throws Exception {
assertEquals(Utils.COMPLETION_RESULT, runTest(Utils.TestcaseType.SET_TIMER_FOR_DISMISSAL));
try {
diff --git a/tests/tests/alarmclock/src/android/alarmclock/cts/SetAlarmTest.java b/tests/tests/alarmclock/src/android/alarmclock/cts/SetAlarmTest.java
index ff31ba4..a95a1dd 100644
--- a/tests/tests/alarmclock/src/android/alarmclock/cts/SetAlarmTest.java
+++ b/tests/tests/alarmclock/src/android/alarmclock/cts/SetAlarmTest.java
@@ -19,14 +19,11 @@
import android.alarmclock.common.Utils;
import android.alarmclock.common.Utils.TestcaseType;
-import androidx.test.filters.Suppress;
-
public class SetAlarmTest extends AlarmClockTestBase {
public SetAlarmTest() {
super();
}
- @Suppress // b/120982312 - Flaky on AOSP
public void testAll() throws Exception {
assertEquals(Utils.COMPLETION_RESULT, runTest(TestcaseType.SET_ALARM));
}
diff --git a/tests/tests/batterysaving/apps/app_target_api_25/Android.mk b/tests/tests/batterysaving/apps/app_target_api_25/Android.mk
index f1ebee6..42c1466 100644
--- a/tests/tests/batterysaving/apps/app_target_api_25/Android.mk
+++ b/tests/tests/batterysaving/apps/app_target_api_25/Android.mk
@@ -33,6 +33,7 @@
ub-uiautomator
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 23
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/tests/tests/calendarcommon/Android.mk b/tests/tests/calendarcommon/Android.mk
index bfd9f26..fd97621 100644
--- a/tests/tests/calendarcommon/Android.mk
+++ b/tests/tests/calendarcommon/Android.mk
@@ -32,6 +32,7 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 15
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/tests/tests/car/AndroidManifest.xml b/tests/tests/car/AndroidManifest.xml
index 2a52f2e..fe1b64f 100644
--- a/tests/tests/car/AndroidManifest.xml
+++ b/tests/tests/car/AndroidManifest.xml
@@ -19,7 +19,8 @@
<uses-feature android:name="android.hardware.type.automotive" />
<uses-permission android:name="android.car.permission.CAR_EXTERIOR_ENVIRONMENT" />
<uses-permission android:name="android.car.permission.CAR_INFO" />
-
+ <uses-permission android:name="android.car.permission.CAR_POWERTRAIN" />
+ <uses-permission android:name="android.car.permission.CAR_SPEED" />
<application>
<uses-library android:name="android.test.runner" />
<activity android:name=".drivingstate.DistractionOptimizedActivity">
diff --git a/tests/tests/car/src/android/car/cts/CarSensorManagerTest.java b/tests/tests/car/src/android/car/cts/CarSensorManagerTest.java
index 3b9d8eb..d19d04d 100644
--- a/tests/tests/car/src/android/car/cts/CarSensorManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarSensorManagerTest.java
@@ -55,7 +55,6 @@
@CddTest(requirement="2.5.1")
@Test
- @Ignore // Enable when b/120125891 is fixed
public void testRequiredSensorsForDrivingState() throws Exception {
boolean foundSpeed = false;
boolean foundGear = false;
diff --git a/tests/tests/dpi2/Android.mk b/tests/tests/dpi2/Android.mk
index f366781..8b31db5 100644
--- a/tests/tests/dpi2/Android.mk
+++ b/tests/tests/dpi2/Android.mk
@@ -31,6 +31,7 @@
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 3
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/tests/tests/media/libndkaudio/Android.mk b/tests/tests/media/libndkaudio/Android.mk
index 982c630..9480dcd 100644
--- a/tests/tests/media/libndkaudio/Android.mk
+++ b/tests/tests/media/libndkaudio/Android.mk
@@ -57,5 +57,6 @@
LOCAL_CERTIFICATE := platform
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 23
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-cleartext-pre-P/Android.mk b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext-pre-P/Android.mk
index 7a11df4..032bcde 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-cleartext-pre-P/Android.mk
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext-pre-P/Android.mk
@@ -33,4 +33,6 @@
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 26
+
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/notificationlegacy/Android.mk b/tests/tests/notificationlegacy/Android.mk
index c1fb3fa..07b2f80 100644
--- a/tests/tests/notificationlegacy/Android.mk
+++ b/tests/tests/notificationlegacy/Android.mk
@@ -39,4 +39,6 @@
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
+LOCAL_MIN_SDK_VERSION := 24
+
include $(BUILD_CTS_PACKAGE)
\ No newline at end of file
diff --git a/tests/tests/packageinstaller/emptytestapp/Android.mk b/tests/tests/packageinstaller/emptytestapp/Android.mk
index 7574d1f..4763e01 100644
--- a/tests/tests/packageinstaller/emptytestapp/Android.mk
+++ b/tests/tests/packageinstaller/emptytestapp/Android.mk
@@ -23,6 +23,7 @@
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 23
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := arcts cts vts general-tests
diff --git a/tests/tests/provider/Android.mk b/tests/tests/provider/Android.mk
index 400f0d2..eb6629b 100644
--- a/tests/tests/provider/Android.mk
+++ b/tests/tests/provider/Android.mk
@@ -48,4 +48,6 @@
LOCAL_PACKAGE_NAME := CtsProviderTestCases
LOCAL_PRIVATE_PLATFORM_APIS := true
+LOCAL_MIN_SDK_VERSION := 21
+
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/selinux/selinuxTargetSdk25/Android.mk b/tests/tests/selinux/selinuxTargetSdk25/Android.mk
index f9bfc95..040bc62 100644
--- a/tests/tests/selinux/selinuxTargetSdk25/Android.mk
+++ b/tests/tests/selinux/selinuxTargetSdk25/Android.mk
@@ -40,6 +40,9 @@
LOCAL_PACKAGE_NAME := CtsSelinuxTargetSdk25TestCases
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
+
+LOCAL_MIN_SDK_VERSION := 21
+
include $(BUILD_CTS_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/selinux/selinuxTargetSdk27/Android.mk b/tests/tests/selinux/selinuxTargetSdk27/Android.mk
index 37660a3..ae9e5bf 100644
--- a/tests/tests/selinux/selinuxTargetSdk27/Android.mk
+++ b/tests/tests/selinux/selinuxTargetSdk27/Android.mk
@@ -40,6 +40,9 @@
LOCAL_PACKAGE_NAME := CtsSelinuxTargetSdk27TestCases
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
+
+LOCAL_MIN_SDK_VERSION := 21
+
include $(BUILD_CTS_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/selinux/selinuxTargetSdkCurrent/Android.mk b/tests/tests/selinux/selinuxTargetSdkCurrent/Android.mk
index 63bc768..fa65d3d 100644
--- a/tests/tests/selinux/selinuxTargetSdkCurrent/Android.mk
+++ b/tests/tests/selinux/selinuxTargetSdkCurrent/Android.mk
@@ -40,6 +40,9 @@
LOCAL_PACKAGE_NAME := CtsSelinuxTargetSdkCurrentTestCases
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
+
+LOCAL_MIN_SDK_VERSION := 21
+
include $(BUILD_CTS_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/shortcutmanager/throttling/Android.mk b/tests/tests/shortcutmanager/throttling/Android.mk
index 5a174cc..eb62622 100644
--- a/tests/tests/shortcutmanager/throttling/Android.mk
+++ b/tests/tests/shortcutmanager/throttling/Android.mk
@@ -38,5 +38,6 @@
ShortcutManagerTestUtils
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 25
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/telecom/Android.mk b/tests/tests/telecom/Android.mk
index 8f46fd7..e4f99b8 100644
--- a/tests/tests/telecom/Android.mk
+++ b/tests/tests/telecom/Android.mk
@@ -34,6 +34,7 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 21
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/tests/tests/telecom2/Android.mk b/tests/tests/telecom2/Android.mk
index 5b22a92..9ceb4d4 100644
--- a/tests/tests/telecom2/Android.mk
+++ b/tests/tests/telecom2/Android.mk
@@ -48,6 +48,7 @@
--rename-manifest-package android.telecom2.cts \
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 21
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/tests/tests/telecom3/Android.mk b/tests/tests/telecom3/Android.mk
index 3138e6c..fc95b23 100644
--- a/tests/tests/telecom3/Android.mk
+++ b/tests/tests/telecom3/Android.mk
@@ -45,6 +45,7 @@
--rename-manifest-package android.telecom3.cts \
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 25
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
diff --git a/tests/tests/toast/Android.mk b/tests/tests/toast/Android.mk
index bcf7b7e..9ab8465 100644
--- a/tests/tests/toast/Android.mk
+++ b/tests/tests/toast/Android.mk
@@ -29,6 +29,7 @@
LOCAL_PACKAGE_NAME := CtsToastTestCases
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 25
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/toastlegacy/Android.mk b/tests/tests/toastlegacy/Android.mk
index 217fe55..390222d 100644
--- a/tests/tests/toastlegacy/Android.mk
+++ b/tests/tests/toastlegacy/Android.mk
@@ -30,6 +30,7 @@
LOCAL_PACKAGE_NAME := CtsToastLegacyTestCases
LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 25
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/vr/Android.mk b/tests/vr/Android.mk
index dfd5655..0c842cf 100644
--- a/tests/vr/Android.mk
+++ b/tests/vr/Android.mk
@@ -36,6 +36,7 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src) ../../apps/CtsVerifier/src/com/android/cts/verifier/vr/MockVrListenerService.java
LOCAL_SDK_VERSION := test_current
+LOCAL_MIN_SDK_VERSION := 14
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests