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.wifi; 18 19 import static android.content.Context.NETWORK_SCORE_SERVICE; 20 import static android.provider.Settings.Global.USE_OPEN_WIFI_PACKAGE; 21 import static com.android.settings.wifi.UseOpenWifiPreferenceController 22 .REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY; 23 import static com.google.common.truth.Truth.assertThat; 24 import static org.mockito.Matchers.eq; 25 import static org.mockito.Mockito.mock; 26 import static org.mockito.Mockito.verify; 27 import static org.mockito.Mockito.when; 28 29 import android.annotation.NonNull; 30 import android.app.Activity; 31 import android.app.Fragment; 32 import android.content.ComponentName; 33 import android.content.Context; 34 import android.content.Intent; 35 import android.net.NetworkScoreManager; 36 import android.net.NetworkScorerAppData; 37 import android.provider.Settings; 38 import android.support.v14.preference.SwitchPreference; 39 import android.support.v7.preference.Preference; 40 41 import com.android.settings.R; 42 import com.android.settings.testutils.SettingsRobolectricTestRunner; 43 import com.android.settingslib.core.lifecycle.Lifecycle; 44 45 import com.google.common.collect.Lists; 46 47 import org.junit.Before; 48 import org.junit.BeforeClass; 49 import org.junit.Test; 50 import org.junit.runner.RunWith; 51 import org.mockito.ArgumentCaptor; 52 import org.mockito.Captor; 53 import org.mockito.Mock; 54 import org.mockito.MockitoAnnotations; 55 import org.robolectric.RuntimeEnvironment; 56 import org.robolectric.shadows.ShadowApplication; 57 58 import java.util.ArrayList; 59 import java.util.List; 60 61 @RunWith(SettingsRobolectricTestRunner.class) 62 public class UseOpenWifiPreferenceControllerTest { 63 64 private static ComponentName sEnableActivityComponent; 65 private static NetworkScorerAppData sAppData; 66 private static NetworkScorerAppData sAppDataNoActivity; 67 68 @BeforeClass beforeClass()69 public static void beforeClass() { 70 sEnableActivityComponent = new ComponentName("package", "activityClass"); 71 sAppData = new NetworkScorerAppData(0, null, null, sEnableActivityComponent, null); 72 sAppDataNoActivity = new NetworkScorerAppData(0, null, null, null, null); 73 } 74 75 @Mock 76 private Lifecycle mLifecycle; 77 @Mock 78 private Fragment mFragment; 79 @Mock 80 private NetworkScoreManager mNetworkScoreManager; 81 @Captor 82 private ArgumentCaptor<Intent> mIntentCaptor; 83 private Context mContext; 84 private UseOpenWifiPreferenceController mController; 85 86 @Before setUp()87 public void setUp() { 88 MockitoAnnotations.initMocks(this); 89 90 mContext = RuntimeEnvironment.application; 91 ShadowApplication.getInstance() 92 .setSystemService(NETWORK_SCORE_SERVICE, mNetworkScoreManager); 93 } 94 createController()95 private void createController() { 96 mController = new UseOpenWifiPreferenceController(mContext, mFragment, mLifecycle); 97 } 98 99 /** 100 * Sets the scorers. 101 * 102 * @param scorers list of scorers returned by {@link NetworkScoreManager#getAllValidScorers()}. 103 * First scorer in the list is the active scorer. 104 */ setupScorers(@onNull List<NetworkScorerAppData> scorers)105 private void setupScorers(@NonNull List<NetworkScorerAppData> scorers) { 106 when(mNetworkScoreManager.getActiveScorerPackage()) 107 .thenReturn(sEnableActivityComponent.getPackageName()); 108 when(mNetworkScoreManager.getAllValidScorers()).thenReturn(scorers); 109 when(mNetworkScoreManager.getActiveScorer()).thenReturn(scorers.get(0)); 110 } 111 112 @Test testIsAvailable_returnsFalseWhenNoScorerSet()113 public void testIsAvailable_returnsFalseWhenNoScorerSet() { 114 createController(); 115 116 assertThat(mController.isAvailable()).isFalse(); 117 } 118 119 @Test testIsAvailable_returnsFalseWhenScorersNotSupported()120 public void testIsAvailable_returnsFalseWhenScorersNotSupported() { 121 setupScorers(Lists.newArrayList(sAppDataNoActivity)); 122 createController(); 123 124 assertThat(mController.isAvailable()).isFalse(); 125 } 126 127 @Test testIsAvailable_returnsTrueIfActiveScorerSupported()128 public void testIsAvailable_returnsTrueIfActiveScorerSupported() { 129 setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity)); 130 createController(); 131 132 assertThat(mController.isAvailable()).isTrue(); 133 } 134 135 @Test testIsAvailable_returnsTrueIfNonActiveScorerSupported()136 public void testIsAvailable_returnsTrueIfNonActiveScorerSupported() { 137 setupScorers(Lists.newArrayList(sAppDataNoActivity, sAppData)); 138 when(mNetworkScoreManager.getActiveScorer()).thenReturn(sAppDataNoActivity); 139 createController(); 140 141 assertThat(mController.isAvailable()).isTrue(); 142 } 143 144 @Test onPreferenceChange_nonMatchingKey_shouldDoNothing()145 public void onPreferenceChange_nonMatchingKey_shouldDoNothing() { 146 createController(); 147 148 final SwitchPreference pref = new SwitchPreference(mContext); 149 150 assertThat(mController.onPreferenceChange(pref, null)).isFalse(); 151 } 152 153 @Test onPreferenceChange_notAvailable_shouldDoNothing()154 public void onPreferenceChange_notAvailable_shouldDoNothing() { 155 createController(); 156 157 final Preference pref = new Preference(mContext); 158 pref.setKey(mController.getPreferenceKey()); 159 160 assertThat(mController.onPreferenceChange(pref, null)).isFalse(); 161 } 162 163 @Test onPreferenceChange_matchingKeyAndAvailable_enableShouldStartEnableActivity()164 public void onPreferenceChange_matchingKeyAndAvailable_enableShouldStartEnableActivity() { 165 setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity)); 166 createController(); 167 168 final SwitchPreference pref = new SwitchPreference(mContext); 169 pref.setKey(mController.getPreferenceKey()); 170 171 assertThat(mController.onPreferenceChange(pref, null)).isFalse(); 172 verify(mFragment).startActivityForResult(mIntentCaptor.capture(), 173 eq(REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY)); 174 Intent activityIntent = mIntentCaptor.getValue(); 175 assertThat(activityIntent.getComponent()).isEqualTo(sEnableActivityComponent); 176 assertThat(activityIntent.getAction()).isEqualTo(NetworkScoreManager.ACTION_CUSTOM_ENABLE); 177 } 178 179 @Test onPreferenceChange_matchingKeyAndAvailable_disableShouldUpdateSetting()180 public void onPreferenceChange_matchingKeyAndAvailable_disableShouldUpdateSetting() { 181 setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity)); 182 Settings.Global.putString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE, 183 sEnableActivityComponent.getPackageName()); 184 185 createController(); 186 187 final SwitchPreference pref = new SwitchPreference(mContext); 188 pref.setKey(mController.getPreferenceKey()); 189 190 assertThat(mController.onPreferenceChange(pref, null)).isTrue(); 191 assertThat(Settings.Global.getString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE)) 192 .isEqualTo(""); 193 } 194 195 @Test onActivityResult_nonmatchingRequestCode_shouldDoNothing()196 public void onActivityResult_nonmatchingRequestCode_shouldDoNothing() { 197 setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity)); 198 createController(); 199 200 assertThat(mController.onActivityResult(234 /* requestCode */, Activity.RESULT_OK)) 201 .isEqualTo(false); 202 assertThat(Settings.Global.getString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE)) 203 .isNull(); 204 } 205 206 @Test onActivityResult_matchingRequestCode_nonOkResult_shouldDoNothing()207 public void onActivityResult_matchingRequestCode_nonOkResult_shouldDoNothing() { 208 setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity)); 209 createController(); 210 211 assertThat(mController 212 .onActivityResult(REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY, Activity.RESULT_CANCELED)) 213 .isEqualTo(true); 214 assertThat(Settings.Global.getString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE)) 215 .isNull(); 216 } 217 218 @Test onActivityResult_matchingRequestCode_okResult_updatesSetting()219 public void onActivityResult_matchingRequestCode_okResult_updatesSetting() { 220 setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity)); 221 createController(); 222 223 assertThat(mController 224 .onActivityResult(REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY, Activity.RESULT_OK)) 225 .isEqualTo(true); 226 assertThat(Settings.Global.getString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE)) 227 .isEqualTo(sEnableActivityComponent.getPackageName()); 228 } 229 230 @Test updateState_noEnableActivity_preferenceDisabled_summaryChanged()231 public void updateState_noEnableActivity_preferenceDisabled_summaryChanged() { 232 setupScorers(Lists.newArrayList(sAppDataNoActivity)); 233 createController(); 234 235 final SwitchPreference preference = mock(SwitchPreference.class); 236 Settings.Global.putString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE, 237 sEnableActivityComponent.getPackageName()); 238 239 mController.updateState(preference); 240 241 verify(preference).setChecked(false); 242 verify(preference).setSummary( 243 R.string.use_open_wifi_automatically_summary_scorer_unsupported_disabled); 244 } 245 246 @Test updateState_noScorer_preferenceDisabled_summaryChanged()247 public void updateState_noScorer_preferenceDisabled_summaryChanged() { 248 when(mNetworkScoreManager.getAllValidScorers()).thenReturn(new ArrayList<>()); 249 createController(); 250 251 final SwitchPreference preference = mock(SwitchPreference.class); 252 Settings.Global.putString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE, 253 sEnableActivityComponent.getPackageName()); 254 255 mController.updateState(preference); 256 257 verify(preference).setChecked(false); 258 verify(preference).setSummary( 259 R.string.use_open_wifi_automatically_summary_scoring_disabled); 260 } 261 262 @Test updateState_enableActivityExists_preferenceEnabled()263 public void updateState_enableActivityExists_preferenceEnabled() { 264 setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity)); 265 createController(); 266 267 final SwitchPreference preference = mock(SwitchPreference.class); 268 Settings.Global.putString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE, 269 sEnableActivityComponent.getPackageName()); 270 271 mController.updateState(preference); 272 273 verify(preference).setChecked(true); 274 verify(preference).setSummary(R.string.use_open_wifi_automatically_summary); 275 } 276 } 277