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