Home | History | Annotate | Download | only in development
      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
     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
     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
     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
     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
    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
    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
    138     public void handlePreferenceTreeClick_incorrectPreferenceKey_shouldReturnFalse() {
    139         when(mPreference.getKey()).thenReturn("SomeRandomKey");
    140 
    141         assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
    142     }
    143 }
    144