/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.cts.usespermissiondiffcertapp; 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.content.ClipData; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.UriPermission; import android.database.Cursor; import android.net.Uri; import androidx.test.InstrumentationRegistry; import java.io.IOException; import java.util.List; public class Asserts { private static Context getContext() { return InstrumentationRegistry.getTargetContext(); } static void assertAccess(ClipData clip, int mode) { for (int i = 0; i < clip.getItemCount(); i++) { ClipData.Item item = clip.getItemAt(i); Uri uri = item.getUri(); if (uri != null) { assertAccess(uri, mode); } else { Intent intent = item.getIntent(); uri = intent.getData(); if (uri != null) { assertAccess(uri, mode); } ClipData intentClip = intent.getClipData(); if (intentClip != null) { assertAccess(intentClip, mode); } } } } static void assertAccess(Uri uri, int mode) { if ((mode & Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) { assertReadingContentUriAllowed(uri); } else { assertReadingContentUriNotAllowed(uri, null); } if ((mode & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) { assertWritingContentUriAllowed(uri); } else { assertWritingContentUriNotAllowed(uri, null); } } static void assertReadingContentUriNotAllowed(Uri uri, String msg) { try { getContext().getContentResolver().query(uri, null, null, null, null); fail("expected SecurityException reading " + uri + ": " + msg); } catch (SecurityException expected) { assertNotNull("security exception's error message.", expected.getMessage()); } } static void assertReadingContentUriAllowed(Uri uri) { try { getContext().getContentResolver().query(uri, null, null, null, null); } catch (SecurityException e) { fail("unexpected SecurityException reading " + uri + ": " + e.getMessage()); } } static void assertReadingClipNotAllowed(ClipData clip) { assertReadingClipNotAllowed(clip, null); } static void assertReadingClipNotAllowed(ClipData clip, String msg) { for (int i=0; i perms = getContext() .getContentResolver().getPersistedUriPermissions(); if (uri != null) { assertEquals("expected exactly one permission", 1, perms.size()); final UriPermission perm = perms.get(0); assertEquals("unexpected uri", uri, perm.getUri()); final long actual = perm.getPersistedTime(); if (before != -1) { assertTrue("found " + actual + " before " + before, actual >= before); } if (after != -1) { assertTrue("found " + actual + " after " + after, actual <= after); } final boolean expectedRead = (flags & Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0; final boolean expectedWrite = (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0; assertEquals("unexpected read status", expectedRead, perm.isReadPermission()); assertEquals("unexpected write status", expectedWrite, perm.isWritePermission()); } else { assertEquals("expected zero permissions", 0, perms.size()); } Utils.verifyOutgoingPersisted(uri); } }