• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.settings.development;
2 
3 import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes.REQUEST_MOCK_LOCATION_APP;
4 import static com.google.common.truth.Truth.assertThat;
5 import static org.mockito.ArgumentMatchers.any;
6 import static org.mockito.ArgumentMatchers.anyInt;
7 import static org.mockito.ArgumentMatchers.anyString;
8 import static org.mockito.ArgumentMatchers.eq;
9 import static org.mockito.Mockito.spy;
10 import static org.mockito.Mockito.verify;
11 import static org.mockito.Mockito.when;
12 
13 import android.app.Activity;
14 import android.app.AppOpsManager;
15 import android.content.Context;
16 import android.content.Intent;
17 import android.content.pm.ApplicationInfo;
18 import android.content.pm.PackageManager;
19 import android.support.v7.preference.Preference;
20 import android.support.v7.preference.PreferenceScreen;
21 
22 import com.android.settings.R;
23 import com.android.settings.testutils.SettingsRobolectricTestRunner;
24 import com.android.settingslib.wrapper.PackageManagerWrapper;
25 
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.mockito.Mock;
30 import org.mockito.MockitoAnnotations;
31 import org.robolectric.RuntimeEnvironment;
32 import org.robolectric.util.ReflectionHelpers;
33 
34 import java.util.Collections;
35 
36 @RunWith(SettingsRobolectricTestRunner.class)
37 public class MockLocationAppPreferenceControllerTest {
38 
39     @Mock
40     private DevelopmentSettingsDashboardFragment mFragment;
41     @Mock
42     private AppOpsManager mAppOpsManager;
43     @Mock
44     private PackageManagerWrapper mPackageManager;
45     @Mock
46     private Preference mPreference;
47     @Mock
48     private PreferenceScreen mScreen;
49     @Mock
50     private AppOpsManager.PackageOps mPackageOps;
51     @Mock
52     private AppOpsManager.OpEntry mOpEntry;
53     @Mock
54     private ApplicationInfo mApplicationInfo;
55 
56     private Context mContext;
57     private MockLocationAppPreferenceController mController;
58 
59     @Before
setup()60     public void setup() {
61         MockitoAnnotations.initMocks(this);
62         mContext = RuntimeEnvironment.application;
63         mController = spy(new MockLocationAppPreferenceController(mContext, mFragment));
64         ReflectionHelpers.setField(mController, "mAppsOpsManager", mAppOpsManager);
65         ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager);
66         when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
67         mController.displayPreference(mScreen);
68     }
69 
70     @Test
updateState_foobarAppSelected_shouldSetSummaryToFoobar()71     public void updateState_foobarAppSelected_shouldSetSummaryToFoobar() {
72         final String appName = "foobar";
73         when(mAppOpsManager.getPackagesForOps(any())).thenReturn(
74                 Collections.singletonList(mPackageOps));
75         when(mPackageOps.getOps()).thenReturn(Collections.singletonList(mOpEntry));
76         when(mOpEntry.getMode()).thenReturn(AppOpsManager.MODE_ALLOWED);
77         when(mPackageOps.getPackageName()).thenReturn(appName);
78 
79         mController.updateState(mPreference);
80 
81         verify(mPreference).setSummary(mContext.getString(R.string.mock_location_app_set, appName));
82     }
83 
84     @Test
updateState_noAppSelected_shouldSetSummaryToDefault()85     public void updateState_noAppSelected_shouldSetSummaryToDefault() {
86         when(mAppOpsManager.getPackagesForOps(any())).thenReturn(Collections.emptyList());
87 
88         mController.updateState(mPreference);
89 
90         verify(mPreference).setSummary(mContext.getString(R.string.mock_location_app_not_set));
91     }
92 
93     @Test
onActivityResult_fooPrevAppBarNewApp_shouldRemoveFooAndSetBarAsMockLocationApp()94     public void onActivityResult_fooPrevAppBarNewApp_shouldRemoveFooAndSetBarAsMockLocationApp()
95             throws PackageManager.NameNotFoundException {
96         final String prevAppName = "foo";
97         final String newAppName = "bar";
98         final Intent intent = new Intent();
99         intent.setAction(newAppName);
100         when(mAppOpsManager.getPackagesForOps(any()))
101             .thenReturn(Collections.singletonList(mPackageOps));
102         when(mPackageOps.getOps()).thenReturn(Collections.singletonList(mOpEntry));
103         when(mOpEntry.getMode()).thenReturn(AppOpsManager.MODE_ALLOWED);
104         when(mPackageOps.getPackageName()).thenReturn(prevAppName);
105         when(mPackageManager.getApplicationInfo(anyString(),
106                 eq(PackageManager.MATCH_DISABLED_COMPONENTS))).thenReturn(mApplicationInfo);
107 
108         final boolean handled =
109             mController.onActivityResult(REQUEST_MOCK_LOCATION_APP, Activity.RESULT_OK, intent);
110 
111         assertThat(handled).isTrue();
112         verify(mAppOpsManager).setMode(anyInt(), anyInt(), eq(newAppName),
113                 eq(AppOpsManager.MODE_ALLOWED));
114         verify(mAppOpsManager).setMode(anyInt(), anyInt(), eq(prevAppName),
115                 eq(AppOpsManager.MODE_ERRORED));
116     }
117 
118     @Test
onActivityResult_incorrectCode_shouldReturnFalse()119     public void onActivityResult_incorrectCode_shouldReturnFalse() {
120         final boolean handled = mController.onActivityResult(30983150 /* request code */,
121                 Activity.RESULT_OK, null /* intent */);
122 
123         assertThat(handled).isFalse();
124     }
125 
126     @Test
handlePreferenceTreeClick_samePreferenceKey_shouldLaunchActivity()127     public void handlePreferenceTreeClick_samePreferenceKey_shouldLaunchActivity() {
128         final String preferenceKey = mController.getPreferenceKey();
129         when(mPreference.getKey()).thenReturn(preferenceKey);
130 
131         final boolean handled = mController.handlePreferenceTreeClick(mPreference);
132 
133         assertThat(handled).isTrue();
134         verify(mFragment).startActivityForResult(any(), eq(REQUEST_MOCK_LOCATION_APP));
135     }
136 
137     @Test
handlePreferenceTreeClick_incorrectPreferenceKey_shouldReturnFalse()138     public void handlePreferenceTreeClick_incorrectPreferenceKey_shouldReturnFalse() {
139         when(mPreference.getKey()).thenReturn("SomeRandomKey");
140 
141         assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
142     }
143 }
144