WifiDetailPreferenceControllerTest.java revision 046400c2c407429da47e6b2230ba8bbd21c43e9b
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.ArgumentMatchers.nullable; 21import static org.mockito.Matchers.any; 22import static org.mockito.Mockito.doNothing; 23import static org.mockito.Mockito.inOrder; 24import static org.mockito.Mockito.never; 25import static org.mockito.Mockito.reset; 26import static org.mockito.Mockito.times; 27import static org.mockito.Mockito.verify; 28import static org.mockito.Mockito.when; 29 30import android.app.Activity; 31import android.content.Context; 32import android.content.Intent; 33import android.graphics.drawable.Drawable; 34import android.net.ConnectivityManager; 35import android.net.ConnectivityManager.NetworkCallback; 36import android.net.IpPrefix; 37import android.net.LinkAddress; 38import android.net.LinkProperties; 39import android.net.Network; 40import android.net.NetworkBadging; 41import android.net.NetworkCapabilities; 42import android.net.NetworkInfo; 43import android.net.NetworkRequest; 44import android.net.RouteInfo; 45import android.net.wifi.WifiConfiguration; 46import android.net.wifi.WifiInfo; 47import android.net.wifi.WifiManager; 48import android.os.Handler; 49import android.support.v7.preference.Preference; 50import android.support.v7.preference.PreferenceCategory; 51import android.support.v7.preference.PreferenceScreen; 52import android.view.View; 53import android.view.View.OnClickListener; 54import android.widget.Button; 55 56import com.android.internal.logging.nano.MetricsProto; 57import com.android.settings.R; 58import com.android.settings.SettingsRobolectricTestRunner; 59import com.android.settings.TestConfig; 60import com.android.settings.applications.LayoutPreference; 61import com.android.settings.core.instrumentation.MetricsFeatureProvider; 62import com.android.settings.vpn2.ConnectivityManagerWrapperImpl; 63import com.android.settings.wifi.WifiDetailPreference; 64import com.android.settingslib.core.lifecycle.Lifecycle; 65import com.android.settingslib.wifi.AccessPoint; 66 67import org.junit.Before; 68import org.junit.Test; 69import org.junit.runner.RunWith; 70import org.mockito.Answers; 71import org.mockito.ArgumentCaptor; 72import org.mockito.Captor; 73import org.mockito.InOrder; 74import org.mockito.Mock; 75import org.mockito.MockitoAnnotations; 76import org.robolectric.RuntimeEnvironment; 77import org.robolectric.annotation.Config; 78 79import java.net.Inet6Address; 80import java.net.InetAddress; 81import java.net.UnknownHostException; 82 83@RunWith(SettingsRobolectricTestRunner.class) 84@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 85public class WifiDetailPreferenceControllerTest { 86 87 private static final int LEVEL = 1; 88 private static final int RSSI = -55; 89 private static final int LINK_SPEED = 123; 90 private static final String MAC_ADDRESS = WifiInfo.DEFAULT_MAC_ADDRESS; 91 private static final String SECURITY = "None"; 92 93 private InetAddress mIpv4Address; 94 private Inet6Address mIpv6Address; 95 96 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 97 private PreferenceScreen mockScreen; 98 99 @Mock private AccessPoint mockAccessPoint; 100 @Mock private Activity mockActivity; 101 @Mock private ConnectivityManager mockConnectivityManager; 102 @Mock private ConnectivityManagerWrapperImpl mockConnectivityManagerWrapper; 103 @Mock private Network mockNetwork; 104 @Mock private NetworkInfo mockNetworkInfo; 105 @Mock private WifiConfiguration mockWifiConfig; 106 @Mock private WifiInfo mockWifiInfo; 107 @Mock private WifiNetworkDetailsFragment mockFragment; 108 @Mock private WifiManager mockWifiManager; 109 @Mock private MetricsFeatureProvider mockMetricsFeatureProvider; 110 111 @Mock private Preference mockConnectionDetailPref; 112 @Mock private LayoutPreference mockButtonsPref; 113 @Mock private Button mockSignInButton; 114 @Mock private WifiDetailPreference mockSignalStrengthPref; 115 @Mock private WifiDetailPreference mockLinkSpeedPref; 116 @Mock private WifiDetailPreference mockFrequencyPref; 117 @Mock private WifiDetailPreference mockSecurityPref; 118 @Mock private WifiDetailPreference mockMacAddressPref; 119 @Mock private WifiDetailPreference mockIpAddressPref; 120 @Mock private WifiDetailPreference mockGatewayPref; 121 @Mock private WifiDetailPreference mockSubnetPref; 122 @Mock private WifiDetailPreference mockDnsPref; 123 @Mock private Button mockForgetButton; 124 @Mock private PreferenceCategory mockIpv6AddressCategory; 125 126 @Captor private ArgumentCaptor<NetworkCallback> mCallbackCaptor; 127 @Captor private ArgumentCaptor<View.OnClickListener> mForgetClickListener; 128 129 private Context mContext = RuntimeEnvironment.application; 130 private Lifecycle mLifecycle; 131 private LinkProperties mLinkProperties; 132 private WifiDetailPreferenceController mController; 133 134 @Before 135 public void setUp() { 136 MockitoAnnotations.initMocks(this); 137 138 mLifecycle = new Lifecycle(); 139 140 try { 141 mIpv4Address = InetAddress.getByAddress( 142 new byte[] { (byte) 255, (byte) 255, (byte) 255, (byte) 255 }); 143 mIpv6Address = Inet6Address.getByAddress( 144 "123", /* host */ 145 new byte[] { 146 (byte) 0xFE, (byte) 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x11, 0x25, 147 (byte) 0xFF, (byte) 0xFE, (byte) 0xF8, (byte) 0x7C, (byte) 0xB2}, 148 1 /*scope id */); 149 } catch (UnknownHostException e) { 150 throw new RuntimeException(e); 151 } 152 153 when(mockAccessPoint.getConfig()).thenReturn(mockWifiConfig); 154 when(mockAccessPoint.getLevel()).thenReturn(LEVEL); 155 when(mockAccessPoint.getSecurityString(false)).thenReturn(SECURITY); 156 157 when(mockConnectivityManagerWrapper.getConnectivityManager()) 158 .thenReturn(mockConnectivityManager); 159 when(mockConnectivityManager.getNetworkInfo(any(Network.class))) 160 .thenReturn(mockNetworkInfo); 161 doNothing().when(mockConnectivityManagerWrapper).registerNetworkCallback( 162 nullable(NetworkRequest.class), mCallbackCaptor.capture(), nullable(Handler.class)); 163 doNothing().when(mockForgetButton).setOnClickListener(mForgetClickListener.capture()); 164 165 when(mockWifiInfo.getLinkSpeed()).thenReturn(LINK_SPEED); 166 when(mockWifiInfo.getRssi()).thenReturn(RSSI); 167 when(mockWifiInfo.getMacAddress()).thenReturn(MAC_ADDRESS); 168 when(mockWifiManager.getConnectionInfo()).thenReturn(mockWifiInfo); 169 170 when(mockWifiManager.getCurrentNetwork()).thenReturn(mockNetwork); 171 mLinkProperties = new LinkProperties(); 172 when(mockConnectivityManager.getLinkProperties(mockNetwork)).thenReturn(mLinkProperties); 173 174 when(mockFragment.getActivity()).thenReturn(mockActivity); 175 176 setupMockedPreferenceScreen(); 177 mController = newWifiDetailPreferenceController(); 178 } 179 180 private WifiDetailPreferenceController newWifiDetailPreferenceController() { 181 return new WifiDetailPreferenceController( 182 mockAccessPoint, 183 mockConnectivityManagerWrapper, 184 mContext, 185 mockFragment, 186 null, // Handler 187 mLifecycle, 188 mockWifiManager, 189 mockMetricsFeatureProvider); 190 } 191 192 private void setupMockedPreferenceScreen() { 193 when(mockScreen.getPreferenceManager().getContext()).thenReturn(mContext); 194 195 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_CONNECTION_DETAIL_PREF)) 196 .thenReturn(mockConnectionDetailPref); 197 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_BUTTONS_PREF)) 198 .thenReturn(mockButtonsPref); 199 when(mockButtonsPref.findViewById(R.id.left_button)) 200 .thenReturn(mockForgetButton); 201 when(mockButtonsPref.findViewById(R.id.right_button)) 202 .thenReturn(mockSignInButton); 203 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_SIGNAL_STRENGTH_PREF)) 204 .thenReturn(mockSignalStrengthPref); 205 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_LINK_SPEED)) 206 .thenReturn(mockLinkSpeedPref); 207 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_FREQUENCY_PREF)) 208 .thenReturn(mockFrequencyPref); 209 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_SECURITY_PREF)) 210 .thenReturn(mockSecurityPref); 211 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_MAC_ADDRESS_PREF)) 212 .thenReturn(mockMacAddressPref); 213 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_IP_ADDRESS_PREF)) 214 .thenReturn(mockIpAddressPref); 215 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_GATEWAY_PREF)) 216 .thenReturn(mockGatewayPref); 217 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_SUBNET_MASK_PREF)) 218 .thenReturn(mockSubnetPref); 219 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_DNS_PREF)) 220 .thenReturn(mockDnsPref); 221 when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_IPV6_ADDRESS_CATEGORY)) 222 .thenReturn(mockIpv6AddressCategory); 223 } 224 225 @Test 226 public void isAvailable_shouldAlwaysReturnTrue() { 227 mController.displayPreference(mockScreen); 228 229 assertThat(mController.isAvailable()).isTrue(); 230 } 231 232 @Test 233 public void securityPreference_stringShouldBeSet() { 234 mController.displayPreference(mockScreen); 235 236 verify(mockSecurityPref).setDetailText(SECURITY); 237 } 238 239 @Test 240 public void latestWifiInfo_shouldBeFetchedInDisplayPreference() { 241 mController.displayPreference(mockScreen); 242 243 verify(mockWifiManager, times(1)).getConnectionInfo(); 244 } 245 246 @Test 247 public void latestNetworkInfo_shouldBeFetchedInDisplayPreference() { 248 mController.displayPreference(mockScreen); 249 250 verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class)); 251 } 252 253 @Test 254 public void networkCallback_shouldBeRegisteredOnResume() { 255 mController.onResume(); 256 257 verify(mockConnectivityManagerWrapper, times(1)).registerNetworkCallback( 258 nullable(NetworkRequest.class), mCallbackCaptor.capture(), nullable(Handler.class)); 259 } 260 261 @Test 262 public void networkCallback_shouldBeUnregisteredOnPause() { 263 mController.onResume(); 264 mController.onPause(); 265 266 verify(mockConnectivityManager, times(1)).unregisterNetworkCallback( 267 mCallbackCaptor.getValue()); 268 } 269 270 @Test 271 public void connectionDetailPref_shouldHaveIconSet() { 272 Drawable expectedIcon = 273 NetworkBadging.getWifiIcon(LEVEL, NetworkBadging.BADGING_NONE, mContext.getTheme()); 274 275 mController.displayPreference(mockScreen); 276 277 verify(mockConnectionDetailPref).setIcon(expectedIcon); 278 } 279 280 @Test 281 public void connectionDetailPref_shouldHaveTitleSet() { 282 String summary = "summary"; 283 when(mockAccessPoint.getSettingsSummary()).thenReturn(summary); 284 285 mController.displayPreference(mockScreen); 286 287 verify(mockConnectionDetailPref).setTitle(summary); 288 } 289 290 @Test 291 public void signalStrengthPref_shouldHaveIconSet() { 292 mController.displayPreference(mockScreen); 293 294 verify(mockSignalStrengthPref).setIcon(any(Drawable.class)); 295 } 296 297 @Test 298 public void signalStrengthPref_shouldHaveDetailTextSet() { 299 String expectedStrength = 300 mContext.getResources().getStringArray(R.array.wifi_signal)[LEVEL]; 301 302 mController.displayPreference(mockScreen); 303 304 verify(mockSignalStrengthPref).setDetailText(expectedStrength); 305 } 306 307 @Test 308 public void linkSpeedPref_shouldHaveDetailTextSet() { 309 String expectedLinkSpeed = mContext.getString(R.string.link_speed, LINK_SPEED); 310 311 mController.displayPreference(mockScreen); 312 313 verify(mockLinkSpeedPref).setDetailText(expectedLinkSpeed); 314 } 315 316 @Test 317 public void linkSpeedPref_shouldNotShowIfNotSet() { 318 when(mockWifiInfo.getLinkSpeed()).thenReturn(-1); 319 320 mController.displayPreference(mockScreen); 321 322 verify(mockLinkSpeedPref).setVisible(false); 323 } 324 325 @Test 326 public void macAddressPref_shouldHaveDetailTextSet() { 327 mController.displayPreference(mockScreen); 328 329 verify(mockMacAddressPref).setDetailText(MAC_ADDRESS); 330 } 331 332 @Test 333 public void ipAddressPref_shouldHaveDetailTextSet() { 334 LinkAddress ipv4Address = new LinkAddress(mIpv4Address, 32); 335 336 mLinkProperties.addLinkAddress(ipv4Address); 337 338 mController.displayPreference(mockScreen); 339 340 verify(mockIpAddressPref).setDetailText(mIpv4Address.getHostAddress()); 341 } 342 343 @Test 344 public void gatewayAndSubnet_shouldHaveDetailTextSet() { 345 int prefixLength = 24; 346 IpPrefix subnet = new IpPrefix(mIpv4Address, prefixLength); 347 InetAddress gateway = mIpv4Address; 348 mLinkProperties.addRoute(new RouteInfo(subnet, gateway)); 349 350 mController.displayPreference(mockScreen); 351 352 verify(mockSubnetPref).setDetailText("255.255.255.0"); 353 verify(mockGatewayPref).setDetailText(mIpv4Address.getHostAddress()); 354 } 355 356 @Test 357 public void dnsServersPref_shouldHaveDetailTextSet() throws UnknownHostException { 358 mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[]{8,8,4,4})); 359 mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[]{8,8,8,8})); 360 361 mController.displayPreference(mockScreen); 362 363 verify(mockDnsPref).setDetailText("8.8.4.4,8.8.8.8"); 364 } 365 366 @Test 367 public void noCurrentNetwork_shouldFinishActivity() { 368 // If WifiManager#getCurrentNetwork() returns null, then the network is neither connected 369 // nor connecting and WifiStateMachine has not reached L2ConnectedState. 370 when(mockWifiManager.getCurrentNetwork()).thenReturn(null); 371 372 mController.displayPreference(mockScreen); 373 374 verify(mockActivity).finish(); 375 } 376 377 @Test 378 public void noLinkProperties_allIpDetailsHidden() { 379 when(mockConnectivityManager.getLinkProperties(mockNetwork)).thenReturn(null); 380 reset(mockIpv6AddressCategory, mockIpAddressPref, mockSubnetPref, mockGatewayPref, 381 mockDnsPref); 382 383 mController.displayPreference(mockScreen); 384 385 verify(mockIpv6AddressCategory).setVisible(false); 386 verify(mockIpAddressPref).setVisible(false); 387 verify(mockSubnetPref).setVisible(false); 388 verify(mockGatewayPref).setVisible(false); 389 verify(mockDnsPref).setVisible(false); 390 verify(mockIpv6AddressCategory, never()).setVisible(true); 391 verify(mockIpAddressPref, never()).setVisible(true); 392 verify(mockSubnetPref, never()).setVisible(true); 393 verify(mockGatewayPref, never()).setVisible(true); 394 verify(mockDnsPref, never()).setVisible(true); 395 } 396 397 @Test 398 public void canForgetNetwork_noNetwork() { 399 when(mockAccessPoint.getConfig()).thenReturn(null); 400 401 mController = newWifiDetailPreferenceController(); 402 mController.displayPreference(mockScreen); 403 404 verify(mockForgetButton).setVisibility(View.INVISIBLE); 405 } 406 407 @Test 408 public void canForgetNetwork_ephemeral() { 409 when(mockWifiInfo.isEphemeral()).thenReturn(true); 410 when(mockAccessPoint.getConfig()).thenReturn(null); 411 412 mController.displayPreference(mockScreen); 413 414 verify(mockForgetButton).setVisibility(View.VISIBLE); 415 } 416 417 @Test 418 public void canForgetNetwork_saved() { 419 mController.displayPreference(mockScreen); 420 421 verify(mockForgetButton).setVisibility(View.VISIBLE); 422 } 423 424 @Test 425 public void forgetNetwork_ephemeral() { 426 String ssid = "ssid"; 427 when(mockWifiInfo.isEphemeral()).thenReturn(true); 428 when(mockWifiInfo.getSSID()).thenReturn(ssid); 429 430 mController.displayPreference(mockScreen); 431 mForgetClickListener.getValue().onClick(null); 432 433 verify(mockWifiManager).disableEphemeralNetwork(ssid); 434 verify(mockMetricsFeatureProvider) 435 .action(mockActivity, MetricsProto.MetricsEvent.ACTION_WIFI_FORGET); 436 } 437 438 @Test 439 public void forgetNetwork_saved() { 440 mockWifiConfig.networkId = 5; 441 442 mController.displayPreference(mockScreen); 443 mForgetClickListener.getValue().onClick(null); 444 445 verify(mockWifiManager).forget(mockWifiConfig.networkId, null); 446 verify(mockMetricsFeatureProvider) 447 .action(mockActivity, MetricsProto.MetricsEvent.ACTION_WIFI_FORGET); 448 } 449 450 @Test 451 public void networkStateChangedIntent_shouldRefetchInfo() { 452 mController.displayPreference(mockScreen); 453 mController.onResume(); 454 455 verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class)); 456 verify(mockWifiManager, times(1)).getConnectionInfo(); 457 458 mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION)); 459 460 verify(mockConnectivityManager, times(2)).getNetworkInfo(any(Network.class)); 461 verify(mockWifiManager, times(2)).getConnectionInfo(); 462 } 463 464 @Test 465 public void rssiChangedIntent_shouldRefetchInfo() { 466 mController.displayPreference(mockScreen); 467 mController.onResume(); 468 469 verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class)); 470 verify(mockWifiManager, times(1)).getConnectionInfo(); 471 472 mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION)); 473 474 verify(mockConnectivityManager, times(2)).getNetworkInfo(any(Network.class)); 475 verify(mockWifiManager, times(2)).getConnectionInfo(); 476 } 477 478 @Test 479 public void networkDisconnectdState_shouldFinishActivity() { 480 mController.onResume(); 481 482 when(mockConnectivityManager.getNetworkInfo(any(Network.class))).thenReturn(null); 483 mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION)); 484 485 verify(mockActivity).finish(); 486 } 487 488 @Test 489 public void networkOnLost_shouldFinishActivity() { 490 mController.displayPreference(mockScreen); 491 mController.onResume(); 492 493 mCallbackCaptor.getValue().onLost(mockNetwork); 494 495 verify(mockActivity).finish(); 496 } 497 498 @Test 499 public void ipv6AddressPref_shouldHaveHostAddressTextSet() { 500 LinkAddress ipv6Address = new LinkAddress(mIpv6Address, 128); 501 502 mLinkProperties.addLinkAddress(ipv6Address); 503 504 mController.displayPreference(mockScreen); 505 506 ArgumentCaptor<Preference> preferenceCaptor = ArgumentCaptor.forClass(Preference.class); 507 verify(mockIpv6AddressCategory).addPreference(preferenceCaptor.capture()); 508 assertThat(preferenceCaptor.getValue().getTitle()).isEqualTo(mIpv6Address.getHostAddress()); 509 } 510 511 @Test 512 public void ipv6AddressPref_shouldNotBeSelectable() { 513 LinkAddress ipv6Address = new LinkAddress(mIpv6Address, 128); 514 515 mLinkProperties.addLinkAddress(ipv6Address); 516 517 mController.displayPreference(mockScreen); 518 519 ArgumentCaptor<Preference> preferenceCaptor = ArgumentCaptor.forClass(Preference.class); 520 verify(mockIpv6AddressCategory).addPreference(preferenceCaptor.capture()); 521 assertThat(preferenceCaptor.getValue().isSelectable()).isFalse(); 522 } 523 524 @Test 525 public void captivePortal_shouldShowSignInButton() { 526 InOrder inOrder = inOrder(mockSignInButton); 527 528 mController.displayPreference(mockScreen); 529 mController.onResume(); 530 531 inOrder.verify(mockSignInButton).setVisibility(View.INVISIBLE); 532 533 NetworkCapabilities nc = new NetworkCapabilities(); 534 nc.clearAll(); 535 nc.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); 536 537 NetworkCallback callback = mCallbackCaptor.getValue(); 538 callback.onCapabilitiesChanged(mockNetwork, nc); 539 inOrder.verify(mockSignInButton).setVisibility(View.INVISIBLE); 540 541 nc = new NetworkCapabilities(nc); 542 nc.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL); 543 callback.onCapabilitiesChanged(mockNetwork, nc); 544 inOrder.verify(mockSignInButton).setVisibility(View.VISIBLE); 545 546 nc = new NetworkCapabilities(nc); 547 nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL); 548 callback.onCapabilitiesChanged(mockNetwork, nc); 549 inOrder.verify(mockSignInButton).setVisibility(View.INVISIBLE); 550 } 551 552 @Test 553 public void testSignInButton_shouldStartCaptivePortalApp() { 554 mController.displayPreference(mockScreen); 555 556 ArgumentCaptor<OnClickListener> captor = ArgumentCaptor.forClass(OnClickListener.class); 557 verify(mockSignInButton).setOnClickListener(captor.capture()); 558 captor.getValue().onClick(mockSignInButton); 559 verify(mockConnectivityManagerWrapper).startCaptivePortalApp(mockNetwork); 560 } 561 562 @Test 563 public void signInButtonVisible_buttonPanelShouldBeVisible() { 564 when(mockSignInButton.getVisibility()).thenReturn(View.VISIBLE); 565 when(mockForgetButton.getVisibility()).thenReturn(View.INVISIBLE); 566 567 mController.displayPreference(mockScreen); 568 569 verify(mockButtonsPref).setVisible(true); 570 } 571 572 @Test 573 public void forgetButtonVisible_buttonPanelShouldBeVisible() { 574 when(mockSignInButton.getVisibility()).thenReturn(View.INVISIBLE); 575 when(mockForgetButton.getVisibility()).thenReturn(View.VISIBLE); 576 577 mController.displayPreference(mockScreen); 578 579 verify(mockButtonsPref).setVisible(true); 580 } 581 582 @Test 583 public void neitherButtonVisible_buttonPanelShouldBeInvisible() { 584 when(mockSignInButton.getVisibility()).thenReturn(View.INVISIBLE); 585 when(mockForgetButton.getVisibility()).thenReturn(View.INVISIBLE); 586 587 mController.displayPreference(mockScreen); 588 589 verify(mockButtonsPref).setVisible(false); 590 } 591} 592