blob: 6e3d9067f63cebdbd030a675fb7c39ba36a547f1 [file] [log] [blame]
Jason Monkf13b4b32014-11-07 16:39:34 -05001package com.android.systemui.statusbar.policy;
2
3import android.content.Intent;
Jason Monk33f8ae72015-05-08 10:45:15 -04004import android.net.NetworkCapabilities;
Jason Monkf13b4b32014-11-07 16:39:34 -05005import android.net.NetworkInfo;
6import android.net.wifi.WifiInfo;
7import android.net.wifi.WifiManager;
Jason Monke427cb82015-07-28 09:18:08 -04008import android.test.suitebuilder.annotation.SmallTest;
Jason Monk2515f472017-09-19 09:52:43 -04009import android.testing.AndroidTestingRunner;
10import android.testing.TestableLooper.RunWithLooper;
Jason Monkf13b4b32014-11-07 16:39:34 -050011
Jason Monk33f8ae72015-05-08 10:45:15 -040012import com.android.systemui.statusbar.policy.NetworkController.IconState;
Jason Monk07b75fe2015-05-14 16:47:03 -040013
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040014import org.junit.Test;
15import org.junit.runner.RunWith;
Jason Monkf13b4b32014-11-07 16:39:34 -050016import org.mockito.ArgumentCaptor;
17import org.mockito.Mockito;
18
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040019import static junit.framework.Assert.assertEquals;
20
Jason Monk26ad85a2016-12-08 14:45:42 -050021import static org.mockito.Matchers.any;
22import static org.mockito.Matchers.anyBoolean;
Anarghya Mitra678722f2018-05-11 14:29:54 -070023import static org.mockito.Mockito.mock;
Amin Shaikhc7593b12018-03-09 16:07:09 -050024import static org.mockito.Mockito.when;
Jason Monk26ad85a2016-12-08 14:45:42 -050025
Jason Monke427cb82015-07-28 09:18:08 -040026@SmallTest
Jason Monk2515f472017-09-19 09:52:43 -040027@RunWith(AndroidTestingRunner.class)
28@RunWithLooper
Jason Monkf13b4b32014-11-07 16:39:34 -050029public class NetworkControllerWifiTest extends NetworkControllerBaseTest {
30 // These match the constants in WifiManager and need to be kept up to date.
31 private static final int MIN_RSSI = -100;
32 private static final int MAX_RSSI = -55;
33
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040034 @Test
Jason Monkf13b4b32014-11-07 16:39:34 -050035 public void testWifiIcon() {
36 String testSsid = "Test SSID";
37 setWifiEnabled(true);
Jason Monk7e6c83c2017-04-26 14:35:24 -040038 verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK);
Jason Monkf13b4b32014-11-07 16:39:34 -050039
40 setWifiState(true, testSsid);
Amin Shaikhe74dbdd2018-03-09 16:05:30 -050041 setWifiLevel(0);
Jason Monkf13b4b32014-11-07 16:39:34 -050042 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][0]);
43
44 for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) {
45 setWifiLevel(testLevel);
46
Anarghya Mitra678722f2018-05-11 14:29:54 -070047 setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
Jason Monkf13b4b32014-11-07 16:39:34 -050048 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
Anarghya Mitra678722f2018-05-11 14:29:54 -070049 setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, false, true);
Jason Monkf13b4b32014-11-07 16:39:34 -050050 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][testLevel]);
51 }
52 }
53
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040054 @Test
Jason Monkf13b4b32014-11-07 16:39:34 -050055 public void testQsWifiIcon() {
56 String testSsid = "Test SSID";
57
58 setWifiEnabled(false);
Jason Monkd2263cd2014-11-10 14:22:56 -050059 verifyLastQsWifiIcon(false, false, WifiIcons.QS_WIFI_NO_NETWORK, null);
Jason Monkf13b4b32014-11-07 16:39:34 -050060
61 setWifiEnabled(true);
Jason Monkd2263cd2014-11-10 14:22:56 -050062 verifyLastQsWifiIcon(true, false, WifiIcons.QS_WIFI_NO_NETWORK, null);
Jason Monkf13b4b32014-11-07 16:39:34 -050063
64 setWifiState(true, testSsid);
65 for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) {
66 setWifiLevel(testLevel);
67
Anarghya Mitra678722f2018-05-11 14:29:54 -070068 setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
Jason Monkf13b4b32014-11-07 16:39:34 -050069 verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][testLevel],
70 testSsid);
Anarghya Mitra678722f2018-05-11 14:29:54 -070071 setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, false, true);
Jason Monkf13b4b32014-11-07 16:39:34 -050072 verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[0][testLevel],
73 testSsid);
74 }
75 }
76
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040077 @Test
Jason Monkf13b4b32014-11-07 16:39:34 -050078 public void testQsDataDirection() {
79 // Setup normal connection
80 String testSsid = "Test SSID";
81 int testLevel = 2;
82 setWifiEnabled(true);
83 setWifiState(true, testSsid);
84 setWifiLevel(testLevel);
Anarghya Mitra678722f2018-05-11 14:29:54 -070085 setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
Jason Monkf13b4b32014-11-07 16:39:34 -050086 verifyLastQsWifiIcon(true, true,
87 WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][testLevel], testSsid);
88
Jason Monk26ad85a2016-12-08 14:45:42 -050089 // Set to different activity state first to ensure a callback happens.
Roshan Pius80fb1372018-07-16 15:43:03 -070090 setWifiActivity(WifiManager.TrafficStateCallback.DATA_ACTIVITY_IN);
Jason Monk26ad85a2016-12-08 14:45:42 -050091
Roshan Pius80fb1372018-07-16 15:43:03 -070092 setWifiActivity(WifiManager.TrafficStateCallback.DATA_ACTIVITY_NONE);
Jason Monkf13b4b32014-11-07 16:39:34 -050093 verifyLastQsDataDirection(false, false);
Roshan Pius80fb1372018-07-16 15:43:03 -070094 setWifiActivity(WifiManager.TrafficStateCallback.DATA_ACTIVITY_IN);
Jason Monkf13b4b32014-11-07 16:39:34 -050095 verifyLastQsDataDirection(true, false);
Roshan Pius80fb1372018-07-16 15:43:03 -070096 setWifiActivity(WifiManager.TrafficStateCallback.DATA_ACTIVITY_OUT);
Jason Monkf13b4b32014-11-07 16:39:34 -050097 verifyLastQsDataDirection(false, true);
Roshan Pius80fb1372018-07-16 15:43:03 -070098 setWifiActivity(WifiManager.TrafficStateCallback.DATA_ACTIVITY_INOUT);
Jason Monkf13b4b32014-11-07 16:39:34 -050099 verifyLastQsDataDirection(true, true);
100 }
101
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -0400102 @Test
Jason Monkf13b4b32014-11-07 16:39:34 -0500103 public void testRoamingIconDuringWifi() {
104 // Setup normal connection
Sundeep Ghuman9d10a3c2017-06-16 00:05:16 +0000105 String testSsid = "Test SSID";
Jason Monkf13b4b32014-11-07 16:39:34 -0500106 int testLevel = 2;
107 setWifiEnabled(true);
108 setWifiState(true, testSsid);
109 setWifiLevel(testLevel);
Anarghya Mitra678722f2018-05-11 14:29:54 -0700110 setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
Jason Monkf13b4b32014-11-07 16:39:34 -0500111 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
112
113 setupDefaultSignal();
114 setGsmRoaming(true);
115 // Still be on wifi though.
Anarghya Mitra678722f2018-05-11 14:29:54 -0700116 setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
117 setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
Jason Monkf13b4b32014-11-07 16:39:34 -0500118 verifyLastMobileDataIndicators(true,
Jason Monk48edc0c2017-04-10 15:01:27 -0400119 DEFAULT_LEVEL,
Jason Monk0f0de132016-12-19 15:36:13 -0500120 0, true);
Jason Monkf13b4b32014-11-07 16:39:34 -0500121 }
122
Anarghya Mitra678722f2018-05-11 14:29:54 -0700123 @Test
124 public void testWifiIconInvalidatedViaCallback() {
125 // Setup normal connection
126 String testSsid = "Test SSID";
127 int testLevel = 2;
128 setWifiEnabled(true);
129 setWifiState(true, testSsid);
130 setWifiLevel(testLevel);
131 setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
132 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
133
134 setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, true);
135 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][testLevel]);
136 }
137
138 @Test
139 public void testWifiIconDisconnectedViaCallback(){
140 // Setup normal connection
141 String testSsid = "Test SSID";
142 int testLevel = 2;
143 setWifiEnabled(true);
144 setWifiState(true, testSsid);
145 setWifiLevel(testLevel);
146 setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
147 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
148
149 setWifiState(false, testSsid);
150 setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, false);
151 verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK);
152 }
153
154 @Test
155 public void testVpnWithUnderlyingWifi(){
156 String testSsid = "Test SSID";
157 int testLevel = 2;
158 setWifiEnabled(true);
159 verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK);
160
161 setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_VPN, false, true);
162 setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_VPN, true, true);
163 verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK);
164
165 // Mock calling setUnderlyingNetworks.
166 setWifiState(true, testSsid);
167 setWifiLevel(testLevel);
168 setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true);
169 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
170 }
171
Jason Monkf13b4b32014-11-07 16:39:34 -0500172 protected void setWifiActivity(int activity) {
173 // TODO: Not this, because this variable probably isn't sticking around.
Jason Monkd2263cd2014-11-10 14:22:56 -0500174 mNetworkController.mWifiSignalController.setActivity(activity);
Jason Monkf13b4b32014-11-07 16:39:34 -0500175 }
176
177 protected void setWifiLevel(int level) {
178 float amountPerLevel = (MAX_RSSI - MIN_RSSI) / (WifiIcons.WIFI_LEVEL_COUNT - 1);
179 int rssi = (int)(MIN_RSSI + level * amountPerLevel);
180 // Put RSSI in the middle of the range.
181 rssi += amountPerLevel / 2;
182 Intent i = new Intent(WifiManager.RSSI_CHANGED_ACTION);
183 i.putExtra(WifiManager.EXTRA_NEW_RSSI, rssi);
184 mNetworkController.onReceive(mContext, i);
185 }
186
187 protected void setWifiEnabled(boolean enabled) {
Amin Shaikheddaf3f2018-04-18 17:43:53 -0400188 when(mMockWm.getWifiState()).thenReturn(
Jason Monkf13b4b32014-11-07 16:39:34 -0500189 enabled ? WifiManager.WIFI_STATE_ENABLED : WifiManager.WIFI_STATE_DISABLED);
Amin Shaikheddaf3f2018-04-18 17:43:53 -0400190 mNetworkController.onReceive(mContext, new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION));
Jason Monkf13b4b32014-11-07 16:39:34 -0500191 }
192
193 protected void setWifiState(boolean connected, String ssid) {
194 Intent i = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
Anarghya Mitra678722f2018-05-11 14:29:54 -0700195 NetworkInfo networkInfo = mock(NetworkInfo.class);
Amin Shaikhc7593b12018-03-09 16:07:09 -0500196 when(networkInfo.isConnected()).thenReturn(connected);
Jason Monkf13b4b32014-11-07 16:39:34 -0500197
Anarghya Mitra678722f2018-05-11 14:29:54 -0700198 WifiInfo wifiInfo = mock(WifiInfo.class);
Amin Shaikhc7593b12018-03-09 16:07:09 -0500199 when(wifiInfo.getSSID()).thenReturn(ssid);
200 when(mMockWm.getConnectionInfo()).thenReturn(wifiInfo);
Jason Monkf13b4b32014-11-07 16:39:34 -0500201
202 i.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
Jason Monkf13b4b32014-11-07 16:39:34 -0500203 mNetworkController.onReceive(mContext, i);
204 }
205
206 protected void verifyLastQsDataDirection(boolean in, boolean out) {
207 ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class);
208 ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class);
209
Jason Monk07b75fe2015-05-14 16:47:03 -0400210 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
Amin Shaikhe74dbdd2018-03-09 16:05:30 -0500211 anyBoolean(), any(), any(), inArg.capture(), outArg.capture(), any(), anyBoolean(),
212 any());
Jason Monkf13b4b32014-11-07 16:39:34 -0500213 assertEquals("WiFi data in, in quick settings", in, (boolean) inArg.getValue());
214 assertEquals("WiFi data out, in quick settings", out, (boolean) outArg.getValue());
215 }
216
217 protected void verifyLastQsWifiIcon(boolean enabled, boolean connected, int icon,
218 String description) {
Jason Monk07b75fe2015-05-14 16:47:03 -0400219 ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500220 ArgumentCaptor<Boolean> enabledArg = ArgumentCaptor.forClass(Boolean.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500221 ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class);
222
Jason Monk07b75fe2015-05-14 16:47:03 -0400223 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800224 enabledArg.capture(), any(), iconArg.capture(), anyBoolean(),
Amin Shaikhe74dbdd2018-03-09 16:05:30 -0500225 anyBoolean(), descArg.capture(), anyBoolean(), any());
Jason Monk07b75fe2015-05-14 16:47:03 -0400226 IconState iconState = iconArg.getValue();
Jason Monkf13b4b32014-11-07 16:39:34 -0500227 assertEquals("WiFi enabled, in quick settings", enabled, (boolean) enabledArg.getValue());
Jason Monk07b75fe2015-05-14 16:47:03 -0400228 assertEquals("WiFi connected, in quick settings", connected, iconState.visible);
229 assertEquals("WiFi signal, in quick settings", icon, iconState.icon);
Amin Shaikhc7593b12018-03-09 16:07:09 -0500230 assertEquals("WiFI desc (ssid), in quick settings", description, descArg.getValue());
Jason Monkf13b4b32014-11-07 16:39:34 -0500231 }
232
233 protected void verifyLastWifiIcon(boolean visible, int icon) {
Jason Monk07b75fe2015-05-14 16:47:03 -0400234 ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500235
Jason Monk07b75fe2015-05-14 16:47:03 -0400236 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
Sundeep Ghumand57f3242017-01-13 15:31:48 -0800237 anyBoolean(), iconArg.capture(), any(), anyBoolean(), anyBoolean(),
Amin Shaikhe74dbdd2018-03-09 16:05:30 -0500238 any(), anyBoolean(), any());
Jason Monk07b75fe2015-05-14 16:47:03 -0400239 IconState iconState = iconArg.getValue();
240 assertEquals("WiFi visible, in status bar", visible, iconState.visible);
241 assertEquals("WiFi signal, in status bar", icon, iconState.icon);
Jason Monkf13b4b32014-11-07 16:39:34 -0500242 }
243}