WifiDetailPreferenceControllerTest.java revision 399e1a58107b0d7864dfefb198e8a687d63f2d06
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 */ 16package com.android.settings.wifi.details; 17 18import static com.google.common.truth.Truth.assertThat; 19 20import static org.mockito.Matchers.any; 21import static org.mockito.Mockito.never; 22import static org.mockito.Mockito.reset; 23import static org.mockito.Mockito.times; 24import static org.mockito.Mockito.verify; 25import static org.mockito.Mockito.when; 26 27import android.content.Context; 28import android.graphics.drawable.Drawable; 29import android.net.ConnectivityManager; 30import android.net.IpPrefix; 31import android.net.LinkAddress; 32import android.net.LinkProperties; 33import android.net.Network; 34import android.net.NetworkBadging; 35import android.net.NetworkInfo; 36import android.net.RouteInfo; 37import android.net.wifi.WifiConfiguration; 38import android.net.wifi.WifiInfo; 39import android.net.wifi.WifiManager; 40import android.support.v7.preference.Preference; 41import android.support.v7.preference.PreferenceCategory; 42import android.support.v7.preference.PreferenceScreen; 43 44import com.android.settings.R; 45import com.android.settings.SettingsRobolectricTestRunner; 46import com.android.settings.TestConfig; 47import com.android.settings.core.lifecycle.Lifecycle; 48import com.android.settings.wifi.WifiDetailPreference; 49import com.android.settingslib.wifi.AccessPoint; 50 51import org.junit.Before; 52import org.junit.Test; 53import org.junit.runner.RunWith; 54import org.mockito.Answers; 55import org.mockito.Mock; 56import org.mockito.MockitoAnnotations; 57import org.robolectric.annotation.Config; 58import org.robolectric.RuntimeEnvironment; 59import org.robolectric.annotation.Config; 60import org.robolectric.annotation.Implementation; 61import org.robolectric.annotation.Implements; 62 63import java.net.InetAddress; 64import java.net.UnknownHostException; 65 66@RunWith(SettingsRobolectricTestRunner.class) 67@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 68public class WifiDetailPreferenceControllerTest { 69 70 private static final int LEVEL = 1; 71 private static final int RSSI = -55; 72 private static final int LINK_SPEED = 123; 73 private static final String MAC_ADDRESS = WifiInfo.DEFAULT_MAC_ADDRESS; 74 private static final String SECURITY = "None"; 75 76 private InetAddress mIpv4Address; 77 78 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 79 private PreferenceScreen mockScreen; 80 81 @Mock private AccessPoint mockAccessPoint; 82 @Mock private WifiManager mockWifiManager; 83 @Mock private ConnectivityManager mockConnectivityManager; 84 @Mock private NetworkInfo mockNetworkInfo; 85 @Mock private WifiConfiguration mockWifiConfig; 86 @Mock private WifiInfo mockWifiInfo; 87 @Mock private Network mockNetwork; 88 89 @Mock private Preference mockConnectionDetailPref; 90 @Mock private WifiDetailPreference mockSignalStrengthPref; 91 @Mock private WifiDetailPreference mockLinkSpeedPref; 92 @Mock private WifiDetailPreference mockFrequencyPref; 93 @Mock private WifiDetailPreference mockSecurityPref; 94 @Mock private WifiDetailPreference mockMacAddressPref; 95 @Mock private WifiDetailPreference mockIpAddressPref; 96 @Mock private WifiDetailPreference mockGatewayPref; 97 @Mock private WifiDetailPreference mockSubnetPref; 98 @Mock private WifiDetailPreference mockDnsPref; 99 @Mock private PreferenceCategory mockIpv6AddressCategory; 100 101 private LinkProperties mLinkProperties; 102 private Context mContext = RuntimeEnvironment.application; 103 private Lifecycle mLifecycle; 104 private WifiDetailPreferenceController mController; 105 106 @Before 107 public void setUp() { 108 MockitoAnnotations.initMocks(this); 109 110 mLifecycle = new Lifecycle(); 111 112 try { 113 mIpv4Address = InetAddress.getByAddress( 114 new byte[] { (byte) 255, (byte) 255, (byte) 255, (byte) 255 }); 115 } catch (UnknownHostException e) { 116 throw new RuntimeException(e); 117 } 118 119 when(mockAccessPoint.getConfig()).thenReturn(mockWifiConfig); 120 when(mockAccessPoint.getLevel()).thenReturn(LEVEL); 121 when(mockAccessPoint.getNetworkInfo()).thenReturn(mockNetworkInfo); 122 when(mockAccessPoint.getRssi()).thenReturn(RSSI); 123 when(mockAccessPoint.getSecurityString(false)).thenReturn(SECURITY); 124 125 when(mockWifiInfo.getLinkSpeed()).thenReturn(LINK_SPEED); 126 when(mockWifiInfo.getRssi()).thenReturn(RSSI); 127 when(mockWifiInfo.getMacAddress()).thenReturn(MAC_ADDRESS); 128 when(mockWifiManager.getConnectionInfo()).thenReturn(mockWifiInfo); 129 130 when(mockWifiManager.getCurrentNetwork()).thenReturn(mockNetwork); 131 mLinkProperties = new LinkProperties(); 132 when(mockConnectivityManager.getLinkProperties(mockNetwork)).thenReturn(mLinkProperties); 133 134 mController = new WifiDetailPreferenceController( 135 mockAccessPoint, mContext, mLifecycle, mockWifiManager, mockConnectivityManager); 136 137 setupMockedPreferenceScreen(); 138 } 139 140 private void setupMockedPreferenceScreen() { 141 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_CONNECTION_DETAIL_PREF)) 142 .thenReturn(mockConnectionDetailPref); 143 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_SIGNAL_STRENGTH_PREF)) 144 .thenReturn(mockSignalStrengthPref); 145 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_LINK_SPEED)) 146 .thenReturn(mockLinkSpeedPref); 147 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_FREQUENCY_PREF)) 148 .thenReturn(mockFrequencyPref); 149 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_SECURITY_PREF)) 150 .thenReturn(mockSecurityPref); 151 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_MAC_ADDRESS_PREF)) 152 .thenReturn(mockMacAddressPref); 153 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_IP_ADDRESS_PREF)) 154 .thenReturn(mockIpAddressPref); 155 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_GATEWAY_PREF)) 156 .thenReturn(mockGatewayPref); 157 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_SUBNET_MASK_PREF)) 158 .thenReturn(mockSubnetPref); 159 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_DNS_PREF)) 160 .thenReturn(mockDnsPref); 161 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_IPV6_ADDRESS_CATEGORY)) 162 .thenReturn(mockIpv6AddressCategory); 163 164 mController.displayPreference(mockScreen); 165 } 166 167 @Test 168 public void isAvailable_shouldAlwaysReturnTrue() { 169 assertThat(mController.isAvailable()).isTrue(); 170 } 171 172 @Test 173 public void securityPreference_stringShouldBeSet() { 174 verify(mockSecurityPref).setDetailText(SECURITY); 175 } 176 177 @Test 178 public void latestWifiInfoAndConfig_shouldBeFetchedOnResume() { 179 mController.onResume(); 180 181 // Once in construction, once in onResume 182 verify(mockWifiManager, times(2)).getConnectionInfo(); 183 } 184 185 @Test 186 public void connectionDetailPref_shouldHaveIconSet() { 187 Drawable expectedIcon = 188 NetworkBadging.getWifiIcon(LEVEL, NetworkBadging.BADGING_NONE, mContext.getTheme()); 189 190 mController.onResume(); 191 192 verify(mockConnectionDetailPref).setIcon(expectedIcon); 193 } 194 195 @Test 196 public void connectionDetailPref_shouldHaveTitleSet() { 197 String summary = "summary"; 198 when(mockAccessPoint.getSettingsSummary()).thenReturn(summary); 199 200 mController.onResume(); 201 202 verify(mockConnectionDetailPref).setTitle(summary); 203 } 204 205 @Test 206 public void signalStrengthPref_shouldHaveIconSet() { 207 mController.onResume(); 208 209 verify(mockSignalStrengthPref).setIcon(any(Drawable.class)); 210 } 211 212 @Test 213 public void signalStrengthPref_shouldHaveDetailTextSet() { 214 String expectedStrength = 215 mContext.getResources().getStringArray(R.array.wifi_signal)[LEVEL]; 216 217 mController.onResume(); 218 219 verify(mockSignalStrengthPref).setDetailText(expectedStrength); 220 } 221 222 @Test 223 public void linkSpeedPref_shouldHaveDetailTextSet() { 224 String expectedLinkSpeed = mContext.getString(R.string.link_speed, LINK_SPEED); 225 226 mController.onResume(); 227 228 verify(mockLinkSpeedPref).setDetailText(expectedLinkSpeed); 229 } 230 231 @Test 232 public void linkSpeedPref_shouldNotShowIfNotSet() { 233 when(mockWifiInfo.getLinkSpeed()).thenReturn(-1); 234 235 mController.onResume(); 236 237 verify(mockLinkSpeedPref).setVisible(false); 238 } 239 240 @Test 241 public void macAddressPref_shouldHaveDetailTextSet() { 242 mController.onResume(); 243 244 verify(mockMacAddressPref).setDetailText(MAC_ADDRESS); 245 } 246 247 @Test 248 public void ipAddressPref_shouldHaveDetailTextSet() { 249 LinkAddress ipv4Address = new LinkAddress(mIpv4Address, 32); 250 251 mLinkProperties.addLinkAddress(ipv4Address); 252 253 mController.onResume(); 254 255 verify(mockIpAddressPref).setDetailText(mIpv4Address.getHostAddress()); 256 } 257 258 @Test 259 public void gatewayAndSubnet_shouldHaveDetailTextSet() { 260 int prefixLength = 24; 261 IpPrefix subnet = new IpPrefix(mIpv4Address, prefixLength); 262 InetAddress gateway = mIpv4Address; 263 mLinkProperties.addRoute(new RouteInfo(subnet, gateway)); 264 265 mController.onResume(); 266 267 verify(mockSubnetPref).setDetailText("255.255.255.0"); 268 verify(mockGatewayPref).setDetailText(mIpv4Address.getHostAddress()); 269 } 270 271 @Test 272 public void dnsServersPref_shouldHaveDetailTextSet() throws UnknownHostException { 273 mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[]{8,8,4,4})); 274 mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[]{8,8,8,8})); 275 276 mController.onResume(); 277 278 verify(mockDnsPref).setDetailText("8.8.4.4,8.8.8.8"); 279 } 280 281 @Test 282 public void noCurrentNetwork_allIpDetailsHidden() { 283 when(mockWifiManager.getCurrentNetwork()).thenReturn(null); 284 reset(mockIpv6AddressCategory, mockIpAddressPref, mockSubnetPref, mockGatewayPref, 285 mockDnsPref); 286 287 mController.onResume(); 288 289 verify(mockIpv6AddressCategory).setVisible(false); 290 verify(mockIpAddressPref).setVisible(false); 291 verify(mockSubnetPref).setVisible(false); 292 verify(mockGatewayPref).setVisible(false); 293 verify(mockDnsPref).setVisible(false); 294 verify(mockIpv6AddressCategory, never()).setVisible(true); 295 verify(mockIpAddressPref, never()).setVisible(true); 296 verify(mockSubnetPref, never()).setVisible(true); 297 verify(mockGatewayPref, never()).setVisible(true); 298 verify(mockDnsPref, never()).setVisible(true); 299 } 300 301 @Test 302 public void noLinkProperties_allIpDetailsHidden() { 303 when(mockConnectivityManager.getLinkProperties(mockNetwork)).thenReturn(null); 304 reset(mockIpv6AddressCategory, mockIpAddressPref, mockSubnetPref, mockGatewayPref, 305 mockDnsPref); 306 307 mController.onResume(); 308 309 verify(mockIpv6AddressCategory).setVisible(false); 310 verify(mockIpAddressPref).setVisible(false); 311 verify(mockSubnetPref).setVisible(false); 312 verify(mockGatewayPref).setVisible(false); 313 verify(mockDnsPref).setVisible(false); 314 verify(mockIpv6AddressCategory, never()).setVisible(true); 315 verify(mockIpAddressPref, never()).setVisible(true); 316 verify(mockSubnetPref, never()).setVisible(true); 317 verify(mockGatewayPref, never()).setVisible(true); 318 verify(mockDnsPref, never()).setVisible(true); 319 } 320 321 @Test 322 public void canForgetNetwork_noNetwork() { 323 when(mockAccessPoint.getConfig()).thenReturn(null); 324 325 mController = new WifiDetailPreferenceController( 326 mockAccessPoint, mContext, mLifecycle, mockWifiManager, mockConnectivityManager); 327 328 assertThat(mController.canForgetNetwork()).isFalse(); 329 } 330 331 @Test 332 public void canForgetNetwork_ephemeral() { 333 when(mockWifiInfo.isEphemeral()).thenReturn(true); 334 when(mockAccessPoint.getConfig()).thenReturn(null); 335 336 mController = new WifiDetailPreferenceController( 337 mockAccessPoint, mContext, mLifecycle, mockWifiManager, mockConnectivityManager); 338 339 assertThat(mController.canForgetNetwork()).isTrue(); 340 } 341 342 @Test 343 public void canForgetNetwork_saved() { 344 assertThat(mController.canForgetNetwork()).isTrue(); 345 } 346 347 @Test 348 public void forgetNetwork_ephemeral() { 349 String ssid = "ssid"; 350 351 when(mockWifiInfo.isEphemeral()).thenReturn(true); 352 when(mockWifiInfo.getSSID()).thenReturn(ssid); 353 354 mController.forgetNetwork(); 355 356 verify(mockWifiManager).disableEphemeralNetwork(ssid); 357 } 358 359 @Test 360 public void forgetNetwork_saved() { 361 mockWifiConfig.networkId = 5; 362 363 mController.forgetNetwork(); 364 365 verify(mockWifiManager).forget(mockWifiConfig.networkId, null); 366 } 367} 368