summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-01-12 21:09:41 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2022-01-12 21:09:41 +0000
commit3ed8bc39c947e27de116e63748377bcb3254211c (patch)
tree0bc5699597a52eeacedb3b661368866de3d8194a
parent3a148e69cecf412216fe343f46a1c924a7c0b1a0 (diff)
parent559d4fd11f5e1fc72ee4df2827a2c25fce26634b (diff)
downloadcts-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
-rw-r--r--tests/signature/api-check/Android.bp22
-rw-r--r--tests/signature/api-check/CtsHiddenApiBlocklistApiDynamicConfig.dynamic67
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-27-api/Android.bp8
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-27-api/AndroidTest.xml10
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-27-api/src/android/signature/cts/api/api27/HiddenApiTest.java4
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-28-api/Android.bp8
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-28-api/AndroidTest.xml10
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-28-api/src/android/signature/cts/api/api28/HiddenApiTest.java4
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-current-api/Android.bp3
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-current-api/AndroidTest.xml10
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-current-api/src/android/signature/cts/api/current/HiddenApiTest.java4
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-debug-class/Android.bp8
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidTest.xml12
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-debug-class/src/android/signature/cts/api/blocklist/debug/DebugClassHiddenApiTest.java (renamed from tests/signature/api-check/src/java/android/signature/cts/api/DebugClassHiddenApiTest.java)5
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-test-api/Android.bp8
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-test-api/AndroidTest.xml10
-rw-r--r--tests/signature/api-check/hidden-api-blacklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java15
-rw-r--r--tests/signature/api-check/src/java/android/signature/cts/api/AbstractApiTest.java27
-rw-r--r--tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java2
-rw-r--r--tests/signature/api-check/src/java/android/signature/cts/api/SignatureTest.java2
-rw-r--r--tests/signature/api-check/system-annotation/src/java/android/signature/cts/api/AnnotationTest.java10
-rw-r--r--tests/signature/api-check/system-api/Android.mk2
-rw-r--r--tests/signature/api-check/system-api/AndroidTest.xml11
-rw-r--r--tests/signature/api-check/system-api/DynamicConfig.xml55
-rw-r--r--tests/signature/api-check/system-api/src/android/signature/cts/api/system/SignatureTest.java4
-rw-r--r--tests/signature/api-check/with-dynamic-config/Android.bp26
-rw-r--r--tests/signature/api-check/with-dynamic-config/src/java/android/signature/cts/api/dynamic/DynamicConfigHiddenApiTest.java52
-rw-r--r--tests/signature/api-check/with-dynamic-config/src/java/android/signature/cts/api/dynamic/DynamicConfigSignatureTest.java51
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);
+ }
+ }
+}