1/* 2 * Copyright (C) 2016 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 */ 16package com.android.server.wifi; 17 18import static org.junit.Assert.assertEquals; 19import static org.junit.Assert.assertTrue; 20import static org.mockito.Mockito.*; 21 22import android.content.BroadcastReceiver; 23import android.content.Context; 24import android.content.Intent; 25import android.content.IntentFilter; 26import android.net.wifi.SupplicantState; 27import android.net.wifi.WifiManager; 28import android.net.wifi.WifiSsid; 29import android.os.Handler; 30import android.os.Message; 31import android.os.test.TestLooper; 32 33import com.android.internal.app.IBatteryStats; 34 35import org.junit.Before; 36import org.junit.Test; 37import org.mockito.Mock; 38import org.mockito.MockitoAnnotations; 39/** 40 * Unit tests for {@link android.net.wifi.SupplicantStateTracker}. 41 */ 42public class SupplicantStateTrackerTest { 43 44 private static final String TAG = "SupplicantStateTrackerTest"; 45 private static final String sSSID = "\"GoogleGuest\""; 46 private static final WifiSsid sWifiSsid = WifiSsid.createFromAsciiEncoded(sSSID); 47 private static final String sBSSID = "01:02:03:04:05:06"; 48 49 private @Mock WifiConfigManager mWcm; 50 private @Mock Context mContext; 51 private Handler mHandler; 52 private SupplicantStateTracker mSupplicantStateTracker; 53 private TestLooper mLooper; 54 private FrameworkFacade mFacade; 55 56 private FrameworkFacade getFrameworkFacade() { 57 FrameworkFacade facade = mock(FrameworkFacade.class); 58 IBatteryStats batteryStatsService = mock(IBatteryStats.class); 59 when(facade.getBatteryService()).thenReturn(batteryStatsService); 60 return facade; 61 } 62 63 private Message getSupplicantStateChangeMessage(int networkId, WifiSsid wifiSsid, 64 String bssid, SupplicantState newSupplicantState) { 65 return Message.obtain(null, WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT, 0, 0, 66 new StateChangeResult(networkId, wifiSsid, bssid, newSupplicantState)); 67 68 } 69 70 @Before 71 public void setUp() { 72 mLooper = new TestLooper(); 73 mHandler = new Handler(mLooper.getLooper()); 74 MockitoAnnotations.initMocks(this); 75 mFacade = getFrameworkFacade(); 76 mSupplicantStateTracker = new SupplicantStateTracker(mContext, mWcm, mFacade, mHandler); 77 } 78 79 /** 80 * This test verifies that the SupplicantStateTracker sends a broadcast intent upon receiving 81 * a message when supplicant state changes 82 */ 83 @Test 84 public void testSupplicantStateChangeIntent() { 85 BroadcastReceiver wifiBroadcastReceiver = new BroadcastReceiver() { 86 @Override 87 public void onReceive(Context context, Intent intent) { 88 String action = intent.getAction(); 89 assertTrue(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)); 90 SupplicantState recvdState = 91 (SupplicantState) intent.getExtra(WifiManager.EXTRA_NEW_STATE, -1); 92 assertEquals(SupplicantState.SCANNING, recvdState); 93 } 94 }; 95 IntentFilter mIntentFilter = new IntentFilter(); 96 mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 97 mContext.registerReceiver(wifiBroadcastReceiver, mIntentFilter); 98 mSupplicantStateTracker.sendMessage(getSupplicantStateChangeMessage(0, sWifiSsid, 99 sBSSID, SupplicantState.SCANNING)); 100 } 101 102 /** 103 * This test verifies that the current auth status is sent in the Broadcast intent 104 */ 105 @Test 106 public void testAuthPassInSupplicantStateChangeIntent() { 107 BroadcastReceiver wifiBroadcastReceiver = new BroadcastReceiver() { 108 @Override 109 public void onReceive(Context context, Intent intent) { 110 String action = intent.getAction(); 111 assertTrue(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)); 112 SupplicantState recvdState = 113 (SupplicantState) intent.getExtra(WifiManager.EXTRA_NEW_STATE, -1); 114 assertEquals(SupplicantState.AUTHENTICATING, recvdState); 115 boolean authStatus = 116 (boolean) intent.getExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1); 117 assertEquals(authStatus, true); 118 } 119 }; 120 IntentFilter mIntentFilter = new IntentFilter(); 121 mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 122 mContext.registerReceiver(wifiBroadcastReceiver, mIntentFilter); 123 mSupplicantStateTracker.sendMessage(getSupplicantStateChangeMessage(0, sWifiSsid, 124 sBSSID, SupplicantState.AUTHENTICATING)); 125 mSupplicantStateTracker.sendMessage(WifiMonitor.AUTHENTICATION_FAILURE_EVENT); 126 } 127 128 /** 129 * This test verifies that the current auth status is sent in the Broadcast intent 130 */ 131 @Test 132 public void testAuthFailedInSupplicantStateChangeIntent() { 133 BroadcastReceiver wifiBroadcastReceiver = new BroadcastReceiver() { 134 @Override 135 public void onReceive(Context context, Intent intent) { 136 String action = intent.getAction(); 137 assertTrue(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)); 138 SupplicantState recvdState = 139 (SupplicantState) intent.getExtra(WifiManager.EXTRA_NEW_STATE, -1); 140 assertEquals(SupplicantState.AUTHENTICATING, recvdState); 141 boolean authStatus = 142 (boolean) intent.getExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1); 143 assertEquals(authStatus, false); 144 } 145 }; 146 IntentFilter mIntentFilter = new IntentFilter(); 147 mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 148 mContext.registerReceiver(wifiBroadcastReceiver, mIntentFilter); 149 mSupplicantStateTracker.sendMessage(WifiMonitor.AUTHENTICATION_FAILURE_EVENT); 150 mSupplicantStateTracker.sendMessage(getSupplicantStateChangeMessage(0, sWifiSsid, 151 sBSSID, SupplicantState.AUTHENTICATING)); 152 } 153 154 /** 155 * This test verifies the correct reasonCode for auth failure is sent in Broadcast 156 * intent. 157 */ 158 @Test 159 public void testReasonCodeInSupplicantStateChangeIntent() { 160 BroadcastReceiver wifiBroadcastReceiver = new BroadcastReceiver() { 161 @Override 162 public void onReceive(Context context, Intent intent) { 163 String action = intent.getAction(); 164 assertTrue(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)); 165 SupplicantState recvdState = 166 (SupplicantState) intent.getExtra(WifiManager.EXTRA_NEW_STATE, -1); 167 assertEquals(SupplicantState.AUTHENTICATING, recvdState); 168 boolean authStatus = 169 (boolean) intent.getExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1); 170 assertEquals(authStatus, false); 171 int reasonCode = (int) 172 intent.getExtra(WifiManager.EXTRA_SUPPLICANT_ERROR_REASON, -1); 173 assertEquals(reasonCode, WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD); 174 } 175 }; 176 IntentFilter mIntentFilter = new IntentFilter(); 177 mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 178 mContext.registerReceiver(wifiBroadcastReceiver, mIntentFilter); 179 mSupplicantStateTracker.sendMessage(WifiMonitor.AUTHENTICATION_FAILURE_EVENT, 180 WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD, -1); 181 mSupplicantStateTracker.sendMessage(getSupplicantStateChangeMessage(0, sWifiSsid, 182 sBSSID, SupplicantState.AUTHENTICATING)); 183 } 184} 185