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