1 /* 2 * Copyright 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.hotspot2; 18 19 import static org.junit.Assert.*; 20 import static org.mockito.Mockito.any; 21 import static org.mockito.Mockito.anyInt; 22 import static org.mockito.Mockito.doReturn; 23 import static org.mockito.Mockito.eq; 24 import static org.mockito.Mockito.never; 25 import static org.mockito.Mockito.times; 26 import static org.mockito.Mockito.verify; 27 import static org.mockito.Mockito.when; 28 29 import android.content.BroadcastReceiver; 30 import android.content.Context; 31 import android.content.IntentFilter; 32 import android.net.ConnectivityManager; 33 import android.net.LinkAddress; 34 import android.net.LinkProperties; 35 import android.net.Network; 36 import android.net.NetworkRequest; 37 import android.net.NetworkUtils; 38 import android.net.RouteInfo; 39 import android.net.wifi.WifiConfiguration; 40 import android.net.wifi.WifiInfo; 41 import android.net.wifi.WifiManager; 42 import android.net.wifi.WifiSsid; 43 import android.os.Handler; 44 import android.os.test.TestLooper; 45 import android.support.test.filters.SmallTest; 46 47 import com.android.server.wifi.TestUtil; 48 49 import org.junit.Before; 50 import org.junit.Test; 51 import org.mockito.ArgumentCaptor; 52 import org.mockito.Mock; 53 import org.mockito.MockitoAnnotations; 54 55 import java.net.InetAddress; 56 57 /** 58 * Unit tests for {@link com.android.server.wifi.hotspot2.PasspointProvisioner}. 59 */ 60 @SmallTest 61 public class OsuNetworkConnectionTest { 62 private static final String TAG = "OsuNetworkConnectionTest"; 63 private static final int ENABLE_LOGGING = 1; 64 private static final int DISABLE_LOGGING = 0; 65 66 private static final int TEST_NETWORK_ID = 6; 67 private static final String TEST_NAI = null; 68 private static final String TEST_NAI_OSEN = "access.test.com"; 69 private static final WifiSsid TEST_SSID = WifiSsid.createFromAsciiEncoded("Test SSID"); 70 71 private OsuNetworkConnection mNetworkConnection; 72 private TestLooper mLooper; 73 private Handler mHandler; 74 75 @Mock Context mContext; 76 @Mock WifiManager mWifiManager; 77 @Mock ConnectivityManager mConnectivityManager; 78 @Mock OsuNetworkConnection.Callbacks mNetworkCallbacks; 79 @Mock WifiInfo mWifiInfo; 80 @Mock Network mCurrentNetwork; 81 82 @Before 83 public void setUp() throws Exception { 84 MockitoAnnotations.initMocks(this); 85 doReturn(mWifiManager).when(mContext) 86 .getSystemService(eq(Context.WIFI_SERVICE)); 87 doReturn(mConnectivityManager).when(mContext) 88 .getSystemService(eq(Context.CONNECTIVITY_SERVICE)); 89 when(mWifiManager.isWifiEnabled()).thenReturn(true); 90 when(mWifiManager.enableNetwork(TEST_NETWORK_ID, true)).thenReturn(true); 91 when(mWifiManager.addNetwork(any(WifiConfiguration.class))).thenReturn(TEST_NETWORK_ID); 92 when(mWifiInfo.getNetworkId()).thenReturn(TEST_NETWORK_ID); 93 mLooper = new TestLooper(); 94 mHandler = new Handler(mLooper.getLooper()); 95 mNetworkConnection = new OsuNetworkConnection(mContext); 96 mNetworkConnection.enableVerboseLogging(ENABLE_LOGGING); 97 } 98 99 private LinkProperties createProvisionedLinkProperties() { 100 InetAddress addrV4 = NetworkUtils.numericToInetAddress("75.208.6.1"); 101 InetAddress dns1 = NetworkUtils.numericToInetAddress("75.208.7.1"); 102 LinkAddress linkAddrV4 = new LinkAddress(addrV4, 32); 103 InetAddress gateway1 = NetworkUtils.numericToInetAddress("75.208.8.1"); 104 LinkProperties lp4 = new LinkProperties(); 105 lp4.addLinkAddress(linkAddrV4); 106 lp4.addDnsServer(dns1); 107 lp4.addRoute(new RouteInfo(gateway1)); 108 return lp4; 109 } 110 111 /** 112 * Verify that the class registers for receiving the necessary broadcast intents upon init. 113 * Verify that the initialization only occurs once even if init() is called multiple times. 114 */ 115 @Test 116 public void verifyBroadcastIntentRegistration() { 117 mNetworkConnection.init(mHandler); 118 119 ArgumentCaptor<IntentFilter> intentFilterCaptor = 120 ArgumentCaptor.forClass(IntentFilter.class); 121 verify(mContext).registerReceiver(any(BroadcastReceiver.class), 122 intentFilterCaptor.capture(), any(), eq(mHandler)); 123 verify(mWifiManager).isWifiEnabled(); 124 IntentFilter intentFilter = intentFilterCaptor.getValue(); 125 assertEquals(intentFilter.countActions(), 1); 126 } 127 128 /** 129 * Verifies that onWifiEnabled() callback is invoked when the relevant intent is 130 * received and the caller is subscribed to receive the callback. 131 */ 132 @Test 133 public void verifyWifiStateCallbacks() { 134 when(mWifiManager.isWifiEnabled()).thenReturn(false); 135 mNetworkConnection.init(mHandler); 136 ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = 137 ArgumentCaptor.forClass(BroadcastReceiver.class); 138 verify(mContext).registerReceiver(broadcastReceiverCaptor.capture(), 139 any(IntentFilter.class), any(), eq(mHandler)); 140 BroadcastReceiver broadcastReceiver = broadcastReceiverCaptor.getValue(); 141 mLooper.dispatchAll(); 142 mNetworkConnection.setEventCallback(mNetworkCallbacks); 143 TestUtil.sendWifiStateChanged(broadcastReceiver, mContext, 144 WifiManager.WIFI_STATE_ENABLED); 145 TestUtil.sendWifiStateChanged(broadcastReceiver, mContext, 146 WifiManager.WIFI_STATE_DISABLED); 147 mNetworkConnection.setEventCallback(null); 148 TestUtil.sendWifiStateChanged(broadcastReceiver, mContext, 149 WifiManager.WIFI_STATE_ENABLED); 150 TestUtil.sendWifiStateChanged(broadcastReceiver, mContext, 151 WifiManager.WIFI_STATE_DISABLED); 152 verify(mNetworkCallbacks, times(1)).onWifiEnabled(); 153 verify(mNetworkCallbacks, times(1)).onWifiDisabled(); 154 } 155 156 /** 157 * Verifies that connect() API returns false when Wifi is not enabled 158 */ 159 @Test 160 public void verifyNetworkConnectionWhenWifiIsDisabled() { 161 when(mWifiManager.isWifiEnabled()).thenReturn(false); 162 mNetworkConnection.init(mHandler); 163 assertEquals(false, mNetworkConnection.connect(TEST_SSID, TEST_NAI)); 164 } 165 166 /** 167 * Verifies that connect() API returns false when OSU AP is a part of an OSEN 168 */ 169 @Test 170 public void verifyOSENUnsupported() { 171 mNetworkConnection.init(mHandler); 172 assertEquals(false, mNetworkConnection.connect(TEST_SSID, TEST_NAI_OSEN)); 173 } 174 175 /** 176 * Verifies that connect() API returns false when WifiManager's addNetwork() 177 * returns an invalid network ID 178 */ 179 @Test 180 public void verifyNetworkConnectionWhenAddNetworkFails() { 181 when(mWifiManager.addNetwork(any(WifiConfiguration.class))).thenReturn(-1); 182 mNetworkConnection.init(mHandler); 183 assertEquals(false, mNetworkConnection.connect(TEST_SSID, TEST_NAI)); 184 verify(mWifiManager, never()).removeNetwork(TEST_NETWORK_ID); 185 } 186 187 /** 188 * Verifies that connect() API returns false when WifiManager's enableNetwork() 189 * fails for the given network ID corresponding to the OSU AP 190 */ 191 @Test 192 public void verifyNetworkConnectionWhenEnableNetworkFails() { 193 when(mWifiManager.enableNetwork(TEST_NETWORK_ID, true)).thenReturn(false); 194 mNetworkConnection.init(mHandler); 195 assertEquals(false, mNetworkConnection.connect(TEST_SSID, TEST_NAI)); 196 verify(mWifiManager).removeNetwork(TEST_NETWORK_ID); 197 } 198 199 /** 200 * Verifies that network state callbacks are invoked when network callbacks 201 * are received and when WifiManager has successfully requested connection to the OSU AP. 202 * Ensure IP connectivity is available before invoking onConnected callback. 203 */ 204 @Test 205 public void verifyNetworkCallbackInvokedWhenConnected() { 206 mNetworkConnection.init(mHandler); 207 208 mNetworkConnection.setEventCallback(mNetworkCallbacks); 209 assertEquals(true, mNetworkConnection.connect(TEST_SSID, TEST_NAI)); 210 211 ArgumentCaptor<ConnectivityManager.NetworkCallback> networkCallbackCaptor = 212 ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); 213 verify(mConnectivityManager).requestNetwork(any(NetworkRequest.class), 214 networkCallbackCaptor.capture(), any(Handler.class), anyInt()); 215 ConnectivityManager.NetworkCallback callback = networkCallbackCaptor.getValue(); 216 callback.onLinkPropertiesChanged(mCurrentNetwork, createProvisionedLinkProperties()); 217 verify(mNetworkCallbacks).onConnected(mCurrentNetwork); 218 219 callback.onLost(mCurrentNetwork); 220 verify(mNetworkCallbacks).onDisconnected(); 221 mNetworkConnection.disconnectIfNeeded(); 222 verify(mWifiManager).removeNetwork(TEST_NETWORK_ID); 223 } 224 225 /** 226 * Verifies that network state callbacks are invoked when the network callbacks 227 * are received and when WifiManager has successfully requested connection to the OSU AP. 228 * If IP connectivity is not provisioned, do not invoke onConnected callback. 229 */ 230 @Test 231 public void verifyNetworkConnectionTimeout() { 232 mNetworkConnection.init(mHandler); 233 234 mNetworkConnection.setEventCallback(mNetworkCallbacks); 235 assertEquals(true, mNetworkConnection.connect(TEST_SSID, TEST_NAI)); 236 237 ArgumentCaptor<ConnectivityManager.NetworkCallback> networkCallbackCaptor = 238 ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); 239 verify(mConnectivityManager).requestNetwork(any(NetworkRequest.class), 240 networkCallbackCaptor.capture(), any(Handler.class), anyInt()); 241 ConnectivityManager.NetworkCallback callback = networkCallbackCaptor.getValue(); 242 callback.onLinkPropertiesChanged(mCurrentNetwork, new LinkProperties()); 243 verify(mNetworkCallbacks, never()).onConnected(mCurrentNetwork); 244 245 callback.onUnavailable(); 246 verify(mNetworkCallbacks).onTimeOut(); 247 mNetworkConnection.disconnectIfNeeded(); 248 verify(mWifiManager).removeNetwork(TEST_NETWORK_ID); 249 } 250 251 /** 252 * Verifies that WifiManager's removeNetwork() is called when disconnectIfNeeded() is called 253 * on the OSU AP's network ID. 254 */ 255 @Test 256 public void verifyNetworkDisconnect() { 257 mNetworkConnection.init(mHandler); 258 assertEquals(true, mNetworkConnection.connect(TEST_SSID, TEST_NAI)); 259 mNetworkConnection.disconnectIfNeeded(); 260 verify(mWifiManager).removeNetwork(TEST_NETWORK_ID); 261 } 262 } 263 264