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