blob: 1b21a503e47269f80e3865bf74c06f0d42800fbf [file] [log] [blame]
/*
* 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 android.permission.cts;
import static android.Manifest.permission.ACCESS_BACKGROUND_LOCATION;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.READ_CALL_LOG;
import static android.Manifest.permission.READ_CONTACTS;
import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE;
import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_WHEN_REQUESTED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
import static android.permission.cts.PermissionUtils.clearAppState;
import static android.permission.cts.PermissionUtils.eventually;
import static android.permission.cts.PermissionUtils.getPermissionFlags;
import static android.permission.cts.PermissionUtils.install;
import static android.permission.cts.PermissionUtils.isGranted;
import static android.permission.cts.PermissionUtils.setPermissionFlags;
import static android.permission.cts.PermissionUtils.uninstallApp;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.platform.test.annotations.AppModeFull;
import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests how permission flags behave.
*/
@RunWith(AndroidJUnit4.class)
@AppModeFull(reason = "Cannot read permission flags of other app.")
public class PermissionFlagsTest {
/** The package name of all apps used in the test */
private static final String APP_PKG = "android.permission.cts.appthatrequestpermission";
private static final String TMP_DIR = "/data/local/tmp/cts/permissions/";
private static final String APK_CONTACTS_15 =
TMP_DIR + "CtsAppThatRequestsContactsPermission15.apk";
private static final String APK_LOCATION_22 =
TMP_DIR + "CtsAppThatRequestsLocationPermission22.apk";
private static final String APK_LOCATION_28 =
TMP_DIR + "CtsAppThatRequestsLocationPermission28.apk";
@After
public void uninstallTestApp() {
uninstallApp(APP_PKG);
}
@Test
public void implicitPermission() {
install(APK_LOCATION_28);
assertEquals(FLAG_PERMISSION_REVOKE_WHEN_REQUESTED,
getPermissionFlags(APP_PKG, ACCESS_BACKGROUND_LOCATION));
}
@Test
public void regularPermission() {
install(APK_LOCATION_28);
assertEquals(0, getPermissionFlags(APP_PKG, ACCESS_COARSE_LOCATION));
}
@Test
public void regularPermissionPreM() {
install(APK_CONTACTS_15);
assertEquals(FLAG_PERMISSION_REVOKE_ON_UPGRADE | FLAG_PERMISSION_REVIEW_REQUIRED,
getPermissionFlags(APP_PKG, READ_CONTACTS));
}
@Test
public void implicitPermissionPreM() {
install(APK_CONTACTS_15);
assertEquals(FLAG_PERMISSION_REVOKE_ON_UPGRADE | FLAG_PERMISSION_REVIEW_REQUIRED |
FLAG_PERMISSION_REVOKE_WHEN_REQUESTED, getPermissionFlags(APP_PKG, READ_CALL_LOG));
}
@Test
public void clearRegularPermissionPreM() {
install(APK_CONTACTS_15);
int defaultState = getPermissionFlags(APP_PKG, READ_CONTACTS);
setPermissionFlags(APP_PKG, READ_CONTACTS, FLAG_PERMISSION_REVIEW_REQUIRED, 0);
setPermissionFlags(APP_PKG, READ_CONTACTS,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED);
clearAppState(APP_PKG);
eventually(() -> assertEquals(defaultState, getPermissionFlags(APP_PKG, READ_CONTACTS)));
}
@Test
public void clearImplicitPermissionPreM() {
install(APK_CONTACTS_15);
int defaultState = getPermissionFlags(APP_PKG, READ_CALL_LOG);
setPermissionFlags(APP_PKG, READ_CALL_LOG, FLAG_PERMISSION_REVIEW_REQUIRED, 0);
setPermissionFlags(APP_PKG, READ_CALL_LOG,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED);
clearAppState(APP_PKG);
eventually(() -> assertEquals(defaultState, getPermissionFlags(APP_PKG, READ_CALL_LOG)));
}
@Test
public void clearRegularPermission() {
install(APK_LOCATION_28);
int defaultState = getPermissionFlags(APP_PKG, ACCESS_COARSE_LOCATION);
setPermissionFlags(APP_PKG, ACCESS_COARSE_LOCATION,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED);
clearAppState(APP_PKG);
eventually(() -> assertEquals(defaultState,
getPermissionFlags(APP_PKG, ACCESS_COARSE_LOCATION)));
}
@Test
public void clearImplicitPermission() {
install(APK_LOCATION_28);
int defaultState = getPermissionFlags(APP_PKG, ACCESS_BACKGROUND_LOCATION);
setPermissionFlags(APP_PKG, ACCESS_BACKGROUND_LOCATION,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED);
clearAppState(APP_PKG);
eventually(() -> assertEquals(defaultState,
getPermissionFlags(APP_PKG, ACCESS_BACKGROUND_LOCATION)));
}
@Test
public void reinstallPreM() {
install(APK_CONTACTS_15);
install(APK_CONTACTS_15);
assertEquals(FLAG_PERMISSION_REVOKE_ON_UPGRADE | FLAG_PERMISSION_REVIEW_REQUIRED,
getPermissionFlags(APP_PKG, READ_CONTACTS));
assertEquals(FLAG_PERMISSION_REVOKE_ON_UPGRADE | FLAG_PERMISSION_REVIEW_REQUIRED |
FLAG_PERMISSION_REVOKE_WHEN_REQUESTED, getPermissionFlags(APP_PKG, READ_CALL_LOG));
}
@Test
public void reinstallDoesNotOverrideChangesPreM() {
install(APK_CONTACTS_15);
setPermissionFlags(APP_PKG, READ_CONTACTS, FLAG_PERMISSION_REVIEW_REQUIRED, 0);
setPermissionFlags(APP_PKG, READ_CONTACTS,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED);
setPermissionFlags(APP_PKG, READ_CALL_LOG, FLAG_PERMISSION_REVIEW_REQUIRED, 0);
setPermissionFlags(APP_PKG, READ_CALL_LOG,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED);
install(APK_CONTACTS_15);
assertEquals(FLAG_PERMISSION_REVOKE_ON_UPGRADE | FLAG_PERMISSION_USER_SET
| FLAG_PERMISSION_USER_FIXED,
getPermissionFlags(APP_PKG, READ_CONTACTS));
assertEquals(FLAG_PERMISSION_REVOKE_ON_UPGRADE | FLAG_PERMISSION_USER_SET
| FLAG_PERMISSION_USER_FIXED | FLAG_PERMISSION_REVOKE_WHEN_REQUESTED,
getPermissionFlags(APP_PKG, READ_CALL_LOG));
}
@Test
public void reinstall() {
install(APK_LOCATION_28);
install(APK_LOCATION_28);
assertEquals(0, getPermissionFlags(APP_PKG, ACCESS_COARSE_LOCATION));
assertEquals(FLAG_PERMISSION_REVOKE_WHEN_REQUESTED,
getPermissionFlags(APP_PKG, ACCESS_BACKGROUND_LOCATION));
}
@Test
public void reinstallDoesNotOverrideChanges() {
install(APK_LOCATION_28);
setPermissionFlags(APP_PKG, ACCESS_COARSE_LOCATION,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED);
setPermissionFlags(APP_PKG, ACCESS_BACKGROUND_LOCATION,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED,
FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED);
install(APK_LOCATION_28);
assertEquals(FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED,
getPermissionFlags(APP_PKG, ACCESS_COARSE_LOCATION));
assertEquals(FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED
| FLAG_PERMISSION_REVOKE_WHEN_REQUESTED,
getPermissionFlags(APP_PKG, ACCESS_BACKGROUND_LOCATION));
}
@Test
public void preMPermsAreMarkedRevokeOnUpgrade() throws Exception {
install(APK_LOCATION_22);
assertEquals(FLAG_PERMISSION_REVOKE_ON_UPGRADE,
getPermissionFlags(APP_PKG, ACCESS_COARSE_LOCATION)
& FLAG_PERMISSION_REVOKE_ON_UPGRADE);
assertEquals(FLAG_PERMISSION_REVOKE_ON_UPGRADE,
getPermissionFlags(APP_PKG, ACCESS_BACKGROUND_LOCATION)
& FLAG_PERMISSION_REVOKE_ON_UPGRADE);
}
@Test
public void revokeOnUpgrade() throws Exception {
install(APK_LOCATION_22);
setPermissionFlags(APP_PKG, ACCESS_COARSE_LOCATION, FLAG_PERMISSION_REVOKE_ON_UPGRADE, 0);
install(APK_LOCATION_28);
assertTrue(isGranted(APP_PKG, ACCESS_COARSE_LOCATION));
assertFalse(isGranted(APP_PKG, ACCESS_BACKGROUND_LOCATION));
assertEquals(0,getPermissionFlags(APP_PKG, ACCESS_COARSE_LOCATION)
& FLAG_PERMISSION_REVOKE_ON_UPGRADE);
assertEquals(0,getPermissionFlags(APP_PKG, ACCESS_BACKGROUND_LOCATION)
& FLAG_PERMISSION_REVOKE_ON_UPGRADE);
}
}