WifiMonitorTest.java revision 6680c62f91f61660d47c34ae435113ca5846b79d
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 17package com.android.server.wifi; 18 19import static org.junit.Assert.assertArrayEquals; 20import static org.junit.Assert.assertEquals; 21import static org.junit.Assert.assertNull; 22import static org.mockito.Mockito.spy; 23import static org.mockito.Mockito.verify; 24 25import android.hardware.wifi.supplicant.V1_0.ISupplicantStaIfaceCallback.WpsConfigError; 26import android.hardware.wifi.supplicant.V1_0.ISupplicantStaIfaceCallback.WpsErrorIndication; 27import android.net.wifi.SupplicantState; 28import android.net.wifi.WifiEnterpriseConfig; 29import android.net.wifi.WifiManager; 30import android.net.wifi.WifiSsid; 31import android.os.Handler; 32import android.os.Message; 33import android.os.test.TestLooper; 34import android.test.suitebuilder.annotation.SmallTest; 35 36import com.android.server.wifi.hotspot2.AnqpEvent; 37import com.android.server.wifi.hotspot2.IconEvent; 38import com.android.server.wifi.util.TelephonyUtil; 39 40import org.junit.Before; 41import org.junit.Test; 42import org.mockito.ArgumentCaptor; 43 44import java.lang.reflect.Constructor; 45 46/** 47 * Unit tests for {@link com.android.server.wifi.WifiMonitor}. 48 */ 49@SmallTest 50public class WifiMonitorTest { 51 private static final String WLAN_IFACE_NAME = "wlan0"; 52 private static final String[] GSM_AUTH_DATA = { "45adbc", "fead45", "0x3452"}; 53 private static final String[] UMTS_AUTH_DATA = { "fead45", "0x3452"}; 54 private static final String BSSID = "fe:45:23:12:12:0a"; 55 private static final int NETWORK_ID = 5; 56 private static final String SSID = "\"test124\""; 57 private WifiMonitor mWifiMonitor; 58 private TestLooper mLooper; 59 private Handler mHandlerSpy; 60 61 @Before 62 public void setUp() throws Exception { 63 final Constructor<WifiMonitor> wifiMonitorConstructor = 64 WifiMonitor.class.getDeclaredConstructor(); 65 wifiMonitorConstructor.setAccessible(true); 66 mWifiMonitor = spy(wifiMonitorConstructor.newInstance()); 67 mLooper = new TestLooper(); 68 mHandlerSpy = spy(new Handler(mLooper.getLooper())); 69 mWifiMonitor.setMonitoring(WLAN_IFACE_NAME, true); 70 } 71 72 /** 73 * Broadcast WPS failure event test. 74 */ 75 @Test 76 public void testBroadcastWpsEventFailDueToErrorTkipOnlyProhibhited() { 77 mWifiMonitor.registerHandler( 78 WLAN_IFACE_NAME, WifiMonitor.WPS_FAIL_EVENT, mHandlerSpy); 79 mWifiMonitor.broadcastWpsFailEvent( 80 WLAN_IFACE_NAME, WpsConfigError.NO_ERROR, 81 WpsErrorIndication.SECURITY_TKIP_ONLY_PROHIBITED); 82 mLooper.dispatchAll(); 83 84 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 85 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 86 assertEquals(WifiMonitor.WPS_FAIL_EVENT, messageCaptor.getValue().what); 87 assertEquals(WifiManager.WPS_TKIP_ONLY_PROHIBITED, messageCaptor.getValue().arg1); 88 } 89 90 /** 91 * Broadcast WPS failure event test. 92 */ 93 @Test 94 public void testBroadcastWpsEventFailDueToErrorWepProhibhited() { 95 mWifiMonitor.registerHandler( 96 WLAN_IFACE_NAME, WifiMonitor.WPS_FAIL_EVENT, mHandlerSpy); 97 mWifiMonitor.broadcastWpsFailEvent( 98 WLAN_IFACE_NAME, WpsConfigError.NO_ERROR, 99 WpsErrorIndication.SECURITY_WEP_PROHIBITED); 100 mLooper.dispatchAll(); 101 102 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 103 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 104 assertEquals(WifiMonitor.WPS_FAIL_EVENT, messageCaptor.getValue().what); 105 assertEquals(WifiManager.WPS_WEP_PROHIBITED, messageCaptor.getValue().arg1); 106 } 107 108 /** 109 * Broadcast WPS failure event test. 110 */ 111 @Test 112 public void testBroadcastWpsEventFailDueToConfigAuthError() { 113 mWifiMonitor.registerHandler( 114 WLAN_IFACE_NAME, WifiMonitor.WPS_FAIL_EVENT, mHandlerSpy); 115 mWifiMonitor.broadcastWpsFailEvent( 116 WLAN_IFACE_NAME, WpsConfigError.DEV_PASSWORD_AUTH_FAILURE, 117 WpsErrorIndication.NO_ERROR); 118 119 mLooper.dispatchAll(); 120 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 121 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 122 assertEquals(WifiMonitor.WPS_FAIL_EVENT, messageCaptor.getValue().what); 123 assertEquals(WifiManager.WPS_AUTH_FAILURE, messageCaptor.getValue().arg1); 124 } 125 126 /** 127 * Broadcast WPS failure event test. 128 */ 129 @Test 130 public void testBroadcastWpsEventFailDueToConfigPbcOverlapError() { 131 mWifiMonitor.registerHandler( 132 WLAN_IFACE_NAME, WifiMonitor.WPS_FAIL_EVENT, mHandlerSpy); 133 mWifiMonitor.broadcastWpsFailEvent( 134 WLAN_IFACE_NAME, WpsConfigError.MULTIPLE_PBC_DETECTED, 135 WpsErrorIndication.NO_ERROR); 136 mLooper.dispatchAll(); 137 138 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 139 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 140 assertEquals(WifiMonitor.WPS_FAIL_EVENT, messageCaptor.getValue().what); 141 assertEquals(WifiManager.WPS_OVERLAP_ERROR, messageCaptor.getValue().arg1); 142 } 143 144 /** 145 * Broadcast WPS failure event test. 146 */ 147 @Test 148 public void testBroadcastWpsEventFailDueToConfigError() { 149 mWifiMonitor.registerHandler( 150 WLAN_IFACE_NAME, WifiMonitor.WPS_FAIL_EVENT, mHandlerSpy); 151 mWifiMonitor.broadcastWpsFailEvent( 152 WLAN_IFACE_NAME, WpsConfigError.MSG_TIMEOUT, 153 WpsErrorIndication.NO_ERROR); 154 mLooper.dispatchAll(); 155 156 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 157 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 158 assertEquals(WifiMonitor.WPS_FAIL_EVENT, messageCaptor.getValue().what); 159 assertEquals(WifiManager.ERROR, messageCaptor.getValue().arg1); 160 assertEquals(WpsConfigError.MSG_TIMEOUT, messageCaptor.getValue().arg2); 161 } 162 163 /** 164 * Broadcast WPS success event test. 165 */ 166 @Test 167 public void testBroadcastWpsEventSuccess() { 168 mWifiMonitor.registerHandler( 169 WLAN_IFACE_NAME, WifiMonitor.WPS_SUCCESS_EVENT, mHandlerSpy); 170 mWifiMonitor.broadcastWpsSuccessEvent(WLAN_IFACE_NAME); 171 mLooper.dispatchAll(); 172 173 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 174 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 175 assertEquals(WifiMonitor.WPS_SUCCESS_EVENT, messageCaptor.getValue().what); 176 } 177 178 /** 179 * Broadcast WPS overlap event test. 180 */ 181 @Test 182 public void testBroadcastWpsEventOverlap() { 183 mWifiMonitor.registerHandler( 184 WLAN_IFACE_NAME, WifiMonitor.WPS_OVERLAP_EVENT, mHandlerSpy); 185 mWifiMonitor.broadcastWpsOverlapEvent(WLAN_IFACE_NAME); 186 mLooper.dispatchAll(); 187 188 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 189 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 190 assertEquals(WifiMonitor.WPS_OVERLAP_EVENT, messageCaptor.getValue().what); 191 } 192 193 /** 194 * Broadcast WPS timeout event test. 195 */ 196 @Test 197 public void testBroadcastWpsEventTimeout() { 198 mWifiMonitor.registerHandler( 199 WLAN_IFACE_NAME, WifiMonitor.WPS_TIMEOUT_EVENT, mHandlerSpy); 200 mWifiMonitor.broadcastWpsTimeoutEvent(WLAN_IFACE_NAME); 201 mLooper.dispatchAll(); 202 203 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 204 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 205 assertEquals(WifiMonitor.WPS_TIMEOUT_EVENT, messageCaptor.getValue().what); 206 } 207 208 /** 209 * Broadcast ANQP done event test. 210 */ 211 @Test 212 public void testBroadcastAnqpDoneEvent() { 213 mWifiMonitor.registerHandler( 214 WLAN_IFACE_NAME, WifiMonitor.ANQP_DONE_EVENT, mHandlerSpy); 215 long bssid = 5; 216 mWifiMonitor.broadcastAnqpDoneEvent(WLAN_IFACE_NAME, new AnqpEvent(bssid, null)); 217 mLooper.dispatchAll(); 218 219 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 220 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 221 assertEquals(WifiMonitor.ANQP_DONE_EVENT, messageCaptor.getValue().what); 222 assertEquals(bssid, ((AnqpEvent) messageCaptor.getValue().obj).getBssid()); 223 assertNull(((AnqpEvent) messageCaptor.getValue().obj).getElements()); 224 } 225 226 /** 227 * Broadcast Icon event test. 228 */ 229 @Test 230 public void testBroadcastIconDoneEvent() { 231 mWifiMonitor.registerHandler( 232 WLAN_IFACE_NAME, WifiMonitor.RX_HS20_ANQP_ICON_EVENT, mHandlerSpy); 233 long bssid = 5; 234 String fileName = "test"; 235 int fileSize = 0; 236 mWifiMonitor.broadcastIconDoneEvent( 237 WLAN_IFACE_NAME, new IconEvent(bssid, fileName, fileSize, null)); 238 mLooper.dispatchAll(); 239 240 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 241 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 242 assertEquals(WifiMonitor.RX_HS20_ANQP_ICON_EVENT, messageCaptor.getValue().what); 243 assertEquals(bssid, ((IconEvent) messageCaptor.getValue().obj).getBSSID()); 244 assertEquals(fileName, ((IconEvent) messageCaptor.getValue().obj).getFileName()); 245 assertEquals(fileSize, ((IconEvent) messageCaptor.getValue().obj).getSize()); 246 assertNull(((IconEvent) messageCaptor.getValue().obj).getData()); 247 } 248 249 /** 250 * Broadcast network Gsm auth request test. 251 */ 252 @Test 253 public void testBroadcastNetworkGsmAuthRequestEvent() { 254 mWifiMonitor.registerHandler( 255 WLAN_IFACE_NAME, WifiMonitor.SUP_REQUEST_SIM_AUTH, mHandlerSpy); 256 int networkId = NETWORK_ID; 257 String ssid = SSID; 258 String[] data = GSM_AUTH_DATA; 259 mWifiMonitor.broadcastNetworkGsmAuthRequestEvent(WLAN_IFACE_NAME, networkId, ssid, data); 260 mLooper.dispatchAll(); 261 262 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 263 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 264 assertEquals(WifiMonitor.SUP_REQUEST_SIM_AUTH, messageCaptor.getValue().what); 265 TelephonyUtil.SimAuthRequestData authData = 266 (TelephonyUtil.SimAuthRequestData) messageCaptor.getValue().obj; 267 assertEquals(networkId, authData.networkId); 268 assertEquals(ssid, authData.ssid); 269 assertEquals(WifiEnterpriseConfig.Eap.SIM, authData.protocol); 270 assertArrayEquals(data, authData.data); 271 } 272 273 /** 274 * Broadcast network Umts auth request test. 275 */ 276 @Test 277 public void testBroadcastNetworkUmtsAuthRequestEvent() { 278 mWifiMonitor.registerHandler( 279 WLAN_IFACE_NAME, WifiMonitor.SUP_REQUEST_SIM_AUTH, mHandlerSpy); 280 int networkId = NETWORK_ID; 281 String ssid = SSID; 282 String[] data = UMTS_AUTH_DATA; 283 mWifiMonitor.broadcastNetworkUmtsAuthRequestEvent(WLAN_IFACE_NAME, networkId, ssid, data); 284 mLooper.dispatchAll(); 285 286 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 287 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 288 assertEquals(WifiMonitor.SUP_REQUEST_SIM_AUTH, messageCaptor.getValue().what); 289 TelephonyUtil.SimAuthRequestData authData = 290 (TelephonyUtil.SimAuthRequestData) messageCaptor.getValue().obj; 291 assertEquals(networkId, authData.networkId); 292 assertEquals(ssid, authData.ssid); 293 assertEquals(WifiEnterpriseConfig.Eap.AKA, authData.protocol); 294 assertArrayEquals(data, authData.data); 295 } 296 297 /** 298 * Broadcast Scan results event test. 299 */ 300 @Test 301 public void testBroadcastScanResultsEvent() { 302 mWifiMonitor.registerHandler( 303 WLAN_IFACE_NAME, WifiMonitor.SCAN_RESULTS_EVENT, mHandlerSpy); 304 mWifiMonitor.broadcastScanResultEvent(WLAN_IFACE_NAME); 305 mLooper.dispatchAll(); 306 307 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 308 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 309 assertEquals(WifiMonitor.SCAN_RESULTS_EVENT, messageCaptor.getValue().what); 310 } 311 312 /** 313 * Broadcast Scan failed event test. 314 */ 315 @Test 316 public void testBroadcastScanFailedEvent() { 317 mWifiMonitor.registerHandler( 318 WLAN_IFACE_NAME, WifiMonitor.SCAN_FAILED_EVENT, mHandlerSpy); 319 mWifiMonitor.broadcastScanFailedEvent(WLAN_IFACE_NAME); 320 mLooper.dispatchAll(); 321 322 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 323 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 324 325 assertEquals(WifiMonitor.SCAN_FAILED_EVENT, messageCaptor.getValue().what); 326 } 327 328 /** 329 * Broadcast authentication failure test. 330 */ 331 @Test 332 public void testBroadcastAuthenticationFailureEvent() { 333 mWifiMonitor.registerHandler( 334 WLAN_IFACE_NAME, WifiMonitor.AUTHENTICATION_FAILURE_EVENT, mHandlerSpy); 335 int reason = WifiMonitor.AUTHENTICATION_FAILURE_REASON_WRONG_PSWD; 336 mWifiMonitor.broadcastAuthenticationFailureEvent(WLAN_IFACE_NAME, reason); 337 mLooper.dispatchAll(); 338 339 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 340 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 341 assertEquals(WifiMonitor.AUTHENTICATION_FAILURE_EVENT, messageCaptor.getValue().what); 342 assertEquals(reason, messageCaptor.getValue().arg2); 343 344 } 345 346 347 /** 348 * Broadcast association rejection test. 349 */ 350 @Test 351 public void testBroadcastAssociationRejectionEvent() { 352 mWifiMonitor.registerHandler( 353 WLAN_IFACE_NAME, WifiMonitor.ASSOCIATION_REJECTION_EVENT, mHandlerSpy); 354 int status = 5; 355 String bssid = BSSID; 356 mWifiMonitor.broadcastAssociationRejectionEvent(WLAN_IFACE_NAME, status, false, bssid); 357 mLooper.dispatchAll(); 358 359 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 360 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 361 assertEquals(WifiMonitor.ASSOCIATION_REJECTION_EVENT, messageCaptor.getValue().what); 362 assertEquals(0, messageCaptor.getValue().arg1); 363 assertEquals(status, messageCaptor.getValue().arg2); 364 assertEquals(bssid, (String) messageCaptor.getValue().obj); 365 } 366 367 /** 368 * Broadcast association successful test. 369 */ 370 @Test 371 public void testBroadcastAssociationSuccessfulEvent() { 372 mWifiMonitor.registerHandler( 373 WLAN_IFACE_NAME, WifiStateMachine.CMD_ASSOCIATED_BSSID, mHandlerSpy); 374 String bssid = BSSID; 375 mWifiMonitor.broadcastAssociationSuccesfulEvent(WLAN_IFACE_NAME, bssid); 376 mLooper.dispatchAll(); 377 378 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 379 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 380 assertEquals(WifiStateMachine.CMD_ASSOCIATED_BSSID, messageCaptor.getValue().what); 381 assertEquals(bssid, (String) messageCaptor.getValue().obj); 382 } 383 384 /** 385 * Broadcast network connection test. 386 */ 387 @Test 388 public void testBroadcastNetworkConnectionEvent() { 389 mWifiMonitor.registerHandler( 390 WLAN_IFACE_NAME, WifiMonitor.NETWORK_CONNECTION_EVENT, mHandlerSpy); 391 int networkId = NETWORK_ID; 392 String bssid = BSSID; 393 mWifiMonitor.broadcastNetworkConnectionEvent(WLAN_IFACE_NAME, networkId, bssid); 394 mLooper.dispatchAll(); 395 396 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 397 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 398 assertEquals(WifiMonitor.NETWORK_CONNECTION_EVENT, messageCaptor.getValue().what); 399 assertEquals(networkId, messageCaptor.getValue().arg1); 400 assertEquals(bssid, (String) messageCaptor.getValue().obj); 401 } 402 403 /** 404 * Broadcast network disconnection test. 405 */ 406 @Test 407 public void testBroadcastNetworkDisconnectionEvent() { 408 mWifiMonitor.registerHandler( 409 WLAN_IFACE_NAME, WifiMonitor.NETWORK_DISCONNECTION_EVENT, mHandlerSpy); 410 int local = 1; 411 int reason = 5; 412 String bssid = BSSID; 413 mWifiMonitor.broadcastNetworkDisconnectionEvent(WLAN_IFACE_NAME, local, reason, bssid); 414 mLooper.dispatchAll(); 415 416 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 417 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 418 assertEquals(WifiMonitor.NETWORK_DISCONNECTION_EVENT, messageCaptor.getValue().what); 419 assertEquals(local, messageCaptor.getValue().arg1); 420 assertEquals(reason, messageCaptor.getValue().arg2); 421 assertEquals(bssid, (String) messageCaptor.getValue().obj); 422 } 423 424 /** 425 * Broadcast supplicant state change test. 426 */ 427 @Test 428 public void testBroadcastSupplicantStateChangeEvent() { 429 mWifiMonitor.registerHandler( 430 WLAN_IFACE_NAME, WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT, mHandlerSpy); 431 int networkId = NETWORK_ID; 432 WifiSsid wifiSsid = WifiSsid.createFromAsciiEncoded(SSID); 433 String bssid = BSSID; 434 SupplicantState newState = SupplicantState.ASSOCIATED; 435 mWifiMonitor.broadcastSupplicantStateChangeEvent( 436 WLAN_IFACE_NAME, networkId, wifiSsid, bssid, newState); 437 mLooper.dispatchAll(); 438 439 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 440 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 441 assertEquals(WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT, messageCaptor.getValue().what); 442 StateChangeResult result = (StateChangeResult) messageCaptor.getValue().obj; 443 assertEquals(networkId, result.networkId); 444 assertEquals(wifiSsid, result.wifiSsid); 445 assertEquals(bssid, result.BSSID); 446 assertEquals(newState, result.state); 447 } 448 449 /** 450 * Broadcast supplicant connection test. 451 */ 452 @Test 453 public void testBroadcastSupplicantConnectionEvent() { 454 mWifiMonitor.registerHandler( 455 WLAN_IFACE_NAME, WifiMonitor.SUP_CONNECTION_EVENT, mHandlerSpy); 456 mWifiMonitor.broadcastSupplicantConnectionEvent(WLAN_IFACE_NAME); 457 mLooper.dispatchAll(); 458 459 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 460 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 461 assertEquals(WifiMonitor.SUP_CONNECTION_EVENT, messageCaptor.getValue().what); 462 } 463 /** 464 * Broadcast supplicant disconnection test. 465 */ 466 @Test 467 public void testBroadcastSupplicantDisconnectionEvent() { 468 mWifiMonitor.registerHandler( 469 WLAN_IFACE_NAME, WifiMonitor.SUP_DISCONNECTION_EVENT, mHandlerSpy); 470 mWifiMonitor.broadcastSupplicantDisconnectionEvent(WLAN_IFACE_NAME); 471 mLooper.dispatchAll(); 472 473 ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 474 verify(mHandlerSpy).handleMessage(messageCaptor.capture()); 475 assertEquals(WifiMonitor.SUP_DISCONNECTION_EVENT, messageCaptor.getValue().what); 476 } 477} 478