diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-03-09 08:01:08 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-03-09 08:01:08 +0000 |
commit | b147c062ee28bae836ff5f0490e4973805e6f0c5 (patch) | |
tree | a29d0c470d704c7b80630cba4a331b0793734cf8 | |
parent | 5fa0aca339ac68b7c3cf8c89e41402645548e8b6 (diff) | |
parent | 241e7bc1ebb77bcd158f7d23f56722c03125a5fa (diff) | |
download | cts-android-mainline-12.0.0_r108.tar.gz |
Snap for 8278022 from 241e7bc1ebb77bcd158f7d23f56722c03125a5fa to mainline-resolv-releaseandroid-mainline-12.0.0_r124android-mainline-12.0.0_r108
Change-Id: I7302c23f1a58fe983904d3b9d4fc5f60c4f08ace
111 files changed, 2754 insertions, 330 deletions
diff --git a/hostsidetests/appcloning/Android.bp b/hostsidetests/appcloning/Android.bp new file mode 100644 index 00000000000..f1ecc4be33b --- /dev/null +++ b/hostsidetests/appcloning/Android.bp @@ -0,0 +1,38 @@ +// Copyright (C) 2022 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +java_test_host { + name: "CtsAppCloningHostTest", + srcs: [ + "hostside/src/**/AppCloningHostTest.java", + "hostside/src/**/BaseHostTestCase.java", + ], + libs: [ + "cts-tradefed", + "tradefed", + "testng", + ], + // tag the module as cts a test artifact + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], + test_config: "AndroidTestAppCloning.xml", + data: [":CtsAppCloningTestApp"], +} diff --git a/hostsidetests/scopedstorage/AndroidTestAppCloning.xml b/hostsidetests/appcloning/AndroidTestAppCloning.xml index 03802f23886..8c882eb773a 100644 --- a/hostsidetests/scopedstorage/AndroidTestAppCloning.xml +++ b/hostsidetests/appcloning/AndroidTestAppCloning.xml @@ -1,29 +1,29 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2021 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. ---> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> <configuration description="Test for App cloning support with clone user profiles"> <option name="test-suite-tag" value="cts" /> <option name="config-descriptor:metadata" key="component" value="framework" /> <option name="config-descriptor:metadata" key="parameter" value="instant_app" /> <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" /> - <!-- TODO(b/169101565): change to secondary_user when fixed --> <!-- Clone user profile is meant to exist only alongside a real system user. It does not exist for a headless system user, or a secondary user --> <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" /> <test class="com.android.tradefed.testtype.HostTest" > - <option name="class" value="android.scopedstorage.cts.host.AppCloningHostTest" /> + <option name="class" value="com.android.cts.appcloning.AppCloningHostTest" /> </test> <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController"> diff --git a/hostsidetests/appcloning/OWNERS b/hostsidetests/appcloning/OWNERS new file mode 100644 index 00000000000..7cc93143726 --- /dev/null +++ b/hostsidetests/appcloning/OWNERS @@ -0,0 +1,6 @@ +# Bug component: 1029024 +saumyap@google.com +maco@google.com +dagarhimanshu@google.com +sarup@google.com +sailendrabathi@google.com
\ No newline at end of file diff --git a/hostsidetests/appcloning/TEST_MAPPING b/hostsidetests/appcloning/TEST_MAPPING new file mode 100644 index 00000000000..f512df95a6c --- /dev/null +++ b/hostsidetests/appcloning/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "presubmit": [ + { + "name": "CtsAppCloningHostTest" + } + ] +}
\ No newline at end of file diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/AppCloningHostTest.java b/hostsidetests/appcloning/hostside/src/com/android/cts/appcloning/AppCloningHostTest.java index 9522731fe5d..ce7356c5966 100644 --- a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/AppCloningHostTest.java +++ b/hostsidetests/appcloning/hostside/src/com/android/cts/appcloning/AppCloningHostTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.scopedstorage.cts.host; +package com.android.cts.appcloning; import static com.google.common.truth.Truth.assertThat; @@ -34,36 +34,39 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.ArrayList; -import java.util.List; - /** * Runs the AppCloning tests. */ @RunWith(DeviceJUnit4ClassRunner.class) @AppModeFull public class AppCloningHostTest extends BaseHostTestCase { - private static final String APP_A = "CtsScopedStorageTestAppA.apk"; - private static final String APP_A_PACKAGE = "android.scopedstorage.cts.testapp.A.withres"; + + private static final String APP_A = "CtsAppCloningTestApp.apk"; + private static final String APP_A_PACKAGE = "com.android.cts.appcloningtestapp"; + private static final String CONTENT_PROVIDER_URL = "content://android.tradefed.contentprovider"; private static final int CLONE_PROFILE_DIRECTORY_CREATION_TIMEOUT_MS = 20000; + private String mCloneUserId; private ContentProviderHandler mContentProviderHandler; - @Before public void setup() throws Exception { assumeFalse("Device is in headless system user mode", isHeadlessSystemUserMode()); assumeTrue(isAtLeastS()); assumeFalse("Device uses sdcardfs", usesSdcardFs()); + // create clone user String output = executeShellCommand( "pm create-user --profileOf 0 --user-type android.os.usertype.profile.CLONE " + "testUser"); - mCloneUserId = output.substring(output.lastIndexOf(' ') + 1).replaceAll("[^0-9]", ""); + mCloneUserId = output.substring(output.lastIndexOf(' ') + 1).replaceAll("[^0-9]", + ""); assertThat(mCloneUserId).isNotEmpty(); + CommandResult out = executeShellV2Command("am start-user -w %s", mCloneUserId); assertThat(out.getStderr()).isEmpty(); + mContentProviderHandler = new ContentProviderHandler(getDevice()); mContentProviderHandler.setUp(); } @@ -74,6 +77,8 @@ public class AppCloningHostTest extends BaseHostTestCase { if (mContentProviderHandler != null) { mContentProviderHandler.tearDown(); } + + // remove the clone user executeShellCommand("pm remove-user %s", mCloneUserId); } @@ -92,7 +97,8 @@ public class AppCloningHostTest extends BaseHostTestCase { eventually(() -> { // Wait for finish. assertThat(isSuccessful( - runContentProviderCommand("query", mCloneUserId, "/sdcard", ""))).isTrue(); + runContentProviderCommand("query", mCloneUserId, + "/sdcard", ""))).isTrue(); }, CLONE_PROFILE_DIRECTORY_CREATION_TIMEOUT_MS); // Create a file on the clone user storage @@ -101,16 +107,19 @@ public class AppCloningHostTest extends BaseHostTestCase { eventually(() -> { // Wait for finish. assertThat(isSuccessful( - runContentProviderCommand("write", mCloneUserId, "/sdcard/testFile.txt", + runContentProviderCommand("write", mCloneUserId, + "/sdcard/testFile.txt", "< /sdcard/testFile.txt"))).isTrue(); }, CLONE_PROFILE_DIRECTORY_CREATION_TIMEOUT_MS); // Check that the above created file exists on the clone user storage - out = runContentProviderCommand("query", mCloneUserId, "/sdcard/testFile.txt", ""); + out = runContentProviderCommand("query", mCloneUserId, + "/sdcard/testFile.txt", ""); assertThat(isSuccessful(out)).isTrue(); // Cleanup the created file - out = runContentProviderCommand("delete", mCloneUserId, "/sdcard/testFile.txt", ""); + out = runContentProviderCommand("delete", mCloneUserId, + "/sdcard/testFile.txt", ""); assertThat(isSuccessful(out)).isTrue(); } @@ -136,7 +145,6 @@ public class AppCloningHostTest extends BaseHostTestCase { } private boolean usesSdcardFs() throws Exception { - List<String> mounts = new ArrayList<>(); CommandResult out = executeShellV2Command("cat /proc/mounts"); assertThat(isSuccessful(out)).isTrue(); for (String line : out.getStdout().split("\n")) { @@ -147,6 +155,4 @@ public class AppCloningHostTest extends BaseHostTestCase { } return false; } - - } diff --git a/hostsidetests/appcloning/hostside/src/com/android/cts/appcloning/BaseHostTestCase.java b/hostsidetests/appcloning/hostside/src/com/android/cts/appcloning/BaseHostTestCase.java new file mode 100644 index 00000000000..3d301f1b7ca --- /dev/null +++ b/hostsidetests/appcloning/hostside/src/com/android/cts/appcloning/BaseHostTestCase.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.cts.appcloning; + +import com.android.tradefed.device.DeviceNotAvailableException; +import com.android.tradefed.device.ITestDevice; +import com.android.tradefed.device.NativeDevice; +import com.android.tradefed.log.LogUtil.CLog; +import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.tradefed.util.CommandResult; +import com.android.tradefed.util.CommandStatus; + + +abstract class BaseHostTestCase extends BaseHostJUnit4Test { + private int mCurrentUserId = NativeDevice.INVALID_USER_ID; + private static final String ERROR_MESSAGE_TAG = "[ERROR]"; + + protected String executeShellCommand(String cmd, Object... args) throws Exception { + return getDevice().executeShellCommand(String.format(cmd, args)); + } + + protected CommandResult executeShellV2Command(String cmd, Object... args) throws Exception { + return getDevice().executeShellV2Command(String.format(cmd, args)); + } + + protected boolean isPackageInstalled(String packageName, String userId) throws Exception { + return getDevice().isPackageInstalled(packageName, userId); + } + + // TODO (b/174775905) remove after exposing the check from ITestDevice. + protected boolean isHeadlessSystemUserMode() throws DeviceNotAvailableException { + String result = getDevice() + .executeShellCommand("getprop ro.fw.mu.headless_system_user").trim(); + return "true".equalsIgnoreCase(result); + } + + protected boolean isAtLeastS() throws DeviceNotAvailableException { + return getDevice().getApiLevel() >= 31 /* BUILD.VERSION_CODES.S */; + } + + protected static void eventually(ThrowingRunnable r, long timeoutMillis) { + long start = System.currentTimeMillis(); + + while (true) { + try { + r.run(); + return; + } catch (Throwable e) { + if (System.currentTimeMillis() - start < timeoutMillis) { + try { + Thread.sleep(100); + } catch (InterruptedException ignored) { + throw new RuntimeException(e); + } + } else { + throw new RuntimeException(e); + } + } + } + } + + protected int getCurrentUserId() throws Exception { + setCurrentUserId(); + + return mCurrentUserId; + } + + protected boolean isSuccessful(CommandResult result) { + if (!CommandStatus.SUCCESS.equals(result.getStatus())) { + return false; + } + String stdout = result.getStdout(); + if (stdout.contains(ERROR_MESSAGE_TAG)) { + return false; + } + String stderr = result.getStderr(); + return (stderr == null || stderr.trim().isEmpty()); + } + + private void setCurrentUserId() throws Exception { + if (mCurrentUserId != NativeDevice.INVALID_USER_ID) return; + + ITestDevice device = getDevice(); + mCurrentUserId = device.getCurrentUser(); + CLog.i("Current user: %d"); + } + + protected interface ThrowingRunnable { + /** + * Similar to {@link Runnable#run} but has {@code throws Exception}. + */ + void run() throws Exception; + } +} diff --git a/hostsidetests/appcloning/test-apps/AppCloningTestApp/Android.bp b/hostsidetests/appcloning/test-apps/AppCloningTestApp/Android.bp new file mode 100644 index 00000000000..b3edfec5112 --- /dev/null +++ b/hostsidetests/appcloning/test-apps/AppCloningTestApp/Android.bp @@ -0,0 +1,31 @@ +// Copyright (C) 2022 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +android_test_helper_app { + name: "CtsAppCloningTestApp", + defaults: ["cts_defaults"], + static_libs: [ + "androidx.test.rules", + "truth-prebuilt", + "cts-install-lib", + ], + srcs: ["src/**/*.java"], + sdk_version: "test_current", + target_sdk_version: "current", + min_sdk_version: "30", +} diff --git a/hostsidetests/appcloning/test-apps/AppCloningTestApp/AndroidManifest.xml b/hostsidetests/appcloning/test-apps/AppCloningTestApp/AndroidManifest.xml new file mode 100644 index 00000000000..07d78a0ead2 --- /dev/null +++ b/hostsidetests/appcloning/test-apps/AppCloningTestApp/AndroidManifest.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.cts.appcloningtestapp" + android:versionCode="1" + android:versionName="1.0" > + + <uses-sdk android:minSdkVersion="30" /> + + <application> + <uses-library android:name="android.test.runner" /> + </application> + + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.cts.appcloningtestapp" /> + +</manifest>
\ No newline at end of file diff --git a/hostsidetests/appcloning/test-apps/AppCloningTestApp/src/com/android/cts/appcloningtestapp/AppCloningDeviceTest.java b/hostsidetests/appcloning/test-apps/AppCloningTestApp/src/com/android/cts/appcloningtestapp/AppCloningDeviceTest.java new file mode 100644 index 00000000000..46480f7cd78 --- /dev/null +++ b/hostsidetests/appcloning/test-apps/AppCloningTestApp/src/com/android/cts/appcloningtestapp/AppCloningDeviceTest.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.cts.appcloningtestapp; + +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class AppCloningDeviceTest { + private static final String TAG = "AppCloningDeviceTest"; +} diff --git a/hostsidetests/scopedstorage/Android.bp b/hostsidetests/scopedstorage/Android.bp index 689141f98e1..808a00d2c2a 100644 --- a/hostsidetests/scopedstorage/Android.bp +++ b/hostsidetests/scopedstorage/Android.bp @@ -25,8 +25,13 @@ android_test_helper_app { min_sdk_version: "30", srcs: ["ScopedStorageTestHelper/src/**/*.java"], // Tag as a CTS artifact - test_suites: ["general-tests", "mts-mediaprovider", "cts"], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], } + android_test_helper_app { name: "CtsScopedStorageTestAppB", manifest: "ScopedStorageTestHelper/TestAppB.xml", @@ -36,8 +41,13 @@ android_test_helper_app { min_sdk_version: "30", srcs: ["ScopedStorageTestHelper/src/**/*.java"], // Tag as a CTS artifact - test_suites: ["general-tests", "mts-mediaprovider", "cts"], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], } + android_test_helper_app { name: "CtsScopedStorageTestAppC", manifest: "ScopedStorageTestHelper/TestAppC.xml", @@ -47,8 +57,13 @@ android_test_helper_app { min_sdk_version: "30", srcs: ["ScopedStorageTestHelper/src/**/*.java"], // Tag as a CTS artifact - test_suites: ["general-tests", "mts-mediaprovider", "cts"], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], } + android_test_helper_app { name: "CtsScopedStorageTestAppC30", manifest: "ScopedStorageTestHelper/TestAppC30.xml", @@ -58,8 +73,13 @@ android_test_helper_app { min_sdk_version: "30", srcs: ["ScopedStorageTestHelper/src/**/*.java"], // Tag as a CTS artifact - test_suites: ["general-tests", "mts", "cts"], + test_suites: [ + "general-tests", + "mts", + "cts", + ], } + android_test_helper_app { name: "CtsScopedStorageTestAppCLegacy", manifest: "ScopedStorageTestHelper/TestAppCLegacy.xml", @@ -69,8 +89,13 @@ android_test_helper_app { min_sdk_version: "28", srcs: ["ScopedStorageTestHelper/src/**/*.java"], // Tag as a CTS artifact - test_suites: ["general-tests", "mts-mediaprovider", "cts"], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], } + android_test_helper_app { name: "CtsScopedStorageTestAppDLegacy", manifest: "ScopedStorageTestHelper/TestAppDLegacy.xml", @@ -80,7 +105,11 @@ android_test_helper_app { min_sdk_version: "28", srcs: ["ScopedStorageTestHelper/src/**/*.java"], // Tag as a CTS artifact - test_suites: ["general-tests", "mts-mediaprovider", "cts"], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], } android_test_helper_app { @@ -92,8 +121,13 @@ android_test_helper_app { min_sdk_version: "30", srcs: ["ScopedStorageTestHelper/src/**/*.java"], // Tag as a CTS artifact - test_suites: ["general-tests", "mts-mediaprovider", "cts"], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], } + android_test_helper_app { name: "CtsScopedStorageTestAppFileManagerBypassDB", manifest: "ScopedStorageTestHelper/TestAppFileManagerBypassDB.xml", @@ -103,8 +137,13 @@ android_test_helper_app { min_sdk_version: "30", srcs: ["ScopedStorageTestHelper/src/**/*.java"], // Tag as a CTS artifact - test_suites: ["general-tests", "mts", "cts"], + test_suites: [ + "general-tests", + "mts", + "cts", + ], } + android_test_helper_app { name: "CtsScopedStorageTestAppSystemGalleryBypassDB", manifest: "ScopedStorageTestHelper/TestAppSystemGalleryBypassDB.xml", @@ -114,8 +153,13 @@ android_test_helper_app { min_sdk_version: "30", srcs: ["ScopedStorageTestHelper/src/**/*.java"], // Tag as a CTS artifact - test_suites: ["general-tests", "mts", "cts"], + test_suites: [ + "general-tests", + "mts", + "cts", + ], } + android_test_helper_app { name: "CtsScopedStorageTestAppSystemGallery30BypassDB", manifest: "ScopedStorageTestHelper/TestAppSystemGallery30BypassDB.xml", @@ -125,7 +169,11 @@ android_test_helper_app { min_sdk_version: "30", srcs: ["ScopedStorageTestHelper/src/**/*.java"], // Tag as a CTS artifact - test_suites: ["general-tests", "mts", "cts"], + test_suites: [ + "general-tests", + "mts", + "cts", + ], } android_test_helper_app { @@ -150,9 +198,16 @@ android_test { name: "ScopedStorageTest", manifest: "AndroidManifest.xml", srcs: ["src/**/*.java"], - static_libs: ["truth-prebuilt", "cts-scopedstorage-lib"], + static_libs: [ + "truth-prebuilt", + "cts-scopedstorage-lib", + ], compile_multilib: "both", - test_suites: ["general-tests", "mts-mediaprovider", "cts"], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], sdk_version: "test_current", target_sdk_version: "31", min_sdk_version: "30", @@ -161,40 +216,67 @@ android_test { ":CtsScopedStorageTestAppB", ":CtsScopedStorageTestAppC", ":CtsScopedStorageTestAppCLegacy", - ] + ], } android_test { name: "LegacyStorageTest", manifest: "legacy/AndroidManifest.xml", srcs: ["legacy/src/**/*.java"], - static_libs: ["truth-prebuilt", "cts-scopedstorage-lib"], + static_libs: [ + "truth-prebuilt", + "cts-scopedstorage-lib", + ], compile_multilib: "both", - test_suites: ["general-tests", "mts-mediaprovider", "cts"], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], sdk_version: "test_current", target_sdk_version: "29", min_sdk_version: "30", java_resources: [ ":CtsScopedStorageTestAppA", - ] + ], } java_test_host { name: "CtsScopedStorageCoreHostTest", - srcs: [ + srcs: [ "host/src/android/scopedstorage/cts/host/ScopedStorageCoreHostTest.java", - "host/src/android/scopedstorage/cts/host/BaseHostTestCase.java" + "host/src/android/scopedstorage/cts/host/BaseHostTestCase.java", + ], + libs: [ + "cts-tradefed", + "tradefed", + "testng", + ], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", ], - libs: ["cts-tradefed", "tradefed", "testng"], - test_suites: ["general-tests", "mts-mediaprovider", "cts"], test_config: "CoreTest.xml", } java_test_host { name: "CtsScopedStorageHostTest", srcs: ["host/src/**/*.java"], - libs: ["cts-tradefed", "tradefed", "testng"], - test_suites: ["general-tests", "mts-mediaprovider", "cts"], + libs: [ + "cts-tradefed", + "tradefed", + "testng", + ], + static_libs: [ + "modules-utils-build-testing", + "compatibility-host-util", + ], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], test_config: "AndroidTest.xml", data: [ ":CtsLegacyStorageTestAppRequestLegacy", @@ -205,20 +287,20 @@ java_test_host { java_test_host { name: "CtsScopedStoragePublicVolumeHostTest", srcs: ["host/src/**/*.java"], - libs: ["cts-tradefed", "tradefed", "testng"], - test_suites: ["general-tests", "mts-mediaprovider"], - test_config: "PublicVolumeTest.xml", -} - -java_test_host { - name: "CtsAppCloningHostTest", - srcs: [ - "host/src/android/scopedstorage/cts/host/AppCloningHostTest.java", - "host/src/android/scopedstorage/cts/host/BaseHostTestCase.java" + libs: [ + "cts-tradefed", + "tradefed", + "testng", + ], + static_libs: [ + "modules-utils-build-testing", + "compatibility-host-util", + ], + test_suites: [ + "general-tests", + "mts-mediaprovider", ], - libs: ["cts-tradefed", "tradefed", "testng"], - test_suites: ["general-tests", "mts-mediaprovider", "cts"], - test_config: "AndroidTestAppCloning.xml", + test_config: "PublicVolumeTest.xml", } android_test { @@ -226,13 +308,24 @@ android_test { manifest: "device/AndroidManifest.xml", test_config: "device/AndroidTest.xml", srcs: ["device/**/*.java"], - static_libs: ["truth-prebuilt", "cts-scopedstorage-lib",], + static_libs: [ + "truth-prebuilt", + "cts-scopedstorage-lib", + ], compile_multilib: "both", - test_suites: ["general-tests", "mts-mediaprovider", "cts"], + test_suites: [ + "general-tests", + "mts-mediaprovider", + "cts", + ], sdk_version: "test_current", target_sdk_version: "31", min_sdk_version: "30", - libs: ["android.test.base", "android.test.mock", "android.test.runner",], + libs: [ + "android.test.base", + "android.test.mock", + "android.test.runner", + ], java_resources: [ ":CtsScopedStorageTestAppA", ":CtsScopedStorageTestAppB", @@ -244,5 +337,5 @@ android_test { ":CtsScopedStorageTestAppFileManagerBypassDB", ":CtsScopedStorageTestAppSystemGalleryBypassDB", ":CtsScopedStorageTestAppSystemGallery30BypassDB", - ] + ], } diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2017/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2017/Android.bp new file mode 100644 index 00000000000..5dac7f7abc3 --- /dev/null +++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2017/Android.bp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_test { + name: "CVE-2019-2017", + defaults: ["cts_hostsidetests_securitybulletin_defaults"], + srcs: [ + "poc.cpp", + ], + compile_multilib: "64", + shared_libs: [ + "libnfc-nci", + ], + include_dirs: [ + "system/nfc/src/nfc/include", + "system/nfc/src/gki/common", + "system/nfc/src/gki/ulinux", + "system/nfc/src/include", + ], +} diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2017/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2017/poc.cpp new file mode 100644 index 00000000000..9ecc457f143 --- /dev/null +++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2017/poc.cpp @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <rw_int.h> +#include <stdlib.h> +#include "../includes/common.h" + +bool testInProgress = false; +struct sigaction new_action, old_action; +void sigabrt_handler(int signum, siginfo_t *info, void *context) { + if (testInProgress && info->si_signo == SIGABRT) { + (*old_action.sa_sigaction)(signum, info, context); + return; + } + exit(EXIT_FAILURE); +} + +uint8_t *p_data = nullptr; +extern tRW_CB rw_cb; + +extern void rw_t2t_handle_rsp(uint8_t *p_data); + +void poc_cback(uint8_t, tRW_DATA *) {} + +void exit_handler(void) { + if (p_data) { + free(p_data); + p_data = nullptr; + } +} + +int main() { + atexit(exit_handler); + sigemptyset(&new_action.sa_mask); + new_action.sa_flags = SA_SIGINFO; + new_action.sa_sigaction = sigabrt_handler; + sigaction(SIGABRT, &new_action, &old_action); + + tNFC_ACTIVATE_DEVT p_activate_params = {}; + p_activate_params.protocol = NFC_PROTOCOL_ISO_DEP; + p_activate_params.rf_tech_param.mode = NFC_DISCOVERY_TYPE_POLL_A; + FAIL_CHECK(RW_SetActivatedTagType(&p_activate_params, &poc_cback) == NFC_STATUS_OK); + FAIL_CHECK(rw_cb.p_cback == &poc_cback); + tRW_T2T_CB *p_t2t = &rw_cb.tcb.t2t; + p_t2t->state = RW_T2T_STATE_DETECT_TLV; + p_t2t->tlv_detect = TAG_LOCK_CTRL_TLV; + p_t2t->substate = RW_T2T_SUBSTATE_WAIT_READ_TLV_VALUE; + p_t2t->found_tlv = TAG_LOCK_CTRL_TLV; + p_t2t->bytes_count = 0; + p_t2t->p_cur_cmd_buf = (NFC_HDR *)GKI_getpoolbuf(NFC_RW_POOL_ID); + rw_cb.p_cback = &poc_cback; + p_data = (uint8_t *)malloc(sizeof(uint8_t)); + FAIL_CHECK(p_data); + + testInProgress = true; + rw_t2t_handle_rsp(p_data); + testInProgress = false; + + return EXIT_SUCCESS; +} diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2020/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2020/Android.bp new file mode 100644 index 00000000000..5fdbfdba161 --- /dev/null +++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2020/Android.bp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_test { + name: "CVE-2019-2020", + defaults: ["cts_hostsidetests_securitybulletin_defaults"], + srcs: [ + "poc.cpp", + ], + compile_multilib: "64", + shared_libs: [ + "libnfc-nci", + ], + include_dirs: [ + "system/nfc/src/nfc/include", + "system/nfc/src/gki/common", + "system/nfc/src/gki/ulinux", + "system/nfc/src/include", + ], +} diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2020/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2020/poc.cpp new file mode 100644 index 00000000000..ba4d950474e --- /dev/null +++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2020/poc.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdlib.h> +#include "../includes/common.h" + +#include <nfc_api.h> +#include <nfc_int.h> +#include <rw_int.h> +#include <tags_defs.h> +#include <llcp_int.h> + +#define DEFAULT_SAP 1 +#define LENGTH 0 + +bool testInProgress = false; + +struct sigaction new_action, old_action; + +void sigsegv_handler(int signum, siginfo_t *info, void *context) { + if (testInProgress && info->si_signo == SIGSEGV) { + (*old_action.sa_sigaction)(signum, info, context); + return; + } + exit(EXIT_FAILURE); +} + +extern tLLCP_CB llcp_cb; +extern tRW_CB rw_cb; +extern tNFC_CB nfc_cb; + +void GKI_freebuf(void* x) { (void)x; } +void GKI_start_timer(uint8_t, int32_t, bool) {} +void GKI_stop_timer(uint8_t) {} + +void poc_cback(tRW_EVENT event, tRW_DATA* p_rw_data) { + (void)event; + (void)p_rw_data; +} + +int32_t main() { + sigemptyset(&new_action.sa_mask); + new_action.sa_flags = SA_SIGINFO; + new_action.sa_sigaction = sigsegv_handler; + sigaction(SIGSEGV, &new_action, &old_action); + + tNFC_ACTIVATE_DEVT p_activate_params = {}; + p_activate_params.protocol = NFC_PROTOCOL_ISO_DEP; + p_activate_params.rf_tech_param.mode = NFC_DISCOVERY_TYPE_POLL_A; + RW_SetActivatedTagType(&p_activate_params, &poc_cback); + FAIL_CHECK(rw_cb.p_cback == &poc_cback); + + GKI_init(); + llcp_init(); + for (int32_t n = 0; n < LLCP_MAX_DATA_LINK; ++n) { + llcp_cb.dlcb[n].state = LLCP_DLC_STATE_CONNECTED; + llcp_cb.dlcb[n].local_sap = DEFAULT_SAP; + llcp_cb.dlcb[n].remote_sap = DEFAULT_SAP; + } + + testInProgress = true; + llcp_dlc_proc_rx_pdu(DEFAULT_SAP, LLCP_PDU_RNR_TYPE, DEFAULT_SAP, LENGTH, + nullptr); + testInProgress = false; + + return EXIT_SUCCESS; +} diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2031/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2031/Android.bp new file mode 100644 index 00000000000..639ca9113ff --- /dev/null +++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2031/Android.bp @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_test { + name: "CVE-2019-2031", + defaults: ["cts_hostsidetests_securitybulletin_defaults"], + srcs: [ + "poc.cpp", + ":cts_hostsidetests_securitybulletin_memutils", + ], + compile_multilib: "64", + shared_libs: [ + "libnfc-nci", + "liblog", + ], + include_dirs: [ + "system/nfc/src/nfc/include", + "system/nfc/src/gki/common", + "system/nfc/src/gki/ulinux", + "system/nfc/src/include", + "system/nfc/src/nfa/include", + ], + cflags: [ + "-DCHECK_OVERFLOW", + ], +} diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2031/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2031/poc.cpp new file mode 100644 index 00000000000..17812370c49 --- /dev/null +++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2031/poc.cpp @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../includes/common.h" +#include <nfc_api.h> +#include <nfc_int.h> +#include <rw_int.h> +#include <stdlib.h> +#include <string.h> +#include <tags_defs.h> + +#define T3T_MSG_FELICALITE_MC_OFFSET 0x01 + +bool testInProgress = false; + +struct sigaction new_action, old_action; + +void sigabrt_handler(int signum, siginfo_t *info, void *context) { + if (testInProgress && info->si_signo == SIGABRT) { + (*old_action.sa_sigaction)(signum, info, context); + return; + } + exit(EXIT_FAILURE); +} + +extern tRW_CB rw_cb; +extern tNFC_CB nfc_cb; +tNFC_CONN *p_data; +void rw_init(void); +tNFC_STATUS rw_t3t_select(uint8_t peer_nfcid2[NCI_RF_F_UID_LEN], + uint8_t mrti_check, uint8_t mrti_update); + +void *allocate_memory(size_t size) { + void *ptr = malloc(size); + memset(ptr, 0x0, size); + return ptr; +} + +/* States */ +enum { + RW_T3T_STATE_NOT_ACTIVATED, + RW_T3T_STATE_IDLE, + RW_T3T_STATE_COMMAND_PENDING +}; + +/* Enumeration of API commands */ +enum { + RW_T3T_CMD_DETECT_NDEF, + RW_T3T_CMD_CHECK_NDEF, + RW_T3T_CMD_UPDATE_NDEF, + RW_T3T_CMD_CHECK, + RW_T3T_CMD_UPDATE, + RW_T3T_CMD_SEND_RAW_FRAME, + RW_T3T_CMD_GET_SYSTEM_CODES, + RW_T3T_CMD_FORMAT, + RW_T3T_CMD_SET_READ_ONLY_SOFT, + RW_T3T_CMD_SET_READ_ONLY_HARD, + RW_T3T_CMD_MAX +}; + +/* Sub-states */ +enum { + /* Sub states for formatting Felica-Lite */ + RW_T3T_FMT_SST_POLL_FELICA_LITE, /* Waiting for POLL Felica-Lite response (for + formatting) */ + RW_T3T_FMT_SST_CHECK_MC_BLK, /* Waiting for Felica-Lite MC (MemoryControl) + block-read to complete */ + RW_T3T_FMT_SST_UPDATE_MC_BLK, /* Waiting for Felica-Lite MC (MemoryControl) + block-write to complete */ + RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB, /* Waiting for NDEF attribute block-write + to complete */ + + /* Sub states for setting Felica-Lite read only */ + RW_T3T_SRO_SST_POLL_FELICA_LITE, /* Waiting for POLL Felica-Lite response (for + setting read only) */ + RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB, /* Waiting for NDEF attribute block-write + to complete */ + RW_T3T_SRO_SST_CHECK_MC_BLK, /* Waiting for Felica-Lite MC (MemoryControl) + block-read to complete */ + RW_T3T_SRO_SST_UPDATE_MC_BLK /* Waiting for Felica-Lite MC (MemoryControl) + block-write to complete */ +}; + +void poc_cback(tRW_EVENT event, tRW_DATA *p_rw_data) { + (void)event; + (void)p_rw_data; +} + +void GKI_start_timer(uint8_t, int32_t, bool) {} + +void GKI_stop_timer(uint8_t) {} + +void GKI_freebuf(void *) {} + +void exit_handler(void) { + if (p_data) { + if (p_data->data.p_data) { + free(p_data->data.p_data); + p_data->data.p_data = nullptr; + } + free(p_data); + p_data = nullptr; + } +} + +int main() { + atexit(exit_handler); + sigemptyset(&new_action.sa_mask); + new_action.sa_flags = SA_SIGINFO; + new_action.sa_sigaction = sigabrt_handler; + sigaction(SIGABRT, &new_action, &old_action); + + tNFC_ACTIVATE_DEVT p_activate_params = {}; + p_activate_params.protocol = NFC_PROTOCOL_ISO_DEP; + p_activate_params.rf_tech_param.mode = NFC_DISCOVERY_TYPE_POLL_A; + RW_SetActivatedTagType(&p_activate_params, &poc_cback); + FAIL_CHECK(rw_cb.p_cback == &poc_cback); + + tRW_T3T_CB *p_t3t = &rw_cb.tcb.t3t; + + GKI_init(); + rw_init(); + rw_cb.p_cback = &poc_cback; + + uint8_t peer_nfcid2[NCI_RF_F_UID_LEN]; + uint8_t mrti_check = 1, mrti_update = 1; + FAIL_CHECK(rw_t3t_select(peer_nfcid2, mrti_check, mrti_update) == + NFC_STATUS_OK) + + p_data = (tNFC_CONN *)allocate_memory(sizeof(tNFC_CONN)); + FAIL_CHECK(p_data); + + p_data->data.p_data = (NFC_HDR *)allocate_memory(sizeof(NFC_HDR) * 3); + FAIL_CHECK(p_data->data.p_data); + + p_data->status = NFC_STATUS_OK; + + p_t3t->cur_cmd = RW_T3T_CMD_CHECK_NDEF; + p_t3t->rw_state = RW_T3T_STATE_COMMAND_PENDING; + p_t3t->flags |= RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; + p_t3t->ndef_attrib.ln = 0x000F; + + NFC_HDR *p_msg = (p_data->data).p_data; + p_msg->offset = 0; + p_msg->len = T3T_MSG_RSP_OFFSET_CHECK_DATA + 1; + + uint8_t *p_t3t_rsp = (uint8_t *)(p_msg + 1) + p_msg->offset; + p_t3t_rsp[0] = NCI_STATUS_OK; + p_t3t_rsp++; + p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] = T3T_MSG_OPC_CHECK_RSP; + p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] = T3T_MSG_RSP_STATUS_OK; + p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] = 0; + + tNFC_CONN_CB *p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; + tNFC_CONN_EVT event = NFC_DATA_CEVT; + memcpy(p_t3t->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], + NCI_NFCID2_LEN); + testInProgress = true; + p_cb->p_cback(0, event, p_data); + testInProgress = false; + + return EXIT_SUCCESS; +} diff --git a/hostsidetests/securitybulletin/src/android/security/cts/Bug_183613671.java b/hostsidetests/securitybulletin/src/android/security/cts/Bug_183613671.java index 63a5370188f..75bbd0ac298 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/Bug_183613671.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/Bug_183613671.java @@ -23,10 +23,10 @@ import org.junit.Test; import org.junit.Before; import org.junit.runner.RunWith; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; @RunWith(DeviceJUnit4ClassRunner.class) -public final class Bug_183613671 extends BaseHostJUnit4Test { +public final class Bug_183613671 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.BUG_183613671"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; private static final String TEST_APP = "BUG-183613671.apk"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/Bug_183963253.java b/hostsidetests/securitybulletin/src/android/security/cts/Bug_183963253.java index e31cb479c0e..adf6103043a 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/Bug_183963253.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/Bug_183963253.java @@ -25,10 +25,10 @@ import org.junit.Before; import org.junit.runner.RunWith; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; @RunWith(DeviceJUnit4ClassRunner.class) -public final class Bug_183963253 extends BaseHostJUnit4Test { +public final class Bug_183963253 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.BUG_183963253"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; private static final String TEST_APP = "BUG-183963253.apk"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2017.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2017.java new file mode 100644 index 00000000000..b7c2ea8fab3 --- /dev/null +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2017.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts; + +import android.platform.test.annotations.AsbSecurityTest; + +import com.android.compatibility.common.util.CrashUtils; +import com.android.compatibility.common.util.CrashUtils.Config.BacktraceFilterPattern; +import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; + +import java.util.regex.Pattern; + +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(DeviceJUnit4ClassRunner.class) +public class CVE_2019_2017 extends SecurityTestCase { + + /** + * b/121035711 + * Vulnerability Behaviour: SIGABRT in self + * Vulnerable Library: libnfc-nci (As per AOSP code) + * Vulnerable Function: rw_t2t_handle_tlv_detect_rsp (As per AOSP code) + */ + @AsbSecurityTest(cveBugId = 121035711) + @Test + public void testPocCVE_2019_2017() throws Exception { + AdbUtils.assumeHasNfc(getDevice()); + assumeIsSupportedNfcDevice(getDevice()); + pocPusher.only64(); + String signals[] = {CrashUtils.SIGABRT}; + String binaryName = "CVE-2019-2017"; + AdbUtils.pocConfig testConfig = new AdbUtils.pocConfig(binaryName, getDevice()); + testConfig.config = new CrashUtils.Config().setProcessPatterns(Pattern.compile(binaryName)) + .setBacktraceIncludes(new BacktraceFilterPattern("libnfc-nci", + "rw_t2t_handle_tlv_detect_rsp")); + testConfig.config + .setBacktraceExcludes(new BacktraceFilterPattern("libdl", "__cfi_slowpath")); + testConfig.config.setSignals(signals); + AdbUtils.runPocAssertNoCrashesNotVulnerable(testConfig); + } +} diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2020.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2020.java new file mode 100644 index 00000000000..b65faeef587 --- /dev/null +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2020.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts; + +import android.platform.test.annotations.AsbSecurityTest; + +import com.android.compatibility.common.util.CrashUtils; +import com.android.compatibility.common.util.CrashUtils.Config.BacktraceFilterPattern; +import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; + +import java.util.regex.Pattern; + +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(DeviceJUnit4ClassRunner.class) +public class CVE_2019_2020 extends SecurityTestCase { + + /** + * b/116788646 + * Vulnerability Behaviour: SIGSEGV in self + * Vulnerable Library: libnfc-nci (As per AOSP code) + * Vulnerable Function: llcp_dlc_proc_rx_pdu (As per AOSP code) + */ + @AsbSecurityTest(cveBugId = 116788646) + @Test + public void testPocCVE_2019_2020() throws Exception { + AdbUtils.assumeHasNfc(getDevice()); + assumeIsSupportedNfcDevice(getDevice()); + pocPusher.only64(); + String signals[] = {CrashUtils.SIGSEGV}; + String binaryName = "CVE-2019-2020"; + AdbUtils.pocConfig testConfig = new AdbUtils.pocConfig(binaryName, getDevice()); + testConfig.config = new CrashUtils.Config().setProcessPatterns(Pattern.compile(binaryName)) + .setBacktraceIncludes(new BacktraceFilterPattern("libnfc-nci", + "llcp_dlc_proc_rx_pdu")); + testConfig.config + .setBacktraceExcludes(new BacktraceFilterPattern("libdl", "__cfi_slowpath")); + testConfig.config.checkMinAddress(false); + testConfig.config.setSignals(signals); + AdbUtils.runPocAssertNoCrashesNotVulnerable(testConfig); + } +} diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2031.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2031.java new file mode 100644 index 00000000000..21b22856fcc --- /dev/null +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2031.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts; + +import android.platform.test.annotations.AsbSecurityTest; + +import com.android.compatibility.common.util.CrashUtils; +import com.android.compatibility.common.util.CrashUtils.Config.BacktraceFilterPattern; +import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; + +import java.util.regex.Pattern; + +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(DeviceJUnit4ClassRunner.class) +public class CVE_2019_2031 extends SecurityTestCase { + + /** + * b/120502559 + * Vulnerability Behaviour: SIGABRT in self + * Vulnerable Library: libnfc-nci (As per AOSP code) + * Vulnerable Function: rw_t3t_act_handle_check_ndef_rsp (As per AOSP code) + */ + @AsbSecurityTest(cveBugId = 120502559) + @Test + public void testPocCVE_2019_2031() throws Exception { + AdbUtils.assumeHasNfc(getDevice()); + assumeIsSupportedNfcDevice(getDevice()); + pocPusher.only64(); + String signals[] = {CrashUtils.SIGABRT}; + String binaryName = "CVE-2019-2031"; + AdbUtils.pocConfig testConfig = new AdbUtils.pocConfig(binaryName, getDevice()); + testConfig.config = new CrashUtils.Config().setProcessPatterns(Pattern.compile(binaryName)) + .setBacktraceIncludes(new BacktraceFilterPattern("libnfc-nci", + "rw_t3t_act_handle_check_ndef_rsp")); + testConfig.config + .setBacktraceExcludes(new BacktraceFilterPattern("libdl", "__cfi_slowpath")); + testConfig.config.setSignals(signals); + AdbUtils.runPocAssertNoCrashesNotVulnerable(testConfig); + } +} diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0015.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0015.java new file mode 100644 index 00000000000..3aa0474a422 --- /dev/null +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0015.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts; + +import static org.junit.Assert.assertTrue; + +import android.platform.test.annotations.AppModeFull; +import android.platform.test.annotations.AsbSecurityTest; + +import com.android.tradefed.device.ITestDevice; +import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(DeviceJUnit4ClassRunner.class) +public class CVE_2020_0015 extends StsExtraBusinessLogicHostTestBase { + + @AppModeFull + @AsbSecurityTest(cveBugId = 139017101) + @Test + public void testPocCVE_2020_0015() throws Exception { + ITestDevice device = getDevice(); + final String testPkg = "android.security.cts.CVE_2020_0015"; + uninstallPackage(device, testPkg); + + /* Wake up the screen */ + AdbUtils.runCommandLine("input keyevent KEYCODE_WAKEUP", device); + AdbUtils.runCommandLine("input keyevent KEYCODE_MENU", device); + AdbUtils.runCommandLine("input keyevent KEYCODE_HOME", device); + + installPackage("CVE-2020-0015.apk"); + AdbUtils.runCommandLine("pm grant " + testPkg + " android.permission.SYSTEM_ALERT_WINDOW", + device); + assertTrue(runDeviceTests(testPkg, testPkg + ".DeviceTest", "testOverlayButtonPresence")); + } +} diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0305.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0305.java index a6ae4f823fa..4b1bc22e33f 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0305.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0305.java @@ -22,7 +22,7 @@ import android.util.Log; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import org.junit.After; import org.junit.Assert; @@ -38,7 +38,7 @@ import org.junit.runner.RunWith; * collected from the hostside and reported accordingly. */ @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0305 extends BaseHostJUnit4Test { +public class CVE_2021_0305 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.CVE_2021_0305"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; private static final String TEST_APP = "CVE-2021-0305.apk"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0481.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0481.java index 5f0c200d1f4..2ae3f0f0d9c 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0481.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0481.java @@ -22,7 +22,7 @@ import android.util.Log; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import com.android.tradefed.log.LogUtil.CLog; import org.junit.After; @@ -42,7 +42,7 @@ import static org.hamcrest.CoreMatchers.*; * collected from the hostside and reported accordingly. */ @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0481 extends BaseHostJUnit4Test { +public class CVE_2021_0481 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.CVE_2021_0481"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; private static final String TEST_APP = "CVE-2021-0481.apk"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0523.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0523.java index 77c9188d6b5..3e6928853de 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0523.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0523.java @@ -20,14 +20,15 @@ import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.device.ITestDevice; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; + import org.junit.Assert; import org.junit.Before; import org.junit.runner.RunWith; import org.junit.Test; @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0523 extends BaseHostJUnit4Test { +public class CVE_2021_0523 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.cve_2021_0523"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; private static final String TEST_APP = "CVE-2021-0523.apk"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0586.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0586.java index 34e2ca1ec31..5a7ec8d1c24 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0586.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0586.java @@ -20,14 +20,14 @@ import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.device.ITestDevice; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import org.junit.Assert; import org.junit.Before; import org.junit.runner.RunWith; import org.junit.Test; @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0586 extends BaseHostJUnit4Test { +public class CVE_2021_0586 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.cve_2021_0586"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; private static final String TEST_APP = "CVE-2021-0586.apk"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0591.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0591.java index 0c8f0a9fd1b..eb74b201862 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0591.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0591.java @@ -21,7 +21,7 @@ import android.platform.test.annotations.AsbSecurityTest; import android.platform.test.annotations.RequiresDevice; import com.android.tradefed.device.ITestDevice; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import java.util.regex.Pattern; import org.junit.Assert; import org.junit.Before; @@ -33,7 +33,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assume.assumeTrue; @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0591 extends BaseHostJUnit4Test { +public class CVE_2021_0591 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.CVE_2021_0591"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0642.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0642.java index 285f57af096..29fd2b39bf2 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0642.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0642.java @@ -19,9 +19,9 @@ package android.security.cts; import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AsbSecurityTest; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import com.android.tradefed.device.ITestDevice; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; import org.junit.Assert; import org.junit.Before; @@ -29,7 +29,7 @@ import org.junit.Test; import org.junit.runner.RunWith; @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0642 extends BaseHostJUnit4Test { +public class CVE_2021_0642 extends StsExtraBusinessLogicHostTestBase { static final String TEST_APP = "CVE-2021-0642.apk"; static final String TEST_PKG = "android.security.cts.cve_2021_0642"; static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0685.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0685.java index f5f6b8b19b0..26bba4a6d50 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0685.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0685.java @@ -19,14 +19,14 @@ package android.security.cts; import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import org.junit.Assert; import org.junit.Before; import org.junit.runner.RunWith; import org.junit.Test; @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0685 extends BaseHostJUnit4Test { +public class CVE_2021_0685 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.cve_2021_0685"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; private static final String TEST_APP = "CVE-2021-0685.apk"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0691.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0691.java index 9b592bdcbbd..bf261fd0eab 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0691.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0691.java @@ -22,7 +22,7 @@ import android.util.Log; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import com.android.tradefed.log.LogUtil.CLog; import org.junit.After; @@ -38,7 +38,7 @@ import static org.hamcrest.CoreMatchers.*; * Test installs sample app and then tries to overwrite *.apk file */ @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0691 extends BaseHostJUnit4Test { +public class CVE_2021_0691 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.CVE_2021_0691"; private static final String TEST_APP = "CVE-2021-0691.apk"; private static final String DEVICE_TMP_DIR = "/data/local/tmp/"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0693.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0693.java index 5f13cf6feec..2b7ad1452d2 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0693.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0693.java @@ -19,13 +19,13 @@ package android.security.cts; import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0693 extends BaseHostJUnit4Test { +public class CVE_2021_0693 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.CVE_2021_0693"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0706.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0706.java index c46bedeb2f7..fabaf89437a 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0706.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0706.java @@ -20,13 +20,13 @@ import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.device.ITestDevice; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import org.junit.Before; import org.junit.runner.RunWith; import org.junit.Test; @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0706 extends BaseHostJUnit4Test { +public class CVE_2021_0706 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.CVE_2021_0706"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0921.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0921.java index 27900e19fcb..760c265fe09 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0921.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0921.java @@ -20,7 +20,7 @@ import android.platform.test.annotations.AppModeFull; import android.util.Log; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import com.android.tradefed.log.LogUtil.CLog; import org.junit.After; import org.junit.Assert; @@ -30,7 +30,7 @@ import org.junit.runner.RunWith; import static org.junit.Assert.*; @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0921 extends BaseHostJUnit4Test { +public class CVE_2021_0921 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.CVE_2021_0921"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; private static final String TEST_APP = "CVE-2021-0921.apk"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0953.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0953.java index 6d320f562d8..ecb6bdd3cd4 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0953.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0953.java @@ -19,13 +19,13 @@ package android.security.cts; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.device.ITestDevice; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0953 extends BaseHostJUnit4Test { +public class CVE_2021_0953 extends StsExtraBusinessLogicHostTestBase { @AsbSecurityTest(cveBugId = 184046278) @Test diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0965.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0965.java index 4deab6614e8..65934f2741f 100644 --- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0965.java +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_0965.java @@ -21,7 +21,7 @@ import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AsbSecurityTest; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; import org.junit.Assert; import org.junit.Before; @@ -29,7 +29,7 @@ import org.junit.Test; import org.junit.runner.RunWith; @RunWith(DeviceJUnit4ClassRunner.class) -public class CVE_2021_0965 extends BaseHostJUnit4Test { +public class CVE_2021_0965 extends StsExtraBusinessLogicHostTestBase { private static final String TEST_PKG = "android.security.cts.CVE_2021_0965"; private static final String TEST_CLASS = TEST_PKG + "." + "DeviceTest"; private static final String TEST_APP = "CVE-2021-0965.apk"; diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_39692.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_39692.java new file mode 100644 index 00000000000..444f1a55a60 --- /dev/null +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_39692.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts; + +import static org.junit.Assert.assertTrue; + +import android.platform.test.annotations.AppModeFull; +import android.platform.test.annotations.AsbSecurityTest; + +import com.android.tradefed.device.ITestDevice; +import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(DeviceJUnit4ClassRunner.class) +public class CVE_2021_39692 extends StsExtraBusinessLogicHostTestBase { + + @AppModeFull + @AsbSecurityTest(cveBugId = 209611539) + @Test + public void testPocCVE_2021_39692() throws Exception { + ITestDevice device = getDevice(); + final String testPkg = "android.security.cts.CVE_2021_39692"; + uninstallPackage(device, testPkg); + + /* Wake up the screen */ + AdbUtils.runCommandLine("input keyevent KEYCODE_WAKEUP", device); + AdbUtils.runCommandLine("input keyevent KEYCODE_MENU", device); + AdbUtils.runCommandLine("input keyevent KEYCODE_HOME", device); + + installPackage("CVE-2021-39692.apk"); + AdbUtils.runCommandLine("pm grant " + testPkg + " android.permission.SYSTEM_ALERT_WINDOW", + device); + assertTrue(runDeviceTests(testPkg, testPkg + ".DeviceTest", "testOverlayButtonPresence")); + } +} diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_39700.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_39700.java new file mode 100644 index 00000000000..acc6a2ed00f --- /dev/null +++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2021_39700.java @@ -0,0 +1,51 @@ +/** + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; + +import android.platform.test.annotations.AsbSecurityTest; + +import com.android.tradefed.device.ITestDevice; +import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; +import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.File; + +@RunWith(DeviceJUnit4ClassRunner.class) +public class CVE_2021_39700 extends StsExtraBusinessLogicHostTestBase { + + /** + * b/201645790 + * This test is related to + * "hostsidetests/appsecurity/src/android/appsecurity/cts/ListeningPortsTest.java" + */ + @AsbSecurityTest(cveBugId = 201645790) + @Test + public void testPocCVE_2021_39700() throws Exception { + ITestDevice device = getDevice(); + assumeTrue("Failed to unroot the device", device.disableAdbRoot()); + String procUdp6File = "/proc/net/udp6"; + File tempFile = File.createTempFile("CVE_2021_39700", "temp"); + assertTrue("Vulnerable to b/201645790 !!", device.pullFile(procUdp6File, tempFile)); + tempFile.deleteOnExit(); + } +} diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/Android.bp b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/Android.bp new file mode 100644 index 00000000000..4efed42a7d6 --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/Android.bp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +android_test_helper_app { + name: "CVE-2020-0015", + defaults: ["cts_support_defaults"], + srcs: ["src/**/*.java"], + test_suites: [ + "sts", + ], + static_libs: [ + "androidx.test.rules", + "androidx.test.uiautomator_uiautomator", + "androidx.test.core", + ], + sdk_version: "current", +} diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/AndroidManifest.xml b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/AndroidManifest.xml new file mode 100644 index 00000000000..7685c352eba --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/AndroidManifest.xml @@ -0,0 +1,36 @@ +<!-- + Copyright 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + package="android.security.cts.CVE_2020_0015" + android:versionCode="1" + android:versionName="1.0"> + + <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> + + <application + android:allowBackup="true" + android:label="CVE_2020_0015" + android:supportsRtl="true"> + <uses-library android:name="android.test.runner" /> + <service android:name=".PocService" + android:enabled="true" /> + </application> + + <instrumentation + android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="android.security.cts.CVE_2020_0015" /> +</manifest> diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/res/raw/cacert b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/res/raw/cacert Binary files differnew file mode 100644 index 00000000000..f0a07797f08 --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/res/raw/cacert diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/res/values/strings.xml b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/res/values/strings.xml new file mode 100644 index 00000000000..93f9df8faae --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/res/values/strings.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + <string name="activityNotStartedException">Unable to start the %1$s</string> + <string name="activityNotFoundMsg">The activity with intent %1$s was not found</string> + <string name="canNotDrawOverlaysMsg">The application cannot draw overlays</string> + <string name="certName">Sample Certificate</string> + <string name="dumpsysActivityCmd">dumpsys activity %1$s</string> + <string name="dumpsysActivityException">Could not execute dumpsys activity command</string> + <string name="intentExtraKeyCert">CERT</string> + <string name="intentExtraKeyName">name</string> + <string name="mResumedTrue">mResumed=true</string> + <string name="overlayErrorMessage">Device is vulnerable to b/139017101 hence any app with + SYSTEM_ALERT_WINDOW can overlay the %1$s screen</string> + <string name="overlayButtonText">OverlayButton</string> + <string name="overlayUiScreenError">Overlay UI did not appear on the screen</string> + <string name="rawResOpenError">Could not open the raw resource %1$s</string> + <string name="streamReadError">Could not read from the raw resource cacert</string> + <string name="streamReadWriteException">Error while trying to read from InputStream object + and writing to a ByteArrayOutputStream object</string> + <string name="testPkg">android.security.cts.CVE_2020_0015</string> + <string name="vulActivityNotRunningError">The %1$s is not currently running on the device + </string> +</resources> diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/src/android/security/cts/CVE_2020_0015/DeviceTest.java b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/src/android/security/cts/CVE_2020_0015/DeviceTest.java new file mode 100644 index 00000000000..f42eb7544ad --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/src/android/security/cts/CVE_2020_0015/DeviceTest.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts.CVE_2020_0015; + +import static androidx.test.core.app.ApplicationProvider.getApplicationContext; +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeNoException; +import static org.junit.Assume.assumeTrue; + +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.provider.Settings; +import android.security.KeyChain; + +import androidx.test.runner.AndroidJUnit4; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.Until; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.regex.Pattern; + +@RunWith(AndroidJUnit4.class) +public class DeviceTest { + String testVulnerablePackage = ""; + + private void startOverlayService() { + Context context = getApplicationContext(); + assertNotNull(context); + Intent intent = new Intent(context, PocService.class); + + assumeTrue(context.getString(R.string.canNotDrawOverlaysMsg), + Settings.canDrawOverlays(getApplicationContext())); + try { + context.startService(intent); + } catch (Exception e) { + assumeNoException( + context.getString(R.string.activityNotStartedException, "overlay service"), e); + } + } + + private void startVulnerableActivity() { + Context context = getApplicationContext(); + assertNotNull(context); + + InputStream inStream = context.getResources().openRawResource(R.raw.cacert); + assumeTrue(context.getString(R.string.rawResOpenError, "cacert"), inStream != null); + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + byte[] data = new byte[1024]; + try { + int nRead = inStream.read(data, 0, data.length); + assumeTrue(context.getString(R.string.streamReadError), nRead > 0); + outStream.write(data, 0, nRead); + } catch (Exception e) { + assumeNoException(context.getString(R.string.streamReadWriteException), e); + } + + Intent intent = KeyChain.createInstallIntent(); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(context.getString(R.string.intentExtraKeyName), + context.getString(R.string.certName)); + intent.putExtra(context.getString(R.string.intentExtraKeyCert), outStream.toByteArray()); + PackageManager pm = context.getPackageManager(); + ResolveInfo ri = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); + assumeTrue(context.getString(R.string.activityNotFoundMsg, intent), ri != null); + testVulnerablePackage = ri.activityInfo.packageName; + + try { + context.startActivity(intent); + } catch (ActivityNotFoundException e) { + assumeNoException(context.getString(R.string.activityNotFoundMsg, intent), e); + } + } + + @Test + public void testOverlayButtonPresence() { + UiDevice mDevice = UiDevice.getInstance(getInstrumentation()); + + /* Start the overlay service */ + startOverlayService(); + + /* Wait for the overlay window */ + Context context = getApplicationContext(); + Pattern overlayTextPattern = Pattern.compile(context.getString(R.string.overlayButtonText), + Pattern.CASE_INSENSITIVE); + final int launchTimeoutMs = 20000; + assumeTrue(context.getString(R.string.overlayUiScreenError), + mDevice.wait(Until.hasObject(By.text(overlayTextPattern)), launchTimeoutMs)); + + /* Start the vulnerable activity */ + startVulnerableActivity(); + + /* Wait until the object of launcher activity is gone */ + boolean overlayDisallowed = false; + if (mDevice.wait(Until.gone(By.pkg(context.getString(R.string.testPkg))), + launchTimeoutMs)) { + overlayDisallowed = true; + } + + /* Check if the currently running activity is the vulnerable activity */ + String activityDump = ""; + try { + activityDump = mDevice.executeShellCommand( + context.getString(R.string.dumpsysActivityCmd, testVulnerablePackage)); + } catch (IOException e) { + assumeNoException(context.getString(R.string.dumpsysActivityException), e); + } + Pattern activityPattern = + Pattern.compile(context.getString(R.string.mResumedTrue), Pattern.CASE_INSENSITIVE); + assumeTrue(context.getString(R.string.vulActivityNotRunningError, testVulnerablePackage), + activityPattern.matcher(activityDump).find()); + + /* Failing the test as fix is not present */ + assertTrue(context.getString(R.string.overlayErrorMessage, testVulnerablePackage), + overlayDisallowed); + } +} diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/src/android/security/cts/CVE_2020_0015/PocService.java b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/src/android/security/cts/CVE_2020_0015/PocService.java new file mode 100644 index 00000000000..d8563d45db9 --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2020-0015/src/android/security/cts/CVE_2020_0015/PocService.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts.CVE_2020_0015; + +import static org.junit.Assume.assumeTrue; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.PixelFormat; +import android.os.IBinder; +import android.provider.Settings; +import android.view.Gravity; +import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; +import android.widget.Button; + +public class PocService extends Service { + private Button mButton; + private WindowManager mWindowManager; + private WindowManager.LayoutParams mLayoutParams; + + private int getScreenWidth() { + return Resources.getSystem().getDisplayMetrics().widthPixels; + } + + private int getScreenHeight() { + return Resources.getSystem().getDisplayMetrics().heightPixels; + } + + @Override + public void onCreate() { + super.onCreate(); + mWindowManager = getSystemService(WindowManager.class); + mLayoutParams = new WindowManager.LayoutParams(); + mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + mLayoutParams.format = PixelFormat.OPAQUE; + mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; + mLayoutParams.width = getScreenWidth(); + mLayoutParams.height = getScreenHeight(); + mLayoutParams.x = getScreenWidth() / 2; + mLayoutParams.y = getScreenHeight() / 2; + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + showFloatingWindow(); + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onDestroy() { + if (mWindowManager != null && mButton != null) { + mWindowManager.removeView(mButton); + } + super.onDestroy(); + } + + private void showFloatingWindow() { + Context context = getApplicationContext(); + assumeTrue(context.getString(R.string.canNotDrawOverlaysMsg), + Settings.canDrawOverlays(getApplicationContext())); + mButton = new Button(getApplicationContext()); + mButton.setText(context.getString(R.string.overlayButtonText)); + mWindowManager.addView(mButton, mLayoutParams); + mButton.setTag(mButton.getVisibility()); + } +} diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2021-0523/src/android/security/cts/CVE_2021_0523/PocActivity.java b/hostsidetests/securitybulletin/test-apps/CVE-2021-0523/src/android/security/cts/CVE_2021_0523/PocActivity.java index a28b337a327..3e35266716d 100644 --- a/hostsidetests/securitybulletin/test-apps/CVE-2021-0523/src/android/security/cts/CVE_2021_0523/PocActivity.java +++ b/hostsidetests/securitybulletin/test-apps/CVE-2021-0523/src/android/security/cts/CVE_2021_0523/PocActivity.java @@ -17,6 +17,7 @@ package android.security.cts.cve_2021_0523; import android.app.Activity; +import android.content.ActivityNotFoundException; import android.content.Intent; import android.net.wifi.WifiManager; import android.os.Bundle; @@ -28,6 +29,10 @@ public class PocActivity extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(WifiManager.ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE); - startActivity(intent); + try { + startActivity(intent); + } catch (ActivityNotFoundException e) { + // do nothing + } } } diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2021-0953/src/android/security/cts/CVE_2021_0953/PocActivity.java b/hostsidetests/securitybulletin/test-apps/CVE-2021-0953/src/android/security/cts/CVE_2021_0953/PocActivity.java index 3684cbe97cc..c28bd75d1b9 100644 --- a/hostsidetests/securitybulletin/test-apps/CVE-2021-0953/src/android/security/cts/CVE_2021_0953/PocActivity.java +++ b/hostsidetests/securitybulletin/test-apps/CVE-2021-0953/src/android/security/cts/CVE_2021_0953/PocActivity.java @@ -21,6 +21,7 @@ import android.app.PendingIntent; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.content.ComponentName; +import android.content.ActivityNotFoundException; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; @@ -70,7 +71,13 @@ public class PocActivity extends Activity { intent.putExtra("appWidgetId", APPWIDGET_ID); intent.putExtra("appWidgetProvider", new ComponentName("com.android.quicksearchbox", "com.android.quicksearchbox.SearchWidgetProvider")); - PocActivity.this.startActivityForResult(intent, REQUEST_BIND_APPWIDGET); + try { + PocActivity.this.startActivityForResult(intent, REQUEST_BIND_APPWIDGET); + } catch (ActivityNotFoundException e) { + sendTestResult(getResources().getInteger(R.integer.assumption_failure), + "Could not start activity"); + return; + } String settingsPkgName = ""; PackageManager pm = getPackageManager(); List<ResolveInfo> ris = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/Android.bp b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/Android.bp new file mode 100644 index 00000000000..602c426190f --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/Android.bp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +android_test_helper_app { + name: "CVE-2021-39692", + defaults: ["cts_support_defaults"], + srcs: ["src/**/*.java"], + test_suites: [ + "sts", + ], + static_libs: [ + "androidx.test.rules", + "androidx.test.uiautomator_uiautomator", + "androidx.test.core", + ], + sdk_version: "current", +} diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/AndroidManifest.xml b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/AndroidManifest.xml new file mode 100644 index 00000000000..459d99233f2 --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/AndroidManifest.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="android.security.cts.CVE_2021_39692"> + + <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> + + <application + android:testOnly="false" + android:allowBackup="true" + android:label="CVE-2021-39692"> + <uses-library android:name="android.test.runner" /> + <activity android:name=".PocActivity" + android:enabled="true" + android:exported="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + <service android:name=".PocService" + android:enabled="true" + android:exported="false" /> + + <receiver android:name=".PocDeviceAdminReceiver" + android:permission="android.permission.BIND_DEVICE_ADMIN" + android:exported="true"> + <meta-data + android:name="android.app.device_admin" + android:resource="@xml/device_admin_receiver"/> + <intent-filter> + <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> + <action android:name="android.intent.action.BOOT_COMPLETED" /> + <action android:name="android.app.action.PROFILE_OWNER_CHANGED" /> + <action android:name="android.app.action.DEVICE_OWNER_CHANGED" /> + </intent-filter> + </receiver> + </application> + + <instrumentation + android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="android.security.cts.CVE_2021_39692" /> +</manifest> diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/res/values/strings.xml b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/res/values/strings.xml new file mode 100644 index 00000000000..cf041ca29d4 --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/res/values/strings.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + <string name="activityNotStartedException">Unable to start the %1$s</string> + <string name="activityNotFoundMsg">The activity with intent %1$s was not found</string> + <string name="canNotDrawOverlaysMsg">The application cannot draw overlays</string> + <string name="dumpsysActivityCmd">dumpsys activity %1$s</string> + <string name="dumpsysActivityException">Could not execute dumpsys activity command</string> + <string name="overlayErrorMessage">Device is vulnerable to b/209611539 hence any app with + "SYSTEM_ALERT_WINDOW can overlay the %1$s screen</string> + <string name="mResumedTrue">mResumed=true</string> + <string name="overlayButtonText">OverlayButton</string> + <string name="overlayUiScreenError">Overlay UI did not appear on the screen</string> + <string name="testPkg">android.security.cts.CVE_2021_39692</string> + <string name="vulActivityNotRunningError">The %1$s is not currently running on the device + </string> +</resources> diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/res/xml/device_admin_receiver.xml b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/res/xml/device_admin_receiver.xml new file mode 100644 index 00000000000..af74d3bebb6 --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/res/xml/device_admin_receiver.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<device-admin> + <support-transfer-ownership/> + <uses-policies> + <limit-password/> + <watch-login/> + <reset-password/> + <force-lock/> + <wipe-data/> + <expire-password/> + <encrypted-storage/> + <disable-camera/> + <disable-keyguard-features/> + </uses-policies> +</device-admin> diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/DeviceTest.java b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/DeviceTest.java new file mode 100644 index 00000000000..e2f6196e4d5 --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/DeviceTest.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts.CVE_2021_39692; + +import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE; +import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME; +import static androidx.test.core.app.ApplicationProvider.getApplicationContext; +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeNoException; +import static org.junit.Assume.assumeTrue; + +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.provider.Settings; + +import androidx.test.runner.AndroidJUnit4; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.Until; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.IOException; +import java.util.regex.Pattern; + +@RunWith(AndroidJUnit4.class) +public class DeviceTest { + + private void startOverlayService() { + Context context = getApplicationContext(); + assertNotNull(context); + Intent intent = new Intent(context, PocService.class); + + assumeTrue(context.getString(R.string.canNotDrawOverlaysMsg), + Settings.canDrawOverlays(getApplicationContext())); + try { + context.startService(intent); + } catch (Exception e) { + assumeNoException( + context.getString(R.string.activityNotStartedException, "overlay service"), e); + } + } + + private void startVulnerableActivity() { + Context context = getApplicationContext(); + Intent intent = new Intent(context, PocActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + context.startActivity(intent); + } catch (ActivityNotFoundException e) { + assumeNoException( + context.getString(R.string.activityNotStartedException, "PocActivity"), e); + } + } + + @Test + public void testOverlayButtonPresence() { + UiDevice mDevice = UiDevice.getInstance(getInstrumentation()); + + /* Start the overlay service */ + startOverlayService(); + + /* Wait for the overlay window */ + Context context = getApplicationContext(); + Pattern overlayTextPattern = Pattern.compile(context.getString(R.string.overlayButtonText), + Pattern.CASE_INSENSITIVE); + final int launchTimeoutMs = 20000; + assumeTrue(context.getString(R.string.overlayUiScreenError), + mDevice.wait(Until.hasObject(By.text(overlayTextPattern)), launchTimeoutMs)); + + /* Start the vulnerable activity */ + startVulnerableActivity(); + + /* Wait until the object of launcher activity is gone */ + boolean overlayDisallowed = false; + if (mDevice.wait(Until.gone(By.pkg(context.getString(R.string.testPkg))), + launchTimeoutMs)) { + overlayDisallowed = true; + } + + Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE); + intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, + new ComponentName(context, PocDeviceAdminReceiver.class)); + PackageManager pm = context.getPackageManager(); + ResolveInfo ri = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); + assumeTrue(context.getString(R.string.activityNotFoundMsg, intent), ri != null); + String testVulnerableActivity = ri.activityInfo.name; + + /* Check if the currently running activity is the vulnerable activity */ + String activityDump = ""; + try { + activityDump = mDevice.executeShellCommand( + context.getString(R.string.dumpsysActivityCmd, testVulnerableActivity)); + } catch (IOException e) { + assumeNoException(context.getString(R.string.dumpsysActivityException), e); + } + Pattern activityPattern = + Pattern.compile(context.getString(R.string.mResumedTrue), Pattern.CASE_INSENSITIVE); + assumeTrue(context.getString(R.string.vulActivityNotRunningError, testVulnerableActivity), + activityPattern.matcher(activityDump).find()); + + /* Failing the test as fix is not present */ + assertTrue(context.getString(R.string.overlayErrorMessage, testVulnerableActivity), + overlayDisallowed); + } +} diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/PocActivity.java b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/PocActivity.java new file mode 100644 index 00000000000..89a7d931479 --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/PocActivity.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts.CVE_2021_39692; + +import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE; +import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME; +import static org.junit.Assume.assumeNoException; +import static org.junit.Assume.assumeTrue; + +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.Bundle; + +public class PocActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE); + intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, + new ComponentName(getApplicationContext(), PocDeviceAdminReceiver.class)); + PackageManager pm = getPackageManager(); + ResolveInfo ri = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); + assumeTrue(getString(R.string.activityNotFoundMsg, intent), ri != null); + try { + startActivityForResult(intent, 1); + } catch (ActivityNotFoundException e) { + assumeNoException(getString(R.string.activityNotFoundMsg, intent), e); + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode == Activity.RESULT_OK) { + this.setResult(Activity.RESULT_OK); + this.finish(); + } + } +} diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/PocDeviceAdminReceiver.java b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/PocDeviceAdminReceiver.java new file mode 100644 index 00000000000..455aa03141c --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/PocDeviceAdminReceiver.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts.CVE_2021_39692; + +import android.app.admin.DeviceAdminReceiver; +import android.content.Context; +import android.content.Intent; + +public class PocDeviceAdminReceiver extends DeviceAdminReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + super.onReceive(context, intent); + } +} diff --git a/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/PocService.java b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/PocService.java new file mode 100644 index 00000000000..be96d115d4f --- /dev/null +++ b/hostsidetests/securitybulletin/test-apps/CVE-2021-39692/src/android/security/cts/CVE_2021_39692/PocService.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.cts.CVE_2021_39692; + +import static org.junit.Assume.assumeTrue; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.PixelFormat; +import android.os.IBinder; +import android.provider.Settings; +import android.view.Gravity; +import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; +import android.widget.Button; + +public class PocService extends Service { + private Button mButton; + private WindowManager mWindowManager; + private WindowManager.LayoutParams mLayoutParams; + + private static int getScreenWidth() { + return Resources.getSystem().getDisplayMetrics().widthPixels; + } + + private static int getScreenHeight() { + return Resources.getSystem().getDisplayMetrics().heightPixels; + } + + @Override + public void onCreate() { + super.onCreate(); + mWindowManager = getSystemService(WindowManager.class); + mLayoutParams = new WindowManager.LayoutParams(); + mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + mLayoutParams.format = PixelFormat.OPAQUE; + mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; + mLayoutParams.width = getScreenWidth(); + mLayoutParams.height = getScreenHeight(); + mLayoutParams.x = getScreenWidth() / 2; + mLayoutParams.y = getScreenHeight() / 2; + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + showFloatingWindow(); + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onDestroy() { + if (mWindowManager != null && mButton != null) { + mWindowManager.removeView(mButton); + } + super.onDestroy(); + } + + private void showFloatingWindow() { + Context context = getApplicationContext(); + assumeTrue(context.getString(R.string.canNotDrawOverlaysMsg), + Settings.canDrawOverlays(getApplicationContext())); + mButton = new Button(getApplicationContext()); + mButton.setText(context.getString(R.string.overlayButtonText)); + mWindowManager.addView(mButton, mLayoutParams); + mButton.setTag(mButton.getVisibility()); + } +} diff --git a/tests/MediaProviderTranscode/AndroidTest.xml b/tests/MediaProviderTranscode/AndroidTest.xml index 7dc78ebcd2f..6b9c8e902fe 100644 --- a/tests/MediaProviderTranscode/AndroidTest.xml +++ b/tests/MediaProviderTranscode/AndroidTest.xml @@ -37,4 +37,8 @@ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" /> <option name="hidden-api-checks" value="false"/> </test> + + <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController"> + <option name="mainline-module-package-name" value="com.google.android.mediaprovider" /> + </object> </configuration> diff --git a/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerBaseTest.java b/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerBaseTest.java index 5873feed179..67623acfaff 100644 --- a/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerBaseTest.java +++ b/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerBaseTest.java @@ -47,9 +47,13 @@ public class PhotoPickerBaseTest { enablePhotoPickerFlag(inst); + final String setSyncDelayCommand = + "setprop persist.sys.photopicker.pickerdb.default_sync_delay_ms 0"; + mDevice.executeShellCommand(setSyncDelayCommand); + mContext = inst.getContext(); final Intent intent = new Intent(mContext, GetResultActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Wake up the device and dismiss the keyguard before the test starts mDevice.executeShellCommand("input keyevent KEYCODE_WAKEUP"); diff --git a/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerCrossProfileTest.java b/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerCrossProfileTest.java index c05d22e2d46..fcef9088960 100644 --- a/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerCrossProfileTest.java +++ b/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerCrossProfileTest.java @@ -20,18 +20,22 @@ import static android.photopicker.cts.util.PhotoPickerAssertionsUtils.assertPick import static android.photopicker.cts.util.PhotoPickerAssertionsUtils.assertRedactedReadOnlyAccess; import static android.photopicker.cts.util.PhotoPickerFilesUtils.createImages; import static android.photopicker.cts.util.PhotoPickerFilesUtils.deleteMedia; +import static android.photopicker.cts.util.PhotoPickerUiUtils.SHORT_TIMEOUT; import static android.photopicker.cts.util.PhotoPickerUiUtils.findAddButton; import static android.photopicker.cts.util.PhotoPickerUiUtils.findItemList; import static android.photopicker.cts.util.PhotoPickerUiUtils.findProfileButton; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assertWithMessage; import android.content.ClipData; import android.content.Intent; import android.net.Uri; import android.provider.MediaStore; +import androidx.test.filters.SdkSuppress; import androidx.test.uiautomator.UiObject; +import androidx.test.uiautomator.UiSelector; import com.android.bedstead.harrier.BedsteadJUnit4; import com.android.bedstead.harrier.DeviceState; @@ -40,7 +44,6 @@ import com.android.bedstead.harrier.annotations.RequireRunOnWorkProfile; import org.junit.After; import org.junit.ClassRule; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -61,13 +64,19 @@ public class PhotoPickerCrossProfileTest extends PhotoPickerBaseTest { @After public void tearDown() throws Exception { for (Uri uri : mUriList) { - deleteMedia(uri, mContext.getUserId()); + deleteMedia(uri, mContext); } + mUriList.clear(); mActivity.finish(); } + /** + * ACTION_PICK_IMAGES is allowlisted by default from work to personal. This got allowlisted + * in a platform code change and is available Android T onwards. + */ @Test @RequireRunOnWorkProfile + @SdkSuppress(minSdkVersion = 32, codeName = "T") public void testWorkApp_canAccessPersonalProfileContents() throws Exception { final int imageCount = 2; createImages(imageCount, sDeviceState.primaryUser().id(), mUriList); @@ -104,15 +113,31 @@ public class PhotoPickerCrossProfileTest extends PhotoPickerBaseTest { } } + /** + * ACTION_PICK_IMAGES is allowlisted by default from work to personal. This got allowlisted + * in a platform code change and is available Android T onwards. Before that it needs to be + * explicitly allowlisted by the device admin. + */ + @Test + @RequireRunOnWorkProfile + @SdkSuppress(maxSdkVersion = 31, codeName = "S") + public void testWorkApp_cannotAccessPersonalProfile_beforeT() throws Exception { + assertBlockedByAdmin(/* isInvokedFromWorkProfile */ true); + } + + /** + * ACTION_PICK_IMAGES is allowlisted by default from work to personal only (not vice-a-versa) + */ @Test @EnsureHasWorkProfile - @Ignore("Enable after b/216475844 is fixed") - public void testPersonalApp_canAccessWorkProfileContents() throws Exception { - final int imageCount = 2; - createImages(imageCount, sDeviceState.workProfile().id(), mUriList); + public void testPersonalApp_cannotAccessWorkProfile_default() throws Exception { + assertBlockedByAdmin(/* isInvokedFromWorkProfile */ false); + } + private void assertBlockedByAdmin(boolean isInvokedFromWorkProfile) throws Exception { Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES); - intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, imageCount); + // TODO(b/205291616): Replace 100 with MediaStore.getPickImagesMaxLimit() + intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, 100); mActivity.startActivityForResult(intent, REQUEST_CODE); // Click the profile button to change to work profile @@ -120,26 +145,24 @@ public class PhotoPickerCrossProfileTest extends PhotoPickerBaseTest { profileButton.click(); mDevice.waitForIdle(); - final List<UiObject> itemList = findItemList(imageCount); - final int itemCount = itemList.size(); - assertThat(itemCount).isEqualTo(imageCount); - for (int i = 0; i < itemCount; i++) { - final UiObject item = itemList.get(i); - item.click(); - mDevice.waitForIdle(); - } - - final UiObject addButton = findAddButton(); - addButton.click(); - mDevice.waitForIdle(); + assertBlockedByAdminDialog(isInvokedFromWorkProfile); + } - final ClipData clipData = mActivity.getResult().data.getClipData(); - final int count = clipData.getItemCount(); - assertThat(count).isEqualTo(imageCount); - for (int i = 0; i < count; i++) { - Uri uri = clipData.getItemAt(i).getUri(); - assertPickerUriFormat(uri, sDeviceState.workProfile().id()); - assertRedactedReadOnlyAccess(uri); + private void assertBlockedByAdminDialog(boolean isInvokedFromWorkProfile) { + final String dialogTitle = "Blocked by your admin"; + assertWithMessage("Timed out while waiting for blocked by admin dialog to appear") + .that(new UiObject(new UiSelector().textContains(dialogTitle)) + .waitForExists(SHORT_TIMEOUT)) + .isTrue(); + + final String dialogDescription; + if (isInvokedFromWorkProfile) { + dialogDescription = "Accessing personal data from a work app is not permitted"; + } else { + dialogDescription = "Accessing work data from a personal app is not permitted"; } + assertWithMessage("Blocked by admin description is not as expected") + .that(new UiObject(new UiSelector().textContains(dialogDescription)).exists()) + .isTrue(); } } diff --git a/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerTest.java b/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerTest.java index d02fa42a453..b9f8f33a3f3 100644 --- a/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerTest.java +++ b/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerTest.java @@ -44,6 +44,7 @@ import androidx.test.uiautomator.UiObject; import androidx.test.uiautomator.UiSelector; import org.junit.After; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -60,9 +61,13 @@ public class PhotoPickerTest extends PhotoPickerBaseTest { @After public void tearDown() throws Exception { for (Uri uri : mUriList) { - deleteMedia(uri, mContext.getUserId()); + deleteMedia(uri, mContext); + } + mUriList.clear(); + + if (mActivity != null) { + mActivity.finish(); } - mActivity.finish(); } @Test @@ -271,7 +276,7 @@ public class PhotoPickerTest extends PhotoPickerBaseTest { swipeLeftAndWait(); // Deselect one item - clickAndWait(findPreviewSelectCheckButton()); + clickAndWait(findPreviewSelectedCheckButton()); // Return selected items clickAndWait(findPreviewAddButton()); @@ -287,6 +292,7 @@ public class PhotoPickerTest extends PhotoPickerBaseTest { } @Test + @Ignore("Re-enable once b/218794887 is fixed") public void testMultiSelect_PreviewVideoPlayPause() throws Exception { launchPreviewMultipleWithVideos(/* videoCount */ 4); @@ -311,6 +317,7 @@ public class PhotoPickerTest extends PhotoPickerBaseTest { } @Test + @Ignore("Re-enable once b/218794887 is fixed") public void testMultiSelect_PreviewVideoMuteButton() throws Exception { launchPreviewMultipleWithVideos(/* videoCount */ 4); @@ -371,6 +378,7 @@ public class PhotoPickerTest extends PhotoPickerBaseTest { } @Test + @Ignore("Re-enable once b/218794887 is fixed") public void testMultiSelect_PreviewVideoControlsVisibility() throws Exception { launchPreviewMultipleWithVideos(/* videoCount */ 3); @@ -548,9 +556,9 @@ public class PhotoPickerTest extends PhotoPickerBaseTest { REGEX_PACKAGE_NAME + ":id/button_view_selected")); } - private static UiObject findPreviewSelectCheckButton() { + private static UiObject findPreviewSelectedCheckButton() { return new UiObject(new UiSelector().resourceIdMatches( - REGEX_PACKAGE_NAME + ":id/preview_select_check_button")); + REGEX_PACKAGE_NAME + ":id/preview_selected_check_button")); } diff --git a/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerFilesUtils.java b/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerFilesUtils.java index 8103b70f6cd..87be76422c8 100644 --- a/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerFilesUtils.java +++ b/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerFilesUtils.java @@ -19,10 +19,12 @@ package android.photopicker.cts.util; import android.app.UiAutomation; import android.content.Context; import android.net.Uri; +import android.os.Bundle; import android.os.FileUtils; import android.os.UserHandle; import android.photopicker.cts.R; import android.provider.MediaStore; +import android.provider.cts.ProviderTestUtils; import android.provider.cts.media.MediaStoreUtils; import androidx.test.InstrumentationRegistry; @@ -47,6 +49,8 @@ public class PhotoPickerFilesUtils { uriList.add(uri); clearMediaOwner(uri, userId); } + // Wait for Picker db sync to complete + MediaStore.waitForIdle(InstrumentationRegistry.getContext().getContentResolver()); } public static void createDNGVideos(int count, int userId, List<Uri> uriList) @@ -56,6 +60,8 @@ public class PhotoPickerFilesUtils { uriList.add(uri); clearMediaOwner(uri, userId); } + // Wait for Picker db sync to complete + MediaStore.waitForIdle(InstrumentationRegistry.getContext().getContentResolver()); } public static void createVideos(int count, int userId, List<Uri> uriList) @@ -65,11 +71,16 @@ public class PhotoPickerFilesUtils { uriList.add(uri); clearMediaOwner(uri, userId); } + // Wait for Picker db sync to complete + MediaStore.waitForIdle(InstrumentationRegistry.getContext().getContentResolver()); } - public static void deleteMedia(Uri uri, int userId) throws Exception { - final String cmd = String.format("content delete --uri %s --user %d", uri, userId); - ShellUtils.runShellCommand(cmd); + public static void deleteMedia(Uri uri, Context context) throws Exception { + try { + ProviderTestUtils.setOwner(uri, context.getPackageName()); + context.getContentResolver().delete(uri, Bundle.EMPTY); + } catch (Exception ignored) { + } } private static void clearMediaOwner(Uri uri, int userId) throws Exception { diff --git a/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java b/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java index 47fe16104d4..542b3aa9db6 100644 --- a/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java +++ b/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java @@ -16,6 +16,8 @@ package android.providerui.cts; +import static android.provider.cts.ProviderTestUtils.resolveVolumeName; + import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -122,6 +124,7 @@ public class MediaStoreUiTest { mActivity = (GetResultActivity) mInstrumentation.startActivitySync(intent); mInstrumentation.waitForIdleSync(); mActivity.clearResult(); + mDevice.wakeUp(); } @After @@ -147,6 +150,7 @@ public class MediaStoreUiTest { if (!supportsHardware()) return; prepareFile(); + clearDocumentsUi(); final Uri treeUri = acquireAccess(mFile, Environment.DIRECTORY_DOCUMENTS); assertNotNull(treeUri); @@ -175,6 +179,7 @@ public class MediaStoreUiTest { if (!supportsHardware()) return; prepareFile(); + clearDocumentsUi(); try { MediaStore.getDocumentUri(mActivity, mMediaStoreUri); @@ -189,6 +194,7 @@ public class MediaStoreUiTest { if (!supportsHardware()) return; prepareFile(); + clearDocumentsUi(); final Uri treeUri = acquireAccess(mFile, Environment.DIRECTORY_DOCUMENTS); Log.v(TAG, "Tree " + treeUri); @@ -408,7 +414,7 @@ public class MediaStoreUiTest { } private void prepareFile() throws Exception { - final File dir = new File(getVolumePath(mVolumeName), + final File dir = new File(getVolumePath(resolveVolumeName(mVolumeName)), Environment.DIRECTORY_DOCUMENTS); final File file = new File(dir, "cts" + System.nanoTime() + ".txt"); @@ -419,7 +425,7 @@ public class MediaStoreUiTest { } private void prepareFile(String rawText) throws Exception { - final File dir = new File(getVolumePath(mVolumeName), + final File dir = new File(getVolumePath(resolveVolumeName(mVolumeName)), Environment.DIRECTORY_DOCUMENTS); final File file = new File(dir, "cts" + System.nanoTime() + ".txt"); @@ -430,7 +436,8 @@ public class MediaStoreUiTest { } private Pair<Uri, File> prepareFileAndFetchDetails(String rawText) throws Exception { - final File dir = new File(getVolumePath(mVolumeName), Environment.DIRECTORY_DOCUMENTS); + final File dir = new File(getVolumePath(resolveVolumeName(mVolumeName)), + Environment.DIRECTORY_DOCUMENTS); final File file = new File(dir, "cts" + System.nanoTime() + ".txt"); File stagedFile = stageFileWithRawText(rawText, file); diff --git a/tests/tests/content/TEST_MAPPING b/tests/tests/content/TEST_MAPPING index ed0ac3444a4..7f588e48040 100644 --- a/tests/tests/content/TEST_MAPPING +++ b/tests/tests/content/TEST_MAPPING @@ -1,27 +1,29 @@ { "presubmit": [ { - "name": "CtsContentTestCases", + "name": "FrameworksCoreTests", "options": [ { - "exclude-annotation": "androidx.test.filters.FlakyTest" - }, - { - "exclude-annotation": "org.junit.Ignore" + "include-filter": "android.content.pm.PackageManagerTests" }, { - "include-filter": "android.content.pm.cts" + "exclude-annotation": "androidx.test.filters.Suppress" } ] - }, + } + ], + "presubmit-large": [ { - "name": "FrameworksCoreTests", + "name": "CtsContentTestCases", "options": [ { - "include-filter": "android.content.pm.PackageManagerTests" + "exclude-annotation": "androidx.test.filters.FlakyTest" }, { - "exclude-annotation": "androidx.test.filters.Suppress" + "exclude-annotation": "org.junit.Ignore" + }, + { + "include-filter": "android.content.pm.cts" } ] } diff --git a/tests/tests/permission3/src/android/permission3/cts/SensorBlockedBannerTest.kt b/tests/tests/permission3/src/android/permission3/cts/SensorBlockedBannerTest.kt index 37e9d41fe5c..191885bd29d 100644 --- a/tests/tests/permission3/src/android/permission3/cts/SensorBlockedBannerTest.kt +++ b/tests/tests/permission3/src/android/permission3/cts/SensorBlockedBannerTest.kt @@ -21,9 +21,11 @@ import android.hardware.SensorPrivacyManager import android.hardware.SensorPrivacyManager.Sensors.CAMERA import android.hardware.SensorPrivacyManager.Sensors.MICROPHONE import android.location.LocationManager +import android.Manifest.permission_group.CAMERA as CAMERA_PERMISSION_GROUP +import android.Manifest.permission_group.LOCATION as LOCATION_PERMISSION_GROUP +import android.Manifest.permission_group.MICROPHONE as MICROPHONE_PERMISSION_GROUP import android.os.Build import android.provider.DeviceConfig -import android.provider.Settings import android.support.test.uiautomator.By import androidx.test.filters.SdkSuppress import com.android.compatibility.common.util.SystemUtil.callWithShellPermissionIdentity @@ -31,6 +33,7 @@ import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionId import org.junit.After import org.junit.Assume import org.junit.Before +import org.junit.Ignore import org.junit.Test /** @@ -50,9 +53,9 @@ class SensorBlockedBannerTest : BaseUsePermissionTest() { WARNING_BANNER_ENABLED, false.toString()) } - private val permToLabel = mapOf(CAMERA to "privdash_label_camera", - MICROPHONE to "privdash_label_microphone", - LOCATION to "privdash_label_location") + private val sensorToPermissionGroup = mapOf(CAMERA to CAMERA_PERMISSION_GROUP, + MICROPHONE to MICROPHONE_PERMISSION_GROUP, + LOCATION to LOCATION_PERMISSION_GROUP) private val permToTitle = mapOf(CAMERA to "blocked_camera_title", MICROPHONE to "blocked_microphone_title", @@ -80,17 +83,16 @@ class SensorBlockedBannerTest : BaseUsePermissionTest() { } private fun navigateAndTest(sensor: Int) { - val permLabel = permToLabel.getOrDefault(sensor, "Break") - val intent = Intent(Settings.ACTION_PRIVACY_SETTINGS) + val permissionGroup = sensorToPermissionGroup.getOrDefault(sensor, "Break") + val intent = Intent(Intent.ACTION_MANAGE_PERMISSION_APPS) + .putExtra(Intent.EXTRA_PERMISSION_GROUP_NAME, permissionGroup) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - context.startActivity(intent) - click(By.text(getPermissionControllerString("app_permission_manager"))) - click(By.text(getPermissionControllerString(permLabel))) + runWithShellPermissionIdentity { + context.startActivity(intent) + } val bannerTitle = permToTitle.getOrDefault(sensor, "Break") waitFindObject(By.text(getPermissionControllerString(bannerTitle))) pressBack() - pressBack() - pressBack() } private fun runSensorTest(sensor: Int) { @@ -105,18 +107,21 @@ class SensorBlockedBannerTest : BaseUsePermissionTest() { } @Test + @Ignore fun testCameraCardDisplayed() { Assume.assumeTrue(sensorPrivacyManager.supportsSensorToggle(CAMERA)) runSensorTest(CAMERA) } @Test + @Ignore fun testMicCardDisplayed() { Assume.assumeTrue(sensorPrivacyManager.supportsSensorToggle(MICROPHONE)) runSensorTest(MICROPHONE) } @Test + @Ignore fun testLocationCardDisplayed() { runSensorTest(LOCATION) } diff --git a/tests/tests/security/src/android/security/cts/ActivityManagerTest.java b/tests/tests/security/src/android/security/cts/ActivityManagerTest.java index 9480251f37c..f16b8fb2111 100644 --- a/tests/tests/security/src/android/security/cts/ActivityManagerTest.java +++ b/tests/tests/security/src/android/security/cts/ActivityManagerTest.java @@ -15,26 +15,30 @@ */ package android.security.cts; +import static org.junit.Assert.*; + import android.app.ActivityManager; import android.app.ApplicationExitInfo; import android.content.Context; import android.os.IBinder; import android.platform.test.annotations.AsbSecurityTest; import android.util.Log; +import androidx.test.runner.AndroidJUnit4; import androidx.test.InstrumentationRegistry; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import junit.framework.TestCase; import java.lang.reflect.InvocationTargetException; -public class ActivityManagerTest extends TestCase { +import org.junit.runner.RunWith; +import org.junit.Test; - @Override - protected void setUp() throws Exception { - super.setUp(); - } +@RunWith(AndroidJUnit4.class) +public class ActivityManagerTest extends StsExtraBusinessLogicTestCase { @AsbSecurityTest(cveBugId = 19394591) + @Test public void testActivityManager_injectInputEvents() throws ClassNotFoundException { try { /* @@ -53,6 +57,7 @@ public class ActivityManagerTest extends TestCase { // b/144285917 @AsbSecurityTest(cveBugId = 144285917) + @Test public void testActivityManager_attachNullApplication() { SecurityException securityException = null; Exception unexpectedException = null; @@ -81,6 +86,7 @@ public class ActivityManagerTest extends TestCase { // b/166667403 @AsbSecurityTest(cveBugId = 166667403) + @Test public void testActivityManager_appExitReasonPackageNames() { final String mockPackage = "com.foo.bar"; final String realPackage = "com.android.compatibility.common.deviceinfo"; diff --git a/tests/tests/security/src/android/security/cts/AllocatePixelRefIntOverflowTest.java b/tests/tests/security/src/android/security/cts/AllocatePixelRefIntOverflowTest.java index 5d297c6a9b2..fca75a22425 100644 --- a/tests/tests/security/src/android/security/cts/AllocatePixelRefIntOverflowTest.java +++ b/tests/tests/security/src/android/security/cts/AllocatePixelRefIntOverflowTest.java @@ -19,21 +19,28 @@ package android.security.cts; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; +import org.junit.runner.RunWith; +import org.junit.Test; + +import static org.junit.Assert.*; import java.io.InputStream; import android.security.cts.R; -public class AllocatePixelRefIntOverflowTest extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class AllocatePixelRefIntOverflowTest extends StsExtraBusinessLogicTestCase { /** * Verifies that the device is not vulnerable to ANDROID-19270126: Android * BitmapFactory.decodeStream JPG allocPixelRef integer overflow */ @AsbSecurityTest(cveBugId = 19394591) + @Test public void testAllocateJavaPixelRefIntOverflow() { - InputStream exploitImage = mContext.getResources().openRawResource( + InputStream exploitImage = getInstrumentation().getContext().getResources().openRawResource( R.raw.cve_2015_1531_b_19270126); /** * The decodeStream method results in SIGSEGV (Segmentation fault) on unpatched devices diff --git a/tests/tests/security/src/android/security/cts/AmbiguousBundlesTest.java b/tests/tests/security/src/android/security/cts/AmbiguousBundlesTest.java index 73536e35b0f..397c0129661 100644 --- a/tests/tests/security/src/android/security/cts/AmbiguousBundlesTest.java +++ b/tests/tests/security/src/android/security/cts/AmbiguousBundlesTest.java @@ -16,7 +16,7 @@ package android.security.cts; -import android.test.AndroidTestCase; +import static org.junit.Assert.fail; import android.app.Activity; import android.os.BaseBundle; @@ -27,21 +27,29 @@ import android.view.AbsSavedState; import android.view.View; import android.view.View.BaseSavedState; import android.annotation.SuppressLint; +import androidx.test.runner.AndroidJUnit4; + +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.io.InputStream; import java.lang.reflect.Field; import java.util.Random; +import org.junit.runner.RunWith; +import org.junit.Test; + import android.security.cts.R; import android.platform.test.annotations.AsbSecurityTest; -public class AmbiguousBundlesTest extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class AmbiguousBundlesTest extends StsExtraBusinessLogicTestCase { /** * b/140417434 * Vulnerability Behaviour: Failure via Exception */ @AsbSecurityTest(cveBugId = 140417434) + @Test public void test_android_CVE_2020_0082() throws Exception { Ambiguator ambiguator = new Ambiguator() { @@ -180,6 +188,7 @@ public class AmbiguousBundlesTest extends AndroidTestCase { * b/71992105 */ @AsbSecurityTest(cveBugId = 71992105) + @Test public void test_android_CVE_2017_13310() throws Exception { Ambiguator ambiguator = new Ambiguator() { @@ -270,6 +279,7 @@ public class AmbiguousBundlesTest extends AndroidTestCase { * b/71508348 */ @AsbSecurityTest(cveBugId = 71508348) + @Test public void test_android_CVE_2018_9339() throws Exception { Ambiguator ambiguator = new Ambiguator() { @@ -373,6 +383,7 @@ public class AmbiguousBundlesTest extends AndroidTestCase { * b/62998805 */ @AsbSecurityTest(cveBugId = 62998805) + @Test public void test_android_CVE_2017_0806() throws Exception { Ambiguator ambiguator = new Ambiguator() { @Override @@ -436,6 +447,7 @@ public class AmbiguousBundlesTest extends AndroidTestCase { * b/73252178 */ @AsbSecurityTest(cveBugId = 73252178) + @Test public void test_android_CVE_2017_13311() throws Exception { Ambiguator ambiguator = new Ambiguator() { @Override @@ -530,6 +542,7 @@ public class AmbiguousBundlesTest extends AndroidTestCase { * b/71714464 */ @AsbSecurityTest(cveBugId = 71714464) + @Test public void test_android_CVE_2017_13287() throws Exception { Ambiguator ambiguator = new Ambiguator() { @Override diff --git a/tests/tests/security/src/android/security/cts/AndroidFutureTest.java b/tests/tests/security/src/android/security/cts/AndroidFutureTest.java index 7b26ff0cee8..1deafdde4f1 100644 --- a/tests/tests/security/src/android/security/cts/AndroidFutureTest.java +++ b/tests/tests/security/src/android/security/cts/AndroidFutureTest.java @@ -25,6 +25,7 @@ import android.platform.test.annotations.AsbSecurityTest; import androidx.test.core.app.ApplicationProvider; import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import static org.junit.Assert.assertFalse; import org.junit.Test; @@ -34,7 +35,7 @@ import java.io.File; import java.lang.reflect.Field; @RunWith(AndroidJUnit4.class) -public class AndroidFutureTest { +public class AndroidFutureTest extends StsExtraBusinessLogicTestCase { @AsbSecurityTest(cveBugId = 186530450) @Test diff --git a/tests/tests/security/src/android/security/cts/AssetManagerTest.java b/tests/tests/security/src/android/security/cts/AssetManagerTest.java index 10e1c2098c3..684fa6f4d02 100644 --- a/tests/tests/security/src/android/security/cts/AssetManagerTest.java +++ b/tests/tests/security/src/android/security/cts/AssetManagerTest.java @@ -19,13 +19,19 @@ package android.security.cts; import android.content.res.AssetManager; import android.content.res.XmlResourceParser; import android.platform.test.annotations.AsbSecurityTest; +import androidx.test.runner.AndroidJUnit4; -import com.android.compatibility.common.util.CtsAndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; -public class AssetManagerTest extends CtsAndroidTestCase { +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class AssetManagerTest extends StsExtraBusinessLogicTestCase { // b/144028297 @AsbSecurityTest(cveBugId = 144028297) + @Test public void testCloseThenFinalize() throws Exception { final XmlResourceParser[] parser = {null}; final AssetManager[] assetManager = {AssetManager.class.newInstance()}; diff --git a/tests/tests/security/src/android/security/cts/AttributionSourceTest.java b/tests/tests/security/src/android/security/cts/AttributionSourceTest.java index 80ffd60eb7e..e36fa49b3eb 100644 --- a/tests/tests/security/src/android/security/cts/AttributionSourceTest.java +++ b/tests/tests/security/src/android/security/cts/AttributionSourceTest.java @@ -16,44 +16,39 @@ package android.security.cts; +import static org.junit.Assert.assertThrows; + +import java.lang.reflect.Field; +import org.junit.Test; +import org.junit.runner.RunWith; + import android.content.AttributionSource; import android.content.Context; import android.platform.test.annotations.AsbSecurityTest; - import androidx.test.core.app.ApplicationProvider; import androidx.test.runner.AndroidJUnit4; -import org.junit.Assume; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.Assert; - -import java.lang.reflect.Field; - @RunWith(AndroidJUnit4.class) public class AttributionSourceTest { @AsbSecurityTest(cveBugId = 200288596) @Test - public void testPidCheck() - throws Exception { + public void testPidCheck() throws Exception { Context context = ApplicationProvider.getApplicationContext(); - AttributionSource attributionSource = null; - Field attSourceStateField = null; - try { - attributionSource = (AttributionSource) Context.class.getMethod( - "getAttributionSource").invoke(context); - attSourceStateField = attributionSource.getClass().getDeclaredField( - "mAttributionSourceState"); - attSourceStateField.setAccessible(true); - } catch (Exception e) { - Assume.assumeFalse(true); - } + AttributionSource attributionSource = + new AttributionSource( + (AttributionSource) + Context.class.getMethod("getAttributionSource").invoke(context), + null); + + Field attSourceStateField = + attributionSource.getClass().getDeclaredField("mAttributionSourceState"); + attSourceStateField.setAccessible(true); Object attSourceState = attSourceStateField.get(attributionSource); attSourceState.getClass().getField("pid").setInt(attSourceState, 0); final AttributionSource attributionSourceFinal = attributionSource; - Assert.assertThrows(SecurityException.class, - () -> attributionSourceFinal.enforceCallingPid()); + assertThrows(SecurityException.class, () -> attributionSourceFinal.enforceCallingPid()); } } + diff --git a/tests/tests/security/src/android/security/cts/AudioSecurityTest.java b/tests/tests/security/src/android/security/cts/AudioSecurityTest.java index 1e1878deae3..e011b7fc4ca 100644 --- a/tests/tests/security/src/android/security/cts/AudioSecurityTest.java +++ b/tests/tests/security/src/android/security/cts/AudioSecurityTest.java @@ -23,14 +23,20 @@ import android.media.audiofx.Equalizer; import android.platform.test.annotations.AsbSecurityTest; import android.util.Log; -import com.android.compatibility.common.util.CtsAndroidTestCase; +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; + +import static org.junit.Assert.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; import java.util.UUID; -public class AudioSecurityTest extends CtsAndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class AudioSecurityTest extends StsExtraBusinessLogicTestCase { private static final String TAG = "AudioSecurityTest"; private static final int ERROR_DEAD_OBJECT = -7; // AudioEffect.ERROR_DEAD_OBJECT @@ -90,6 +96,7 @@ public class AudioSecurityTest extends CtsAndroidTestCase { // b/28173666 @AsbSecurityTest(cveBugId = 28173666) + @Test public void testAllEffectsGetParameterAttemptOffload_CVE_2016_3745() throws Exception { testAllEffects("get parameter attempt offload", new TestEffect() { @@ -104,6 +111,7 @@ public class AudioSecurityTest extends CtsAndroidTestCase { // b/32624850 // b/32635664 @AsbSecurityTest(cveBugId = 32438594) + @Test public void testAllEffectsGetParameter2AttemptOffload_CVE_2017_0398() throws Exception { testAllEffects("get parameter2 attempt offload", new TestEffect() { @@ -116,6 +124,7 @@ public class AudioSecurityTest extends CtsAndroidTestCase { // b/30204301 @AsbSecurityTest(cveBugId = 30204301) + @Test public void testAllEffectsSetParameterAttemptOffload_CVE_2016_3924() throws Exception { testAllEffects("set parameter attempt offload", new TestEffect() { @@ -128,6 +137,7 @@ public class AudioSecurityTest extends CtsAndroidTestCase { // b/37536407 @AsbSecurityTest(cveBugId = 32448258) + @Test public void testAllEffectsEqualizer_CVE_2017_0401() throws Exception { testAllEffects("equalizer get parameter name", new TestEffect() { @@ -355,6 +365,7 @@ public class AudioSecurityTest extends CtsAndroidTestCase { // b/31781965 @AsbSecurityTest(cveBugId = 31781965) + @Test public void testVisualizerCapture_CVE_2017_0396() throws Exception { // Capture params final int CAPTURE_SIZE = 1 << 24; // 16MB seems to be large enough to cause a SEGV. diff --git a/tests/tests/security/src/android/security/cts/BigRleTest.java b/tests/tests/security/src/android/security/cts/BigRleTest.java index 20ac03a90c5..f441c7808f3 100644 --- a/tests/tests/security/src/android/security/cts/BigRleTest.java +++ b/tests/tests/security/src/android/security/cts/BigRleTest.java @@ -18,14 +18,19 @@ package android.security.cts; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.io.InputStream; import android.platform.test.annotations.AsbSecurityTest; import android.security.cts.R; -public class BigRleTest extends AndroidTestCase { +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class BigRleTest extends StsExtraBusinessLogicTestCase { /** * Verifies that the device does not run OOM decoding a particular RLE encoded BMP. * @@ -33,8 +38,9 @@ public class BigRleTest extends AndroidTestCase { * we attempted to allocate space for all the encoded data at once, resulting in OOM. */ @AsbSecurityTest(cveBugId = 33251605) + @Test public void test_android_bug_33251605() { - InputStream exploitImage = mContext.getResources().openRawResource(R.raw.bug_33251605); + InputStream exploitImage = getInstrumentation().getContext().getResources().openRawResource(R.raw.bug_33251605); Bitmap bitmap = BitmapFactory.decodeStream(exploitImage); } } diff --git a/tests/tests/security/src/android/security/cts/BinderExploitTest.java b/tests/tests/security/src/android/security/cts/BinderExploitTest.java index 7516e5b6712..aa7a3607ed0 100644 --- a/tests/tests/security/src/android/security/cts/BinderExploitTest.java +++ b/tests/tests/security/src/android/security/cts/BinderExploitTest.java @@ -40,8 +40,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import static org.junit.Assert.assertTrue; -import android.test.AndroidTestCase; import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import android.platform.test.annotations.AsbSecurityTest; import java.util.ArrayList; @@ -53,9 +53,14 @@ import android.os.IBinder; import android.system.ErrnoException; import android.widget.TextView; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; + import java.io.File; import java.util.List; +import org.junit.runner.RunWith; +import org.junit.Test; + class Exchange extends IBinderExchange.Stub { IBinder binder; BinderExploitTest.CVE_2019_2213_Activity xpl; @@ -97,7 +102,8 @@ class ExploitThread extends Thread { public native void runxpl(String pipedir); } -public class BinderExploitTest extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class BinderExploitTest extends StsExtraBusinessLogicTestCase { static final String TAG = BinderExploitTest.class.getSimpleName(); private static final String SECURITY_CTS_PACKAGE_NAME = "android.security.cts"; @@ -115,6 +121,7 @@ public class BinderExploitTest extends AndroidTestCase { * b/141496757 */ @AsbSecurityTest(cveBugId = 133758011) + @Test public void testPoc_cve_2019_2213() throws Exception { Log.i(TAG, String.format("%s", "testPoc_cve_2019_2213 start...")); diff --git a/tests/tests/security/src/android/security/cts/BitmapFactoryDecodeStreamTest.java b/tests/tests/security/src/android/security/cts/BitmapFactoryDecodeStreamTest.java index 444b110b629..9b9ea1f98c5 100644 --- a/tests/tests/security/src/android/security/cts/BitmapFactoryDecodeStreamTest.java +++ b/tests/tests/security/src/android/security/cts/BitmapFactoryDecodeStreamTest.java @@ -18,14 +18,18 @@ package android.security.cts; import android.graphics.BitmapFactory; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; - +import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; +import org.junit.runner.RunWith; +import org.junit.Test; +import static org.junit.Assert.*; import android.security.cts.R; import java.io.BufferedInputStream; import java.io.InputStream; -public class BitmapFactoryDecodeStreamTest extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class BitmapFactoryDecodeStreamTest extends StsExtraBusinessLogicTestCase { /* * This test case reproduces the bug in CVE-2015-1532. * It verifies that the BitmapFactory:decodeStream method is not vulnerable @@ -33,23 +37,26 @@ public class BitmapFactoryDecodeStreamTest extends AndroidTestCase { * npTc chunk. */ @AsbSecurityTest(cveBugId = 19151999) + @Test public void testNinePatchHeapOverflow() throws Exception { - InputStream inStream = new BufferedInputStream(mContext.getResources().openRawResource( + InputStream inStream = new BufferedInputStream(getInstrumentation().getContext().getResources().openRawResource( R.raw.cve_2015_1532)); BitmapFactory.decodeStream(inStream); } @AsbSecurityTest(cveBugId = 36724453) + @Test public void testPocCVE_2017_0691() throws Exception { - InputStream exploitImage = new BufferedInputStream(mContext.getResources().openRawResource( + InputStream exploitImage = new BufferedInputStream(getInstrumentation().getContext().getResources().openRawResource( R.raw.cve_2017_0691)); BitmapFactory.decodeStream(exploitImage); } @AsbSecurityTest(cveBugId = 65290323) + @Test public void test_b65290323() throws Exception { - InputStream exploitImage = new BufferedInputStream(mContext.getResources().openRawResource( + InputStream exploitImage = new BufferedInputStream(getInstrumentation().getContext().getResources().openRawResource( R.raw.b65290323)); BitmapFactory.decodeStream(exploitImage); } diff --git a/tests/tests/security/src/android/security/cts/BitmapFactorySecurityTests.java b/tests/tests/security/src/android/security/cts/BitmapFactorySecurityTests.java index b1de686459b..c77b7dd2f60 100644 --- a/tests/tests/security/src/android/security/cts/BitmapFactorySecurityTests.java +++ b/tests/tests/security/src/android/security/cts/BitmapFactorySecurityTests.java @@ -16,10 +16,15 @@ package android.security.cts; +import static org.junit.Assert.*; + +import android.content.Context; import android.graphics.BitmapFactory; import android.os.ParcelFileDescriptor; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import androidx.test.runner.AndroidJUnit4; + +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.io.File; import java.io.FileDescriptor; @@ -27,13 +32,16 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.lang.Exception; +import org.junit.runner.RunWith; +import org.junit.Test; import android.security.cts.R; -public class BitmapFactorySecurityTests extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class BitmapFactorySecurityTests extends StsExtraBusinessLogicTestCase { private FileDescriptor getResource(int resId) { try { - InputStream is = mContext.getResources().openRawResource(resId); + InputStream is = getInstrumentation().getContext().getResources().openRawResource(resId); assertNotNull(is); File file = File.createTempFile("BitmapFactorySecurityFile" + resId, "img"); file.deleteOnExit(); @@ -58,6 +66,7 @@ public class BitmapFactorySecurityTests extends AndroidTestCase { * Verifies that decoding a corrupt ICO does crash. */ @AsbSecurityTest(cveBugId = 38116746) + @Test public void test_android_bug_38116746() { FileDescriptor exploitImage = getResource(R.raw.bug_38116746); try { @@ -74,6 +83,7 @@ public class BitmapFactorySecurityTests extends AndroidTestCase { * Verifies that decoding a corrupt BMP does crash. */ @AsbSecurityTest(cveBugId = 37627194) + @Test public void test_android_bug_37627194() { FileDescriptor exploitImage = getResource(R.raw.bug_37627194); try { @@ -84,6 +94,7 @@ public class BitmapFactorySecurityTests extends AndroidTestCase { } @AsbSecurityTest(cveBugId = 156261521) + @Test public void test_android_bug_156261521() { // Previously decoding this would crash. FileDescriptor exploitImage = getResource(R.raw.bug_156261521); diff --git a/tests/tests/security/src/android/security/cts/BitmapTest.java b/tests/tests/security/src/android/security/cts/BitmapTest.java index 5be9098612a..5ce81fd9d95 100644 --- a/tests/tests/security/src/android/security/cts/BitmapTest.java +++ b/tests/tests/security/src/android/security/cts/BitmapTest.java @@ -25,6 +25,7 @@ import android.graphics.Bitmap; import android.os.BadParcelableException; import android.os.IBinder; import android.platform.test.annotations.AsbSecurityTest; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; @@ -42,7 +43,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @RunWith(AndroidJUnit4.class) -public class BitmapTest { +public class BitmapTest extends StsExtraBusinessLogicTestCase { private Instrumentation mInstrumentation; private PeerConnection mRemoteConnection; diff --git a/tests/tests/security/src/android/security/cts/BluetoothIntentsTest.java b/tests/tests/security/src/android/security/cts/BluetoothIntentsTest.java index 48107032a21..a15ab42133f 100644 --- a/tests/tests/security/src/android/security/cts/BluetoothIntentsTest.java +++ b/tests/tests/security/src/android/security/cts/BluetoothIntentsTest.java @@ -20,13 +20,18 @@ import org.junit.Test; import android.content.ComponentName; import android.content.Intent; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; -public class BluetoothIntentsTest extends AndroidTestCase { +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class BluetoothIntentsTest extends StsExtraBusinessLogicTestCase { /** * b/35258579 */ @AsbSecurityTest(cveBugId = 35258579) + @Test public void testAcceptIntent() { genericIntentTest("ACCEPT"); } @@ -35,6 +40,7 @@ public class BluetoothIntentsTest extends AndroidTestCase { * b/35258579 */ @AsbSecurityTest(cveBugId = 35258579) + @Test public void testDeclineIntent() { genericIntentTest("DECLINE"); } @@ -47,7 +53,7 @@ public class BluetoothIntentsTest extends AndroidTestCase { new ComponentName("com.android.bluetooth", "com.android.bluetooth.opp.BluetoothOppReceiver")); should_be_protected_broadcast.setAction(prefix + action); - mContext.sendBroadcast(should_be_protected_broadcast); + getInstrumentation().getContext().sendBroadcast(should_be_protected_broadcast); } catch (SecurityException e) { return; diff --git a/tests/tests/security/src/android/security/cts/CVE_2020_0294.java b/tests/tests/security/src/android/security/cts/CVE_2020_0294.java index 6625c9ebafc..f85ec3fdbb4 100644 --- a/tests/tests/security/src/android/security/cts/CVE_2020_0294.java +++ b/tests/tests/security/src/android/security/cts/CVE_2020_0294.java @@ -28,6 +28,8 @@ import android.platform.test.annotations.AsbSecurityTest; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; + import org.junit.Test; import org.junit.runner.RunWith; @@ -35,7 +37,7 @@ import static org.junit.Assert.*; import static org.junit.Assume.*; @RunWith(AndroidJUnit4.class) -public class CVE_2020_0294 { +public class CVE_2020_0294 extends StsExtraBusinessLogicTestCase { private static final String TAG = "CVE_2020_0294"; /** diff --git a/tests/tests/security/src/android/security/cts/CVE_2021_0309.java b/tests/tests/security/src/android/security/cts/CVE_2021_0309.java index deb7c409152..14cb7cea700 100644 --- a/tests/tests/security/src/android/security/cts/CVE_2021_0309.java +++ b/tests/tests/security/src/android/security/cts/CVE_2021_0309.java @@ -31,11 +31,13 @@ import android.platform.test.annotations.AsbSecurityTest; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; + import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) -public class CVE_2021_0309 { +public class CVE_2021_0309 extends StsExtraBusinessLogicTestCase { private final Context mContext = InstrumentationRegistry.getContext(); boolean isVulnerable = true; diff --git a/tests/tests/security/src/android/security/cts/CVE_2021_0327/CVE_2021_0327.java b/tests/tests/security/src/android/security/cts/CVE_2021_0327/CVE_2021_0327.java index 13076ba9567..44bbc01fdce 100644 --- a/tests/tests/security/src/android/security/cts/CVE_2021_0327/CVE_2021_0327.java +++ b/tests/tests/security/src/android/security/cts/CVE_2021_0327/CVE_2021_0327.java @@ -24,13 +24,14 @@ import android.test.AndroidTestCase; import android.util.Log; import androidx.test.runner.AndroidJUnit4; import androidx.test.InstrumentationRegistry; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) -public class CVE_2021_0327 { +public class CVE_2021_0327 extends StsExtraBusinessLogicTestCase { private static final String SECURITY_CTS_PACKAGE_NAME = "android.security.cts"; private static final String TAG = "CVE_2021_0327"; diff --git a/tests/tests/security/src/android/security/cts/CVE_2021_0339.java b/tests/tests/security/src/android/security/cts/CVE_2021_0339.java index 5335a4234fa..98b8de8d637 100644 --- a/tests/tests/security/src/android/security/cts/CVE_2021_0339.java +++ b/tests/tests/security/src/android/security/cts/CVE_2021_0339.java @@ -31,6 +31,9 @@ import android.test.AndroidTestCase; import android.util.Log; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; + +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; + import org.junit.Test; import org.junit.runner.RunWith; @@ -38,7 +41,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @RunWith(AndroidJUnit4.class) -public class CVE_2021_0339 { +public class CVE_2021_0339 extends StsExtraBusinessLogicTestCase { static final String TAG = CVE_2021_0339.class.getSimpleName(); private static final String SECURITY_CTS_PACKAGE_NAME = "android.security.cts"; diff --git a/tests/tests/security/src/android/security/cts/CVE_2021_0394.java b/tests/tests/security/src/android/security/cts/CVE_2021_0394.java index b39bc711ecd..d43714208b9 100644 --- a/tests/tests/security/src/android/security/cts/CVE_2021_0394.java +++ b/tests/tests/security/src/android/security/cts/CVE_2021_0394.java @@ -18,13 +18,14 @@ package android.security.cts; import android.platform.test.annotations.AsbSecurityTest; import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import dalvik.system.VMRuntime; import org.junit.runner.RunWith; import org.junit.Test; import static org.junit.Assert.assertFalse; @RunWith(AndroidJUnit4.class) -public class CVE_2021_0394 { +public class CVE_2021_0394 extends StsExtraBusinessLogicTestCase { static { System.loadLibrary("ctssecurity_jni"); } diff --git a/tests/tests/security/src/android/security/cts/CVE_2021_0521.java b/tests/tests/security/src/android/security/cts/CVE_2021_0521.java index 8a883ff7fdc..d4b0179d363 100644 --- a/tests/tests/security/src/android/security/cts/CVE_2021_0521.java +++ b/tests/tests/security/src/android/security/cts/CVE_2021_0521.java @@ -22,6 +22,7 @@ import android.platform.test.annotations.AsbSecurityTest; import android.platform.test.annotations.SecurityTest; import android.util.Log; import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.lang.reflect.Field; import java.util.Collections; import java.util.List; @@ -34,7 +35,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assume.assumeThat; @RunWith(AndroidJUnit4.class) -public class CVE_2021_0521 { +public class CVE_2021_0521 extends StsExtraBusinessLogicTestCase { private String TAG = "CVE_2021_0521"; diff --git a/tests/tests/security/src/android/security/cts/CVE_2021_0922.java b/tests/tests/security/src/android/security/cts/CVE_2021_0922.java index 855ad37788b..b79070fdbec 100644 --- a/tests/tests/security/src/android/security/cts/CVE_2021_0922.java +++ b/tests/tests/security/src/android/security/cts/CVE_2021_0922.java @@ -26,13 +26,14 @@ import android.platform.test.annotations.AsbSecurityTest; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) -public class CVE_2021_0922 { +public class CVE_2021_0922 extends StsExtraBusinessLogicTestCase { private Instrumentation mInstrumentation; diff --git a/tests/tests/security/src/android/security/cts/CVE_2021_0934.java b/tests/tests/security/src/android/security/cts/CVE_2021_0934.java index ab4c71b8500..0f44d8cc226 100644 --- a/tests/tests/security/src/android/security/cts/CVE_2021_0934.java +++ b/tests/tests/security/src/android/security/cts/CVE_2021_0934.java @@ -25,11 +25,13 @@ import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AsbSecurityTest; import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; + import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) -public class CVE_2021_0934 { +public class CVE_2021_0934 extends StsExtraBusinessLogicTestCase { @AppModeFull @AsbSecurityTest(cveBugId = 169762606) diff --git a/tests/tests/security/src/android/security/cts/CVE_2021_39663.java b/tests/tests/security/src/android/security/cts/CVE_2021_39663.java index 965deb031c3..0add1bd4007 100644 --- a/tests/tests/security/src/android/security/cts/CVE_2021_39663.java +++ b/tests/tests/security/src/android/security/cts/CVE_2021_39663.java @@ -36,6 +36,7 @@ import android.system.Os; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import org.junit.Test; import org.junit.runner.RunWith; @@ -45,7 +46,7 @@ import java.io.IOException; @AppModeFull @RunWith(AndroidJUnit4.class) -public class CVE_2021_39663 { +public class CVE_2021_39663 extends StsExtraBusinessLogicTestCase { @Test @AsbSecurityTest(cveBugId = 200682135) diff --git a/tests/tests/security/src/android/security/cts/ConscryptIntermediateVerificationTest.java b/tests/tests/security/src/android/security/cts/ConscryptIntermediateVerificationTest.java index 3022b6cec8e..23860530619 100644 --- a/tests/tests/security/src/android/security/cts/ConscryptIntermediateVerificationTest.java +++ b/tests/tests/security/src/android/security/cts/ConscryptIntermediateVerificationTest.java @@ -18,7 +18,7 @@ package android.security.cts; import android.content.Context; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.io.InputStream; import java.security.KeyStore; import java.security.cert.Certificate; @@ -32,7 +32,13 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; -public class ConscryptIntermediateVerificationTest extends AndroidTestCase { +import static org.junit.Assert.*; +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class ConscryptIntermediateVerificationTest extends StsExtraBusinessLogicTestCase { private X509Certificate[] loadCertificates(int resource) throws Exception { CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); @@ -76,6 +82,7 @@ public class ConscryptIntermediateVerificationTest extends AndroidTestCase { } @AsbSecurityTest(cveBugId = 26232830) + @Test public void testIntermediateVerification() throws Exception { X509TrustManager tm = getTrustManager(); X509Certificate[] validChain = loadCertificates(R.raw.intermediate_test_valid); diff --git a/tests/tests/security/src/android/security/cts/DecodeTest.java b/tests/tests/security/src/android/security/cts/DecodeTest.java index 26ab802b0e9..16c8905afe9 100644 --- a/tests/tests/security/src/android/security/cts/DecodeTest.java +++ b/tests/tests/security/src/android/security/cts/DecodeTest.java @@ -19,13 +19,20 @@ package android.security.cts; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.io.InputStream; import android.security.cts.R; -public class DecodeTest extends AndroidTestCase { +import static org.junit.Assert.*; + +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class DecodeTest extends StsExtraBusinessLogicTestCase { /** * Verifies that the device fails to decode a large, corrupt BMP. * @@ -33,8 +40,9 @@ public class DecodeTest extends AndroidTestCase { * decode. */ @AsbSecurityTest(cveBugId = 34778578) + @Test public void test_android_bug_34778578() { - InputStream exploitImage = mContext.getResources().openRawResource(R.raw.bug_34778578); + InputStream exploitImage = getInstrumentation().getContext().getResources().openRawResource(R.raw.bug_34778578); Bitmap bitmap = BitmapFactory.decodeStream(exploitImage); assertNull(bitmap); } @@ -46,8 +54,9 @@ public class DecodeTest extends AndroidTestCase { * decode. */ @AsbSecurityTest(cveBugId = 67381469) + @Test public void test_android_bug_67381469() { - InputStream exploitImage = mContext.getResources().openRawResource(R.raw.bug_67381469); + InputStream exploitImage = getInstrumentation().getContext().getResources().openRawResource(R.raw.bug_67381469); Bitmap bitmap = BitmapFactory.decodeStream(exploitImage); assertNull(bitmap); } diff --git a/tests/tests/security/src/android/security/cts/EffectBundleTest.java b/tests/tests/security/src/android/security/cts/EffectBundleTest.java index 5aef70233f0..ab98f998252 100644 --- a/tests/tests/security/src/android/security/cts/EffectBundleTest.java +++ b/tests/tests/security/src/android/security/cts/EffectBundleTest.java @@ -22,7 +22,7 @@ import android.media.audiofx.Equalizer; import android.media.audiofx.PresetReverb; import android.media.MediaPlayer; import android.platform.test.annotations.AsbSecurityTest; -import android.test.InstrumentationTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import android.util.Log; import java.nio.ByteBuffer; @@ -31,7 +31,14 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.UUID; -public class EffectBundleTest extends InstrumentationTestCase { +import static org.junit.Assert.*; + +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class EffectBundleTest extends StsExtraBusinessLogicTestCase { private static final String TAG = "EffectBundleTest"; private static final int[] INVALID_BAND_ARRAY = {Integer.MIN_VALUE, -10000, -100, -2, -1}; private static final int mValue0 = 9999; //unlikely values. Should not change @@ -48,6 +55,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 32436341 @AsbSecurityTest(cveBugId = 32436341) + @Test public void testEqualizer_getParamCenterFreq() throws Exception { if (!hasEqualizer()) { return; @@ -58,6 +66,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 32588352 @AsbSecurityTest(cveBugId = 32588352) + @Test public void testEqualizer_getParamCenterFreq_long() throws Exception { if (!hasEqualizer()) { return; @@ -67,6 +76,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 32438598 @AsbSecurityTest(cveBugId = 32438598) + @Test public void testEqualizer_getParamBandLevel() throws Exception { if (!hasEqualizer()) { return; @@ -76,6 +86,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 32584034 @AsbSecurityTest(cveBugId = 32584034) + @Test public void testEqualizer_getParamBandLevel_long() throws Exception { if (!hasEqualizer()) { return; @@ -85,6 +96,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 32247948 @AsbSecurityTest(cveBugId = 32247948) + @Test public void testEqualizer_getParamFreqRange() throws Exception { if (!hasEqualizer()) { return; @@ -95,6 +107,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 32588756 @AsbSecurityTest(cveBugId = 32588756) + @Test public void testEqualizer_getParamFreqRange_long() throws Exception { if (!hasEqualizer()) { return; @@ -105,6 +118,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 32448258 @AsbSecurityTest(cveBugId = 32448258) + @Test public void testEqualizer_getParamPresetName() throws Exception { if (!hasEqualizer()) { return; @@ -114,6 +128,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 32588016 @AsbSecurityTest(cveBugId = 32588016) + @Test public void testEqualizer_getParamPresetName_long() throws Exception { if (!hasEqualizer()) { return; @@ -155,6 +170,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //testing security bug: 32095626 @AsbSecurityTest(cveBugId = 32095626) + @Test public void testEqualizer_setParamBandLevel() throws Exception { if (!hasEqualizer()) { return; @@ -171,6 +187,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //testing security bug: 32585400 @AsbSecurityTest(cveBugId = 32585400) + @Test public void testEqualizer_setParamBandLevel_long() throws Exception { if (!hasEqualizer()) { return; @@ -187,6 +204,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //testing security bug: 32705438 @AsbSecurityTest(cveBugId = 32705438) + @Test public void testEqualizer_getParamFreqRangeCommand_short() throws Exception { if (!hasEqualizer()) { return; @@ -197,6 +215,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //testing security bug: 32703959 @AsbSecurityTest(cveBugId = 32703959) + @Test public void testEqualizer_getParamFreqRangeCommand_long() throws Exception { if (!hasEqualizer()) { return; @@ -207,6 +226,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //testing security bug: 37563371 (short media) @AsbSecurityTest(cveBugId = 37563371) + @Test public void testEqualizer_setParamProperties_short() throws Exception { if (!hasEqualizer()) { return; @@ -217,6 +237,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //testing security bug: 37563371 (long media) @AsbSecurityTest(cveBugId = 37563371) + @Test public void testEqualizer_setParamProperties_long() throws Exception { if (!hasEqualizer()) { return; @@ -227,6 +248,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 63662938 @AsbSecurityTest(cveBugId = 63662938) + @Test public void testDownmix_setParameter() throws Exception { verifyZeroPVSizeRejectedForSetParameter( EFFECT_TYPE_DOWNMIX, new int[] { DOWNMIX_PARAM_TYPE }); @@ -243,6 +265,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 63526567 @AsbSecurityTest(cveBugId = 63526567) + @Test public void testEnvironmentalReverb_setParameter() throws Exception { verifyZeroPVSizeRejectedForSetParameter( AudioEffect.EFFECT_TYPE_ENV_REVERB, new int[] { @@ -263,6 +286,7 @@ public class EffectBundleTest extends InstrumentationTestCase { //Testing security bug: 67647856 @AsbSecurityTest(cveBugId = 67647856) + @Test public void testPresetReverb_setParameter() throws Exception { verifyZeroPVSizeRejectedForSetParameter( AudioEffect.EFFECT_TYPE_PRESET_REVERB, new int[] { diff --git a/tests/tests/security/src/android/security/cts/FlagSlipperyTest.kt b/tests/tests/security/src/android/security/cts/FlagSlipperyTest.kt index 8fe8054a2d9..0ceee07f446 100644 --- a/tests/tests/security/src/android/security/cts/FlagSlipperyTest.kt +++ b/tests/tests/security/src/android/security/cts/FlagSlipperyTest.kt @@ -16,7 +16,6 @@ package android.security.cts -import android.app.Instrumentation import android.graphics.Rect import android.os.SystemClock import android.platform.test.annotations.AsbSecurityTest @@ -34,8 +33,8 @@ import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest -import androidx.test.platform.app.InstrumentationRegistry import com.android.compatibility.common.util.PollingCheck +import com.android.sts.common.util.StsExtraBusinessLogicTestCase import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertNull @@ -115,8 +114,7 @@ private class SurfaceCreatedCallback(created: CountDownLatch) : SurfaceHolder.Ca * test code. The third approach requires adding an embedded window, and the code for that test was * forked to avoid excessive branching. */ -class FlagSlipperyTest { - private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() +class FlagSlipperyTest : StsExtraBusinessLogicTestCase { private lateinit var scenario: ActivityScenario<SlipperyEnterBottomActivity> private lateinit var windowManager: WindowManager @@ -132,10 +130,12 @@ class FlagSlipperyTest { val rule = ActivityScenarioRule<SlipperyEnterBottomActivity>( SlipperyEnterBottomActivity::class.java) + constructor() : super() + @Before fun setup() { scenario = rule.getScenario() - windowManager = instrumentation.getTargetContext().getSystemService<WindowManager>( + windowManager = getInstrumentation().getTargetContext().getSystemService<WindowManager>( WindowManager::class.java) setDimensionsToQuarterScreen() @@ -156,7 +156,7 @@ class FlagSlipperyTest { // ========================== Regular window tests ============================================= private fun addWindow(slipperyWhenAdded: Boolean): View { - val view = View(instrumentation.targetContext) + val view = View(getInstrumentation().targetContext) scenario.onActivity { view.setOnTouchListener(OnTouchListener(view)) view.setBackgroundColor(android.graphics.Color.RED) @@ -220,7 +220,7 @@ class FlagSlipperyTest { private lateinit var mVr: SurfaceControlViewHost private fun addEmbeddedHostWindow(): SurfaceView { - val surfaceView = SurfaceView(instrumentation.targetContext) + val surfaceView = SurfaceView(getInstrumentation().targetContext) val surfaceCreated = CountDownLatch(1) scenario.onActivity { surfaceView.setZOrderOnTop(true) @@ -247,7 +247,7 @@ class FlagSlipperyTest { embeddedViewDrawn.countDown() } layoutCompleted.set(false) - val embeddedView = View(instrumentation.targetContext) + val embeddedView = View(getInstrumentation().targetContext) scenario.onActivity { embeddedView.setOnTouchListener(OnTouchListener(surfaceView)) embeddedView.setBackgroundColor(android.graphics.Color.RED) @@ -340,7 +340,7 @@ class FlagSlipperyTest { PollingCheck.waitFor { layoutCompleted.get() } - instrumentation.uiAutomation.syncInputTransactions(true /*waitAnimations*/) + getInstrumentation().uiAutomation.syncInputTransactions(true /*waitAnimations*/) } private fun setDimensionsToQuarterScreen() { @@ -360,7 +360,7 @@ class FlagSlipperyTest { } val event = MotionEvent.obtain(downTime, eventTime, action, x, y, 0 /*metaState*/) event.source = InputDevice.SOURCE_TOUCHSCREEN - instrumentation.uiAutomation.injectInputEvent(event, true /*sync*/) + getInstrumentation().uiAutomation.injectInputEvent(event, true /*sync*/) } companion object { diff --git a/tests/tests/security/src/android/security/cts/IsolatedProcessTest.java b/tests/tests/security/src/android/security/cts/IsolatedProcessTest.java index 60b329f794c..91e39e8a5fe 100644 --- a/tests/tests/security/src/android/security/cts/IsolatedProcessTest.java +++ b/tests/tests/security/src/android/security/cts/IsolatedProcessTest.java @@ -15,6 +15,7 @@ */ package android.security.cts; +import android.app.Instrumentation; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -25,14 +26,21 @@ import android.os.RemoteException; import android.platform.test.annotations.AsbSecurityTest; import android.security.cts.IIsolatedService; import android.security.cts.IsolatedService; -import android.test.AndroidTestCase; import android.util.Log; +import androidx.test.InstrumentationRegistry; import com.android.internal.util.ArrayUtils; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import junit.framework.Assert; +import org.junit.Before; +import org.junit.After; -public class IsolatedProcessTest extends AndroidTestCase { +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class IsolatedProcessTest { static final String TAG = IsolatedProcessTest.class.getSimpleName(); private static final long BIND_SERVICE_TIMEOUT = 5000; @@ -65,15 +73,20 @@ public class IsolatedProcessTest extends AndroidTestCase { } }; - @Override + private static Instrumentation getInstrumentation() { + return InstrumentationRegistry.getInstrumentation(); + } + + @Before public void setUp() throws InterruptedException { mLatch = new CountDownLatch(1); - Intent serviceIntent = new Intent(mContext, IsolatedService.class); - mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); + Intent serviceIntent = new Intent(getInstrumentation().getContext(), IsolatedService.class); + getInstrumentation().getContext().bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); Assert.assertTrue("Timed out while waiting to bind to isolated service", mLatch.await(BIND_SERVICE_TIMEOUT, TimeUnit.MILLISECONDS)); } + @Test @AsbSecurityTest(cveBugId = 30202228) public void testGetCachedServicesFromIsolatedService() throws RemoteException { String[] cachedServices = mService.getCachedSystemServices(); @@ -83,6 +96,7 @@ public class IsolatedProcessTest extends AndroidTestCase { } } + @Test @AsbSecurityTest(cveBugId = 30202228) public void testGetServiceFromIsolatedService() throws RemoteException { for (String serviceName : RESTRICTED_SERVICES_TO_TEST) { @@ -92,14 +106,15 @@ public class IsolatedProcessTest extends AndroidTestCase { } } + @Test public void testGetProcessIsIsolated() throws RemoteException { Assert.assertFalse(Process.isIsolated()); Assert.assertTrue(mService.getProcessIsIsolated()); } - @Override + @After public void tearDown() { - mContext.unbindService(mServiceConnection); + getInstrumentation().getContext().unbindService(mServiceConnection); } } diff --git a/tests/tests/security/src/android/security/cts/MediaMetadataRetrieverTest.java b/tests/tests/security/src/android/security/cts/MediaMetadataRetrieverTest.java index ecf8accc933..65eb132a359 100644 --- a/tests/tests/security/src/android/security/cts/MediaMetadataRetrieverTest.java +++ b/tests/tests/security/src/android/security/cts/MediaMetadataRetrieverTest.java @@ -22,24 +22,31 @@ import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.media.MediaMetadataRetriever; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.io.IOException; -public class MediaMetadataRetrieverTest extends AndroidTestCase { +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; + +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class MediaMetadataRetrieverTest extends StsExtraBusinessLogicTestCase { protected Resources mResources; protected MediaMetadataRetriever mRetriever; - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { mResources = getContext().getResources(); mRetriever = new MediaMetadataRetriever(); } - @Override - protected void tearDown() throws Exception { - super.tearDown(); + @After + public void tearDown() throws Exception { mRetriever.release(); } @@ -53,6 +60,7 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { } } + @Test @AsbSecurityTest(cveBugId = 24623447) public void testID3v2EmbeddedPicture() { setDataSourceFd(R.raw.id3v2_3_extended_header_overflow_padding); diff --git a/tests/tests/security/src/android/security/cts/MediaRecorderInfoLeakTest.java b/tests/tests/security/src/android/security/cts/MediaRecorderInfoLeakTest.java index b4275169539..4b8b178ab71 100644 --- a/tests/tests/security/src/android/security/cts/MediaRecorderInfoLeakTest.java +++ b/tests/tests/security/src/android/security/cts/MediaRecorderInfoLeakTest.java @@ -18,16 +18,24 @@ package android.security.cts; import android.platform.test.annotations.AsbSecurityTest; import android.media.MediaRecorder; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import android.util.Log; import java.io.File; -public class MediaRecorderInfoLeakTest extends AndroidTestCase { +import static org.junit.Assert.*; + +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class MediaRecorderInfoLeakTest extends StsExtraBusinessLogicTestCase { /** * b/27855172 */ + @Test @AsbSecurityTest(cveBugId = 27855172) public void test_cve_2016_2499() throws Exception { MediaRecorder mediaRecorder = null; diff --git a/tests/tests/security/src/android/security/cts/MediaServerCrashTest.java b/tests/tests/security/src/android/security/cts/MediaServerCrashTest.java index 2d2e08453ca..83ce8ff7af4 100644 --- a/tests/tests/security/src/android/security/cts/MediaServerCrashTest.java +++ b/tests/tests/security/src/android/security/cts/MediaServerCrashTest.java @@ -24,7 +24,7 @@ import android.os.ConditionVariable; import android.os.Environment; import android.os.ParcelFileDescriptor; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import android.util.Log; import com.android.compatibility.common.util.MediaUtils; @@ -38,7 +38,16 @@ import java.io.RandomAccessFile; import android.security.cts.R; -public class MediaServerCrashTest extends AndroidTestCase { +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; + +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class MediaServerCrashTest extends StsExtraBusinessLogicTestCase { private static final String TAG = "MediaServerCrashTest"; private static final String MIMETYPE_DRM_MESSAGE = "application/vnd.oma.drm.message"; @@ -49,9 +58,8 @@ public class MediaServerCrashTest extends AndroidTestCase { private final ConditionVariable mOnPrepareCalled = new ConditionVariable(); private final ConditionVariable mOnCompletionCalled = new ConditionVariable(); - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { mFlFilePath = new File(getContext().getFilesDir(), "temp.fl").getAbsolutePath(); mOnPrepareCalled.close(); @@ -83,12 +91,12 @@ public class MediaServerCrashTest extends AndroidTestCase { }); } - @Override - protected void tearDown() throws Exception { - super.tearDown(); + @After + public void tearDown() throws Exception { new File(mFlFilePath).delete(); } + @Test @AsbSecurityTest(cveBugId = 25070434) public void testInvalidMidiNullPointerAccess() throws Exception { testIfMediaServerDied(R.raw.midi_crash); @@ -115,16 +123,17 @@ public class MediaServerCrashTest extends AndroidTestCase { } } + @Test @AsbSecurityTest(cveBugId = 25070434) public void testDrmManagerClientReset() throws Exception { checkIfMediaServerDiedForDrm(R.raw.drm_uaf); } private void checkIfMediaServerDiedForDrm(int res) throws Exception { - AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(res); + AssetFileDescriptor afd = getInstrumentation().getContext().getResources().openRawResourceFd(res); FileInputStream dmStream = afd.createInputStream(); RandomAccessFile flFile = new RandomAccessFile(mFlFilePath, "rw"); - if (!MediaUtils.convertDmToFl(mContext, dmStream, flFile)) { + if (!MediaUtils.convertDmToFl(getInstrumentation().getContext(), dmStream, flFile)) { Log.w(TAG, "Can not convert dm to fl, skip checkIfMediaServerDiedForDrm"); mMediaPlayer.release(); return; diff --git a/tests/tests/security/src/android/security/cts/Movie33897722.java b/tests/tests/security/src/android/security/cts/Movie33897722.java index 2ce16101b02..3ab3bb2cbf8 100644 --- a/tests/tests/security/src/android/security/cts/Movie33897722.java +++ b/tests/tests/security/src/android/security/cts/Movie33897722.java @@ -16,6 +16,8 @@ package android.security.cts; +import static org.junit.Assert.*; + import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -24,13 +26,20 @@ import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.io.InputStream; +import org.junit.runner.RunWith; +import org.junit.Test; import android.security.cts.R; -public class Movie33897722 extends AndroidTestCase { +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class Movie33897722 extends StsExtraBusinessLogicTestCase { /** * Verifies that decoding a particular GIF file does not read out out of bounds. * @@ -39,6 +48,7 @@ public class Movie33897722 extends AndroidTestCase { * color map, which would be reading memory that we do not control, and may be uninitialized. */ @AsbSecurityTest(cveBugId = 33897722) + @Test public void test_android_bug_33897722() { // The image has a 10 x 10 frame on top of a transparent background. Only test the // 10 x 10 frame, since the original bug would never have used uninitialized memory @@ -47,6 +57,7 @@ public class Movie33897722 extends AndroidTestCase { } @AsbSecurityTest(cveBugId = 37662286) + @Test public void test_android_bug_37662286() { // The image has a background color that is out of range. Arbitrarily test // the upper left corner. (Most of the image is transparent.) @@ -62,7 +73,7 @@ public class Movie33897722 extends AndroidTestCase { int drawWidth, int drawHeight) { assertTrue(drawWidth <= screenWidth && drawHeight <= screenHeight); - InputStream exploitImage = mContext.getResources().openRawResource(resId); + InputStream exploitImage = getInstrumentation().getContext().getResources().openRawResource(resId); Movie movie = Movie.decodeStream(exploitImage); assertNotNull(movie); assertEquals(movie.width(), screenWidth); diff --git a/tests/tests/security/src/android/security/cts/NanoAppBundleTest.java b/tests/tests/security/src/android/security/cts/NanoAppBundleTest.java index 4f5754cfbb7..135d4935a55 100644 --- a/tests/tests/security/src/android/security/cts/NanoAppBundleTest.java +++ b/tests/tests/security/src/android/security/cts/NanoAppBundleTest.java @@ -16,7 +16,6 @@ package android.security.cts; -import android.test.AndroidTestCase; import android.platform.test.annotations.AsbSecurityTest; import androidx.test.InstrumentationRegistry; @@ -49,12 +48,23 @@ import android.os.SystemClock; import android.util.Log; import android.annotation.Nullable; import android.platform.test.annotations.AppModeFull; +import androidx.test.runner.AndroidJUnit4; + +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; + +import org.junit.After; +import org.junit.Before; +import org.junit.runner.RunWith; +import org.junit.Test; import static java.lang.Thread.sleep; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; @AppModeFull -public class NanoAppBundleTest extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class NanoAppBundleTest extends StsExtraBusinessLogicTestCase { + private Context mContext; private static final String TAG = "NanoAppBundleTest"; private static final String SECURITY_CTS_PACKAGE_NAME = "android.security.cts"; @@ -72,27 +82,27 @@ public class NanoAppBundleTest extends AndroidTestCase { } }; - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { + mContext = getInstrumentation().getContext(); Intent serviceIntent = new Intent(mContext, AuthenticatorService.class); mContext.startService(serviceIntent); mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); } - @Override - protected void tearDown() throws Exception { + @After + public void tearDown() throws Exception { if (mContext != null) { Intent serviceIntent = new Intent(mContext, AuthenticatorService.class); mContext.stopService(serviceIntent); } - super.tearDown(); } /** * b/113527124 */ @AsbSecurityTest(cveBugId = 77599679) + @Test public void testPoc_cve_2018_9471() throws Exception { try { diff --git a/tests/tests/security/src/android/security/cts/NativeCodeTest.java b/tests/tests/security/src/android/security/cts/NativeCodeTest.java index c5a9bac2504..53c05c0e53e 100644 --- a/tests/tests/security/src/android/security/cts/NativeCodeTest.java +++ b/tests/tests/security/src/android/security/cts/NativeCodeTest.java @@ -18,15 +18,22 @@ package android.security.cts; import android.platform.test.annotations.AsbSecurityTest; -import junit.framework.TestCase; +import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; +import org.junit.runner.RunWith; +import org.junit.Test; -public class NativeCodeTest extends TestCase { +import static org.junit.Assert.*; + +@RunWith(AndroidJUnit4.class) +public class NativeCodeTest extends StsExtraBusinessLogicTestCase { static { System.loadLibrary("ctssecurity_jni"); } @AsbSecurityTest(cveBugId = 22300191) + @Test public void testSysVipc() throws Exception { assertTrue("Android does not support Sys V IPC, it must " + "be removed from the kernel. In the kernel config: " diff --git a/tests/tests/security/src/android/security/cts/NetdTest.java b/tests/tests/security/src/android/security/cts/NetdTest.java index 14623fd4085..463d443dc82 100644 --- a/tests/tests/security/src/android/security/cts/NetdTest.java +++ b/tests/tests/security/src/android/security/cts/NetdTest.java @@ -20,13 +20,17 @@ import android.os.Binder; import android.os.IBinder; import android.platform.test.annotations.AsbSecurityTest; -import junit.framework.TestCase; +import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; +import org.junit.runner.RunWith; +import org.junit.Test; import java.lang.Class; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -public class NetdTest extends TestCase { +@RunWith(AndroidJUnit4.class) +public class NetdTest extends StsExtraBusinessLogicTestCase { /** * Detect if netd has unsanitized system call in Throttle API. @@ -34,6 +38,7 @@ public class NetdTest extends TestCase { * serv.setInterfaceThrottle("foo; reboot; echo ", -1, -1); */ @AsbSecurityTest(cveBugId = 5758556) + @Test public void testThrottleSanitization() { try { diff --git a/tests/tests/security/src/android/security/cts/OutputConfigurationTest.java b/tests/tests/security/src/android/security/cts/OutputConfigurationTest.java index f810817c650..f68c097686d 100644 --- a/tests/tests/security/src/android/security/cts/OutputConfigurationTest.java +++ b/tests/tests/security/src/android/security/cts/OutputConfigurationTest.java @@ -16,20 +16,27 @@ package android.security.cts; +import static org.junit.Assert.*; + import android.graphics.SurfaceTexture; import android.hardware.camera2.params.OutputConfiguration; import android.os.Parcel; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; import android.util.Size; import android.view.Surface; import android.view.TextureView; +import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; +import org.junit.runner.RunWith; +import org.junit.Test; /** * Verify that OutputConfiguration's fields propagate through parcel properly. */ -public class OutputConfigurationTest extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class OutputConfigurationTest extends StsExtraBusinessLogicTestCase { @AsbSecurityTest(cveBugId = 69683251) + @Test public void testSharedSurfaceOutputConfigurationBasic() throws Exception { SurfaceTexture outputTexture = new SurfaceTexture(/* random texture ID */ 5); Surface surface = new Surface(outputTexture); diff --git a/tests/tests/security/src/android/security/cts/ParcelableExceptionTest.java b/tests/tests/security/src/android/security/cts/ParcelableExceptionTest.java index 5b4e5301be7..d2d70d85e59 100644 --- a/tests/tests/security/src/android/security/cts/ParcelableExceptionTest.java +++ b/tests/tests/security/src/android/security/cts/ParcelableExceptionTest.java @@ -16,7 +16,8 @@ package android.security.cts; -import android.test.AndroidTestCase; +import static org.junit.Assert.*; + import android.platform.test.annotations.AsbSecurityTest; import android.security.cts.R; @@ -26,13 +27,21 @@ import android.os.BaseBundle; import android.os.Bundle; import android.os.Parcel; import android.util.Log; +import androidx.test.runner.AndroidJUnit4; + +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.io.File; import java.lang.reflect.Field; -public class ParcelableExceptionTest extends AndroidTestCase { +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class ParcelableExceptionTest extends StsExtraBusinessLogicTestCase { @AsbSecurityTest(cveBugId = 65281159) + @Test public void test_CVE_2017_0871() throws Exception { String filePath = "/data/system/" + System.currentTimeMillis(); File file = new File(filePath); diff --git a/tests/tests/security/src/android/security/cts/PutOverflowTest.java b/tests/tests/security/src/android/security/cts/PutOverflowTest.java index 2bf7a85e063..4667859957e 100644 --- a/tests/tests/security/src/android/security/cts/PutOverflowTest.java +++ b/tests/tests/security/src/android/security/cts/PutOverflowTest.java @@ -17,10 +17,18 @@ package android.security.cts; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.lang.reflect.Method; -public class PutOverflowTest extends AndroidTestCase { +import static org.junit.Assert.*; + +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class PutOverflowTest extends StsExtraBusinessLogicTestCase { + @Test @AsbSecurityTest(cveBugId = 22802399) public void testCrash() throws Exception { try { diff --git a/tests/tests/security/src/android/security/cts/RunningAppProcessInfoTest.java b/tests/tests/security/src/android/security/cts/RunningAppProcessInfoTest.java index 8405acc0265..293200e5541 100644 --- a/tests/tests/security/src/android/security/cts/RunningAppProcessInfoTest.java +++ b/tests/tests/security/src/android/security/cts/RunningAppProcessInfoTest.java @@ -19,11 +19,17 @@ package android.security.cts; import android.app.ActivityManager; import android.content.Context; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; +import org.junit.runner.RunWith; +import org.junit.Test; + +import static org.junit.Assert.*; import java.util.List; -public class RunningAppProcessInfoTest extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class RunningAppProcessInfoTest extends StsExtraBusinessLogicTestCase { /* * This test verifies severity vulnerability: apps can bypass the L restrictions in * getRunningTasks()is fixed. The test tries to get current RunningAppProcessInfo and passes @@ -31,9 +37,10 @@ public class RunningAppProcessInfoTest extends AndroidTestCase { */ @AsbSecurityTest(cveBugId = 20034603) + @Test public void testRunningAppProcessInfo() { ActivityManager amActivityManager = - (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); + (ActivityManager) getInstrumentation().getContext().getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> appList = amActivityManager.getRunningAppProcesses(); // The test will pass if it is able to get only its process info diff --git a/tests/tests/security/src/android/security/cts/SQLiteTest.java b/tests/tests/security/src/android/security/cts/SQLiteTest.java index a3a14d40a41..84d36fa0a7a 100644 --- a/tests/tests/security/src/android/security/cts/SQLiteTest.java +++ b/tests/tests/security/src/android/security/cts/SQLiteTest.java @@ -28,14 +28,21 @@ import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.platform.test.annotations.AsbSecurityTest; import android.provider.VoicemailContract; -import android.test.AndroidTestCase; import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; + +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.io.File; import java.io.FileInputStream; -public class SQLiteTest extends AndroidTestCase { +import org.junit.Before; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class SQLiteTest extends StsExtraBusinessLogicTestCase { private static final String DATABASE_FILE_NAME = "database_test.db"; private ContentResolver mResolver; @@ -44,9 +51,8 @@ public class SQLiteTest extends AndroidTestCase { private SQLiteDatabase mDatabase; - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { mResolver = getContext().getContentResolver(); mContext = InstrumentationRegistry.getTargetContext(); mPackageName = mContext.getPackageName(); @@ -62,6 +68,7 @@ public class SQLiteTest extends AndroidTestCase { * b/139186193 */ @AsbSecurityTest(cveBugId = 139186193) + @Test public void test_android_cve_2019_2195() { Uri uri = VoicemailContract.Voicemails.CONTENT_URI; uri = uri.buildUpon().appendQueryParameter("source_package", mPackageName).build(); @@ -99,6 +106,7 @@ public class SQLiteTest extends AndroidTestCase { * b/153352319 */ @AsbSecurityTest(cveBugId = 153352319) + @Test public void test_android_float_to_text_conversion_overflow() { String create_cmd = "select (printf('%.2147483647G',0.01));"; try (Cursor c = mDatabase.rawQuery(create_cmd, null)) { diff --git a/tests/tests/security/src/android/security/cts/STKFrameworkTest.java b/tests/tests/security/src/android/security/cts/STKFrameworkTest.java index 7e6fb7c87e3..2765de4ac52 100644 --- a/tests/tests/security/src/android/security/cts/STKFrameworkTest.java +++ b/tests/tests/security/src/android/security/cts/STKFrameworkTest.java @@ -15,33 +15,35 @@ */ package android.security.cts; +import static org.junit.Assert.*; + import android.content.ComponentName; import android.content.Intent; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; import android.content.pm.PackageManager; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; + +import androidx.test.runner.AndroidJUnit4; +import org.junit.Before; +import org.junit.runner.RunWith; +import org.junit.Test; -public class STKFrameworkTest extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class STKFrameworkTest extends StsExtraBusinessLogicTestCase { private boolean mHasTelephony; - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { mHasTelephony = getContext().getPackageManager().hasSystemFeature( PackageManager.FEATURE_TELEPHONY); } - @Override - protected void tearDown() throws Exception { - super.tearDown(); - } - /* * Verifies commands Intercepting which has been sent from SIM card to Telephony using * zero-permission malicious application */ @AsbSecurityTest(cveBugId = 21697171) + @Test public void testInterceptedSIMCommandsToTelephony() { if (!mHasTelephony) { return; @@ -54,7 +56,7 @@ public class STKFrameworkTest extends AndroidTestCase { ComponentName.unflattenFromString("com.android.stk/com.android.stk.StkCmdReceiver"); intent.setComponent(cn); try { - mContext.sendBroadcast(intent); + getInstrumentation().getContext().sendBroadcast(intent); fail("Able to send broadcast which can be received by any app which has registered " + "broadcast for action 'com.android.internal.stk.command' since it is not " + "protected with any permission. Device is vulnerable to CVE-2015-3843."); diff --git a/tests/tests/security/src/android/security/cts/SkiaICORecursiveDecodingTest.java b/tests/tests/security/src/android/security/cts/SkiaICORecursiveDecodingTest.java index 4a9802fc307..de6a9ac2707 100644 --- a/tests/tests/security/src/android/security/cts/SkiaICORecursiveDecodingTest.java +++ b/tests/tests/security/src/android/security/cts/SkiaICORecursiveDecodingTest.java @@ -19,26 +19,33 @@ package android.security.cts; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import androidx.test.runner.AndroidJUnit4; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; +import org.junit.runner.RunWith; +import org.junit.Test; import java.io.InputStream; import android.security.cts.R; import android.platform.test.annotations.AsbSecurityTest; -public class SkiaICORecursiveDecodingTest extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +public class SkiaICORecursiveDecodingTest extends StsExtraBusinessLogicTestCase { @AsbSecurityTest(cveBugId = 73782357) + @Test public void testAndroid_cve_2017_13318() { doSkiaIcoRecursiveDecodingTest(R.raw.cve_2017_13318); } @AsbSecurityTest(cveBugId = 17262540) + @Test public void test_android_bug_17262540() { doSkiaIcoRecursiveDecodingTest(R.raw.bug_17262540); } @AsbSecurityTest(cveBugId = 17265466) + @Test public void test_android_bug_17265466() { doSkiaIcoRecursiveDecodingTest(R.raw.bug_17265466); } @@ -47,7 +54,7 @@ public class SkiaICORecursiveDecodingTest extends AndroidTestCase { * Verifies that the device prevents recursive decoding of malformed ICO files */ public void doSkiaIcoRecursiveDecodingTest(int resId) { - InputStream exploitImage = mContext.getResources().openRawResource(resId); + InputStream exploitImage = getInstrumentation().getContext().getResources().openRawResource(resId); /** * The decodeStream method results in SIGSEGV (Segmentation fault) on unpatched devices * while decoding the exploit image which will lead to process crash diff --git a/tests/tests/security/src/android/security/cts/VisualizerEffectTest.java b/tests/tests/security/src/android/security/cts/VisualizerEffectTest.java index 3be7534774a..945d1190f20 100644 --- a/tests/tests/security/src/android/security/cts/VisualizerEffectTest.java +++ b/tests/tests/security/src/android/security/cts/VisualizerEffectTest.java @@ -22,22 +22,25 @@ import android.platform.test.annotations.AsbSecurityTest; import android.media.audiofx.AudioEffect; import android.media.MediaPlayer; import android.media.audiofx.Visualizer; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import android.util.Log; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.UUID; +import static org.junit.Assert.*; -public class VisualizerEffectTest extends AndroidTestCase { +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class VisualizerEffectTest extends StsExtraBusinessLogicTestCase { private String TAG = "VisualizerEffectTest"; - @Override - protected void setUp() throws Exception { - super.setUp(); - } //Testing security bug: 30229821 + @Test @AsbSecurityTest(cveBugId = 30229821) public void testVisualizer_MalformedConstructor() throws Exception { final String VISUALIZER_TYPE = "e46b26a0-dddd-11db-8afd-0002a5d5c51b"; @@ -80,4 +83,4 @@ public class VisualizerEffectTest extends AndroidTestCase { Log.w(TAG,"No visualizer found to test"); } } -}
\ No newline at end of file +} diff --git a/tests/tests/security/src/android/security/cts/ZeroHeightTiffTest.java b/tests/tests/security/src/android/security/cts/ZeroHeightTiffTest.java index 5cc4fe5e183..af28a547ce8 100644 --- a/tests/tests/security/src/android/security/cts/ZeroHeightTiffTest.java +++ b/tests/tests/security/src/android/security/cts/ZeroHeightTiffTest.java @@ -19,22 +19,30 @@ package android.security.cts; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.platform.test.annotations.AsbSecurityTest; -import android.test.AndroidTestCase; +import com.android.sts.common.util.StsExtraBusinessLogicTestCase; import java.io.InputStream; import android.security.cts.R; -public class ZeroHeightTiffTest extends AndroidTestCase { +import static org.junit.Assert.*; + +import androidx.test.runner.AndroidJUnit4; +import org.junit.runner.RunWith; +import org.junit.Test; + +@RunWith(AndroidJUnit4.class) +public class ZeroHeightTiffTest extends StsExtraBusinessLogicTestCase { /** * Verifies that the device fails to decode a zero height tiff file. * * Prior to fixing bug 33300701, decoding resulted in undefined behavior (divide by zero). * With the fix, decoding will fail, without dividing by zero. */ + @Test @AsbSecurityTest(cveBugId = 33300701) public void test_android_bug_33300701() { - InputStream exploitImage = mContext.getResources().openRawResource(R.raw.bug_33300701); + InputStream exploitImage = getInstrumentation().getContext().getResources().openRawResource(R.raw.bug_33300701); Bitmap bitmap = BitmapFactory.decodeStream(exploitImage); assertNull(bitmap); } diff --git a/tests/tests/telecom/AndroidManifest.xml b/tests/tests/telecom/AndroidManifest.xml index 96a07b36904..1b1d48ea3a1 100644 --- a/tests/tests/telecom/AndroidManifest.xml +++ b/tests/tests/telecom/AndroidManifest.xml @@ -79,6 +79,14 @@ </intent-filter> </service> + <service android:name="android.telecom.cts.NullBindingConnectionService" + android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" + android:exported="true"> + <intent-filter> + <action android:name="android.telecom.ConnectionService"/> + </intent-filter> + </service> + <service android:name="android.telecom.cts.MockInCallService" android:permission="android.permission.BIND_INCALL_SERVICE" android:exported="true"> diff --git a/tests/tests/telecom/src/android/telecom/cts/NullBindingConnectionService.java b/tests/tests/telecom/src/android/telecom/cts/NullBindingConnectionService.java new file mode 100644 index 00000000000..1debb7a6d4b --- /dev/null +++ b/tests/tests/telecom/src/android/telecom/cts/NullBindingConnectionService.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.telecom.cts; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import java.util.concurrent.CountDownLatch; + +/** + * A minimal {@link Service} implementation intended to test cases where a {@link ConnectionService} + * tries to return a null binding. + */ +public class NullBindingConnectionService extends Service { + public static CountDownLatch sBindLatch = new CountDownLatch(1); + public static CountDownLatch sUnbindLatch = new CountDownLatch(1); + + public NullBindingConnectionService() { + } + + @Override + public IBinder onBind(Intent intent) { + sBindLatch.countDown(); + sUnbindLatch = new CountDownLatch(1); + return null; + } + + @Override + public boolean onUnbind(Intent intent) { + sUnbindLatch.countDown(); + sBindLatch = new CountDownLatch(1); + return false; + } +} diff --git a/tests/tests/telecom/src/android/telecom/cts/NullBindingTest.java b/tests/tests/telecom/src/android/telecom/cts/NullBindingTest.java new file mode 100644 index 00000000000..611eeaba66e --- /dev/null +++ b/tests/tests/telecom/src/android/telecom/cts/NullBindingTest.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.telecom.cts; + +import android.content.ComponentName; +import android.net.Uri; +import android.os.Bundle; +import android.telecom.PhoneAccount; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; + +/** + * CTS tests to ensure that a ConnectionService which returns a null binding will be automatically + * unbound. + */ + +public class NullBindingTest extends BaseTelecomTestWithMockServices { + private static final PhoneAccountHandle TEST_NULL_BINDING_HANDLE = + new PhoneAccountHandle(new ComponentName("android.telecom.cts", + "android.telecom.cts.NullBindingConnectionService"), + "1"); + + public static final PhoneAccount TEST_NULL_BINDING_ACCOUNT = PhoneAccount.builder( + TEST_NULL_BINDING_HANDLE, "Null") + .setAddress(Uri.parse("sip:test@test.com")) + .setCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED) + .addSupportedUriScheme(PhoneAccount.SCHEME_SIP) + .build(); + + private static final Uri TEST_ADDRESS_1 = Uri.fromParts("sip", "call1@test.com", null); + + @Override + protected void setUp() throws Exception { + super.setUp(); + mContext = getInstrumentation().getContext(); + if (mShouldTestTelecom) { + mTelecomManager.registerPhoneAccount(TEST_NULL_BINDING_ACCOUNT); + } + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + if (mShouldTestTelecom) { + mTelecomManager.unregisterPhoneAccount(TEST_NULL_BINDING_HANDLE); + } + } + + /** + * Ensures that when we bind to a ConnectionService which returns a null binding that the + * ConnectionService is unbound automatically. + */ + public void testNullBinding() { + if (!mShouldTestTelecom) { + return; + } + + // Place a call using the null binding connection service. + Bundle extras = new Bundle(); + extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, TEST_NULL_BINDING_HANDLE); + mTelecomManager.placeCall(TEST_ADDRESS_1, extras); + + // Ensure it bound and then unbound. + assertTrue(TestUtils.waitForLatchCountDown(NullBindingConnectionService.sBindLatch)); + assertTrue(TestUtils.waitForLatchCountDown(NullBindingConnectionService.sUnbindLatch)); + + // Ensure there is no call present in Telecom + assertFalse(mTelecomManager.isInCall()); + } +} diff --git a/tests/tests/textclassifier/src/android/view/textclassifier/cts/SelectionEventTest.java b/tests/tests/textclassifier/src/android/view/textclassifier/cts/SelectionEventTest.java index 72550c46bd4..d86ffb1215f 100644 --- a/tests/tests/textclassifier/src/android/view/textclassifier/cts/SelectionEventTest.java +++ b/tests/tests/textclassifier/src/android/view/textclassifier/cts/SelectionEventTest.java @@ -16,6 +16,11 @@ package android.view.textclassifier.cts; +import static com.google.common.truth.Truth.assertThat; + +import android.view.textclassifier.SelectionEvent; +import android.view.textclassifier.TextClassifier; + import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -27,7 +32,23 @@ import org.junit.runner.RunWith; public class SelectionEventTest { @Test - public void testSelectionEvent_placeholder() { - // TODO: add tests for SelectionEvent + public void testSelectionEvent() { + SelectionEvent event = SelectionEvent.createSelectionActionEvent(0, 1, + SelectionEvent.ACTION_COPY); + assertThat(event.getEventType()).isEqualTo(SelectionEvent.ACTION_COPY); + assertThat(event.getStart()).isEqualTo(0); + assertThat(event.getEnd()).isEqualTo(0); + assertThat(event.getInvocationMethod()).isEqualTo(SelectionEvent.INVOCATION_UNKNOWN); + assertThat(event.getEntityType()).isEqualTo(TextClassifier.TYPE_UNKNOWN); + assertThat(event.getEventIndex()).isEqualTo(0); + assertThat(event.getPackageName()).isEqualTo(""); + assertThat(event.getSmartStart()).isEqualTo(0); + assertThat(event.getSmartEnd()).isEqualTo(0); + assertThat(event.getWidgetType()).isEqualTo(TextClassifier.WIDGET_TYPE_UNKNOWN); + assertThat(event.getWidgetVersion()).isNull(); + assertThat(event.getResultId()).isEqualTo(""); + assertThat(event.getEventTime()).isEqualTo(0); + assertThat(event.getDurationSinceSessionStart()).isEqualTo(0); + assertThat(event.getDurationSincePreviousEvent()).isEqualTo(0); } } diff --git a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextLinksTest.java b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextLinksTest.java index 1414ed7e327..3592c9605f5 100644 --- a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextLinksTest.java +++ b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextLinksTest.java @@ -231,6 +231,7 @@ public class TextLinksTest { assertNull(request.getDefaultLocales()); assertTrue(request.getExtras().isEmpty()); assertNull(request.getEntityConfig()); + assertNull(request.getCallingPackageName()); } @Test @@ -253,6 +254,7 @@ public class TextLinksTest { TextClassifier.HINT_TEXT_IS_EDITABLE, request.getEntityConfig().getHints().iterator().next()); assertEquals(referenceTime, request.getReferenceTime()); + assertNull(request.getCallingPackageName()); } } diff --git a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java index 71300513612..88457caaa9b 100644 --- a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java +++ b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java @@ -259,7 +259,9 @@ public class MultiStaConcurrencyWifiNetworkSpecifierTest extends WifiJUnit4TestB * Tests the concurrent connection flow. * 1. Connect to a network using peer to peer API. * 2. Connect to a network using internet connectivity API. - * 3. Verify that both connections are active. + * 3. Verify that both connections are active only the network for peer-to-peer and network + * for internet have different SSIDs. If they have the same SSID, verify there's exactly one + * connection. */ @Test public void testConnectToInternetNetworkWhenConnectedToPeerPeerNetwork() throws Exception { @@ -275,7 +277,9 @@ public class MultiStaConcurrencyWifiNetworkSpecifierTest extends WifiJUnit4TestB mTestNetworkForInternetConnection); // Ensure that there are 2 wifi connections available for apps. - assertThat(mTestHelper.getNumWifiConnections()).isEqualTo(2); + assertThat(mTestHelper.getNumWifiConnections()).isEqualTo( + mTestNetworkForPeerToPeer.SSID.equals(mTestNetworkForInternetConnection.SSID) + ? 1 : 2); } /** diff --git a/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java b/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java index 98ab11db9fb..c845138b0aa 100644 --- a/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java +++ b/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java @@ -146,7 +146,7 @@ public class TestHelper { wifiManager.unregisterScanResultsCallback(scanResultsCallback); } List<ScanResult> scanResults = wifiManager.getScanResults(); - if (scanResults == null || scanResults.isEmpty()) fail("No scan results available"); + if (scanResults == null || scanResults.isEmpty()) continue; for (ScanResult scanResult : scanResults) { WifiConfiguration matchingNetwork = savedNetworks.stream() .filter(network -> TextUtils.equals( |