1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings; 18 19 import android.app.Activity; 20 import android.content.Context; 21 import android.content.IContentProvider; 22 import android.content.pm.PackageManager; 23 import android.hardware.fingerprint.FingerprintManager; 24 import android.os.UserManager; 25 import android.support.v7.preference.Preference; 26 import android.support.v7.preference.PreferenceGroup; 27 import android.support.v7.preference.PreferenceScreen; 28 29 import com.android.internal.widget.LockPatternUtils; 30 import com.android.settings.dashboard.SummaryLoader; 31 import com.android.settings.notification.LockScreenNotificationPreferenceController; 32 import com.android.settings.testutils.FakeFeatureFactory; 33 import com.android.settings.testutils.XmlTestUtils; 34 import com.android.settings.testutils.shadow.ShadowLockPatternUtils; 35 import com.android.settingslib.drawer.DashboardCategory; 36 import org.junit.Before; 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 import org.mockito.Answers; 40 import org.mockito.Mock; 41 import org.mockito.MockitoAnnotations; 42 import org.robolectric.RuntimeEnvironment; 43 import org.robolectric.annotation.Config; 44 import org.robolectric.annotation.Implementation; 45 import org.robolectric.annotation.Implements; 46 import org.robolectric.shadows.ShadowApplication; 47 import org.robolectric.util.ReflectionHelpers; 48 49 import java.util.List; 50 import java.util.Map; 51 52 import static com.google.common.truth.Truth.assertThat; 53 import static org.mockito.Matchers.anyInt; 54 import static org.mockito.Mockito.doReturn; 55 import static org.mockito.Mockito.mock; 56 import static org.mockito.Mockito.spy; 57 import static org.mockito.Mockito.verify; 58 import static org.mockito.Mockito.verifyNoMoreInteractions; 59 import static org.mockito.Mockito.when; 60 61 @RunWith(SettingsRobolectricTestRunner.class) 62 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 63 public class SecuritySettingsTest { 64 65 private static final String MOCK_SUMMARY = "summary"; 66 67 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 68 private Context mContext; 69 @Mock 70 private DashboardCategory mDashboardCategory; 71 @Mock 72 private SummaryLoader mSummaryLoader; 73 74 private SecuritySettings.SummaryProvider mSummaryProvider; 75 76 @Implements(com.android.settingslib.drawer.TileUtils.class) 77 public static class ShadowTileUtils { 78 @Implementation getTextFromUri(Context context, String uriString, Map<String, IContentProvider> providerMap, String key)79 public static String getTextFromUri(Context context, String uriString, 80 Map<String, IContentProvider> providerMap, String key) { 81 return MOCK_SUMMARY; 82 } 83 } 84 85 @Before setUp()86 public void setUp() { 87 MockitoAnnotations.initMocks(this); 88 FakeFeatureFactory.setupForTest(mContext); 89 mSummaryProvider = new SecuritySettings.SummaryProvider(mContext, mSummaryLoader); 90 } 91 92 @Test testSummaryProvider_notListening()93 public void testSummaryProvider_notListening() { 94 mSummaryProvider.setListening(false); 95 96 verifyNoMoreInteractions(mSummaryLoader); 97 } 98 99 @Test testSummaryProvider_hasFingerPrint_hasStaticSummary()100 public void testSummaryProvider_hasFingerPrint_hasStaticSummary() { 101 final FingerprintManager fpm = mock(FingerprintManager.class); 102 when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) 103 .thenReturn(true); 104 105 // Cast to Object to workaround a robolectric casting bug 106 when((Object) mContext.getSystemService(FingerprintManager.class)).thenReturn(fpm); 107 when(fpm.isHardwareDetected()).thenReturn(true); 108 109 mSummaryProvider.setListening(true); 110 111 verify(mContext).getString(R.string.security_dashboard_summary); 112 } 113 114 @Test testSummaryProvider_noFpFeature_shouldSetSummaryWithNoFingerprint()115 public void testSummaryProvider_noFpFeature_shouldSetSummaryWithNoFingerprint() { 116 final FingerprintManager fpm = mock(FingerprintManager.class); 117 when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) 118 .thenReturn(false); 119 120 mSummaryProvider.setListening(true); 121 122 verify(mContext).getString(R.string.security_dashboard_summary_no_fingerprint); 123 } 124 125 @Test testSummaryProvider_noFpHardware_shouldSetSummaryWithNoFingerprint()126 public void testSummaryProvider_noFpHardware_shouldSetSummaryWithNoFingerprint() { 127 final FingerprintManager fpm = mock(FingerprintManager.class); 128 when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) 129 .thenReturn(true); 130 131 // Cast to Object to workaround a robolectric casting bug 132 when((Object) mContext.getSystemService(FingerprintManager.class)).thenReturn(fpm); 133 when(fpm.isHardwareDetected()).thenReturn(false); 134 135 mSummaryProvider.setListening(true); 136 137 verify(mContext).getString(R.string.security_dashboard_summary_no_fingerprint); 138 } 139 140 @Test testInitTrustAgentPreference_secure_shouldSetSummaryToNumberOfTrustAgent()141 public void testInitTrustAgentPreference_secure_shouldSetSummaryToNumberOfTrustAgent() { 142 final Preference preference = mock(Preference.class); 143 final PreferenceScreen screen = mock(PreferenceScreen.class); 144 when(screen.findPreference(SecuritySettings.KEY_MANAGE_TRUST_AGENTS)) 145 .thenReturn(preference); 146 final LockPatternUtils utils = mock(LockPatternUtils.class); 147 when(utils.isSecure(anyInt())).thenReturn(true); 148 final Context context = ShadowApplication.getInstance().getApplicationContext(); 149 final Activity activity = mock(Activity.class); 150 when(activity.getResources()).thenReturn(context.getResources()); 151 final SecuritySettings securitySettings = spy(new SecuritySettings()); 152 when(securitySettings.getActivity()).thenReturn(activity); 153 154 ReflectionHelpers.setField(securitySettings, "mLockPatternUtils", utils); 155 156 securitySettings.initTrustAgentPreference(screen, 0); 157 verify(preference).setSummary(R.string.manage_trust_agents_summary); 158 159 securitySettings.initTrustAgentPreference(screen, 2); 160 verify(preference).setSummary(context.getResources().getQuantityString( 161 R.plurals.manage_trust_agents_summary_on, 2, 2)); 162 } 163 164 @Test testSetLockscreenPreferencesSummary_shouldSetSummaryFromLockScreenNotification()165 public void testSetLockscreenPreferencesSummary_shouldSetSummaryFromLockScreenNotification() { 166 final Preference preference = mock(Preference.class); 167 final PreferenceGroup group = mock(PreferenceGroup.class); 168 when(group.findPreference(SecuritySettings.KEY_LOCKSCREEN_PREFERENCES)) 169 .thenReturn(preference); 170 final LockScreenNotificationPreferenceController controller = 171 mock(LockScreenNotificationPreferenceController.class); 172 173 final SecuritySettings securitySettings = new SecuritySettings(); 174 ReflectionHelpers.setField(securitySettings, 175 "mLockScreenNotificationPreferenceController", controller); 176 177 when(controller.getSummaryResource()).thenReturn(1234); 178 securitySettings.setLockscreenPreferencesSummary(group); 179 verify(preference).setSummary(1234); 180 } 181 182 @Test 183 @Config (shadows = { 184 ShadowLockPatternUtils.class, 185 }) testNonIndexableKeys_existInXmlLayout()186 public void testNonIndexableKeys_existInXmlLayout() { 187 final Context context = spy(RuntimeEnvironment.application); 188 UserManager manager = mock(UserManager.class); 189 when(manager.isAdminUser()).thenReturn(false); 190 doReturn(manager).when(context).getSystemService(Context.USER_SERVICE); 191 final List<String> niks = SecuritySettings.SEARCH_INDEX_DATA_PROVIDER 192 .getNonIndexableKeys(context); 193 194 final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, 195 R.xml.security_settings_misc); 196 keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context, 197 R.xml.location_settings)); 198 keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context, 199 R.xml.encryption_and_credential)); 200 201 assertThat(keys).containsAllIn(niks); 202 } 203 } 204