diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-01-12 21:09:41 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2022-01-12 21:09:41 +0000 |
commit | 3ed8bc39c947e27de116e63748377bcb3254211c (patch) | |
tree | 0bc5699597a52eeacedb3b661368866de3d8194a | |
parent | 3a148e69cecf412216fe343f46a1c924a7c0b1a0 (diff) | |
parent | 559d4fd11f5e1fc72ee4df2827a2c25fce26634b (diff) | |
download | cts-android-cts-11.0_r7.tar.gz |
Merge "Snap for 8070031 from 36af526790278a736cdff6e724bdc1c79ab612c7 to android11-tests-release" into android11-tests-releaseandroid-cts-11.0_r7
28 files changed, 411 insertions, 39 deletions
diff --git a/tests/signature/api-check/Android.bp b/tests/signature/api-check/Android.bp index ee7642d7cee..078473234d5 100644 --- a/tests/signature/api-check/Android.bp +++ b/tests/signature/api-check/Android.bp @@ -49,6 +49,18 @@ java_defaults { compile_multilib: "both", } +// Defaults for signature api checks with dynamic config. +java_defaults { + name: "signature-api-check-dynamic-config-defaults", + defaults: ["signature-api-check-defaults"], + defaults_visibility: [ + "//cts/tests/signature:__subpackages__", + ], + static_libs: [ + "cts-signature-with-dynamic-config", + ], +} + // Defaults for hiddenapi killswitch checks. java_defaults { name: "hiddenapi-killswitch-check-defaults", @@ -82,7 +94,7 @@ filegroup { // Defaults for hiddenapi blacklist checks. java_defaults { name: "hiddenapi-blacklist-check-defaults", - defaults: ["signature-api-check-defaults"], + defaults: ["signature-api-check-dynamic-config-defaults"], java_resources: [ ":cts-hiddenapi-flags-csv", ":cts-api-hiddenapi-filter-csv" @@ -92,3 +104,11 @@ java_defaults { ], } +// The CtsHiddenApiBlocklistApiDynamicConfig file is intended to be used by +// multiple CtsHiddenApiBlocklist...TestCases. +filegroup { + name: "CtsHiddenApiBlocklistApiDynamicConfig", + srcs: [ + "CtsHiddenApiBlocklistApiDynamicConfig.dynamic", + ], +} diff --git a/tests/signature/api-check/CtsHiddenApiBlocklistApiDynamicConfig.dynamic b/tests/signature/api-check/CtsHiddenApiBlocklistApiDynamicConfig.dynamic new file mode 100644 index 00000000000..6dd8025aede --- /dev/null +++ b/tests/signature/api-check/CtsHiddenApiBlocklistApiDynamicConfig.dynamic @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2021 Google Inc. + + 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. +--> +<dynamicConfig> + <entry key ="expected_failures"> + <!-- + ! Each value in this section identifies an expected failure and is of the + ! form: + ! <failure-type>:<signature of class/member> + ! + ! These entries are loaded by AnnotationTest which uses them to construct + ! an ExpectedFailuresFilter which discards them. + ! + ! e.g. If the test fails with the following error message: + ! repackaged.junit.framework.AssertionFailedError: + ! extra_class: android.media.MediaParceledListSlice Error: Class annotated with android.annotation.SystemApi does not exist in the documented API + ! extra_class: android.media.MediaFrameworkInitializer Error: Class annotated with android.annotation.SystemApi does not exist in the documented API + ! extra_interface: android.media.MediaCommunicationManager$SessionCallback Error: Class annotated with android.annotation.SystemApi does not exist in the documented API + ! extra_class: android.media.MediaTranscodingManager Error: Class annotated with android.annotation.SystemApi does not exist in the documented API + ! ClassLoader hierarchy + ! + ! The first step is to check that the extra classes are expected (e.g. + ! because they have been annotated with the @SystemApi since this version + ! of the CTS tests were released and the tests are being run on an + ! Android system with a version of the mainline modules that includes + ! those changes. + ! + ! If they are not expected then this must be caused by a partner + ! inadvertently adding something to the @SystemApi so the correct + ! response is for them to stop doing that. + ! + ! If they are expected then additional entries should be added to this + ! section. That simply requires copying each error message into their own + ! <value></value> element and then removing the whitespace after the + ! first : and also removing the trailing " Error: ..." part (including + ! the leading white space). + ! + ! See below for some examples. + !--> + <!-- Bug: 204723907 --> + <value>extra_field:int android.net.wifi.ScanResult.UNSPECIFIED</value> + <value>extra_method:boolean android.net.wifi.WifiInfo.isTrusted()</value> + <value>extra_method:long[] android.net.wifi.hotspot2.pps.HomeSp.getMatchAllOis()</value> + <value>extra_method:long[] android.net.wifi.hotspot2.pps.HomeSp.getMatchAnyOis()</value> + <value>extra_method:void android.net.wifi.hotspot2.pps.HomeSp.setMatchAllOis(long[])</value> + <value>extra_method:void android.net.wifi.hotspot2.pps.HomeSp.setMatchAnyOis(long[])</value> + <!-- + ! Add any new entries before this. + ! + ! Note: Due to limitations within the build changes to this file it is + ! necessary to build CtsHiddenApiBlacklistCurrentApiTestCases in order + ! for changes to this file to take effect. + !--> + </entry> +</dynamicConfig> diff --git a/tests/signature/api-check/hidden-api-blacklist-27-api/Android.bp b/tests/signature/api-check/hidden-api-blacklist-27-api/Android.bp index 71a69028266..b334cde586b 100644 --- a/tests/signature/api-check/hidden-api-blacklist-27-api/Android.bp +++ b/tests/signature/api-check/hidden-api-blacklist-27-api/Android.bp @@ -25,4 +25,12 @@ android_test { "vts10", "general-tests", ], + // Ideally the following should be uncommented but unfortunately due to + // limitations in the build that causes build failures due to duplicate copy + // rules being generated. In the meantime it is necessary to build + // CtsHiddenApiBlacklistCurrentApiTestCases before running this test to + // pick up any changes to CtsHiddenApiBlocklistApiDynamicConfig.dynamic. + // data: [ + // ":CtsHiddenApiBlocklistApiDynamicConfig", + // ], } diff --git a/tests/signature/api-check/hidden-api-blacklist-27-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blacklist-27-api/AndroidTest.xml index 1e0ed129085..cfbf78f484d 100644 --- a/tests/signature/api-check/hidden-api-blacklist-27-api/AndroidTest.xml +++ b/tests/signature/api-check/hidden-api-blacklist-27-api/AndroidTest.xml @@ -16,8 +16,13 @@ <configuration description="Config for CTS Hidden API Signature test cases"> <option name="test-suite-tag" value="cts" /> <option name="config-descriptor:metadata" key="component" value="systems" /> - <option name="config-descriptor:metadata" key="parameter" value="instant_app" /> + <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" /> <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" /> + <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher"> + <option name="target" value="device" /> + <option name="config-filename" value="CtsHiddenApiBlocklistApiDynamicConfig" /> + <option name="version" value="1.0" /> + </target_preparer> <option name="config-descriptor:metadata" key="parameter" value="secondary_user" /> <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> <option name="cleanup-apks" value="true" /> @@ -27,10 +32,13 @@ <option name="package" value="android.signature.cts.api.hiddenapi_blacklist_api_27" /> <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" /> <option name="class" value="android.signature.cts.api.api27.HiddenApiTest" /> + <option name="instrumentation-arg" key="dynamic-config-name" value="CtsHiddenApiBlocklistApiDynamicConfig" /> <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" /> <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blacklist" /> <option name="instrumentation-arg" key="hiddenapi-filter-file" value="hiddenapi-filter.csv" /> <option name="test-api-access" value="false" /> <option name="runtime-hint" value="30s" /> + <!-- disable isolated storage so tests can access dynamic config stored in /sdcard. --> + <option name="isolated-storage" value="false" /> </test> </configuration> diff --git a/tests/signature/api-check/hidden-api-blacklist-27-api/src/android/signature/cts/api/api27/HiddenApiTest.java b/tests/signature/api-check/hidden-api-blacklist-27-api/src/android/signature/cts/api/api27/HiddenApiTest.java index c940aac9c67..13ea0f1846a 100644 --- a/tests/signature/api-check/hidden-api-blacklist-27-api/src/android/signature/cts/api/api27/HiddenApiTest.java +++ b/tests/signature/api-check/hidden-api-blacklist-27-api/src/android/signature/cts/api/api27/HiddenApiTest.java @@ -16,5 +16,7 @@ package android.signature.cts.api.api27; -public class HiddenApiTest extends android.signature.cts.api.HiddenApiTest { +import android.signature.cts.api.dynamic.DynamicConfigHiddenApiTest; + +public class HiddenApiTest extends DynamicConfigHiddenApiTest { } diff --git a/tests/signature/api-check/hidden-api-blacklist-28-api/Android.bp b/tests/signature/api-check/hidden-api-blacklist-28-api/Android.bp index 5671a40c7f3..a3afe186032 100644 --- a/tests/signature/api-check/hidden-api-blacklist-28-api/Android.bp +++ b/tests/signature/api-check/hidden-api-blacklist-28-api/Android.bp @@ -25,4 +25,12 @@ android_test { "vts10", "general-tests", ], + // Ideally the following should be uncommented but unfortunately due to + // limitations in the build that causes build failures due to duplicate copy + // rules being generated. In the meantime it is necessary to build + // CtsHiddenApiBlacklistCurrentApiTestCases before running this test to + // pick up any changes to CtsHiddenApiBlocklistApiDynamicConfig.dynamic. + // data: [ + // ":CtsHiddenApiBlocklistApiDynamicConfig", + // ], } diff --git a/tests/signature/api-check/hidden-api-blacklist-28-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blacklist-28-api/AndroidTest.xml index 9e7db7bd423..c6fce596091 100644 --- a/tests/signature/api-check/hidden-api-blacklist-28-api/AndroidTest.xml +++ b/tests/signature/api-check/hidden-api-blacklist-28-api/AndroidTest.xml @@ -16,8 +16,13 @@ <configuration description="Config for CTS Hidden API Signature test cases"> <option name="test-suite-tag" value="cts" /> <option name="config-descriptor:metadata" key="component" value="systems" /> - <option name="config-descriptor:metadata" key="parameter" value="instant_app" /> + <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" /> <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" /> + <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher"> + <option name="target" value="device" /> + <option name="config-filename" value="CtsHiddenApiBlocklistApiDynamicConfig" /> + <option name="version" value="1.0" /> + </target_preparer> <option name="config-descriptor:metadata" key="parameter" value="secondary_user" /> <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> <option name="cleanup-apks" value="true" /> @@ -27,10 +32,13 @@ <option name="package" value="android.signature.cts.api.hiddenapi_blacklist_api_28" /> <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" /> <option name="class" value="android.signature.cts.api.api28.HiddenApiTest" /> + <option name="instrumentation-arg" key="dynamic-config-name" value="CtsHiddenApiBlocklistApiDynamicConfig" /> <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" /> <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blacklist,greylist-max-o" /> <option name="instrumentation-arg" key="hiddenapi-filter-file" value="hiddenapi-filter.csv" /> <option name="test-api-access" value="false" /> <option name="runtime-hint" value="30s" /> + <!-- disable isolated storage so tests can access dynamic config stored in /sdcard. --> + <option name="isolated-storage" value="false" /> </test> </configuration> diff --git a/tests/signature/api-check/hidden-api-blacklist-28-api/src/android/signature/cts/api/api28/HiddenApiTest.java b/tests/signature/api-check/hidden-api-blacklist-28-api/src/android/signature/cts/api/api28/HiddenApiTest.java index f85dda39ba5..091a25f94a8 100644 --- a/tests/signature/api-check/hidden-api-blacklist-28-api/src/android/signature/cts/api/api28/HiddenApiTest.java +++ b/tests/signature/api-check/hidden-api-blacklist-28-api/src/android/signature/cts/api/api28/HiddenApiTest.java @@ -16,5 +16,7 @@ package android.signature.cts.api.api28; -public class HiddenApiTest extends android.signature.cts.api.HiddenApiTest { +import android.signature.cts.api.dynamic.DynamicConfigHiddenApiTest; + +public class HiddenApiTest extends DynamicConfigHiddenApiTest { } diff --git a/tests/signature/api-check/hidden-api-blacklist-current-api/Android.bp b/tests/signature/api-check/hidden-api-blacklist-current-api/Android.bp index ec730b0551d..8e4bbc7e329 100644 --- a/tests/signature/api-check/hidden-api-blacklist-current-api/Android.bp +++ b/tests/signature/api-check/hidden-api-blacklist-current-api/Android.bp @@ -24,4 +24,7 @@ android_test { "vts10", "general-tests", ], + data: [ + ":CtsHiddenApiBlocklistApiDynamicConfig", + ], } diff --git a/tests/signature/api-check/hidden-api-blacklist-current-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blacklist-current-api/AndroidTest.xml index 3cea228c49f..9bd0b320c45 100644 --- a/tests/signature/api-check/hidden-api-blacklist-current-api/AndroidTest.xml +++ b/tests/signature/api-check/hidden-api-blacklist-current-api/AndroidTest.xml @@ -16,8 +16,13 @@ <configuration description="Config for CTS Hidden API Signature test cases"> <option name="test-suite-tag" value="cts" /> <option name="config-descriptor:metadata" key="component" value="systems" /> - <option name="config-descriptor:metadata" key="parameter" value="instant_app" /> + <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" /> <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" /> + <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher"> + <option name="target" value="device" /> + <option name="config-filename" value="CtsHiddenApiBlocklistApiDynamicConfig" /> + <option name="version" value="1.0" /> + </target_preparer> <option name="config-descriptor:metadata" key="parameter" value="secondary_user" /> <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> <option name="cleanup-apks" value="true" /> @@ -27,10 +32,13 @@ <option name="package" value="android.signature.cts.api.hiddenapi_blacklist_current" /> <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" /> <option name="class" value="android.signature.cts.api.current.HiddenApiTest" /> + <option name="instrumentation-arg" key="dynamic-config-name" value="CtsHiddenApiBlocklistApiDynamicConfig" /> <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" /> <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blacklist,greylist-max-o,greylist-max-p" /> <option name="instrumentation-arg" key="hiddenapi-filter-file" value="hiddenapi-filter.csv" /> <option name="test-api-access" value="false" /> <option name="runtime-hint" value="30s" /> + <!-- disable isolated storage so tests can access dynamic config stored in /sdcard. --> + <option name="isolated-storage" value="false" /> </test> </configuration> diff --git a/tests/signature/api-check/hidden-api-blacklist-current-api/src/android/signature/cts/api/current/HiddenApiTest.java b/tests/signature/api-check/hidden-api-blacklist-current-api/src/android/signature/cts/api/current/HiddenApiTest.java index 34f33fec29f..772648940b8 100644 --- a/tests/signature/api-check/hidden-api-blacklist-current-api/src/android/signature/cts/api/current/HiddenApiTest.java +++ b/tests/signature/api-check/hidden-api-blacklist-current-api/src/android/signature/cts/api/current/HiddenApiTest.java @@ -16,5 +16,7 @@ package android.signature.cts.api.current; -public class HiddenApiTest extends android.signature.cts.api.HiddenApiTest { +import android.signature.cts.api.dynamic.DynamicConfigHiddenApiTest; + +public class HiddenApiTest extends DynamicConfigHiddenApiTest { } diff --git a/tests/signature/api-check/hidden-api-blacklist-debug-class/Android.bp b/tests/signature/api-check/hidden-api-blacklist-debug-class/Android.bp index bfb5c8f8999..fd9b4689f89 100644 --- a/tests/signature/api-check/hidden-api-blacklist-debug-class/Android.bp +++ b/tests/signature/api-check/hidden-api-blacklist-debug-class/Android.bp @@ -24,4 +24,12 @@ android_test { "vts10", "general-tests", ], + // Ideally the following should be uncommented but unfortunately due to + // limitations in the build that causes build failures due to duplicate copy + // rules being generated. In the meantime it is necessary to build + // CtsHiddenApiBlacklistCurrentApiTestCases before running this test to + // pick up any changes to CtsHiddenApiBlocklistApiDynamicConfig.dynamic. + // data: [ + // ":CtsHiddenApiBlocklistApiDynamicConfig", + // ], } diff --git a/tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidTest.xml b/tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidTest.xml index e1c06c1edcf..fc8f06212b4 100644 --- a/tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidTest.xml +++ b/tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidTest.xml @@ -16,8 +16,13 @@ <configuration description="Config for CTS Hidden API Signature test cases"> <option name="test-suite-tag" value="cts" /> <option name="config-descriptor:metadata" key="component" value="systems" /> - <option name="config-descriptor:metadata" key="parameter" value="instant_app" /> + <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" /> <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" /> + <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher"> + <option name="target" value="device" /> + <option name="config-filename" value="CtsHiddenApiBlocklistApiDynamicConfig" /> + <option name="version" value="1.0" /> + </target_preparer> <option name="config-descriptor:metadata" key="parameter" value="secondary_user" /> <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> <option name="cleanup-apks" value="true" /> @@ -26,11 +31,14 @@ <test class="com.android.tradefed.testtype.AndroidJUnitTest" > <option name="package" value="android.signature.cts.api.hiddenapi_blacklist_debug_class" /> <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" /> - <option name="class" value="android.signature.cts.api.DebugClassHiddenApiTest" /> + <option name="class" value="android.signature.cts.api.blocklist.debug.DebugClassHiddenApiTest" /> + <option name="instrumentation-arg" key="dynamic-config-name" value="CtsHiddenApiBlocklistApiDynamicConfig" /> <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" /> <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blacklist,greylist-max-o,greylist-max-p" /> <option name="instrumentation-arg" key="hiddenapi-filter-file" value="hiddenapi-filter.csv" /> <option name="test-api-access" value="false" /> <option name="runtime-hint" value="30s" /> + <!-- disable isolated storage so tests can access dynamic config stored in /sdcard. --> + <option name="isolated-storage" value="false" /> </test> </configuration> diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/DebugClassHiddenApiTest.java b/tests/signature/api-check/hidden-api-blacklist-debug-class/src/android/signature/cts/api/blocklist/debug/DebugClassHiddenApiTest.java index 8168f080d69..9266976b320 100644 --- a/tests/signature/api-check/src/java/android/signature/cts/api/DebugClassHiddenApiTest.java +++ b/tests/signature/api-check/hidden-api-blacklist-debug-class/src/android/signature/cts/api/blocklist/debug/DebugClassHiddenApiTest.java @@ -14,11 +14,12 @@ * limitations under the License. */ -package android.signature.cts.api; +package android.signature.cts.api.blocklist.debug; import android.signature.cts.DexMemberChecker; +import android.signature.cts.api.dynamic.DynamicConfigHiddenApiTest; -public class DebugClassHiddenApiTest extends HiddenApiTest { +public class DebugClassHiddenApiTest extends DynamicConfigHiddenApiTest { @Override protected void setUp() throws Exception { super.setUp(); diff --git a/tests/signature/api-check/hidden-api-blacklist-test-api/Android.bp b/tests/signature/api-check/hidden-api-blacklist-test-api/Android.bp index 6ff5ceac46f..6ae25cc115d 100644 --- a/tests/signature/api-check/hidden-api-blacklist-test-api/Android.bp +++ b/tests/signature/api-check/hidden-api-blacklist-test-api/Android.bp @@ -23,4 +23,12 @@ android_test { "vts10", "general-tests", ], + // Ideally the following should be uncommented but unfortunately due to + // limitations in the build that causes build failures due to duplicate copy + // rules being generated. In the meantime it is necessary to build + // CtsHiddenApiBlacklistCurrentApiTestCases before running this test to + // pick up any changes to CtsHiddenApiBlocklistApiDynamicConfig.dynamic. + // data: [ + // ":CtsHiddenApiBlocklistApiDynamicConfig", + // ], } diff --git a/tests/signature/api-check/hidden-api-blacklist-test-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blacklist-test-api/AndroidTest.xml index 313b8b3072f..0a5a4f9a5e9 100644 --- a/tests/signature/api-check/hidden-api-blacklist-test-api/AndroidTest.xml +++ b/tests/signature/api-check/hidden-api-blacklist-test-api/AndroidTest.xml @@ -17,8 +17,13 @@ <configuration description="Config for CTS Hidden API Signature test cases"> <option name="test-suite-tag" value="cts" /> <option name="config-descriptor:metadata" key="component" value="systems" /> - <option name="config-descriptor:metadata" key="parameter" value="instant_app" /> + <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" /> <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" /> + <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher"> + <option name="target" value="device" /> + <option name="config-filename" value="CtsHiddenApiBlocklistApiDynamicConfig" /> + <option name="version" value="1.0" /> + </target_preparer> <option name="config-descriptor:metadata" key="parameter" value="secondary_user" /> <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> <option name="cleanup-apks" value="true" /> @@ -28,8 +33,11 @@ <option name="package" value="android.signature.cts.api.hiddenapi_blacklist_test" /> <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" /> <option name="class" value="android.signature.cts.api.test.HiddenApiTest" /> + <option name="instrumentation-arg" key="dynamic-config-name" value="CtsHiddenApiBlocklistApiDynamicConfig" /> <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" /> <option name="test-api-access" value="false" /> <option name="runtime-hint" value="30s" /> + <!-- disable isolated storage so tests can access dynamic config stored in /sdcard. --> + <option name="isolated-storage" value="false" /> </test> </configuration> diff --git a/tests/signature/api-check/hidden-api-blacklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java b/tests/signature/api-check/hidden-api-blacklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java index 29bc4b7e512..f23afec84a8 100644 --- a/tests/signature/api-check/hidden-api-blacklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java +++ b/tests/signature/api-check/hidden-api-blacklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java @@ -20,23 +20,12 @@ import android.os.Bundle; import android.signature.cts.DexApiDocumentParser; import android.signature.cts.DexField; import android.signature.cts.DexMember; -import android.signature.cts.DexMemberChecker; -import android.signature.cts.DexMethod; -import android.signature.cts.FailureType; -import android.signature.cts.VirtualPath; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardOpenOption; -import java.util.EnumSet; +import android.signature.cts.api.dynamic.DynamicConfigHiddenApiTest; import java.util.Set; import java.util.function.Predicate; import java.util.stream.Stream; -public class HiddenApiTest extends android.signature.cts.api.HiddenApiTest { +public class HiddenApiTest extends DynamicConfigHiddenApiTest { @Override protected boolean shouldTestMember(DexMember member) { diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/AbstractApiTest.java b/tests/signature/api-check/src/java/android/signature/cts/api/AbstractApiTest.java index d06de543b4c..27dc90471e3 100644 --- a/tests/signature/api-check/src/java/android/signature/cts/api/AbstractApiTest.java +++ b/tests/signature/api-check/src/java/android/signature/cts/api/AbstractApiTest.java @@ -40,6 +40,7 @@ import java.nio.file.StandardOpenOption; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; +import java.util.List; import java.util.stream.Stream; import java.util.zip.ZipFile; import repackaged.android.test.InstrumentationTestCase; @@ -55,6 +56,11 @@ public class AbstractApiTest extends InstrumentationTestCase { ClassProvider classProvider; + /** + * The list of expected failures. + */ + private Collection<String> expectedFailures = Collections.emptyList(); + @Override protected void setUp() throws Exception { super.setUp(); @@ -75,6 +81,22 @@ public class AbstractApiTest extends InstrumentationTestCase { initializeFromArgs(instrumentationArgs); } + /** + * Initialize the expected failures. + * + * <p>Call from with {@code #initializeFromArgs}</p> + * + * @param expectedFailures the expected failures. + */ + protected void initExpectedFailures(Collection<String> expectedFailures) { + this.expectedFailures = expectedFailures; + String tag = getClass().getName(); + Log.d(tag, "Expected failure count: " + expectedFailures.size()); + for (String failure: expectedFailures) { + Log.d(tag, "Expected failure: \"" + failure + "\""); + } + } + protected void initializeFromArgs(Bundle instrumentationArgs) throws Exception { } @@ -84,10 +106,11 @@ public class AbstractApiTest extends InstrumentationTestCase { } void runWithTestResultObserver(RunnableWithResultObserver runnable) { - runWithTestResultObserver(Collections.emptyList(), runnable); + runWithTestResultObserver(expectedFailures, runnable); } - void runWithTestResultObserver(Collection<String> expectedFailures, RunnableWithResultObserver runnable) { + private void runWithTestResultObserver( + Collection<String> expectedFailures, RunnableWithResultObserver runnable) { try { ResultObserver observer = mResultObserver; if (!expectedFailures.isEmpty()) { diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java b/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java index 43cca41e327..a479348e296 100644 --- a/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java +++ b/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java @@ -44,7 +44,7 @@ public class HiddenApiTest extends AbstractApiTest { private Set<String> hiddenapiFilterSet; @Override - protected void initializeFromArgs(Bundle instrumentationArgs) { + protected void initializeFromArgs(Bundle instrumentationArgs) throws Exception { hiddenapiFiles = getCommaSeparatedList(instrumentationArgs, "hiddenapi-files"); hiddenapiTestFlags = getCommaSeparatedList(instrumentationArgs, "hiddenapi-test-flags"); hiddenapiFilterFile = instrumentationArgs.getString("hiddenapi-filter-file"); diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/SignatureTest.java b/tests/signature/api-check/src/java/android/signature/cts/api/SignatureTest.java index 440430df923..0bc23088d71 100644 --- a/tests/signature/api-check/src/java/android/signature/cts/api/SignatureTest.java +++ b/tests/signature/api-check/src/java/android/signature/cts/api/SignatureTest.java @@ -42,7 +42,7 @@ public class SignatureTest extends AbstractApiTest { private String[] unexpectedApiFiles; @Override - protected void initializeFromArgs(Bundle instrumentationArgs) { + protected void initializeFromArgs(Bundle instrumentationArgs) throws Exception { systemApiFiles = getCommaSeparatedList(instrumentationArgs, "system-api-files"); baseApiFiles = getCommaSeparatedList(instrumentationArgs, "base-api-files"); unexpectedApiFiles = getCommaSeparatedList(instrumentationArgs, "unexpected-api-files"); diff --git a/tests/signature/api-check/system-annotation/src/java/android/signature/cts/api/AnnotationTest.java b/tests/signature/api-check/system-annotation/src/java/android/signature/cts/api/AnnotationTest.java index 2de0d08f143..a30b184087c 100644 --- a/tests/signature/api-check/system-annotation/src/java/android/signature/cts/api/AnnotationTest.java +++ b/tests/signature/api-check/system-annotation/src/java/android/signature/cts/api/AnnotationTest.java @@ -39,7 +39,6 @@ public class AnnotationTest extends AbstractApiTest { private String[] expectedApiFiles; private String annotationForExactMatch; - private List<String> expectedFailures; @Override protected void initializeFromArgs(Bundle instrumentationArgs) throws Exception { @@ -52,11 +51,8 @@ public class AnnotationTest extends AbstractApiTest { // Get the DynamicConfig.xml contents and extract the expected failures list. DynamicConfigDeviceSide dcds = new DynamicConfigDeviceSide(MODULE_NAME); - expectedFailures = dcds.getValues("expected_failures"); - Log.d(TAG, "Expected failure count: " + expectedFailures.size()); - for (String failure: expectedFailures) { - Log.d(TAG, "Expected failure: \"" + failure + "\""); - } + List<String> expectedFailures = dcds.getValues("expected_failures"); + initExpectedFailures(expectedFailures); } /** @@ -66,7 +62,7 @@ public class AnnotationTest extends AbstractApiTest { public void testAnnotation() { if ("true".equals(PropertyUtil.getProperty("ro.treble.enabled")) && PropertyUtil.getFirstApiLevel() > Build.VERSION_CODES.O_MR1) { - runWithTestResultObserver(expectedFailures, resultObserver -> { + runWithTestResultObserver(resultObserver -> { AnnotationChecker complianceChecker = new AnnotationChecker(resultObserver, classProvider, annotationForExactMatch); diff --git a/tests/signature/api-check/system-api/Android.mk b/tests/signature/api-check/system-api/Android.mk index cd3bc471056..e0a25df3ae8 100644 --- a/tests/signature/api-check/system-api/Android.mk +++ b/tests/signature/api-check/system-api/Android.mk @@ -46,6 +46,8 @@ LOCAL_PACKAGE_NAME := CtsSystemApiSignatureTestCases LOCAL_JAVA_RESOURCE_FILES := $(all_system_api_zip_file) +LOCAL_STATIC_JAVA_LIBRARIES += cts-signature-with-dynamic-config + LOCAL_SIGNATURE_API_FILES := \ current.api.gz \ android-test-mock-current.api.gz \ diff --git a/tests/signature/api-check/system-api/AndroidTest.xml b/tests/signature/api-check/system-api/AndroidTest.xml index d9685e86fb4..93832c10e8e 100644 --- a/tests/signature/api-check/system-api/AndroidTest.xml +++ b/tests/signature/api-check/system-api/AndroidTest.xml @@ -16,8 +16,13 @@ <configuration description="Config for CTS System API Signature test cases"> <option name="test-suite-tag" value="cts" /> <option name="config-descriptor:metadata" key="component" value="systems" /> - <option name="config-descriptor:metadata" key="parameter" value="instant_app" /> + <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" /> <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" /> + <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher"> + <option name="target" value="device" /> + <option name="config-filename" value="CtsSystemApiSignatureTestCases" /> + <option name="version" value="1.0" /> + </target_preparer> <option name="config-descriptor:metadata" key="parameter" value="secondary_user" /> <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> <option name="cleanup-apks" value="true" /> @@ -27,10 +32,12 @@ <option name="package" value="android.signature.cts.api.system" /> <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" /> <option name="class" value="android.signature.cts.api.system.SignatureTest" /> + <option name="instrumentation-arg" key="dynamic-config-name" value="CtsSystemApiSignatureTestCases" /> <option name="instrumentation-arg" key="base-api-files" value="current.api.gz" /> <option name="instrumentation-arg" key="system-api-files" value="system-current.api.gz,system-removed.api.gz" /> <option name="instrumentation-arg" key="previous-api-files" value = "system-all.api.zip" /> - <option name="instrumentation-arg" key="unexpected-api-files" value="android-test-mock-current.api.gz,android-test-runner-current.api.gz" /> <option name="runtime-hint" value="30s" /> + <!-- disable isolated storage so tests can access dynamic config stored in /sdcard. --> + <option name="isolated-storage" value="false" /> </test> </configuration> diff --git a/tests/signature/api-check/system-api/DynamicConfig.xml b/tests/signature/api-check/system-api/DynamicConfig.xml new file mode 100644 index 00000000000..24aa0bb4904 --- /dev/null +++ b/tests/signature/api-check/system-api/DynamicConfig.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2021 Google Inc. + + 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. +--> +<dynamicConfig> + <entry key ="expected_failures"> + <!-- + ! Each value in this section identifies an expected failure and is of the + ! form: + ! <failure-type>:<signature of class/member> + ! + ! These entries are loaded by AnnotationTest which uses them to construct + ! an ExpectedFailuresFilter which discards them. + ! + ! e.g. If the test fails with the following error message: + ! repackaged.junit.framework.AssertionFailedError: + ! extra_class: android.media.MediaParceledListSlice Error: Class annotated with android.annotation.SystemApi does not exist in the documented API + ! extra_class: android.media.MediaFrameworkInitializer Error: Class annotated with android.annotation.SystemApi does not exist in the documented API + ! extra_interface: android.media.MediaCommunicationManager$SessionCallback Error: Class annotated with android.annotation.SystemApi does not exist in the documented API + ! extra_class: android.media.MediaTranscodingManager Error: Class annotated with android.annotation.SystemApi does not exist in the documented API + ! ClassLoader hierarchy + ! + ! The first step is to check that the extra classes are expected (e.g. + ! because they have been annotated with the @SystemApi since this version + ! of the CTS tests were released and the tests are being run on an + ! Android system with a version of the mainline modules that includes + ! those changes. + ! + ! If they are not expected then this must be caused by a partner + ! inadvertently adding something to the @SystemApi so the correct + ! response is for them to stop doing that. + ! + ! If they are expected then additional entries should be added to this + ! section. That simply requires copying each error message into their own + ! <value></value> element and then removing the whitespace after the + ! first : and also removing the trailing " Error: ..." part (including + ! the leading white space). + ! + ! See below for some examples. + !--> + <!-- Bug: 209335798 --> + <value>missing_method:android.bluetooth.BluetoothHeadset#setPriority(android.bluetooth.BluetoothDevice, int)</value> + </entry> +</dynamicConfig> diff --git a/tests/signature/api-check/system-api/src/android/signature/cts/api/system/SignatureTest.java b/tests/signature/api-check/system-api/src/android/signature/cts/api/system/SignatureTest.java index 5316e31bc2e..031c9b6ed9f 100644 --- a/tests/signature/api-check/system-api/src/android/signature/cts/api/system/SignatureTest.java +++ b/tests/signature/api-check/system-api/src/android/signature/cts/api/system/SignatureTest.java @@ -16,5 +16,7 @@ package android.signature.cts.api.system; -public class SignatureTest extends android.signature.cts.api.SignatureTest { +import android.signature.cts.api.dynamic.DynamicConfigSignatureTest; + +public class SignatureTest extends DynamicConfigSignatureTest { } diff --git a/tests/signature/api-check/with-dynamic-config/Android.bp b/tests/signature/api-check/with-dynamic-config/Android.bp new file mode 100644 index 00000000000..882ac206151 --- /dev/null +++ b/tests/signature/api-check/with-dynamic-config/Android.bp @@ -0,0 +1,26 @@ +// 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. + +java_library { + name: "cts-signature-with-dynamic-config", + visibility: [ + "//cts/tests/signature:__subpackages__", + ], + sdk_version: "test_current", + static_libs: [ + "cts-api-signature-test", + "compatibility-device-util-axt", + ], + srcs: ["src/java/**/*.java"], +} diff --git a/tests/signature/api-check/with-dynamic-config/src/java/android/signature/cts/api/dynamic/DynamicConfigHiddenApiTest.java b/tests/signature/api-check/with-dynamic-config/src/java/android/signature/cts/api/dynamic/DynamicConfigHiddenApiTest.java new file mode 100644 index 00000000000..99f6b7b6f81 --- /dev/null +++ b/tests/signature/api-check/with-dynamic-config/src/java/android/signature/cts/api/dynamic/DynamicConfigHiddenApiTest.java @@ -0,0 +1,52 @@ +/* + * 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. + */ +package android.signature.cts.api.dynamic; + +import android.os.Bundle; +import android.signature.cts.api.HiddenApiTest; +import android.signature.cts.api.SignatureTest; +import androidx.test.InstrumentationRegistry; +import com.android.compatibility.common.util.DynamicConfigDeviceSide; +import java.util.Collection; + +/** + * A hidden API test that supports the use of dynamic config. + */ +public class DynamicConfigHiddenApiTest extends HiddenApiTest { + + /** + * The name of the optional instrumentation option that contains the name of the dynamic config + * data set that contains the expected failures. + */ + private static final String DYNAMIC_CONFIG_NAME_OPTION = "dynamic-config-name"; + + @Override + protected void initializeFromArgs(Bundle instrumentationArgs) throws Exception { + super.initializeFromArgs(instrumentationArgs); + + String dynamicConfigName = instrumentationArgs.getString(DYNAMIC_CONFIG_NAME_OPTION); + if (dynamicConfigName != null) { + // Make sure that the Instrumentation provided to this test is registered so it can be + // retrieved by the DynamicConfigDeviceSide below. + InstrumentationRegistry.registerInstance(getInstrumentation(), new Bundle()); + + // Get the DynamicConfig.xml contents and extract the expected failures list. + DynamicConfigDeviceSide dcds = new DynamicConfigDeviceSide(dynamicConfigName); + Collection<String> expectedFailures = dcds.getValues("expected_failures"); + initExpectedFailures(expectedFailures); + } + } +} diff --git a/tests/signature/api-check/with-dynamic-config/src/java/android/signature/cts/api/dynamic/DynamicConfigSignatureTest.java b/tests/signature/api-check/with-dynamic-config/src/java/android/signature/cts/api/dynamic/DynamicConfigSignatureTest.java new file mode 100644 index 00000000000..7b2169c6b02 --- /dev/null +++ b/tests/signature/api-check/with-dynamic-config/src/java/android/signature/cts/api/dynamic/DynamicConfigSignatureTest.java @@ -0,0 +1,51 @@ +/* + * 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. + */ +package android.signature.cts.api.dynamic; + +import android.os.Bundle; +import android.signature.cts.api.SignatureTest; +import androidx.test.InstrumentationRegistry; +import com.android.compatibility.common.util.DynamicConfigDeviceSide; +import java.util.Collection; + +/** + * A signature test that supports the use of dynamic config. + */ +public class DynamicConfigSignatureTest extends SignatureTest { + + /** + * The name of the optional instrumentation option that contains the name of the dynamic config + * data set that contains the expected failures. + */ + private static final String DYNAMIC_CONFIG_NAME_OPTION = "dynamic-config-name"; + + @Override + protected void initializeFromArgs(Bundle instrumentationArgs) throws Exception { + super.initializeFromArgs(instrumentationArgs); + + String dynamicConfigName = instrumentationArgs.getString(DYNAMIC_CONFIG_NAME_OPTION); + if (dynamicConfigName != null) { + // Make sure that the Instrumentation provided to this test is registered so it can be + // retrieved by the DynamicConfigDeviceSide below. + InstrumentationRegistry.registerInstance(getInstrumentation(), new Bundle()); + + // Get the DynamicConfig.xml contents and extract the expected failures list. + DynamicConfigDeviceSide dcds = new DynamicConfigDeviceSide(dynamicConfigName); + Collection<String> expectedFailures = dcds.getValues("expected_failures"); + initExpectedFailures(expectedFailures); + } + } +} |