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