diff options
author | android-build-prod (mdb) <android-build-team-robot@google.com> | 2021-01-13 21:07:19 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2021-01-13 21:07:19 +0000 |
commit | ebe2a39efad3d61e6d14f075d42873073daf7799 (patch) | |
tree | 6fd9dccbb41cbbd6495f7e0c9a5b783abd2581cf | |
parent | b263eba5e8b7e31a3603177c1f478a8442e23b17 (diff) | |
parent | 0dee4f9f015320b2fd33830a890741e26f17f60e (diff) | |
download | cts-ebe2a39efad3d61e6d14f075d42873073daf7799.tar.gz |
Merge "Snap for 7080300 from e9241a0697b947d56118a8cd3b4bc141529d7020 to android11-tests-release" into android11-tests-release
5 files changed, 68 insertions, 15 deletions
diff --git a/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java b/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java index edafafd4e7c..c58c0e40221 100644 --- a/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java +++ b/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java @@ -19,6 +19,7 @@ package android.providerui.cts; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.app.Activity; @@ -38,13 +39,17 @@ import android.os.ParcelFileDescriptor; import android.os.storage.StorageManager; import android.os.storage.StorageVolume; import android.os.UserManager; +import android.provider.DocumentsContract; import android.provider.MediaStore; import android.provider.cts.ProviderTestUtils; import android.providerui.cts.GetResultActivity.Result; import android.support.test.uiautomator.By; import android.support.test.uiautomator.BySelector; import android.support.test.uiautomator.UiDevice; +import android.support.test.uiautomator.UiObject; import android.support.test.uiautomator.UiObject2; +import android.support.test.uiautomator.UiObjectNotFoundException; +import android.support.test.uiautomator.UiSelector; import android.support.test.uiautomator.Until; import android.system.Os; import android.text.format.DateUtils; @@ -76,6 +81,7 @@ public class MediaStoreUiTest { private static final String TAG = "MediaStoreUiTest"; private static final int REQUEST_CODE = 42; + private static final long TIMEOUT_MILLIS = 30 * DateUtils.SECOND_IN_MILLIS; private Instrumentation mInstrumentation; private Context mContext; @@ -211,31 +217,43 @@ public class MediaStoreUiTest { Log.v(TAG, "Staged " + mFile + " as " + mMediaStoreUri); } - private Uri acquireAccess(File file, String directoryName) { + private void assertToolbarTitleEquals(String targetPackageName, String label) + throws UiObjectNotFoundException { + final UiSelector toolbarUiSelector = new UiSelector().resourceId( + targetPackageName + ":id/toolbar"); + final UiSelector titleTextSelector = new UiSelector().className( + "android.widget.TextView").text(label); + final UiObject title = new UiObject(toolbarUiSelector.childSelector(titleTextSelector)); + + assertTrue(title.waitForExists(TIMEOUT_MILLIS)); + } + + private Uri acquireAccess(File file, String directoryName) throws Exception { StorageManager storageManager = (StorageManager) mActivity.getSystemService(Context.STORAGE_SERVICE); // Request access from DocumentsUI final StorageVolume volume = storageManager.getStorageVolume(file); final Intent intent = volume.createOpenDocumentTreeIntent(); + + // launch the directory directly to avoid unexpected UiObject not found issue + final Uri rootUri = intent.getParcelableExtra(DocumentsContract.EXTRA_INITIAL_URI); + final String rootId = DocumentsContract.getRootId(rootUri); + final String documentId = rootId + ":" + directoryName; + intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, + DocumentsContract.buildDocumentUri(rootUri.getAuthority(), documentId)); mActivity.startActivityForResult(intent, REQUEST_CODE); if (mTargetPackageName == null) { mTargetPackageName = getTargetPackageName(mActivity); } - - // We started at the root of the storage device, and need to navigate - // into the requested directory - final BySelector directorySelector = By.pkg(mTargetPackageName) - .text(directoryName); - mDevice.wait(Until.hasObject(directorySelector), 30 * DateUtils.SECOND_IN_MILLIS); - mDevice.findObject(directorySelector).click(); mDevice.waitForIdle(); + assertToolbarTitleEquals(mTargetPackageName, directoryName); // Granting the access BySelector buttonPanelSelector = By.pkg(mTargetPackageName) .res(mTargetPackageName + ":id/container_save"); - mDevice.wait(Until.hasObject(buttonPanelSelector), 30 * DateUtils.SECOND_IN_MILLIS); + mDevice.wait(Until.hasObject(buttonPanelSelector), TIMEOUT_MILLIS); final UiObject2 buttonPanel = mDevice.findObject(buttonPanelSelector); final UiObject2 allowButton = buttonPanel.findObject(By.res("android:id/button1")); allowButton.click(); @@ -244,7 +262,7 @@ public class MediaStoreUiTest { // Granting the access by click "allow" in confirm dialog final BySelector dialogButtonPanelSelector = By.pkg(mTargetPackageName) .res(mTargetPackageName + ":id/buttonPanel"); - mDevice.wait(Until.hasObject(dialogButtonPanelSelector), 30 * DateUtils.SECOND_IN_MILLIS); + mDevice.wait(Until.hasObject(dialogButtonPanelSelector), TIMEOUT_MILLIS); final UiObject2 positiveButton = mDevice.findObject(dialogButtonPanelSelector) .findObject(By.res("android:id/button1")); positiveButton.click(); @@ -258,7 +276,7 @@ public class MediaStoreUiTest { final Uri resultUri = resultIntent.getData(); final int flags = resultIntent.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION - | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); mActivity.getContentResolver().takePersistableUriPermission(resultUri, flags); return resultUri; } diff --git a/tests/security/src/android/keystore/cts/Asn1Utils.java b/tests/security/src/android/keystore/cts/Asn1Utils.java index 958665141d9..933def8aac0 100644 --- a/tests/security/src/android/keystore/cts/Asn1Utils.java +++ b/tests/security/src/android/keystore/cts/Asn1Utils.java @@ -137,15 +137,26 @@ public class Asn1Utils { public static boolean getBooleanFromAsn1(ASN1Encodable value) throws CertificateParsingException { + return getBooleanFromAsn1(value, true); + } + + public static boolean getBooleanFromAsn1(ASN1Encodable value, boolean strictParsing) + throws CertificateParsingException { if (!(value instanceof ASN1Boolean)) { throw new CertificateParsingException( "Expected boolean, found " + value.getClass().getName()); } ASN1Boolean booleanValue = (ASN1Boolean) value; + if (booleanValue.equals(ASN1Boolean.TRUE)) { return true; } else if (booleanValue.equals((ASN1Boolean.FALSE))) { return false; + } else if (!strictParsing) { + // Value is not 0xFF nor 0x00, but some other non-zero value. + // This is invalid DER, but if we're not being strict, + // consider it true, otherwise fall through and throw exception + return true; } throw new CertificateParsingException( diff --git a/tests/security/src/android/keystore/cts/Attestation.java b/tests/security/src/android/keystore/cts/Attestation.java index 2285cadb652..2b7715a31a9 100644 --- a/tests/security/src/android/keystore/cts/Attestation.java +++ b/tests/security/src/android/keystore/cts/Attestation.java @@ -66,6 +66,11 @@ public class Attestation { * attestation extension. */ public Attestation(X509Certificate x509Cert) throws CertificateParsingException { + this(x509Cert, true); + } + + public Attestation(X509Certificate x509Cert, boolean strictParsing) + throws CertificateParsingException { ASN1Sequence seq = getAttestationSequence(x509Cert); unexpectedExtensionOids = retrieveUnexpectedExtensionOids(x509Cert); @@ -79,8 +84,18 @@ public class Attestation { uniqueId = Asn1Utils.getByteArrayFromAsn1(seq.getObjectAt(Attestation.UNIQUE_ID_INDEX)); - softwareEnforced = new AuthorizationList(seq.getObjectAt(SW_ENFORCED_INDEX)); - teeEnforced = new AuthorizationList(seq.getObjectAt(TEE_ENFORCED_INDEX)); + softwareEnforced = new AuthorizationList(seq.getObjectAt(SW_ENFORCED_INDEX), strictParsing); + teeEnforced = new AuthorizationList(seq.getObjectAt(TEE_ENFORCED_INDEX), strictParsing); + } + + public static Attestation loadFromCertificate(X509Certificate x509Cert) + throws CertificateParsingException { + return new Attestation(x509Cert); + } + + public static Attestation loadFromCertificate(X509Certificate x509Cert, boolean strictParsing) + throws CertificateParsingException { + return new Attestation(x509Cert, strictParsing); } public static String securityLevelToString(int attestationSecurityLevel) { diff --git a/tests/security/src/android/keystore/cts/AuthorizationList.java b/tests/security/src/android/keystore/cts/AuthorizationList.java index 85ac115c671..725bc14d291 100644 --- a/tests/security/src/android/keystore/cts/AuthorizationList.java +++ b/tests/security/src/android/keystore/cts/AuthorizationList.java @@ -203,7 +203,12 @@ public class AuthorizationList { private boolean userPresenceRequired; private boolean confirmationRequired; + public AuthorizationList(ASN1Encodable sequence) throws CertificateParsingException { + this(sequence, true); + } + + public AuthorizationList(ASN1Encodable sequence, boolean strictParsing) throws CertificateParsingException { if (!(sequence instanceof ASN1Sequence)) { throw new CertificateParsingException("Expected sequence for authorization list, found " + sequence.getClass().getName()); @@ -287,7 +292,7 @@ public class AuthorizationList { userAuthType = Asn1Utils.getIntegerFromAsn1(value); break; case KM_TAG_ROOT_OF_TRUST & KEYMASTER_TAG_TYPE_MASK: - rootOfTrust = new RootOfTrust(value); + rootOfTrust = new RootOfTrust(value, strictParsing); break; case KM_TAG_ATTESTATION_APPLICATION_ID & KEYMASTER_TAG_TYPE_MASK: attestationApplicationId = new AttestationApplicationId(Asn1Utils diff --git a/tests/security/src/android/keystore/cts/RootOfTrust.java b/tests/security/src/android/keystore/cts/RootOfTrust.java index 99577021b96..b9a711e10ea 100644 --- a/tests/security/src/android/keystore/cts/RootOfTrust.java +++ b/tests/security/src/android/keystore/cts/RootOfTrust.java @@ -38,6 +38,10 @@ public class RootOfTrust { private final int verifiedBootState; public RootOfTrust(ASN1Encodable asn1Encodable) throws CertificateParsingException { + this(asn1Encodable, true); + } + + public RootOfTrust(ASN1Encodable asn1Encodable, boolean strictParsing) throws CertificateParsingException { if (!(asn1Encodable instanceof ASN1Sequence)) { throw new CertificateParsingException("Expected sequence for root of trust, found " + asn1Encodable.getClass().getName()); @@ -46,7 +50,7 @@ public class RootOfTrust { ASN1Sequence sequence = (ASN1Sequence) asn1Encodable; verifiedBootKey = Asn1Utils.getByteArrayFromAsn1(sequence.getObjectAt(VERIFIED_BOOT_KEY_INDEX)); - deviceLocked = Asn1Utils.getBooleanFromAsn1(sequence.getObjectAt(DEVICE_LOCKED_INDEX)); + deviceLocked = Asn1Utils.getBooleanFromAsn1(sequence.getObjectAt(DEVICE_LOCKED_INDEX), strictParsing); verifiedBootState = Asn1Utils.getIntegerFromAsn1(sequence.getObjectAt(VERIFIED_BOOT_STATE_INDEX)); } |