Home | History | Annotate | Download | only in wifi
      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.server.wifi;
     18 
     19 import static android.net.wifi.WifiManager.WIFI_FEATURE_CONTROL_ROAMING;
     20 
     21 import static org.junit.Assert.*;
     22 import static org.mockito.Mockito.*;
     23 
     24 import android.app.test.MockAnswerUtil.AnswerWithArguments;
     25 import android.support.test.filters.SmallTest;
     26 
     27 import org.junit.After;
     28 import org.junit.Before;
     29 import org.junit.Test;
     30 import org.mockito.ArgumentCaptor;
     31 import org.mockito.Captor;
     32 import org.mockito.Mock;
     33 import org.mockito.MockitoAnnotations;
     34 
     35 import java.util.ArrayList;
     36 
     37 /**
     38  * Unit tests for {@link com.android.server.wifi.WifiConnectivityHelper}.
     39  */
     40 @SmallTest
     41 public class WifiConnectivityHelperTest {
     42     /** Sets up test. */
     43     @Before
     44     public void setUp() throws Exception {
     45         MockitoAnnotations.initMocks(this);
     46         setupWifiNative();
     47 
     48         mWifiConnectivityHelper = new WifiConnectivityHelper(mWifiNative);
     49     }
     50 
     51     /** Cleans up test. */
     52     @After
     53     public void cleanup() {
     54         validateMockitoUsage();
     55     }
     56 
     57     private WifiConnectivityHelper mWifiConnectivityHelper;
     58     @Mock private WifiNative mWifiNative;
     59     @Captor ArgumentCaptor<WifiNative.RoamingConfig> mRoamingConfigCaptor;
     60     private int mFeatureSetValue;
     61     private static final String TAG = "WifiConnectivityHelperTest";
     62     private static final int MAX_BSSID_BLACKLIST_SIZE = 16;
     63     private static final int MAX_SSID_WHITELIST_SIZE = 8;
     64 
     65     private void setupWifiNative() {
     66         // Return firmware roaming feature as supported by default.
     67         when(mWifiNative.getSupportedFeatureSet(any())).thenReturn(WIFI_FEATURE_CONTROL_ROAMING);
     68 
     69         doAnswer(new AnswerWithArguments() {
     70             public boolean answer(String ifaceName, WifiNative.RoamingCapabilities roamCap)
     71                     throws Exception {
     72                 roamCap.maxBlacklistSize = MAX_BSSID_BLACKLIST_SIZE;
     73                 roamCap.maxWhitelistSize = MAX_SSID_WHITELIST_SIZE;
     74                 return true;
     75             }}).when(mWifiNative).getRoamingCapabilities(any(), anyObject());
     76 
     77         when(mWifiNative.configureRoaming(any(), anyObject())).thenReturn(true);
     78     }
     79 
     80     private ArrayList<String> buildBssidBlacklist(int size) {
     81         ArrayList<String> bssidBlacklist = new ArrayList<String>();
     82 
     83         for (int i = 0; i < size; i++) {
     84             StringBuilder bssid = new StringBuilder("11:22:33:44:55:66");
     85             bssid.setCharAt(16, (char) ('0' + i));
     86             bssidBlacklist.add(bssid.toString());
     87         }
     88 
     89         return bssidBlacklist;
     90     }
     91 
     92     private ArrayList<String> buildSsidWhitelist(int size) {
     93         ArrayList<String> ssidWhitelist = new ArrayList<String>();
     94 
     95         for (int i = 0; i < size; i++) {
     96             StringBuilder ssid = new StringBuilder("\"Test_Ap_0\"");
     97             ssid.setCharAt(9, (char) ('0' + i));
     98             ssidWhitelist.add(ssid.toString());
     99         }
    100 
    101         return ssidWhitelist;
    102     }
    103 
    104     /**
    105      * When WifiNative has WIFI_FEATURE_CONTROL_ROAMING set, verify that
    106      * WifiConnectivityHelper#isFirmwareRoamingSupported returns true.
    107      */
    108     @Test
    109     public void returnFirmwareRoamingSupported() {
    110         //By default WifiNative has WIFI_FEATURE_CONTROL_ROAMING set in its feature set.
    111         assertTrue(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    112         assertTrue(mWifiConnectivityHelper.isFirmwareRoamingSupported());
    113     }
    114 
    115     /**
    116      * When WifiNative doesn't have WIFI_FEATURE_CONTROL_ROAMING set, verify that
    117      * WifiConnectivityHelper#isFirmwareRoamingSupported returns false.
    118      */
    119     @Test
    120     public void returnFirmwareRoamingNotSupported() {
    121         when(mWifiNative.getSupportedFeatureSet(any())).thenReturn(~WIFI_FEATURE_CONTROL_ROAMING);
    122         assertTrue(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    123         assertFalse(mWifiConnectivityHelper.isFirmwareRoamingSupported());
    124     }
    125 
    126     /**
    127      * Verify that correct firmware roaming capability values are returned if querying
    128      * WifiNative for roaming capability succeeded.
    129      */
    130     @Test
    131     public void verifyFirmwareRoamingCapabilityWithSuccessfulNativeCall() {
    132         assertTrue(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    133         assertTrue(mWifiConnectivityHelper.isFirmwareRoamingSupported());
    134         assertEquals(MAX_BSSID_BLACKLIST_SIZE, mWifiConnectivityHelper.getMaxNumBlacklistBssid());
    135         assertEquals(MAX_SSID_WHITELIST_SIZE, mWifiConnectivityHelper.getMaxNumWhitelistSsid());
    136     }
    137 
    138     /**
    139      * Verify that firmware roaming is set to not supported if WifiNative returned firmware roaming
    140      * is supported but failed to return roaming capabilities. Firmware roaming capabilty values
    141      * should be reset to INVALID_LIST_SIZE.
    142      */
    143     @Test
    144     public void verifyFirmwareRoamingCapabilityWithFailureNativeCall() {
    145         doAnswer(new AnswerWithArguments() {
    146             public boolean answer(String ifaceName, WifiNative.RoamingCapabilities roamCap)
    147                     throws Exception {
    148                 return false;
    149             }}).when(mWifiNative).getRoamingCapabilities(any(), anyObject());
    150         assertFalse(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    151         assertFalse(mWifiConnectivityHelper.isFirmwareRoamingSupported());
    152         assertEquals(WifiConnectivityHelper.INVALID_LIST_SIZE,
    153                 mWifiConnectivityHelper.getMaxNumBlacklistBssid());
    154         assertEquals(WifiConnectivityHelper.INVALID_LIST_SIZE,
    155                 mWifiConnectivityHelper.getMaxNumWhitelistSsid());
    156     }
    157 
    158     /**
    159      * Verify that firmware roaming is set to not supported if WifiNative returned firmware roaming
    160      * is supported but returned invalid max BSSID balcklist size. Firmware roaming capabilty values
    161      * should be reset to INVALID_LIST_SIZE.
    162      */
    163     @Test
    164     public void verifyFirmwareRoamingCapabilityWithInvalidMaxBssidBlacklistSize() {
    165         doAnswer(new AnswerWithArguments() {
    166             public boolean answer(String ifaceName, WifiNative.RoamingCapabilities roamCap)
    167                     throws Exception {
    168                 roamCap.maxBlacklistSize = -5;
    169                 roamCap.maxWhitelistSize = MAX_SSID_WHITELIST_SIZE;
    170                 return true;
    171             }}).when(mWifiNative).getRoamingCapabilities(any(), anyObject());
    172         assertFalse(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    173         assertFalse(mWifiConnectivityHelper.isFirmwareRoamingSupported());
    174         assertEquals(WifiConnectivityHelper.INVALID_LIST_SIZE,
    175                 mWifiConnectivityHelper.getMaxNumBlacklistBssid());
    176         assertEquals(WifiConnectivityHelper.INVALID_LIST_SIZE,
    177                 mWifiConnectivityHelper.getMaxNumWhitelistSsid());
    178     }
    179 
    180     /**
    181      * Verify that firmware roaming is set to not supported if WifiNative returned firmware roaming
    182      * is supported but returned invalid max SSID whitelist size. Firmware roaming capabilty values
    183      * should be reset to INVALID_LIST_SIZE.
    184      */
    185     @Test
    186     public void verifyFirmwareRoamingCapabilityWithInvalidMaxSsidWhitelistSize() {
    187         doAnswer(new AnswerWithArguments() {
    188             public boolean answer(String ifaceName, WifiNative.RoamingCapabilities roamCap)
    189                     throws Exception {
    190                 roamCap.maxBlacklistSize = MAX_BSSID_BLACKLIST_SIZE;
    191                 roamCap.maxWhitelistSize = -2;
    192                 return true;
    193             }}).when(mWifiNative).getRoamingCapabilities(any(), anyObject());
    194         assertFalse(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    195         assertFalse(mWifiConnectivityHelper.isFirmwareRoamingSupported());
    196         assertEquals(WifiConnectivityHelper.INVALID_LIST_SIZE,
    197                 mWifiConnectivityHelper.getMaxNumBlacklistBssid());
    198         assertEquals(WifiConnectivityHelper.INVALID_LIST_SIZE,
    199                 mWifiConnectivityHelper.getMaxNumWhitelistSsid());
    200     }
    201 
    202     /**
    203      * Verify that correct size BSSID blacklist and SSID whitelist are accepted.
    204      */
    205     @Test
    206     public void verifySetFirmwareRoamingConfigurationWithGoodInput() {
    207         assertTrue(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    208         ArrayList<String> blacklist = buildBssidBlacklist(MAX_BSSID_BLACKLIST_SIZE);
    209         ArrayList<String> whitelist = buildSsidWhitelist(MAX_SSID_WHITELIST_SIZE);
    210         assertTrue(mWifiConnectivityHelper.setFirmwareRoamingConfiguration(blacklist, whitelist));
    211 
    212         blacklist = buildBssidBlacklist(MAX_BSSID_BLACKLIST_SIZE - 2);
    213         whitelist = buildSsidWhitelist(MAX_SSID_WHITELIST_SIZE - 3);
    214         assertTrue(mWifiConnectivityHelper.setFirmwareRoamingConfiguration(blacklist, whitelist));
    215     }
    216 
    217     /**
    218      * Verify that null BSSID blacklist or SSID whitelist is rejected.
    219      */
    220     @Test
    221     public void verifySetFirmwareRoamingConfigurationWithNullInput() {
    222         assertTrue(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    223         ArrayList<String> blacklist = buildBssidBlacklist(MAX_BSSID_BLACKLIST_SIZE);
    224         ArrayList<String> whitelist = buildSsidWhitelist(MAX_SSID_WHITELIST_SIZE);
    225         assertFalse(mWifiConnectivityHelper.setFirmwareRoamingConfiguration(null, whitelist));
    226         assertFalse(mWifiConnectivityHelper.setFirmwareRoamingConfiguration(blacklist, null));
    227     }
    228 
    229     /**
    230      * Verify that incorrect size BSSID blacklist is rejected.
    231      */
    232     @Test
    233     public void verifySetFirmwareRoamingConfigurationWithIncorrectBlacklist() {
    234         assertTrue(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    235         ArrayList<String> blacklist = buildBssidBlacklist(MAX_BSSID_BLACKLIST_SIZE + 1);
    236         ArrayList<String> whitelist = buildSsidWhitelist(MAX_SSID_WHITELIST_SIZE);
    237         assertFalse(mWifiConnectivityHelper.setFirmwareRoamingConfiguration(blacklist, whitelist));
    238     }
    239 
    240     /**
    241      * Verify that incorrect size SSID whitelist is rejected.
    242      */
    243     @Test
    244     public void verifySetFirmwareRoamingConfigurationWithIncorrectWhitelist() {
    245         assertTrue(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    246         ArrayList<String> blacklist = buildBssidBlacklist(MAX_BSSID_BLACKLIST_SIZE);
    247         ArrayList<String> whitelist = buildSsidWhitelist(MAX_SSID_WHITELIST_SIZE + 1);
    248         assertFalse(mWifiConnectivityHelper.setFirmwareRoamingConfiguration(blacklist, whitelist));
    249     }
    250 
    251     /**
    252      * Verify that empty BSSID blacklist and SSID whitelist are sent to WifiNative
    253      * to reset the firmware roaming configuration.
    254      */
    255     @Test
    256     public void verifySetFirmwareRoamingConfigurationWithEmptyBlacklistAndWhitelist() {
    257         assertTrue(mWifiConnectivityHelper.getFirmwareRoamingInfo());
    258         ArrayList<String> blacklist = buildBssidBlacklist(0);
    259         ArrayList<String> whitelist = buildSsidWhitelist(0);
    260         assertTrue(mWifiConnectivityHelper.setFirmwareRoamingConfiguration(blacklist, whitelist));
    261         verify(mWifiNative).configureRoaming(any(), mRoamingConfigCaptor.capture());
    262         assertEquals(0, mRoamingConfigCaptor.getValue().blacklistBssids.size());
    263         assertEquals(0, mRoamingConfigCaptor.getValue().whitelistSsids.size());
    264     }
    265 }
    266