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 com.android.settings.wifi.WifiConfigController.PRIVACY_SPINNER_INDEX_DEVICE_MAC;
20 import static com.android.settings.wifi.WifiConfigController.PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC;
21 
22 import static com.google.common.truth.Truth.assertThat;
23 
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.when;
26 import static org.robolectric.Shadows.shadowOf;
27 
28 import android.content.Context;
29 import android.content.res.Resources;
30 import android.net.IpConfiguration;
31 import android.net.wifi.WifiConfiguration;
32 import android.net.wifi.WifiEnterpriseConfig;
33 import android.net.wifi.WifiEnterpriseConfig.Eap;
34 import android.net.wifi.WifiEnterpriseConfig.Phase2;
35 import android.net.wifi.WifiManager;
36 import android.telephony.SubscriptionInfo;
37 import android.telephony.SubscriptionManager;
38 import android.telephony.TelephonyManager;
39 import android.view.LayoutInflater;
40 import android.view.View;
41 import android.view.inputmethod.InputMethodManager;
42 import android.widget.ArrayAdapter;
43 import android.widget.CheckBox;
44 import android.widget.LinearLayout;
45 import android.widget.Spinner;
46 import android.widget.TextView;
47 
48 import com.android.settings.R;
49 import com.android.settings.network.SubscriptionUtil;
50 import com.android.settings.testutils.shadow.ShadowConnectivityManager;
51 import com.android.settingslib.wifi.AccessPoint;
52 
53 import org.junit.Before;
54 import org.junit.Test;
55 import org.junit.runner.RunWith;
56 import org.mockito.Mock;
57 import org.mockito.MockitoAnnotations;
58 import org.robolectric.RobolectricTestRunner;
59 import org.robolectric.RuntimeEnvironment;
60 import org.robolectric.Shadows;
61 import org.robolectric.annotation.Config;
62 import org.robolectric.shadows.ShadowInputMethodManager;
63 import org.robolectric.shadows.ShadowSubscriptionManager;
64 
65 import java.util.Arrays;
66 
67 @RunWith(RobolectricTestRunner.class)
68 @Config(shadows = ShadowConnectivityManager.class)
69 public class WifiConfigControllerTest {
70 
71     @Mock
72     private WifiConfigUiBase mConfigUiBase;
73     @Mock
74     private Context mContext;
75     @Mock
76     private AccessPoint mAccessPoint;
77     private View mView;
78     private Spinner mHiddenSettingsSpinner;
79     private ShadowSubscriptionManager mShadowSubscriptionManager;
80 
81     public WifiConfigController mController;
82     private static final String HEX_PSK = "01234567012345670123456701234567012345670123456701234567"
83             + "01abcdef";
84     // An invalid ASCII PSK pass phrase. It is 64 characters long, must not be greater than 63
85     private static final String LONG_PSK =
86             "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl";
87     // An invalid PSK pass phrase. It is 7 characters long, must be at least 8
88     private static final String SHORT_PSK = "abcdefg";
89     // Valid PSK pass phrase
90     private static final String GOOD_PSK = "abcdefghijklmnopqrstuvwxyz";
91     private static final String GOOD_SSID = "abc";
92     private static final int DHCP = 0;
93 
94     @Before
setUp()95     public void setUp() {
96         MockitoAnnotations.initMocks(this);
97         mContext = RuntimeEnvironment.application;
98         when(mConfigUiBase.getContext()).thenReturn(mContext);
99         when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK);
100         mView = LayoutInflater.from(mContext).inflate(R.layout.wifi_dialog, null);
101         final Spinner ipSettingsSpinner = mView.findViewById(R.id.ip_settings);
102         mHiddenSettingsSpinner = mView.findViewById(R.id.hidden_settings);
103         ipSettingsSpinner.setSelection(DHCP);
104         mShadowSubscriptionManager = shadowOf(mContext.getSystemService(SubscriptionManager.class));
105 
106         mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
107                 WifiConfigUiBase.MODE_CONNECT);
108     }
109 
110     @Test
ssidExceeds32Bytes_shouldShowSsidTooLongWarning()111     public void ssidExceeds32Bytes_shouldShowSsidTooLongWarning() {
112         mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
113                 WifiConfigUiBase.MODE_CONNECT);
114         final TextView ssid = mView.findViewById(R.id.ssid);
115         assertThat(ssid).isNotNull();
116         ssid.setText("☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎");
117         mController.showWarningMessagesIfAppropriate();
118 
119         assertThat(mView.findViewById(R.id.ssid_too_long_warning).getVisibility())
120                 .isEqualTo(View.VISIBLE);
121     }
122 
123     @Test
ssidShorterThan32Bytes_shouldNotShowSsidTooLongWarning()124     public void ssidShorterThan32Bytes_shouldNotShowSsidTooLongWarning() {
125         mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
126                 WifiConfigUiBase.MODE_CONNECT);
127 
128         final TextView ssid = mView.findViewById(R.id.ssid);
129         assertThat(ssid).isNotNull();
130         ssid.setText("123456789012345678901234567890");
131         mController.showWarningMessagesIfAppropriate();
132 
133         assertThat(mView.findViewById(R.id.ssid_too_long_warning).getVisibility())
134                 .isEqualTo(View.GONE);
135 
136         ssid.setText("123");
137         mController.showWarningMessagesIfAppropriate();
138 
139         assertThat(mView.findViewById(R.id.ssid_too_long_warning).getVisibility())
140                 .isEqualTo(View.GONE);
141     }
142 
143     @Test
isSubmittable_noSSID_shouldReturnFalse()144     public void isSubmittable_noSSID_shouldReturnFalse() {
145         final TextView ssid = mView.findViewById(R.id.ssid);
146         assertThat(ssid).isNotNull();
147         ssid.setText("");
148         assertThat(mController.isSubmittable()).isFalse();
149     }
150 
151     @Test
isSubmittable_longPsk_shouldReturnFalse()152     public void isSubmittable_longPsk_shouldReturnFalse() {
153         final TextView password = mView.findViewById(R.id.password);
154         assertThat(password).isNotNull();
155         password.setText(LONG_PSK);
156         assertThat(mController.isSubmittable()).isFalse();
157     }
158 
159     @Test
isSubmittable_shortPsk_shouldReturnFalse()160     public void isSubmittable_shortPsk_shouldReturnFalse() {
161         final TextView password = mView.findViewById(R.id.password);
162         assertThat(password).isNotNull();
163         password.setText(SHORT_PSK);
164         assertThat(mController.isSubmittable()).isFalse();
165     }
166 
167     @Test
isSubmittable_goodPsk_shouldReturnTrue()168     public void isSubmittable_goodPsk_shouldReturnTrue() {
169         final TextView password = mView.findViewById(R.id.password);
170         assertThat(password).isNotNull();
171         password.setText(GOOD_PSK);
172         assertThat(mController.isSubmittable()).isTrue();
173     }
174 
175     @Test
isSubmittable_hexPsk_shouldReturnTrue()176     public void isSubmittable_hexPsk_shouldReturnTrue() {
177         final TextView password = mView.findViewById(R.id.password);
178         assertThat(password).isNotNull();
179         password.setText(HEX_PSK);
180         assertThat(mController.isSubmittable()).isTrue();
181     }
182 
183     @Test
isSubmittable_savedConfigZeroLengthPassword_shouldReturnTrue()184     public void isSubmittable_savedConfigZeroLengthPassword_shouldReturnTrue() {
185         final TextView password = mView.findViewById(R.id.password);
186         assertThat(password).isNotNull();
187         password.setText("");
188         when(mAccessPoint.isSaved()).thenReturn(true);
189         assertThat(mController.isSubmittable()).isTrue();
190     }
191 
192     @Test
isSubmittable_nullAccessPoint_noException()193     public void isSubmittable_nullAccessPoint_noException() {
194         mController =
195             new TestWifiConfigController(mConfigUiBase, mView, null, WifiConfigUiBase.MODE_CONNECT);
196         mController.isSubmittable();
197     }
198 
199     @Test
isSubmittable_EapToPskWithValidPassword_shouldReturnTrue()200     public void isSubmittable_EapToPskWithValidPassword_shouldReturnTrue() {
201         mController = new TestWifiConfigController(mConfigUiBase, mView, null,
202                 WifiConfigUiBase.MODE_CONNECT);
203         final TextView ssid = mView.findViewById(R.id.ssid);
204         final TextView password = mView.findViewById(R.id.password);
205         final Spinner securitySpinner = mView.findViewById(R.id.security);
206         assertThat(password).isNotNull();
207         assertThat(securitySpinner).isNotNull();
208         when(mAccessPoint.isSaved()).thenReturn(true);
209 
210         // Change it from EAP to PSK
211         mController.onItemSelected(securitySpinner, null, AccessPoint.SECURITY_EAP, 0);
212         mController.onItemSelected(securitySpinner, null, AccessPoint.SECURITY_PSK, 0);
213         password.setText(GOOD_PSK);
214         ssid.setText(GOOD_SSID);
215 
216         assertThat(mController.isSubmittable()).isTrue();
217     }
218 
219     @Test
isSubmittable_EapWithAkaMethod_shouldReturnTrue()220     public void isSubmittable_EapWithAkaMethod_shouldReturnTrue() {
221         when(mAccessPoint.isSaved()).thenReturn(true);
222         mController.mAccessPointSecurity = AccessPoint.SECURITY_EAP;
223         mView.findViewById(R.id.l_ca_cert).setVisibility(View.GONE);
224 
225         assertThat(mController.isSubmittable()).isTrue();
226     }
227 
228     @Test
isSubmittable_caCertWithoutDomain_shouldReturnFalse()229     public void isSubmittable_caCertWithoutDomain_shouldReturnFalse() {
230         when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_EAP);
231         mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
232                 WifiConfigUiBase.MODE_CONNECT);
233         mView.findViewById(R.id.l_ca_cert).setVisibility(View.VISIBLE);
234         final Spinner eapCaCertSpinner = mView.findViewById(R.id.ca_cert);
235         eapCaCertSpinner.setAdapter(mController.getSpinnerAdapter(new String[]{"certificate"}));
236         eapCaCertSpinner.setSelection(0);
237         mView.findViewById(R.id.l_domain).setVisibility(View.VISIBLE);
238 
239         assertThat(mController.isSubmittable()).isFalse();
240     }
241 
242     @Test
isSubmittable_caCertWithDomain_shouldReturnTrue()243     public void isSubmittable_caCertWithDomain_shouldReturnTrue() {
244         when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_EAP);
245         mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
246                 WifiConfigUiBase.MODE_CONNECT);
247         mView.findViewById(R.id.l_ca_cert).setVisibility(View.VISIBLE);
248         final Spinner eapCaCertSpinner = mView.findViewById(R.id.ca_cert);
249         eapCaCertSpinner.setAdapter(mController.getSpinnerAdapter(new String[]{"certificate"}));
250         eapCaCertSpinner.setSelection(0);
251         mView.findViewById(R.id.l_domain).setVisibility(View.VISIBLE);
252         ((TextView) mView.findViewById(R.id.domain)).setText("fakeDomain");
253 
254         assertThat(mController.isSubmittable()).isTrue();
255     }
256 
257     @Test
getSignalString_notReachable_shouldHaveNoSignalString()258     public void getSignalString_notReachable_shouldHaveNoSignalString() {
259         when(mAccessPoint.isReachable()).thenReturn(false);
260 
261         assertThat(mController.getSignalString()).isNull();
262     }
263 
264     @Test
loadCertificates_undesiredCertificates_shouldNotLoadUndesiredCertificates()265     public void loadCertificates_undesiredCertificates_shouldNotLoadUndesiredCertificates() {
266         final Spinner spinner = new Spinner(mContext);
267 
268         mController.loadCertificates(spinner,
269                 Arrays.asList(WifiConfigController.UNDESIRED_CERTIFICATES),
270                 "doNotProvideEapUserCertString",
271                 false /* showMultipleCerts */,
272                 false /* showUsePreinstalledCertOption */);
273 
274         assertThat(spinner.getAdapter().getCount()).isEqualTo(1);   // doNotProvideEapUserCertString
275     }
276 
277     @Test
ssidGetFocus_addNewNetwork_shouldReturnTrue()278     public void ssidGetFocus_addNewNetwork_shouldReturnTrue() {
279         mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
280                 WifiConfigUiBase.MODE_CONNECT);
281         final TextView ssid = mView.findViewById(R.id.ssid);
282         // Verify ssid text get focus when add new network (accesspoint is null)
283         assertThat(ssid.isFocused()).isTrue();
284     }
285 
286     @Test
passwordGetFocus_connectSecureWifi_shouldReturnTrue()287     public void passwordGetFocus_connectSecureWifi_shouldReturnTrue() {
288         final TextView password = mView.findViewById(R.id.password);
289         // Verify password get focus when connect to secure wifi without eap type
290         assertThat(password.isFocused()).isTrue();
291     }
292 
293     @Test
hiddenWarning_warningVisibilityProperlyUpdated()294     public void hiddenWarning_warningVisibilityProperlyUpdated() {
295         View warningView = mView.findViewById(R.id.hidden_settings_warning);
296         mController.onItemSelected(mHiddenSettingsSpinner, null, mController.HIDDEN_NETWORK, 0);
297         assertThat(warningView.getVisibility()).isEqualTo(View.VISIBLE);
298 
299         mController.onItemSelected(mHiddenSettingsSpinner, null, mController.NOT_HIDDEN_NETWORK, 0);
300         assertThat(warningView.getVisibility()).isEqualTo(View.GONE);
301     }
302 
303     @Test
hiddenField_visibilityUpdatesCorrectly()304     public void hiddenField_visibilityUpdatesCorrectly() {
305         View hiddenField = mView.findViewById(R.id.hidden_settings_field);
306         assertThat(hiddenField.getVisibility()).isEqualTo(View.GONE);
307 
308         mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
309                 WifiConfigUiBase.MODE_CONNECT);
310         assertThat(hiddenField.getVisibility()).isEqualTo(View.VISIBLE);
311     }
312 
313     @Test
securitySpinner_saeSuitebAndOweNotVisible()314     public void securitySpinner_saeSuitebAndOweNotVisible() {
315         securitySpinnerTestHelper(false, false, false);
316     }
317 
318     @Test
securitySpinner_saeSuitebAndOweVisible()319     public void securitySpinner_saeSuitebAndOweVisible() {
320         securitySpinnerTestHelper(true, true, true);
321     }
322 
323     @Test
securitySpinner_saeVisible_suitebAndOweNotVisible()324     public void securitySpinner_saeVisible_suitebAndOweNotVisible() {
325         securitySpinnerTestHelper(true, false, false);
326     }
327 
328     @Test
securitySpinner_oweVisible_suitebAndSaeNotVisible()329     public void securitySpinner_oweVisible_suitebAndSaeNotVisible() {
330         securitySpinnerTestHelper(false, false, true);
331     }
332 
securitySpinnerTestHelper(boolean saeVisible, boolean suitebVisible, boolean oweVisible)333     private void securitySpinnerTestHelper(boolean saeVisible, boolean suitebVisible,
334             boolean oweVisible) {
335         WifiManager wifiManager = mock(WifiManager.class);
336         when(wifiManager.isWpa3SaeSupported()).thenReturn(saeVisible);
337         when(wifiManager.isWpa3SuiteBSupported()).thenReturn(suitebVisible);
338         when(wifiManager.isEnhancedOpenSupported()).thenReturn(oweVisible);
339 
340         mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
341                 WifiConfigUiBase.MODE_MODIFY, wifiManager);
342 
343         final Spinner securitySpinner = mView.findViewById(R.id.security);
344         final ArrayAdapter<String> adapter = (ArrayAdapter) securitySpinner.getAdapter();
345         boolean saeFound = false;
346         boolean suitebFound = false;
347         boolean oweFound = false;
348         for (int i = 0; i < adapter.getCount(); i++) {
349             String val = adapter.getItem(i);
350 
351             if (val.compareTo(mContext.getString(R.string.wifi_security_sae)) == 0) {
352                 saeFound = true;
353             }
354 
355             if (val.compareTo(mContext.getString(R.string.wifi_security_eap_suiteb)) == 0) {
356                 suitebFound = true;
357             }
358 
359             if (val.compareTo(mContext.getString(R.string.wifi_security_owe)) == 0) {
360                 oweFound = true;
361             }
362         }
363 
364         if (saeVisible) {
365             assertThat(saeFound).isTrue();
366         } else {
367             assertThat(saeFound).isFalse();
368         }
369         if (suitebVisible) {
370             assertThat(suitebFound).isTrue();
371         } else {
372             assertThat(suitebFound).isFalse();
373         }
374         if (oweVisible) {
375             assertThat(oweFound).isTrue();
376         } else {
377             assertThat(oweFound).isFalse();
378         }
379     }
380 
381     public class TestWifiConfigController extends WifiConfigController {
382 
TestWifiConfigController( WifiConfigUiBase parent, View view, AccessPoint accessPoint, int mode)383         private TestWifiConfigController(
384             WifiConfigUiBase parent, View view, AccessPoint accessPoint, int mode) {
385             super(parent, view, accessPoint, mode);
386         }
387 
TestWifiConfigController( WifiConfigUiBase parent, View view, AccessPoint accessPoint, int mode, WifiManager wifiManager)388         private TestWifiConfigController(
389                 WifiConfigUiBase parent, View view, AccessPoint accessPoint, int mode,
390                     WifiManager wifiManager) {
391             super(parent, view, accessPoint, mode, wifiManager);
392         }
393 
394     }
395 
396     @Test
loadMacRandomizedValue_shouldMandomizedMacAsDefault()397     public void loadMacRandomizedValue_shouldMandomizedMacAsDefault() {
398         final Spinner privacySetting = mView.findViewById(R.id.privacy_settings);
399 
400         assertThat(privacySetting.getVisibility()).isEqualTo(View.VISIBLE);
401         assertThat(privacySetting.getSelectedItemPosition()).isEqualTo(
402                 PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC);
403     }
404 
405     @Test
loadSavedMacRandomizedPersistentValue_shouldCorrectMacValue()406     public void loadSavedMacRandomizedPersistentValue_shouldCorrectMacValue() {
407         checkSavedMacRandomizedValue(WifiConfiguration.RANDOMIZATION_PERSISTENT);
408     }
409 
410     @Test
loadSavedMacRandomizedNoneValue_shouldCorrectMacValue()411     public void loadSavedMacRandomizedNoneValue_shouldCorrectMacValue() {
412         checkSavedMacRandomizedValue(WifiConfiguration.RANDOMIZATION_NONE);
413     }
414 
checkSavedMacRandomizedValue(int macRandomizedValue)415     private void checkSavedMacRandomizedValue(int macRandomizedValue) {
416         when(mAccessPoint.isSaved()).thenReturn(true);
417         final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
418         when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
419         when(mAccessPoint.getConfig()).thenReturn(mockWifiConfig);
420         mockWifiConfig.macRandomizationSetting = macRandomizedValue;
421         mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
422                 WifiConfigUiBase.MODE_CONNECT);
423         final Spinner privacySetting = mView.findViewById(R.id.privacy_settings);
424 
425         assertThat(privacySetting.getVisibility()).isEqualTo(View.VISIBLE);
426         assertThat(privacySetting.getSelectedItemPosition()).isEqualTo(
427                 macRandomizedValue == WifiConfiguration.RANDOMIZATION_PERSISTENT
428                 ? PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC : PRIVACY_SPINNER_INDEX_DEVICE_MAC);
429     }
430 
431     @Test
saveMacRandomizedValue_noChanged_shouldPersistentAsDefault()432     public void saveMacRandomizedValue_noChanged_shouldPersistentAsDefault() {
433         WifiConfiguration config = mController.getConfig();
434         assertThat(config.macRandomizationSetting).isEqualTo(
435                 WifiConfiguration.RANDOMIZATION_PERSISTENT);
436     }
437 
438     @Test
saveMacRandomizedValue_ChangedToDeviceMac_shouldGetNone()439     public void saveMacRandomizedValue_ChangedToDeviceMac_shouldGetNone() {
440         final Spinner privacySetting = mView.findViewById(R.id.privacy_settings);
441         privacySetting.setSelection(PRIVACY_SPINNER_INDEX_DEVICE_MAC);
442 
443         WifiConfiguration config = mController.getConfig();
444         assertThat(config.macRandomizationSetting).isEqualTo(WifiConfiguration.RANDOMIZATION_NONE);
445     }
446 
447     @Test
replaceTtsString_whenTargetMatched_shouldSuccess()448     public void replaceTtsString_whenTargetMatched_shouldSuccess() {
449         final CharSequence[] display = {"PEAP", "AKA1", "AKA2'"};
450         final CharSequence[] target = {"AKA1", "AKA2'"};
451         final CharSequence[] ttsString = {"AKA1_TTS", "AKA2_TTS"};
452 
453         final CharSequence[] resultTts = mController.findAndReplaceTargetStrings(display, target,
454             ttsString);
455 
456         assertThat(resultTts[0]).isEqualTo("PEAP");
457         assertThat(resultTts[1]).isEqualTo("AKA1_TTS");
458         assertThat(resultTts[2]).isEqualTo("AKA2_TTS");
459     }
460 
461     @Test
replaceTtsString_whenNoTargetStringMatched_originalStringShouldNotChanged()462     public void replaceTtsString_whenNoTargetStringMatched_originalStringShouldNotChanged() {
463         final CharSequence[] display = {"PEAP", "AKA1", "AKA2"};
464         final CharSequence[] target = {"WEP1", "WEP2'"};
465         final CharSequence[] ttsString = {"WEP1_TTS", "WEP2_TTS"};
466 
467         final CharSequence[] resultTts = mController.findAndReplaceTargetStrings(display, target,
468             ttsString);
469 
470         assertThat(resultTts[0]).isEqualTo("PEAP");
471         assertThat(resultTts[1]).isEqualTo("AKA1");
472         assertThat(resultTts[2]).isEqualTo("AKA2");
473     }
474 
475     @Test
checktEapMethodTargetAndTtsArraylength_shouldHaveSameCount()476     public void checktEapMethodTargetAndTtsArraylength_shouldHaveSameCount() {
477         final Resources resources = mContext.getResources();
478         final String[] targetStringArray = resources.getStringArray(
479             R.array.wifi_eap_method_target_strings);
480         final String[] ttsStringArray = resources.getStringArray(
481             R.array.wifi_eap_method_tts_strings);
482 
483         assertThat(targetStringArray.length).isEqualTo(ttsStringArray.length);
484     }
485 
486     @Test
selectSecurity_wpa3Eap192bit_eapMethodTls()487     public void selectSecurity_wpa3Eap192bit_eapMethodTls() {
488         final WifiManager wifiManager = mock(WifiManager.class);
489         when(wifiManager.isWpa3SuiteBSupported()).thenReturn(true);
490         mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
491                 WifiConfigUiBase.MODE_MODIFY, wifiManager);
492         final Spinner securitySpinner = mView.findViewById(R.id.security);
493         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
494         int wpa3Eap192bitPosition = -1;
495         final int securityCount = mController.mSecurityInPosition.length;
496         for (int i = 0; i < securityCount; i++) {
497             if (mController.mSecurityInPosition[i] != null &&
498                     mController.mSecurityInPosition[i] == AccessPoint.SECURITY_EAP_SUITE_B) {
499                 wpa3Eap192bitPosition = i;
500             }
501         }
502 
503         mController.onItemSelected(securitySpinner, /* view */ null, wpa3Eap192bitPosition,
504                 /* id */ 0);
505 
506         final int selectedItemPosition = eapMethodSpinner.getSelectedItemPosition();
507         assertThat(eapMethodSpinner.getSelectedItem().toString()).isEqualTo("TLS");
508     }
509 
510     @Test
checkImeStatus_whenAdvancedToggled_shouldBeHide()511     public void checkImeStatus_whenAdvancedToggled_shouldBeHide() {
512         final InputMethodManager inputMethodManager = mContext
513                 .getSystemService(InputMethodManager.class);
514         final ShadowInputMethodManager shadowImm = Shadows.shadowOf(inputMethodManager);
515         final CheckBox advButton = mView.findViewById(R.id.wifi_advanced_togglebox);
516 
517         inputMethodManager.showSoftInput(null /* view */, 0 /* flags */);
518         advButton.performClick();
519 
520         assertThat(shadowImm.isSoftInputVisible()).isFalse();
521     }
522 
523     @Test
selectEapMethod_savedAccessPoint_shouldGetCorrectPosition()524     public void selectEapMethod_savedAccessPoint_shouldGetCorrectPosition() {
525         when(mAccessPoint.isSaved()).thenReturn(true);
526         when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_EAP);
527         final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
528         when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
529         final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
530         when(mockWifiEnterpriseConfig.getEapMethod()).thenReturn(Eap.PEAP);
531         mockWifiConfig.enterpriseConfig = mockWifiEnterpriseConfig ;
532         when(mAccessPoint.getConfig()).thenReturn(mockWifiConfig);
533         mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
534                 WifiConfigUiBase.MODE_MODIFY);
535         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
536         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
537         WifiConfiguration wifiConfiguration;
538 
539         // Test EAP method PEAP
540         eapMethodSpinner.setSelection(Eap.PEAP);
541         phase2Spinner.setSelection(WifiConfigController.WIFI_PEAP_PHASE2_MSCHAPV2);
542         wifiConfiguration = mController.getConfig();
543 
544         assertThat(wifiConfiguration.enterpriseConfig.getEapMethod()).isEqualTo(Eap.PEAP);
545         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(
546                 Phase2.MSCHAPV2);
547 
548         // Test EAP method TTLS
549         eapMethodSpinner.setSelection(Eap.TTLS);
550         phase2Spinner.setSelection(WifiConfigController.WIFI_TTLS_PHASE2_MSCHAPV2);
551         wifiConfiguration = mController.getConfig();
552 
553         assertThat(wifiConfiguration.enterpriseConfig.getEapMethod()).isEqualTo(Eap.TTLS);
554         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(
555                 Phase2.MSCHAPV2);
556     }
557 
558     @Test
getHiddenSettingsPosition_whenAdvancedToggled_shouldBeFirst()559     public void getHiddenSettingsPosition_whenAdvancedToggled_shouldBeFirst() {
560         final LinearLayout advancedFieldsLayout = mView.findViewById(R.id.wifi_advanced_fields);
561         final LinearLayout hiddenSettingLayout = mView.findViewById(R.id.hidden_settings_field);
562 
563         final LinearLayout firstChild = (LinearLayout) advancedFieldsLayout.getChildAt(0);
564 
565         assertThat(firstChild).isEqualTo(hiddenSettingLayout);
566     }
567 
568     @Test
getAdvancedOptionContentDescription_whenViewInitialed_shouldBeCorrect()569     public void getAdvancedOptionContentDescription_whenViewInitialed_shouldBeCorrect() {
570         final CheckBox advButton = mView.findViewById(R.id.wifi_advanced_togglebox);
571 
572         assertThat(advButton.getContentDescription()).isEqualTo(
573                 mContext.getString(R.string.wifi_advanced_toggle_description));
574     }
575 
576     @Test
getVisibility_whenAdvancedOptionClicked_shouldBeGone()577     public void getVisibility_whenAdvancedOptionClicked_shouldBeGone() {
578         final CheckBox advButton = mView.findViewById(R.id.wifi_advanced_togglebox);
579 
580         advButton.performClick();
581 
582         assertThat(advButton.getVisibility()).isEqualTo(View.GONE);
583     }
584 
585     @Test
loadSims_noSim_simSpinnerDefaultNoSim()586     public void loadSims_noSim_simSpinnerDefaultNoSim() {
587         when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_EAP);
588         mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
589                 WifiConfigUiBase.MODE_CONNECT);
590         final Spinner eapMethodSpinner = mock(Spinner.class);
591         when(eapMethodSpinner.getSelectedItemPosition()).thenReturn(
592                 WifiConfigController2.WIFI_EAP_METHOD_SIM);
593         mController.mEapMethodSpinner = eapMethodSpinner;
594 
595         mController.loadSims();
596 
597         final WifiConfiguration wifiConfiguration = mController.getConfig();
598         assertThat(wifiConfiguration.carrierId).isEqualTo(TelephonyManager.UNKNOWN_CARRIER_ID);
599     }
600 
601     @Test
loadSims_oneSim_simSpinnerDefaultSubscription()602     public void loadSims_oneSim_simSpinnerDefaultSubscription() {
603         when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_EAP);
604         final SubscriptionInfo subscriptionInfo = mock(SubscriptionInfo.class);
605         final int carrierId = 6;
606         when(subscriptionInfo.getSubscriptionId()).thenReturn(carrierId);
607         when(subscriptionInfo.getDisplayName()).thenReturn("FAKE-CARRIER");
608         when(subscriptionInfo.getCarrierId()).thenReturn(carrierId);
609         when(subscriptionInfo.getCarrierName()).thenReturn("FAKE-CARRIER");
610         SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(subscriptionInfo));
611         mShadowSubscriptionManager.setActiveSubscriptionInfoList(Arrays.asList(subscriptionInfo));
612         mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
613                 WifiConfigUiBase.MODE_CONNECT);
614         final Spinner eapMethodSpinner = mock(Spinner.class);
615         when(eapMethodSpinner.getSelectedItemPosition()).thenReturn(
616                 WifiConfigController2.WIFI_EAP_METHOD_SIM);
617         mController.mEapMethodSpinner = eapMethodSpinner;
618 
619         mController.loadSims();
620 
621         final WifiConfiguration wifiConfiguration = mController.getConfig();
622         assertThat(wifiConfiguration.carrierId).isEqualTo(carrierId);
623     }
624 }
625