blob: 647940888bd3b4a09fe3b92e43ec69261fbe83bb [file] [log] [blame]
package org.robolectric.shadows;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_ERRORED;
import static android.app.AppOpsManager.OPSTR_GPS;
import static android.app.AppOpsManager.OP_GPS;
import static android.app.AppOpsManager.OP_SEND_SMS;
import static android.os.Build.VERSION_CODES.KITKAT;
import static com.google.common.truth.Truth.assertThat;
import android.app.AppOpsManager;
import android.app.AppOpsManager.OpEntry;
import android.app.AppOpsManager.PackageOps;
import android.content.Context;
import android.os.Build.VERSION_CODES;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
/**
* Unit tests for {@link ShadowAppOpsManager}.
*/
@RunWith(RobolectricTestRunner.class)
@Config(minSdk = KITKAT)
public class ShadowAppOpsManagerTest {
private static final String PACKAGE_NAME1 = "com.company1.pkg1";
private static final String PACKAGE_NAME2 = "com.company2.pkg2";
private static final int UID_1 = 10000;
private static final int UID_2 = 10001;
// Can be used as an argument of getOpsForPackage().
private static final int[] NO_OP_FILTER = null;
private AppOpsManager appOps;
@Before
public void setUp() {
appOps = (AppOpsManager) RuntimeEnvironment.application.getSystemService(
Context.APP_OPS_SERVICE);
}
@Test
@Config(maxSdk = VERSION_CODES.O_MR1)
public void setMode_checkOpNoThrow_belowP() {
assertThat(appOps.checkOpNoThrow(OP_GPS, UID_1, PACKAGE_NAME1)).isEqualTo(MODE_ERRORED);
appOps.setMode(OP_GPS, UID_1, PACKAGE_NAME1, MODE_ALLOWED);
assertThat(appOps.checkOpNoThrow(OP_GPS, UID_1, PACKAGE_NAME1)).isEqualTo(MODE_ALLOWED);
}
@Test
@Config(minSdk = VERSION_CODES.P)
public void setMode_checkOpNoThrow_atLeastP() {
assertThat(appOps.checkOpNoThrow(OPSTR_GPS, UID_1, PACKAGE_NAME1)).isEqualTo(MODE_ERRORED);
appOps.setMode(OPSTR_GPS, UID_1, PACKAGE_NAME1, MODE_ALLOWED);
assertThat(appOps.checkOpNoThrow(OPSTR_GPS, UID_1, PACKAGE_NAME1)).isEqualTo(MODE_ALLOWED);
}
@Test
public void noteOp() {
assertThat(appOps.noteOp(OP_GPS, UID_1, PACKAGE_NAME1)).isEqualTo(MODE_ALLOWED);
// Use same op more than once
assertThat(appOps.noteOp(OP_GPS, UID_1, PACKAGE_NAME1)).isEqualTo(MODE_ALLOWED);
assertThat(appOps.noteOp(OP_SEND_SMS, UID_1, PACKAGE_NAME1)).isEqualTo(MODE_ALLOWED);
}
@Test
public void getOpsForPackage_noOps() {
List<PackageOps> results = appOps.getOpsForPackage(UID_1, PACKAGE_NAME1, NO_OP_FILTER);
assertOps(results);
}
@Test
public void getOpsForPackage_hasOps() {
appOps.noteOp(OP_GPS, UID_1, PACKAGE_NAME1);
appOps.noteOp(OP_SEND_SMS, UID_1, PACKAGE_NAME1);
// PACKAGE_NAME2 has ops.
List<PackageOps> results = appOps.getOpsForPackage(UID_1, PACKAGE_NAME1, NO_OP_FILTER);
assertOps(results, OP_GPS, OP_SEND_SMS);
// PACKAGE_NAME2 has no ops.
results = appOps.getOpsForPackage(UID_2, PACKAGE_NAME2, NO_OP_FILTER);
assertOps(results);
}
@Test
public void getOpsForPackage_withOpFilter() {
List<PackageOps> results = appOps.getOpsForPackage(
UID_1, PACKAGE_NAME1, new int[]{OP_GPS});
assertOps(results);
appOps.noteOp(OP_SEND_SMS, UID_1, PACKAGE_NAME1);
results = appOps.getOpsForPackage(UID_1, PACKAGE_NAME1, new int[]{OP_GPS});
assertOps(results);
appOps.noteOp(OP_GPS, UID_1, PACKAGE_NAME1);
results = appOps.getOpsForPackage(UID_1, PACKAGE_NAME1, new int[]{OP_GPS});
assertOps(results, OP_GPS);
}
/**
* Assert that the results contain the expected op codes.
*/
private void assertOps(List<PackageOps> pkgOps, Integer... expectedOps) {
Set<Integer> actualOps = new HashSet<>();
for (PackageOps pkgOp : pkgOps) {
for (OpEntry entry : pkgOp.getOps()) {
actualOps.add(entry.getOp());
}
}
assertThat(actualOps).containsAllIn(expectedOps);
}
}