1 /*
2  * Copyright (C) 2019 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.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.ArgumentMatchers.anyInt;
22 import static org.mockito.ArgumentMatchers.nullable;
23 import static org.mockito.Mockito.doNothing;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.spy;
26 import static org.mockito.Mockito.verify;
27 import static org.mockito.Mockito.when;
28 import static org.robolectric.Shadows.shadowOf;
29 
30 import android.content.Context;
31 import android.content.Intent;
32 import android.content.res.Resources;
33 import android.net.IpConfiguration;
34 import android.net.wifi.WifiConfiguration;
35 import android.net.wifi.WifiEnterpriseConfig;
36 import android.net.wifi.WifiEnterpriseConfig.Eap;
37 import android.net.wifi.WifiEnterpriseConfig.Phase2;
38 import android.net.wifi.WifiManager;
39 import android.os.UserHandle;
40 import android.telephony.SubscriptionInfo;
41 import android.telephony.SubscriptionManager;
42 import android.telephony.TelephonyManager;
43 import android.view.LayoutInflater;
44 import android.view.View;
45 import android.view.inputmethod.InputMethodManager;
46 import android.widget.AdapterView;
47 import android.widget.ArrayAdapter;
48 import android.widget.CheckBox;
49 import android.widget.LinearLayout;
50 import android.widget.Spinner;
51 import android.widget.TextView;
52 
53 import com.android.settings.R;
54 import com.android.settings.network.SubscriptionUtil;
55 import com.android.settings.testutils.shadow.ShadowConnectivityManager;
56 import com.android.settings.utils.AndroidKeystoreAliasLoader;
57 import com.android.settings.wifi.details2.WifiPrivacyPreferenceController2;
58 import com.android.wifitrackerlib.WifiEntry;
59 
60 import com.google.common.collect.ImmutableList;
61 
62 import org.junit.Before;
63 import org.junit.Test;
64 import org.junit.runner.RunWith;
65 import org.mockito.ArgumentCaptor;
66 import org.mockito.Mock;
67 import org.mockito.MockitoAnnotations;
68 import org.robolectric.RobolectricTestRunner;
69 import org.robolectric.RuntimeEnvironment;
70 import org.robolectric.Shadows;
71 import org.robolectric.annotation.Config;
72 import org.robolectric.shadows.ShadowInputMethodManager;
73 import org.robolectric.shadows.ShadowSubscriptionManager;
74 
75 import java.util.Arrays;
76 
77 @RunWith(RobolectricTestRunner.class)
78 @Config(shadows = ShadowConnectivityManager.class)
79 public class WifiConfigController2Test {
80 
81     @Mock
82     private WifiConfigUiBase2 mConfigUiBase;
83     @Mock
84     private Context mContext;
85     @Mock
86     private WifiEntry mWifiEntry;
87     @Mock
88     private AndroidKeystoreAliasLoader mAndroidKeystoreAliasLoader;
89     private View mView;
90     private Spinner mHiddenSettingsSpinner;
91     private Spinner mEapCaCertSpinner;
92     private Spinner mEapUserCertSpinner;
93     private String mUnspecifiedCertString;
94     private String mUseSystemCertsString;
95     private String mDoNotProvideEapUserCertString;
96     private ShadowSubscriptionManager mShadowSubscriptionManager;
97 
98     public WifiConfigController2 mController;
99     private static final String HEX_PSK = "01234567012345670123456701234567012345670123456701234567"
100             + "01abcdef";
101     // An invalid ASCII PSK pass phrase. It is 64 characters long, must not be greater than 63
102     private static final String LONG_PSK =
103             "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl";
104     // An invalid PSK pass phrase. It is 7 characters long, must be at least 8
105     private static final String SHORT_PSK = "abcdefg";
106     // Valid PSK pass phrase
107     private static final String GOOD_PSK = "abcdefghijklmnopqrstuvwxyz";
108     private static final String GOOD_SSID = "abc";
109     private static final String VALID_HEX_PSK =
110             "123456789012345678901234567890123456789012345678901234567890abcd";
111     private static final String INVALID_HEX_PSK =
112             "123456789012345678901234567890123456789012345678901234567890ghij";
113     private static final String NUMBER_AND_CHARACTER_KEY = "123456abcd";
114     private static final String PARTIAL_NUMBER_AND_CHARACTER_KEY = "123456abc?";
115     private static final int DHCP = 0;
116     // Saved certificates
117     private static final String SAVED_CA_CERT = "saved CA cert";
118     private static final String SAVED_USER_CERT = "saved user cert";
119 
120     private static final int POSITION_SYSTEM_CERT = 1;
121     private static final int POSITION_INSTALL_CERT = 2;
122     private static final String ACTION_INSTALL_CERTS = "android.credentials.INSTALL";
123     private static final String KEY_INSTALL_CERTIFICATE = "certificate_install_usage";
124     private static final String INSTALL_CERTIFICATE_VALUE = "wifi";
125 
126     @Before
setUp()127     public void setUp() {
128         MockitoAnnotations.initMocks(this);
129         mContext = spy(RuntimeEnvironment.application);
130         when(mConfigUiBase.getContext()).thenReturn(mContext);
131         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_PSK);
132         mView = LayoutInflater.from(mContext).inflate(R.layout.wifi_dialog, null);
133         final Spinner ipSettingsSpinner = mView.findViewById(R.id.ip_settings);
134         mHiddenSettingsSpinner = mView.findViewById(R.id.hidden_settings);
135         mEapCaCertSpinner = mView.findViewById(R.id.ca_cert);
136         mEapUserCertSpinner = mView.findViewById(R.id.user_cert);
137         mUseSystemCertsString = mContext.getString(R.string.wifi_use_system_certs);
138         mUnspecifiedCertString = mContext.getString(R.string.wifi_unspecified);
139         mDoNotProvideEapUserCertString =
140                 mContext.getString(R.string.wifi_do_not_provide_eap_user_cert);
141         ipSettingsSpinner.setSelection(DHCP);
142         mShadowSubscriptionManager = shadowOf(mContext.getSystemService(SubscriptionManager.class));
143 
144         mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
145                 WifiConfigUiBase2.MODE_CONNECT);
146     }
147 
148     @Test
ssidExceeds32Bytes_shouldShowSsidTooLongWarning()149     public void ssidExceeds32Bytes_shouldShowSsidTooLongWarning() {
150         mController = new TestWifiConfigController2(mConfigUiBase, mView, null /* wifiEntry */,
151                 WifiConfigUiBase2.MODE_CONNECT);
152         final TextView ssid = mView.findViewById(R.id.ssid);
153         assertThat(ssid).isNotNull();
154         ssid.setText("☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎");
155         mController.showWarningMessagesIfAppropriate();
156 
157         assertThat(mView.findViewById(R.id.ssid_too_long_warning).getVisibility())
158                 .isEqualTo(View.VISIBLE);
159     }
160 
161     @Test
ssidShorterThan32Bytes_shouldNotShowSsidTooLongWarning()162     public void ssidShorterThan32Bytes_shouldNotShowSsidTooLongWarning() {
163         mController = new TestWifiConfigController2(mConfigUiBase, mView, null /* wifiEntry */,
164                 WifiConfigUiBase2.MODE_CONNECT);
165 
166         final TextView ssid = mView.findViewById(R.id.ssid);
167         assertThat(ssid).isNotNull();
168         ssid.setText("123456789012345678901234567890");
169         mController.showWarningMessagesIfAppropriate();
170 
171         assertThat(mView.findViewById(R.id.ssid_too_long_warning).getVisibility())
172                 .isEqualTo(View.GONE);
173 
174         ssid.setText("123");
175         mController.showWarningMessagesIfAppropriate();
176 
177         assertThat(mView.findViewById(R.id.ssid_too_long_warning).getVisibility())
178                 .isEqualTo(View.GONE);
179     }
180 
181     @Test
isSubmittable_noSSID_shouldReturnFalse()182     public void isSubmittable_noSSID_shouldReturnFalse() {
183         final TextView ssid = mView.findViewById(R.id.ssid);
184         assertThat(ssid).isNotNull();
185         ssid.setText("");
186         assertThat(mController.isSubmittable()).isFalse();
187     }
188 
189     @Test
isSubmittable_longPsk_shouldReturnFalse()190     public void isSubmittable_longPsk_shouldReturnFalse() {
191         final TextView password = mView.findViewById(R.id.password);
192         assertThat(password).isNotNull();
193         password.setText(LONG_PSK);
194         assertThat(mController.isSubmittable()).isFalse();
195     }
196 
197     @Test
isSubmittable_shortPsk_shouldReturnFalse()198     public void isSubmittable_shortPsk_shouldReturnFalse() {
199         final TextView password = mView.findViewById(R.id.password);
200         assertThat(password).isNotNull();
201         password.setText(SHORT_PSK);
202         assertThat(mController.isSubmittable()).isFalse();
203     }
204 
205     @Test
isSubmittable_goodPsk_shouldReturnTrue()206     public void isSubmittable_goodPsk_shouldReturnTrue() {
207         final TextView password = mView.findViewById(R.id.password);
208         assertThat(password).isNotNull();
209         password.setText(GOOD_PSK);
210         assertThat(mController.isSubmittable()).isTrue();
211     }
212 
213     @Test
isSubmittable_hexPsk_shouldReturnTrue()214     public void isSubmittable_hexPsk_shouldReturnTrue() {
215         final TextView password = mView.findViewById(R.id.password);
216         assertThat(password).isNotNull();
217         password.setText(HEX_PSK);
218         assertThat(mController.isSubmittable()).isTrue();
219     }
220 
221     @Test
isSubmittable_savedConfigZeroLengthPassword_shouldReturnTrue()222     public void isSubmittable_savedConfigZeroLengthPassword_shouldReturnTrue() {
223         final TextView password = mView.findViewById(R.id.password);
224         assertThat(password).isNotNull();
225         password.setText("");
226         when(mWifiEntry.isSaved()).thenReturn(true);
227         assertThat(mController.isSubmittable()).isTrue();
228     }
229 
230     @Test
isSubmittable_nullWifiEntry_noException()231     public void isSubmittable_nullWifiEntry_noException() {
232         mController = new TestWifiConfigController2(mConfigUiBase, mView, null,
233                 WifiConfigUiBase2.MODE_CONNECT);
234         mController.isSubmittable();
235     }
236 
237     @Test
isSubmittable_EapToPskWithValidPassword_shouldReturnTrue()238     public void isSubmittable_EapToPskWithValidPassword_shouldReturnTrue() {
239         mController = new TestWifiConfigController2(mConfigUiBase, mView, null,
240                 WifiConfigUiBase2.MODE_CONNECT);
241         final TextView ssid = mView.findViewById(R.id.ssid);
242         final TextView password = mView.findViewById(R.id.password);
243         final Spinner securitySpinner = mView.findViewById(R.id.security);
244         assertThat(password).isNotNull();
245         assertThat(securitySpinner).isNotNull();
246         when(mWifiEntry.isSaved()).thenReturn(true);
247 
248         // Change it from EAP to PSK
249         mController.onItemSelected(securitySpinner, null, WifiEntry.SECURITY_EAP, 0);
250         mController.onItemSelected(securitySpinner, null, WifiEntry.SECURITY_PSK, 0);
251         password.setText(GOOD_PSK);
252         ssid.setText(GOOD_SSID);
253 
254         assertThat(mController.isSubmittable()).isTrue();
255     }
256 
257     @Test
isSubmittable_EapWithAkaMethod_shouldReturnTrue()258     public void isSubmittable_EapWithAkaMethod_shouldReturnTrue() {
259         when(mWifiEntry.isSaved()).thenReturn(true);
260         mController.mWifiEntrySecurity = WifiEntry.SECURITY_EAP;
261         mView.findViewById(R.id.l_ca_cert).setVisibility(View.GONE);
262 
263         assertThat(mController.isSubmittable()).isTrue();
264     }
265 
266     @Test
isSubmittable_caCertWithoutDomain_shouldReturnFalse()267     public void isSubmittable_caCertWithoutDomain_shouldReturnFalse() {
268         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
269         mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
270                 WifiConfigUiBase2.MODE_CONNECT);
271         mView.findViewById(R.id.l_ca_cert).setVisibility(View.VISIBLE);
272         final Spinner eapCaCertSpinner = mView.findViewById(R.id.ca_cert);
273         eapCaCertSpinner.setAdapter(mController.getSpinnerAdapter(new String[]{"certificate"}));
274         eapCaCertSpinner.setSelection(0);
275         mView.findViewById(R.id.l_domain).setVisibility(View.VISIBLE);
276 
277         assertThat(mController.isSubmittable()).isFalse();
278     }
279 
280     @Test
isSubmittable_caCertWithDomain_shouldReturnTrue()281     public void isSubmittable_caCertWithDomain_shouldReturnTrue() {
282         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
283         mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
284                 WifiConfigUiBase2.MODE_CONNECT);
285         mView.findViewById(R.id.l_ca_cert).setVisibility(View.VISIBLE);
286         final Spinner eapCaCertSpinner = mView.findViewById(R.id.ca_cert);
287         eapCaCertSpinner.setAdapter(mController.getSpinnerAdapter(new String[]{"certificate"}));
288         eapCaCertSpinner.setSelection(0);
289         mView.findViewById(R.id.l_domain).setVisibility(View.VISIBLE);
290         ((TextView) mView.findViewById(R.id.domain)).setText("fakeDomain");
291 
292         assertThat(mController.isSubmittable()).isTrue();
293     }
294 
295     @Test
getSignalString_notReachable_shouldHaveNoSignalString()296     public void getSignalString_notReachable_shouldHaveNoSignalString() {
297         when(mWifiEntry.getLevel()).thenReturn(WifiEntry.WIFI_LEVEL_UNREACHABLE);
298 
299         assertThat(mController.getSignalString()).isNull();
300     }
301 
302     @Test
loadCertificates_undesiredCertificates_shouldNotLoadUndesiredCertificates()303     public void loadCertificates_undesiredCertificates_shouldNotLoadUndesiredCertificates() {
304         final Spinner spinner = new Spinner(mContext);
305 
306         mController.loadCertificates(spinner,
307                 Arrays.asList(WifiConfigController.UNDESIRED_CERTIFICATES),
308                 "doNotProvideEapUserCertString",
309                 false /* showMultipleCerts */,
310                 false /* showUsePreinstalledCertOption */);
311 
312         assertThat(spinner.getAdapter().getCount()).isEqualTo(1);   // doNotProvideEapUserCertString
313     }
314 
315     @Test
ssidGetFocus_addNewNetwork_shouldReturnTrue()316     public void ssidGetFocus_addNewNetwork_shouldReturnTrue() {
317         mController = new TestWifiConfigController2(mConfigUiBase, mView, null /* wifiEntry */,
318                 WifiConfigUiBase2.MODE_CONNECT);
319         final TextView ssid = mView.findViewById(R.id.ssid);
320         // Verify ssid text get focus when add new network (wifiEntry is null)
321         assertThat(ssid.isFocused()).isTrue();
322     }
323 
324     @Test
passwordGetFocus_connectSecureWifi_shouldReturnTrue()325     public void passwordGetFocus_connectSecureWifi_shouldReturnTrue() {
326         final TextView password = mView.findViewById(R.id.password);
327         // Verify password get focus when connect to secure wifi without eap type
328         assertThat(password.isFocused()).isTrue();
329     }
330 
331     @Test
hiddenWarning_warningVisibilityProperlyUpdated()332     public void hiddenWarning_warningVisibilityProperlyUpdated() {
333         View warningView = mView.findViewById(R.id.hidden_settings_warning);
334         mController.onItemSelected(mHiddenSettingsSpinner, null, mController.HIDDEN_NETWORK, 0);
335         assertThat(warningView.getVisibility()).isEqualTo(View.VISIBLE);
336 
337         mController.onItemSelected(mHiddenSettingsSpinner, null, mController.NOT_HIDDEN_NETWORK, 0);
338         assertThat(warningView.getVisibility()).isEqualTo(View.GONE);
339     }
340 
341     @Test
hiddenField_visibilityUpdatesCorrectly()342     public void hiddenField_visibilityUpdatesCorrectly() {
343         View hiddenField = mView.findViewById(R.id.hidden_settings_field);
344         assertThat(hiddenField.getVisibility()).isEqualTo(View.GONE);
345 
346         mController = new TestWifiConfigController2(mConfigUiBase, mView, null /* wifiEntry */,
347                 WifiConfigUiBase2.MODE_CONNECT);
348         assertThat(hiddenField.getVisibility()).isEqualTo(View.VISIBLE);
349     }
350 
351     @Test
securitySpinner_saeSuitebAndOweNotVisible()352     public void securitySpinner_saeSuitebAndOweNotVisible() {
353         securitySpinnerTestHelper(false, false, false);
354     }
355 
356     @Test
securitySpinner_saeSuitebAndOweVisible()357     public void securitySpinner_saeSuitebAndOweVisible() {
358         securitySpinnerTestHelper(true, true, true);
359     }
360 
361     @Test
securitySpinner_saeVisible_suitebAndOweNotVisible()362     public void securitySpinner_saeVisible_suitebAndOweNotVisible() {
363         securitySpinnerTestHelper(true, false, false);
364     }
365 
366     @Test
securitySpinner_oweVisible_suitebAndSaeNotVisible()367     public void securitySpinner_oweVisible_suitebAndSaeNotVisible() {
368         securitySpinnerTestHelper(false, false, true);
369     }
370 
securitySpinnerTestHelper(boolean saeVisible, boolean suitebVisible, boolean oweVisible)371     private void securitySpinnerTestHelper(boolean saeVisible, boolean suitebVisible,
372             boolean oweVisible) {
373         WifiManager wifiManager = mock(WifiManager.class);
374         when(wifiManager.isWpa3SaeSupported()).thenReturn(saeVisible);
375         when(wifiManager.isWpa3SuiteBSupported()).thenReturn(suitebVisible);
376         when(wifiManager.isEnhancedOpenSupported()).thenReturn(oweVisible);
377 
378         mController = new TestWifiConfigController2(mConfigUiBase, mView, null /* wifiEntry */,
379                 WifiConfigUiBase2.MODE_MODIFY, wifiManager);
380 
381         final Spinner securitySpinner = mView.findViewById(R.id.security);
382         final ArrayAdapter<String> adapter = (ArrayAdapter) securitySpinner.getAdapter();
383         boolean saeFound = false;
384         boolean suitebFound = false;
385         boolean oweFound = false;
386         for (int i = 0; i < adapter.getCount(); i++) {
387             String val = adapter.getItem(i);
388 
389             if (val.compareTo(mContext.getString(R.string.wifi_security_sae)) == 0) {
390                 saeFound = true;
391             }
392 
393             if (val.compareTo(mContext.getString(R.string.wifi_security_eap_suiteb)) == 0) {
394                 suitebFound = true;
395             }
396 
397             if (val.compareTo(mContext.getString(R.string.wifi_security_owe)) == 0) {
398                 oweFound = true;
399             }
400         }
401 
402         if (saeVisible) {
403             assertThat(saeFound).isTrue();
404         } else {
405             assertThat(saeFound).isFalse();
406         }
407         if (suitebVisible) {
408             assertThat(suitebFound).isTrue();
409         } else {
410             assertThat(suitebFound).isFalse();
411         }
412         if (oweVisible) {
413             assertThat(oweFound).isTrue();
414         } else {
415             assertThat(oweFound).isFalse();
416         }
417     }
418 
419     public class TestWifiConfigController2 extends WifiConfigController2 {
420 
TestWifiConfigController2( WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry, int mode)421         private TestWifiConfigController2(
422                 WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry, int mode) {
423             super(parent, view, wifiEntry, mode);
424         }
425 
TestWifiConfigController2( WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry, int mode, WifiManager wifiManager)426         private TestWifiConfigController2(
427                 WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry, int mode,
428                     WifiManager wifiManager) {
429             super(parent, view, wifiEntry, mode, wifiManager);
430         }
431 
432         @Override
getAndroidKeystoreAliasLoader()433         AndroidKeystoreAliasLoader getAndroidKeystoreAliasLoader() {
434             return mAndroidKeystoreAliasLoader;
435         }
436     }
437 
438     @Test
loadMacRandomizedValue_shouldPersistentAsDefault()439     public void loadMacRandomizedValue_shouldPersistentAsDefault() {
440         final Spinner privacySetting = mView.findViewById(R.id.privacy_settings);
441         final int prefPersist =
442                 WifiPrivacyPreferenceController2.translateMacRandomizedValueToPrefValue(
443                         WifiConfiguration.RANDOMIZATION_PERSISTENT);
444 
445         assertThat(privacySetting.getVisibility()).isEqualTo(View.VISIBLE);
446         assertThat(privacySetting.getSelectedItemPosition()).isEqualTo(prefPersist);
447     }
448 
449     @Test
loadSavedMacRandomizedPersistentValue_shouldCorrectMacValue()450     public void loadSavedMacRandomizedPersistentValue_shouldCorrectMacValue() {
451         checkSavedMacRandomizedValue(WifiConfiguration.RANDOMIZATION_PERSISTENT);
452     }
453 
454     @Test
loadSavedMacRandomizedNoneValue_shouldCorrectMacValue()455     public void loadSavedMacRandomizedNoneValue_shouldCorrectMacValue() {
456         checkSavedMacRandomizedValue(WifiConfiguration.RANDOMIZATION_NONE);
457     }
458 
checkSavedMacRandomizedValue(int macRandomizedValue)459     private void checkSavedMacRandomizedValue(int macRandomizedValue) {
460         when(mWifiEntry.isSaved()).thenReturn(true);
461         final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
462         when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
463         when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig);
464         mockWifiConfig.macRandomizationSetting = macRandomizedValue;
465         mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
466                 WifiConfigUiBase2.MODE_CONNECT);
467 
468         final Spinner privacySetting = mView.findViewById(R.id.privacy_settings);
469         final int expectedPrefValue =
470                 WifiPrivacyPreferenceController2.translateMacRandomizedValueToPrefValue(
471                         macRandomizedValue);
472 
473         assertThat(privacySetting.getVisibility()).isEqualTo(View.VISIBLE);
474         assertThat(privacySetting.getSelectedItemPosition()).isEqualTo(expectedPrefValue);
475     }
476 
477     @Test
saveMacRandomizedValue_noChanged_shouldPersistentAsDefault()478     public void saveMacRandomizedValue_noChanged_shouldPersistentAsDefault() {
479         WifiConfiguration config = mController.getConfig();
480         assertThat(config.macRandomizationSetting).isEqualTo(
481                 WifiConfiguration.RANDOMIZATION_PERSISTENT);
482     }
483 
484     @Test
saveMacRandomizedValue_ChangedToNone_shouldGetNone()485     public void saveMacRandomizedValue_ChangedToNone_shouldGetNone() {
486         final Spinner privacySetting = mView.findViewById(R.id.privacy_settings);
487         final int prefMacNone =
488                 WifiPrivacyPreferenceController2.translateMacRandomizedValueToPrefValue(
489                         WifiConfiguration.RANDOMIZATION_NONE);
490         privacySetting.setSelection(prefMacNone);
491 
492         WifiConfiguration config = mController.getConfig();
493         assertThat(config.macRandomizationSetting).isEqualTo(WifiConfiguration.RANDOMIZATION_NONE);
494     }
495 
496     @Test
replaceTtsString_whenTargetMatched_shouldSuccess()497     public void replaceTtsString_whenTargetMatched_shouldSuccess() {
498         final CharSequence[] display = {"PEAP", "AKA1", "AKA2'"};
499         final CharSequence[] target = {"AKA1", "AKA2'"};
500         final CharSequence[] ttsString = {"AKA1_TTS", "AKA2_TTS"};
501 
502         final CharSequence[] resultTts = mController.findAndReplaceTargetStrings(display, target,
503             ttsString);
504 
505         assertThat(resultTts[0]).isEqualTo("PEAP");
506         assertThat(resultTts[1]).isEqualTo("AKA1_TTS");
507         assertThat(resultTts[2]).isEqualTo("AKA2_TTS");
508     }
509 
510     @Test
replaceTtsString_whenNoTargetStringMatched_originalStringShouldNotChanged()511     public void replaceTtsString_whenNoTargetStringMatched_originalStringShouldNotChanged() {
512         final CharSequence[] display = {"PEAP", "AKA1", "AKA2"};
513         final CharSequence[] target = {"WEP1", "WEP2'"};
514         final CharSequence[] ttsString = {"WEP1_TTS", "WEP2_TTS"};
515 
516         final CharSequence[] resultTts = mController.findAndReplaceTargetStrings(display, target,
517             ttsString);
518 
519         assertThat(resultTts[0]).isEqualTo("PEAP");
520         assertThat(resultTts[1]).isEqualTo("AKA1");
521         assertThat(resultTts[2]).isEqualTo("AKA2");
522     }
523 
524     @Test
checktEapMethodTargetAndTtsArraylength_shouldHaveSameCount()525     public void checktEapMethodTargetAndTtsArraylength_shouldHaveSameCount() {
526         final Resources resources = mContext.getResources();
527         final String[] targetStringArray = resources.getStringArray(
528             R.array.wifi_eap_method_target_strings);
529         final String[] ttsStringArray = resources.getStringArray(
530             R.array.wifi_eap_method_tts_strings);
531 
532         assertThat(targetStringArray.length).isEqualTo(ttsStringArray.length);
533     }
534 
535     @Test
selectSecurity_wpa3Eap192bit_eapMethodTls()536     public void selectSecurity_wpa3Eap192bit_eapMethodTls() {
537         final WifiManager wifiManager = mock(WifiManager.class);
538         when(wifiManager.isWpa3SuiteBSupported()).thenReturn(true);
539         mController = new TestWifiConfigController2(mConfigUiBase, mView, null /* wifiEntry */,
540                 WifiConfigUiBase2.MODE_MODIFY, wifiManager);
541         final Spinner securitySpinner = mView.findViewById(R.id.security);
542         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
543         int wpa3Eap192bitPosition = -1;
544         final int securityCount = mController.mSecurityInPosition.length;
545         for (int i = 0; i < securityCount; i++) {
546             if (mController.mSecurityInPosition[i] != null
547                     && mController.mSecurityInPosition[i] == WifiEntry.SECURITY_EAP_SUITE_B) {
548                 wpa3Eap192bitPosition = i;
549             }
550         }
551 
552         mController.onItemSelected(securitySpinner, /* view */ null, wpa3Eap192bitPosition,
553                 /* id */ 0);
554 
555         final int selectedItemPosition = eapMethodSpinner.getSelectedItemPosition();
556         assertThat(eapMethodSpinner.getSelectedItem().toString()).isEqualTo("TLS");
557     }
558 
559     @Test
checkImeStatus_whenAdvancedToggled_shouldBeHide()560     public void checkImeStatus_whenAdvancedToggled_shouldBeHide() {
561         final InputMethodManager inputMethodManager = mContext
562                 .getSystemService(InputMethodManager.class);
563         final ShadowInputMethodManager shadowImm = Shadows.shadowOf(inputMethodManager);
564         final CheckBox advButton = mView.findViewById(R.id.wifi_advanced_togglebox);
565 
566         inputMethodManager.showSoftInput(null /* view */, 0 /* flags */);
567         advButton.performClick();
568 
569         assertThat(shadowImm.isSoftInputVisible()).isFalse();
570     }
571 
572     @Test
selectEapMethod_savedWifiEntry_shouldGetCorrectPosition()573     public void selectEapMethod_savedWifiEntry_shouldGetCorrectPosition() {
574         setUpModifyingSavedPeapConfigController();
575         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
576         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
577         WifiConfiguration wifiConfiguration;
578 
579         // Test EAP method PEAP
580         eapMethodSpinner.setSelection(Eap.PEAP);
581         phase2Spinner.setSelection(WifiConfigController2.WIFI_PEAP_PHASE2_MSCHAPV2);
582         wifiConfiguration = mController.getConfig();
583 
584         assertThat(wifiConfiguration.enterpriseConfig.getEapMethod()).isEqualTo(Eap.PEAP);
585         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(
586                 Phase2.MSCHAPV2);
587 
588         // Test EAP method TTLS
589         eapMethodSpinner.setSelection(Eap.TTLS);
590         phase2Spinner.setSelection(WifiConfigController2.WIFI_TTLS_PHASE2_MSCHAPV2);
591         wifiConfiguration = mController.getConfig();
592 
593         assertThat(wifiConfiguration.enterpriseConfig.getEapMethod()).isEqualTo(Eap.TTLS);
594         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(
595                 Phase2.MSCHAPV2);
596     }
597 
598     @Test
getHiddenSettingsPosition_whenAdvancedToggled_shouldBeFirst()599     public void getHiddenSettingsPosition_whenAdvancedToggled_shouldBeFirst() {
600         final LinearLayout advancedFieldsLayout = mView.findViewById(R.id.wifi_advanced_fields);
601         final LinearLayout hiddenSettingLayout = mView.findViewById(R.id.hidden_settings_field);
602 
603         final LinearLayout firstChild = (LinearLayout) advancedFieldsLayout.getChildAt(0);
604 
605         assertThat(firstChild).isEqualTo(hiddenSettingLayout);
606     }
607 
608     @Test
getAdvancedOptionContentDescription_whenViewInitialed_shouldBeCorrect()609     public void getAdvancedOptionContentDescription_whenViewInitialed_shouldBeCorrect() {
610         final CheckBox advButton = mView.findViewById(R.id.wifi_advanced_togglebox);
611 
612         assertThat(advButton.getContentDescription()).isEqualTo(
613                 mContext.getString(R.string.wifi_advanced_toggle_description));
614     }
615 
616     @Test
getWepConfig_withNumberAndCharacterKey_shouldContainTheSameKey()617     public void getWepConfig_withNumberAndCharacterKey_shouldContainTheSameKey() {
618         final TextView password = mView.findViewById(R.id.password);
619         password.setText(NUMBER_AND_CHARACTER_KEY);
620         mController.mWifiEntrySecurity = WifiEntry.SECURITY_WEP;
621 
622         WifiConfiguration wifiConfiguration = mController.getConfig();
623 
624         assertThat(wifiConfiguration.wepKeys[0]).isEqualTo(NUMBER_AND_CHARACTER_KEY);
625     }
626 
627     @Test
getWepConfig_withPartialNumberAndCharacterKey_shouldContainDifferentKey()628     public void getWepConfig_withPartialNumberAndCharacterKey_shouldContainDifferentKey() {
629         final TextView password = mView.findViewById(R.id.password);
630         password.setText(PARTIAL_NUMBER_AND_CHARACTER_KEY);
631         mController.mWifiEntrySecurity = WifiEntry.SECURITY_WEP;
632 
633         WifiConfiguration wifiConfiguration = mController.getConfig();
634 
635         assertThat(wifiConfiguration.wepKeys[0]).isNotEqualTo(PARTIAL_NUMBER_AND_CHARACTER_KEY);
636     }
637 
638     @Test
getPskConfig_withValidHexKey_shouldContainTheSameKey()639     public void getPskConfig_withValidHexKey_shouldContainTheSameKey() {
640         final TextView password = mView.findViewById(R.id.password);
641         password.setText(VALID_HEX_PSK);
642         mController.mWifiEntrySecurity = WifiEntry.SECURITY_PSK;
643 
644         WifiConfiguration wifiConfiguration = mController.getConfig();
645 
646         assertThat(wifiConfiguration.preSharedKey).isEqualTo(VALID_HEX_PSK);
647     }
648 
649     @Test
getPskConfig_withInvalidHexKey_shouldContainDifferentKey()650     public void getPskConfig_withInvalidHexKey_shouldContainDifferentKey() {
651         final TextView password = mView.findViewById(R.id.password);
652         password.setText(INVALID_HEX_PSK);
653         mController.mWifiEntrySecurity = WifiEntry.SECURITY_PSK;
654 
655         WifiConfiguration wifiConfiguration = mController.getConfig();
656 
657         assertThat(wifiConfiguration.preSharedKey).isNotEqualTo(INVALID_HEX_PSK);
658     }
659 
660     @Test
getEapConfig_withPhase2Gtc_shouldContainGtcMethod()661     public void getEapConfig_withPhase2Gtc_shouldContainGtcMethod() {
662         setUpModifyingSavedPeapConfigController();
663 
664         // Test EAP method PEAP
665         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
666         eapMethodSpinner.setSelection(Eap.PEAP);
667 
668         // Test phase2 GTC
669         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
670         phase2Spinner.setSelection(WifiConfigController2.WIFI_PEAP_PHASE2_GTC);
671 
672         WifiConfiguration wifiConfiguration = mController.getConfig();
673 
674         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.GTC);
675     }
676 
677     @Test
getEapConfig_withPhase2Sim_shouldContainSimMethod()678     public void getEapConfig_withPhase2Sim_shouldContainSimMethod() {
679         setUpModifyingSavedPeapConfigController();
680 
681         // Test EAP method PEAP
682         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
683         eapMethodSpinner.setSelection(Eap.PEAP);
684 
685         // Test phase2 SIM
686         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
687         phase2Spinner.setSelection(WifiConfigController2.WIFI_PEAP_PHASE2_SIM);
688 
689         WifiConfiguration wifiConfiguration = mController.getConfig();
690 
691         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.SIM);
692     }
693 
694     @Test
getEapConfig_withPhase2Aka_shouldContainAkaMethod()695     public void getEapConfig_withPhase2Aka_shouldContainAkaMethod() {
696         setUpModifyingSavedPeapConfigController();
697 
698         // Test EAP method PEAP
699         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
700         eapMethodSpinner.setSelection(Eap.PEAP);
701 
702         // Test phase2 AKA
703         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
704         phase2Spinner.setSelection(WifiConfigController2.WIFI_PEAP_PHASE2_AKA);
705 
706         WifiConfiguration wifiConfiguration = mController.getConfig();
707 
708         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.AKA);
709     }
710 
711     @Test
getEapConfig_withPhase2AkaPrime_shouldContainAkaPrimeMethod()712     public void getEapConfig_withPhase2AkaPrime_shouldContainAkaPrimeMethod() {
713         setUpModifyingSavedPeapConfigController();
714 
715         // Test EAP method PEAP
716         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
717         eapMethodSpinner.setSelection(Eap.PEAP);
718 
719         // Test phase2 AKA PRIME
720         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
721         phase2Spinner.setSelection(WifiConfigController2.WIFI_PEAP_PHASE2_AKA_PRIME);
722 
723         WifiConfiguration wifiConfiguration = mController.getConfig();
724 
725         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(
726                 Phase2.AKA_PRIME);
727     }
728 
729     @Test
getEapConfig_withPeapPhase2Unknown_shouldContainNoneMethod()730     public void getEapConfig_withPeapPhase2Unknown_shouldContainNoneMethod() {
731         setUpModifyingSavedPeapConfigController();
732 
733         // Test EAP method PEAP
734         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
735         eapMethodSpinner.setSelection(Eap.PEAP);
736 
737         // Test phase2 Unknown
738         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
739         phase2Spinner.setSelection(-1);
740 
741         WifiConfiguration wifiConfiguration = mController.getConfig();
742 
743         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.NONE);
744     }
745 
746     @Test
getEapConfig_withTTLSPhase2Pap_shouldContainPapMethod()747     public void getEapConfig_withTTLSPhase2Pap_shouldContainPapMethod() {
748         setUpModifyingSavedPeapConfigController();
749 
750         // Test EAP method TTLS
751         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
752         eapMethodSpinner.setSelection(Eap.TTLS);
753 
754         // Test phase2 PAP
755         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
756         phase2Spinner.setSelection(WifiConfigController2.WIFI_TTLS_PHASE2_PAP);
757 
758         WifiConfiguration wifiConfiguration = mController.getConfig();
759 
760         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.PAP);
761     }
762 
763     @Test
getEapConfig_withTTLSPhase2Mschap_shouldContainMschapMethod()764     public void getEapConfig_withTTLSPhase2Mschap_shouldContainMschapMethod() {
765         setUpModifyingSavedPeapConfigController();
766 
767         // Test EAP method TTLS
768         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
769         eapMethodSpinner.setSelection(Eap.TTLS);
770 
771         // Test phase2 MSCHAP
772         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
773         phase2Spinner.setSelection(WifiConfigController2.WIFI_TTLS_PHASE2_MSCHAP);
774 
775         WifiConfiguration wifiConfiguration = mController.getConfig();
776 
777         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.MSCHAP);
778     }
779 
780     @Test
getEapConfig_withTTLSPhase2Gtc_shouldContainGtcMethod()781     public void getEapConfig_withTTLSPhase2Gtc_shouldContainGtcMethod() {
782         setUpModifyingSavedPeapConfigController();
783 
784         // Test EAP method TTLS
785         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
786         eapMethodSpinner.setSelection(Eap.TTLS);
787 
788         // Test phase2 GTC
789         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
790         phase2Spinner.setSelection(WifiConfigController2.WIFI_TTLS_PHASE2_GTC);
791 
792         WifiConfiguration wifiConfiguration = mController.getConfig();
793 
794         assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.GTC);
795     }
796 
setUpModifyingSavedPeapConfigController()797     private void setUpModifyingSavedPeapConfigController() {
798         when(mWifiEntry.isSaved()).thenReturn(true);
799         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
800         final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
801         when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
802         final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
803         when(mockWifiEnterpriseConfig.getEapMethod()).thenReturn(Eap.PEAP);
804         mockWifiConfig.enterpriseConfig = mockWifiEnterpriseConfig;
805         when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig);
806         mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
807                 WifiConfigUiBase2.MODE_MODIFY);
808     }
809 
810     @Test
loadSims_noSim_simSpinnerDefaultNoSim()811     public void loadSims_noSim_simSpinnerDefaultNoSim() {
812         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
813         mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
814                 WifiConfigUiBase2.MODE_CONNECT);
815         final Spinner eapMethodSpinner = mock(Spinner.class);
816         when(eapMethodSpinner.getSelectedItemPosition()).thenReturn(
817                 WifiConfigController2.WIFI_EAP_METHOD_SIM);
818         mController.mEapMethodSpinner = eapMethodSpinner;
819 
820         mController.loadSims();
821 
822         final WifiConfiguration wifiConfiguration = mController.getConfig();
823         assertThat(wifiConfiguration.carrierId).isEqualTo(TelephonyManager.UNKNOWN_CARRIER_ID);
824     }
825 
826     @Test
loadSims_oneSim_simSpinnerDefaultSubscription()827     public void loadSims_oneSim_simSpinnerDefaultSubscription() {
828         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
829         final SubscriptionInfo subscriptionInfo = mock(SubscriptionInfo.class);
830         final int carrierId = 6;
831         when(subscriptionInfo.getSubscriptionId()).thenReturn(carrierId);
832         when(subscriptionInfo.getDisplayName()).thenReturn("FAKE-CARRIER");
833         when(subscriptionInfo.getCarrierId()).thenReturn(carrierId);
834         when(subscriptionInfo.getCarrierName()).thenReturn("FAKE-CARRIER");
835         SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(subscriptionInfo));
836         mShadowSubscriptionManager.setActiveSubscriptionInfoList(Arrays.asList(subscriptionInfo));
837         mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
838                 WifiConfigUiBase2.MODE_CONNECT);
839         final Spinner eapMethodSpinner = mock(Spinner.class);
840         when(eapMethodSpinner.getSelectedItemPosition()).thenReturn(
841                 WifiConfigController2.WIFI_EAP_METHOD_SIM);
842         mController.mEapMethodSpinner = eapMethodSpinner;
843 
844         mController.loadSims();
845 
846         final WifiConfiguration wifiConfiguration = mController.getConfig();
847         assertThat(wifiConfiguration.carrierId).isEqualTo(carrierId);
848     }
849 
850     @Test
loadCaCertificateValue_shouldPersistentAsDefault()851     public void loadCaCertificateValue_shouldPersistentAsDefault() {
852         setUpModifyingSavedCertificateConfigController(null, null);
853 
854         mEapCaCertSpinner.setSelection(POSITION_SYSTEM_CERT);
855         assertThat(mEapCaCertSpinner.getSelectedItem()).isEqualTo(mUseSystemCertsString);
856     }
857 
858     @Test
onItemSelected_shouldPersistentInstallCertsAndStartInstallActivity()859     public void onItemSelected_shouldPersistentInstallCertsAndStartInstallActivity() {
860         String installCertsString = "install_certs";
861         Spinner eapCaCertSpinner = mock(Spinner.class);
862         AdapterView view = mock(AdapterView.class);
863         when(eapCaCertSpinner.getItemAtPosition(anyInt())).thenReturn(view);
864         when(view.toString()).thenReturn(installCertsString);
865         mController.mInstallCertsString = installCertsString;
866         mController.mEapCaCertSpinner = eapCaCertSpinner;
867 
868         mController.onItemSelected(eapCaCertSpinner, null, POSITION_INSTALL_CERT, 0);
869 
870         final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
871         verify(mContext).startActivity(argumentCaptor.capture());
872         final Intent intent = argumentCaptor.getValue();
873         assertThat(intent.getAction()).isEqualTo(ACTION_INSTALL_CERTS);
874         assertThat(intent.getExtra(KEY_INSTALL_CERTIFICATE, ""))
875                 .isEqualTo(INSTALL_CERTIFICATE_VALUE);
876     }
877 
878     @Test
loadSavedCaCertificateValue_shouldBeCorrectValue()879     public void loadSavedCaCertificateValue_shouldBeCorrectValue() {
880         setUpModifyingSavedCertificateConfigController(SAVED_CA_CERT, null);
881 
882         assertThat(mEapCaCertSpinner.getSelectedItem()).isEqualTo(SAVED_CA_CERT);
883     }
884 
885     @Test
loadUserCertificateValue_shouldPersistentAsDefault()886     public void loadUserCertificateValue_shouldPersistentAsDefault() {
887         setUpModifyingSavedCertificateConfigController(null, null);
888 
889         assertThat(mEapUserCertSpinner.getSelectedItem()).isEqualTo(mDoNotProvideEapUserCertString);
890     }
891 
892     @Test
loadSavedUserCertificateValue_shouldBeCorrectValue()893     public void loadSavedUserCertificateValue_shouldBeCorrectValue() {
894         setUpModifyingSavedCertificateConfigController(null, SAVED_USER_CERT);
895 
896         assertThat(mEapUserCertSpinner.getSelectedItem()).isEqualTo(SAVED_USER_CERT);
897     }
898 
setUpModifyingSavedCertificateConfigController(String savedCaCertificate, String savedUserCertificate)899     private void setUpModifyingSavedCertificateConfigController(String savedCaCertificate,
900             String savedUserCertificate) {
901         final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
902         final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
903 
904         mockWifiConfig.enterpriseConfig = mockWifiEnterpriseConfig;
905         when(mWifiEntry.isSaved()).thenReturn(true);
906         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
907         when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig);
908         when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
909         when(mockWifiEnterpriseConfig.getEapMethod()).thenReturn(Eap.TLS);
910         if (savedCaCertificate != null) {
911             String[] savedCaCertificates = new String[]{savedCaCertificate};
912             when(mockWifiEnterpriseConfig.getCaCertificateAliases())
913                     .thenReturn(savedCaCertificates);
914             when(mAndroidKeystoreAliasLoader.getCaCertAliases())
915                     .thenReturn(ImmutableList.of(savedCaCertificate));
916         }
917         if (savedUserCertificate != null) {
918             String[] savedUserCertificates = new String[]{savedUserCertificate};
919             when(mockWifiEnterpriseConfig.getClientCertificateAlias())
920                     .thenReturn(savedUserCertificate);
921             when(mAndroidKeystoreAliasLoader.getKeyCertAliases())
922                     .thenReturn(ImmutableList.of(savedUserCertificate));
923         }
924 
925         mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
926                 WifiConfigUiBase2.MODE_MODIFY);
927 
928         //  Because Robolectric has a different behavior from normal flow.
929         //
930         //  Normal flow:
931         //    showSecurityFields start -> mEapMethodSpinner.setSelection
932         //        -> showSecurityFields end -> mController.onItemSelected
933         //
934         //  Robolectric flow:
935         //    showSecurityFields start -> mEapMethodSpinner.setSelection
936         //        -> mController.onItemSelected -> showSecurityFields end
937         //
938         //  We need to add a redundant mEapMethodSpinner.setSelection here to verify whether the
939         //  certificates are covered by mController.onItemSelected after showSecurityFields end.
940         mController.mEapMethodSpinner.setSelection(Eap.TLS);
941     }
942 }
943