blob: dbaa2c5fea0aa1e0969f4923992dc2d071efdd1c [file] [log] [blame]
Jason Monkf13b4b32014-11-07 16:39:34 -05001package com.android.systemui.statusbar.policy;
2
3import android.content.Intent;
Sundeep Ghuman699deaf2017-02-13 15:32:13 -08004import android.net.NetworkBadging;
Jason Monk33f8ae72015-05-08 10:45:15 -04005import android.net.NetworkCapabilities;
Jason Monkf13b4b32014-11-07 16:39:34 -05006import android.net.NetworkInfo;
Sundeep Ghumand57f3242017-01-13 15:31:48 -08007import android.net.NetworkKey;
8import android.net.RssiCurve;
9import android.net.ScoredNetwork;
10import android.net.WifiKey;
Jason Monkf13b4b32014-11-07 16:39:34 -050011import android.net.wifi.WifiInfo;
12import android.net.wifi.WifiManager;
Sundeep Ghumand57f3242017-01-13 15:31:48 -080013import android.net.wifi.WifiNetworkScoreCache;
14import android.os.Bundle;
15import android.provider.Settings;
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040016import android.support.test.runner.AndroidJUnit4;
Jason Monke427cb82015-07-28 09:18:08 -040017import android.test.suitebuilder.annotation.SmallTest;
Jason Monkf13b4b32014-11-07 16:39:34 -050018
Sundeep Ghumand57f3242017-01-13 15:31:48 -080019import com.android.settingslib.Utils;
Jason Monk33f8ae72015-05-08 10:45:15 -040020import com.android.systemui.statusbar.policy.NetworkController.IconState;
Jason Monk07b75fe2015-05-14 16:47:03 -040021
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040022import org.junit.Test;
23import org.junit.runner.RunWith;
Jason Monkf13b4b32014-11-07 16:39:34 -050024import org.mockito.ArgumentCaptor;
Sundeep Ghumand57f3242017-01-13 15:31:48 -080025import org.mockito.Matchers;
Jason Monkf13b4b32014-11-07 16:39:34 -050026import org.mockito.Mockito;
Sundeep Ghumand57f3242017-01-13 15:31:48 -080027import org.mockito.invocation.InvocationOnMock;
28import org.mockito.stubbing.Answer;
Jason Monkf13b4b32014-11-07 16:39:34 -050029
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040030import static junit.framework.Assert.assertEquals;
31
Jason Monk26ad85a2016-12-08 14:45:42 -050032import static org.mockito.Matchers.any;
33import static org.mockito.Matchers.anyBoolean;
Sundeep Ghumand57f3242017-01-13 15:31:48 -080034import static org.mockito.Matchers.anyInt;
35import static org.mockito.Mockito.doAnswer;
36import static org.mockito.Mockito.mock;
37import static org.mockito.Mockito.verify;
38import static org.mockito.Mockito.when;
39
40import java.util.Arrays;
41import java.util.ArrayList;
42import java.util.List;
43import java.util.concurrent.CountDownLatch;
44import java.util.concurrent.TimeUnit;
Jason Monk26ad85a2016-12-08 14:45:42 -050045
Jason Monke427cb82015-07-28 09:18:08 -040046@SmallTest
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040047@RunWith(AndroidJUnit4.class)
Jason Monkf13b4b32014-11-07 16:39:34 -050048public class NetworkControllerWifiTest extends NetworkControllerBaseTest {
49 // These match the constants in WifiManager and need to be kept up to date.
50 private static final int MIN_RSSI = -100;
51 private static final int MAX_RSSI = -55;
52
Sundeep Ghumand57f3242017-01-13 15:31:48 -080053 private static final int LATCH_TIMEOUT = 2000;
54 private static final String TEST_SSID = "\"Test SSID\"";
55 private static final String TEST_BSSID = "00:00:00:00:00:00";
56
57 private final List<NetworkKey> mRequestedKeys = new ArrayList<>();
58 private CountDownLatch mRequestScoresLatch;
59
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040060 @Test
Jason Monkf13b4b32014-11-07 16:39:34 -050061 public void testWifiIcon() {
62 String testSsid = "Test SSID";
63 setWifiEnabled(true);
Jason Monk7e6c83c2017-04-26 14:35:24 -040064 verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK);
Jason Monkf13b4b32014-11-07 16:39:34 -050065
66 setWifiState(true, testSsid);
67 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][0]);
68
69 for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) {
70 setWifiLevel(testLevel);
71
Jason Monk33f8ae72015-05-08 10:45:15 -040072 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
Jason Monkf13b4b32014-11-07 16:39:34 -050073 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
Jason Monk33f8ae72015-05-08 10:45:15 -040074 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, false, true);
Jason Monkf13b4b32014-11-07 16:39:34 -050075 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][testLevel]);
76 }
77 }
78
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040079 @Test
Sundeep Ghumand57f3242017-01-13 15:31:48 -080080 public void testBadgedWifiIcon() throws Exception {
Sundeep Ghumane869d832017-01-25 16:23:43 -080081 // TODO(sghuman): Refactor this setup code when creating a test for the badged QsIcon.
Sundeep Ghumand57f3242017-01-13 15:31:48 -080082 int testLevel = 1;
83 RssiCurve mockBadgeCurve = mock(RssiCurve.class);
84 Bundle attr = new Bundle();
85 attr.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, mockBadgeCurve);
86 ScoredNetwork score =
87 new ScoredNetwork(
88 new NetworkKey(new WifiKey(TEST_SSID, TEST_BSSID)),
89 null,
90 false /* meteredHint */,
91 attr);
92
Sundeep Ghumane869d832017-01-25 16:23:43 -080093 // Must set the Settings value before instantiating the NetworkControllerImpl due to bugs in
Jason Monkf06a3172017-04-25 16:30:53 -040094 // TestableSettingsProvider.
95 Settings.Global.putString(mContext.getContentResolver(),
96 Settings.Global.NETWORK_SCORING_UI_ENABLED,
97 "1");
Sundeep Ghumane869d832017-01-25 16:23:43 -080098 super.setUp(); // re-instantiate NetworkControllImpl now that setting has been updated
Sundeep Ghumand57f3242017-01-13 15:31:48 -080099 setupNetworkScoreManager();
Sundeep Ghumane869d832017-01-25 16:23:43 -0800100
101 // Test Requesting Scores
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800102 mRequestScoresLatch = new CountDownLatch(1);
103 setWifiEnabled(true);
104 setWifiState(true, TEST_SSID, TEST_BSSID);
105 mRequestScoresLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS);
106
Sundeep Ghuman699deaf2017-02-13 15:32:13 -0800107 when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) NetworkBadging.BADGING_SD);
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800108
109 ArgumentCaptor<WifiNetworkScoreCache> scoreCacheCaptor =
110 ArgumentCaptor.forClass(WifiNetworkScoreCache.class);
111 verify(mMockNetworkScoreManager).registerNetworkScoreCache(
112 anyInt(),
113 scoreCacheCaptor.capture(),
114 Matchers.anyInt());
115 scoreCacheCaptor.getValue().updateScores(Arrays.asList(score));
116
Sundeep Ghumane869d832017-01-25 16:23:43 -0800117 // Test badge is set
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800118 setWifiLevel(testLevel);
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800119
Sundeep Ghumane869d832017-01-25 16:23:43 -0800120 ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
121 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
122 anyBoolean(), iconArg.capture(), any(), anyBoolean(), anyBoolean(),
Jason Monk110e5f62017-03-31 13:45:12 -0400123 any(), anyBoolean());
Sundeep Ghumane869d832017-01-25 16:23:43 -0800124 IconState iconState = iconArg.getValue();
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800125
126 assertEquals("Badged Wifi Resource is set",
127 Utils.WIFI_PIE_FOR_BADGING[testLevel],
Sundeep Ghumane869d832017-01-25 16:23:43 -0800128 iconState.icon);
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800129 assertEquals("SD Badge is set",
Sundeep Ghuman699deaf2017-02-13 15:32:13 -0800130 Utils.getWifiBadgeResource(NetworkBadging.BADGING_SD),
Sundeep Ghumane869d832017-01-25 16:23:43 -0800131 iconState.iconOverlay);
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800132 }
133
134 private void setupNetworkScoreManager() {
135 // Capture requested keys and count down latch if present
136 doAnswer(
137 new Answer<Boolean>() {
138 @Override
139 public Boolean answer(InvocationOnMock input) {
140 if (mRequestScoresLatch != null) {
141 mRequestScoresLatch.countDown();
142 }
143 NetworkKey[] keys = (NetworkKey[]) input.getArguments()[0];
144 for (NetworkKey key : keys) {
145 mRequestedKeys.add(key);
146 }
147 return true;
148 }
149 }).when(mMockNetworkScoreManager).requestScores(Matchers.<NetworkKey[]>any());
150 }
151
152 @Test
Jason Monkf13b4b32014-11-07 16:39:34 -0500153 public void testQsWifiIcon() {
154 String testSsid = "Test SSID";
155
156 setWifiEnabled(false);
Jason Monkd2263cd2014-11-10 14:22:56 -0500157 verifyLastQsWifiIcon(false, false, WifiIcons.QS_WIFI_NO_NETWORK, null);
Jason Monkf13b4b32014-11-07 16:39:34 -0500158
159 setWifiEnabled(true);
Jason Monkd2263cd2014-11-10 14:22:56 -0500160 verifyLastQsWifiIcon(true, false, WifiIcons.QS_WIFI_NO_NETWORK, null);
Jason Monkf13b4b32014-11-07 16:39:34 -0500161
162 setWifiState(true, testSsid);
163 for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) {
164 setWifiLevel(testLevel);
165
Jason Monk33f8ae72015-05-08 10:45:15 -0400166 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
Jason Monkf13b4b32014-11-07 16:39:34 -0500167 verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][testLevel],
168 testSsid);
Jason Monk33f8ae72015-05-08 10:45:15 -0400169 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, false, true);
Jason Monkf13b4b32014-11-07 16:39:34 -0500170 verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[0][testLevel],
171 testSsid);
172 }
173 }
174
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -0400175 @Test
Jason Monkf13b4b32014-11-07 16:39:34 -0500176 public void testQsDataDirection() {
177 // Setup normal connection
178 String testSsid = "Test SSID";
179 int testLevel = 2;
180 setWifiEnabled(true);
181 setWifiState(true, testSsid);
182 setWifiLevel(testLevel);
Jason Monk33f8ae72015-05-08 10:45:15 -0400183 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
Jason Monkf13b4b32014-11-07 16:39:34 -0500184 verifyLastQsWifiIcon(true, true,
185 WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][testLevel], testSsid);
186
Jason Monk26ad85a2016-12-08 14:45:42 -0500187 // Set to different activity state first to ensure a callback happens.
188 setWifiActivity(WifiManager.DATA_ACTIVITY_IN);
189
Jason Monkf13b4b32014-11-07 16:39:34 -0500190 setWifiActivity(WifiManager.DATA_ACTIVITY_NONE);
191 verifyLastQsDataDirection(false, false);
192 setWifiActivity(WifiManager.DATA_ACTIVITY_IN);
193 verifyLastQsDataDirection(true, false);
194 setWifiActivity(WifiManager.DATA_ACTIVITY_OUT);
195 verifyLastQsDataDirection(false, true);
196 setWifiActivity(WifiManager.DATA_ACTIVITY_INOUT);
197 verifyLastQsDataDirection(true, true);
198 }
199
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -0400200 @Test
Jason Monkf13b4b32014-11-07 16:39:34 -0500201 public void testRoamingIconDuringWifi() {
202 // Setup normal connection
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800203 String testSsid = "\"Test SSID\"";
Jason Monkf13b4b32014-11-07 16:39:34 -0500204 int testLevel = 2;
205 setWifiEnabled(true);
206 setWifiState(true, testSsid);
207 setWifiLevel(testLevel);
Jason Monk33f8ae72015-05-08 10:45:15 -0400208 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
Jason Monkf13b4b32014-11-07 16:39:34 -0500209 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
210
211 setupDefaultSignal();
212 setGsmRoaming(true);
213 // Still be on wifi though.
Jason Monk33f8ae72015-05-08 10:45:15 -0400214 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
Jason Monk0f0de132016-12-19 15:36:13 -0500215 setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
Jason Monkf13b4b32014-11-07 16:39:34 -0500216 verifyLastMobileDataIndicators(true,
Jason Monk48edc0c2017-04-10 15:01:27 -0400217 DEFAULT_LEVEL,
Jason Monk0f0de132016-12-19 15:36:13 -0500218 0, true);
Jason Monkf13b4b32014-11-07 16:39:34 -0500219 }
220
221 protected void setWifiActivity(int activity) {
222 // TODO: Not this, because this variable probably isn't sticking around.
Jason Monkd2263cd2014-11-10 14:22:56 -0500223 mNetworkController.mWifiSignalController.setActivity(activity);
Jason Monkf13b4b32014-11-07 16:39:34 -0500224 }
225
226 protected void setWifiLevel(int level) {
227 float amountPerLevel = (MAX_RSSI - MIN_RSSI) / (WifiIcons.WIFI_LEVEL_COUNT - 1);
228 int rssi = (int)(MIN_RSSI + level * amountPerLevel);
229 // Put RSSI in the middle of the range.
230 rssi += amountPerLevel / 2;
231 Intent i = new Intent(WifiManager.RSSI_CHANGED_ACTION);
232 i.putExtra(WifiManager.EXTRA_NEW_RSSI, rssi);
233 mNetworkController.onReceive(mContext, i);
234 }
235
236 protected void setWifiEnabled(boolean enabled) {
237 Intent i = new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION);
238 i.putExtra(WifiManager.EXTRA_WIFI_STATE,
239 enabled ? WifiManager.WIFI_STATE_ENABLED : WifiManager.WIFI_STATE_DISABLED);
240 mNetworkController.onReceive(mContext, i);
241 }
242
243 protected void setWifiState(boolean connected, String ssid) {
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800244 setWifiState(connected, ssid, null);
245 }
246
247 protected void setWifiState(boolean connected, String ssid, String bssid) {
Jason Monkf13b4b32014-11-07 16:39:34 -0500248 Intent i = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
249 NetworkInfo networkInfo = Mockito.mock(NetworkInfo.class);
250 Mockito.when(networkInfo.isConnected()).thenReturn(connected);
251
252 WifiInfo wifiInfo = Mockito.mock(WifiInfo.class);
253 Mockito.when(wifiInfo.getSSID()).thenReturn(ssid);
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800254 if (bssid != null) {
255 Mockito.when(wifiInfo.getBSSID()).thenReturn(bssid);
256 }
Jason Monkf13b4b32014-11-07 16:39:34 -0500257
258 i.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
259 i.putExtra(WifiManager.EXTRA_WIFI_INFO, wifiInfo);
260 mNetworkController.onReceive(mContext, i);
261 }
262
263 protected void verifyLastQsDataDirection(boolean in, boolean out) {
264 ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class);
265 ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class);
266
Jason Monk07b75fe2015-05-14 16:47:03 -0400267 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
Jason Monk110e5f62017-03-31 13:45:12 -0400268 anyBoolean(), any(), any(), inArg.capture(), outArg.capture(), any(), anyBoolean());
Jason Monkf13b4b32014-11-07 16:39:34 -0500269 assertEquals("WiFi data in, in quick settings", in, (boolean) inArg.getValue());
270 assertEquals("WiFi data out, in quick settings", out, (boolean) outArg.getValue());
271 }
272
273 protected void verifyLastQsWifiIcon(boolean enabled, boolean connected, int icon,
274 String description) {
Jason Monk07b75fe2015-05-14 16:47:03 -0400275 ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500276 ArgumentCaptor<Boolean> enabledArg = ArgumentCaptor.forClass(Boolean.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500277 ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class);
278
Jason Monk07b75fe2015-05-14 16:47:03 -0400279 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800280 enabledArg.capture(), any(), iconArg.capture(), anyBoolean(),
Jason Monk110e5f62017-03-31 13:45:12 -0400281 anyBoolean(), descArg.capture(), anyBoolean());
Jason Monk07b75fe2015-05-14 16:47:03 -0400282 IconState iconState = iconArg.getValue();
Jason Monkf13b4b32014-11-07 16:39:34 -0500283 assertEquals("WiFi enabled, in quick settings", enabled, (boolean) enabledArg.getValue());
Jason Monk07b75fe2015-05-14 16:47:03 -0400284 assertEquals("WiFi connected, in quick settings", connected, iconState.visible);
285 assertEquals("WiFi signal, in quick settings", icon, iconState.icon);
286 assertEquals("WiFI desc (ssid), in quick settings", description, descArg.getValue());
Jason Monkf13b4b32014-11-07 16:39:34 -0500287 }
288
289 protected void verifyLastWifiIcon(boolean visible, int icon) {
Jason Monk07b75fe2015-05-14 16:47:03 -0400290 ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500291
Jason Monk07b75fe2015-05-14 16:47:03 -0400292 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800293 anyBoolean(), iconArg.capture(), any(), anyBoolean(), anyBoolean(),
Jason Monk110e5f62017-03-31 13:45:12 -0400294 any(), anyBoolean());
Jason Monk07b75fe2015-05-14 16:47:03 -0400295 IconState iconState = iconArg.getValue();
296 assertEquals("WiFi visible, in status bar", visible, iconState.visible);
297 assertEquals("WiFi signal, in status bar", icon, iconState.icon);
Jason Monkf13b4b32014-11-07 16:39:34 -0500298 }
299}