blob: c9ea3b6aa02ed6f8e00ea1b2897bdeafca44fdd0 [file] [log] [blame]
Marcus Hagerott8ac989c2016-10-04 08:45:58 -07001package com.android.contacts;
2
3import android.Manifest;
4import android.content.Context;
5import android.content.Intent;
Marcus Hagerott03a8bb02016-10-06 08:50:01 -07006import android.content.pm.PackageManager;
Marcus Hagerott8ac989c2016-10-04 08:45:58 -07007import android.support.test.InstrumentationRegistry;
8import android.support.test.filters.MediumTest;
Marcus Hagerott819214d2016-09-29 14:58:27 -07009import android.support.test.filters.Suppress;
Marcus Hagerott8ac989c2016-10-04 08:45:58 -070010import android.support.test.runner.AndroidJUnit4;
11import android.support.test.uiautomator.By;
12import android.support.test.uiautomator.UiDevice;
13import android.support.test.uiautomator.UiObject2;
14import android.support.test.uiautomator.Until;
15
16import org.junit.Before;
17import org.junit.Test;
18import org.junit.runner.RunWith;
19
20import static com.android.contacts.common.util.PermissionsUtil.hasPermission;
21import static org.junit.Assume.assumeTrue;
22
23/**
24 * Make sure the app doesn't crash when it is started without permissions. Note: this won't
25 * run in most environments because permissions will already have been granted.
26 *
27 * To exercise this run:
28 *
29 * $ adb shell pm revoke com.android.contacts android.permission.READ_CONTACTS
30 * $ adb shell pm revoke com.android.contacts android.permission.WRITE_CONTACTS
31 * $ adb shell pm revoke com.android.contacts android.permission.GET_ACCOUNTS
32 * $ adb shell pm revoke com.android.contacts android.permission.READ_PHONE_STATE
33 * $ adb shell pm revoke com.android.contacts android.permission.READ_CALL_LOG
34 * $ adb shell pm revoke com.android.contacts android.permission.CALL_PHONE
35 * $ adb shell am instrument -w \
36 * com.google.android.contacts.tests/android.support.test.runner.AndroidJUnitRunner \
37 * -e class com.android.contacts.NoPermissionsLaunchSmokeTest
38 */
39@MediumTest
Marcus Hagerott819214d2016-09-29 14:58:27 -070040// suppressed because failed assumptions are reported as test failures by the build server
41@Suppress
Marcus Hagerott8ac989c2016-10-04 08:45:58 -070042@RunWith(AndroidJUnit4.class)
43public class NoPermissionsLaunchSmokeTest {
44 private static final long TIMEOUT = 5000;
45
46 private Context mTargetContext;
47
48 @Before
49 public void setUp() throws Exception {
50 mTargetContext = InstrumentationRegistry.getTargetContext();
51 assumeTrue(!hasPermission(mTargetContext, Manifest.permission.READ_CONTACTS));
52 assumeTrue(!hasPermission(mTargetContext, Manifest.permission.WRITE_CONTACTS));
53 assumeTrue(!hasPermission(mTargetContext, Manifest.permission.GET_ACCOUNTS));
54 assumeTrue(!hasPermission(mTargetContext, Manifest.permission.READ_PHONE_STATE));
55 assumeTrue(!hasPermission(mTargetContext, Manifest.permission.READ_CALL_LOG));
56 assumeTrue(!hasPermission(mTargetContext, Manifest.permission.CALL_PHONE));
57
58 // remove state that might exist outside of the app
59 // (e.g. launcher shortcuts and scheduled jobs)
60 DynamicShortcuts.reset(mTargetContext);
61 }
62
63 @Test
64 public void launchingMainActivityDoesntCrash() throws Exception {
65 final UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
66
67 // Launch the main activity
68 InstrumentationRegistry.getContext().startActivity(
69 new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_DEFAULT)
70 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
71 .setPackage(InstrumentationRegistry.getTargetContext().getPackageName()));
72
73 device.waitForIdle();
74
75 device.wait(Until.hasObject(By.textStartsWith("Allow Contacts")), TIMEOUT);
76 final UiObject2 grantContactsPermissionButton = device.findObject(By.text("ALLOW"));
77
78 grantContactsPermissionButton.click();
79
80 device.wait(Until.hasObject(By.textEndsWith("make and manage phone calls?")), TIMEOUT);
81
Marcus Hagerott03a8bb02016-10-06 08:50:01 -070082 final PackageManager packageManager = mTargetContext.getPackageManager();
83 if (!packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
84 device.waitForIdle();
85 return;
86 }
87
Marcus Hagerott8ac989c2016-10-04 08:45:58 -070088 final UiObject2 grantPhonePermissionButton = device.findObject(By.text("ALLOW"));
89
90 grantPhonePermissionButton.clickAndWait(Until.newWindow(), TIMEOUT);
91
92 // Not sure if this actually waits for the load to complete or not.
93 device.waitForIdle();
94 }
95
96 // TODO: it would be good to have similar tests for other entry points that might be reached
97 // without required permissions.
98}