blob: ebd538473c1d36090d26a729b71aab788502eee9 [file] [log] [blame]
Jason Monkda68f592015-01-07 10:55:58 -05001/*
2 * Copyright (C) 2015 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 */
Jason Monke0cdb602014-11-05 12:39:45 -050016
17package com.android.systemui.statusbar.policy;
18
Jason Monke0cdb602014-11-05 12:39:45 -050019import android.content.Intent;
20import android.net.ConnectivityManager;
Jason Monkd8e4bf42014-12-12 10:23:12 -050021import android.net.NetworkCapabilities;
Jason Monkf13b4b32014-11-07 16:39:34 -050022import android.net.wifi.WifiManager;
Jason Monk07b75fe2015-05-14 16:47:03 -040023import android.os.Looper;
Jason Monke0cdb602014-11-05 12:39:45 -050024import android.telephony.PhoneStateListener;
25import android.telephony.ServiceState;
26import android.telephony.SignalStrength;
Jason Monkb5746272014-11-12 16:50:31 -050027import android.telephony.SubscriptionInfo;
28import android.telephony.SubscriptionManager;
Jason Monkf13b4b32014-11-07 16:39:34 -050029import android.telephony.TelephonyManager;
Jason Monke0cdb602014-11-05 12:39:45 -050030import android.util.Log;
Jason Monkf13b4b32014-11-07 16:39:34 -050031import com.android.internal.telephony.cdma.EriInfo;
Jason Monkf668d7c2016-01-14 10:38:41 -050032import com.android.settingslib.net.DataUsageController;
Chris Wren930ecca2014-11-12 17:43:41 -050033import com.android.systemui.SysuiTestCase;
Jason Monk33f8ae72015-05-08 10:45:15 -040034import com.android.systemui.statusbar.policy.NetworkController.IconState;
Jason Monkd2263cd2014-11-10 14:22:56 -050035import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
Jason Monkc6cc6262015-06-11 11:10:15 -040036import com.android.systemui.statusbar.policy.NetworkControllerImpl.SubscriptionDefaults;
Jason Monkda68f592015-01-07 10:55:58 -050037import org.mockito.ArgumentCaptor;
38import org.mockito.Mockito;
39
40import java.io.PrintWriter;
41import java.io.StringWriter;
42import java.util.ArrayList;
43import java.util.List;
44
Jason Monkf6a3cf92016-02-29 13:01:08 -050045import static org.mockito.Mockito.mock;
46import static org.mockito.Mockito.when;
47
Chris Wren930ecca2014-11-12 17:43:41 -050048public class NetworkControllerBaseTest extends SysuiTestCase {
Jason Monke0cdb602014-11-05 12:39:45 -050049 private static final String TAG = "NetworkControllerBaseTest";
Jason Monkf13b4b32014-11-07 16:39:34 -050050 protected static final int DEFAULT_LEVEL = 2;
51 protected static final int DEFAULT_SIGNAL_STRENGTH =
52 TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL];
53 protected static final int DEFAULT_QS_SIGNAL_STRENGTH =
54 TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL];
55 protected static final int DEFAULT_ICON = TelephonyIcons.ICON_3G;
56 protected static final int DEFAULT_QS_ICON = TelephonyIcons.QS_ICON_3G;
Jason Monke0cdb602014-11-05 12:39:45 -050057
58 protected NetworkControllerImpl mNetworkController;
Leigh Anned0a62792014-11-13 14:27:10 -080059 protected MobileSignalController mMobileSignalController;
Jason Monke0cdb602014-11-05 12:39:45 -050060 protected PhoneStateListener mPhoneStateListener;
Jason Monk67b2c162016-01-12 10:24:09 -050061 protected SignalStrength mSignalStrength;
62 protected ServiceState mServiceState;
Jason Monkf13b4b32014-11-07 16:39:34 -050063 protected ConnectivityManager mMockCm;
64 protected WifiManager mMockWm;
Jason Monkb5746272014-11-12 16:50:31 -050065 protected SubscriptionManager mMockSm;
Jason Monkf13b4b32014-11-07 16:39:34 -050066 protected TelephonyManager mMockTm;
Jason Monkd2263cd2014-11-10 14:22:56 -050067 protected Config mConfig;
Jason Monk07b75fe2015-05-14 16:47:03 -040068 protected CallbackHandler mCallbackHandler;
Jason Monkc6cc6262015-06-11 11:10:15 -040069 protected SubscriptionDefaults mMockSubDefaults;
Jason Monke0cdb602014-11-05 12:39:45 -050070
Jason Monk18985e02015-01-07 12:07:06 -050071 protected int mSubId;
72
Jason Monkd8e4bf42014-12-12 10:23:12 -050073 private NetworkCapabilities mNetCapabilities;
74
Jason Monke0cdb602014-11-05 12:39:45 -050075 @Override
76 protected void setUp() throws Exception {
77 super.setUp();
Jason Monke0cdb602014-11-05 12:39:45 -050078
Jason Monkf13b4b32014-11-07 16:39:34 -050079 mMockWm = mock(WifiManager.class);
80 mMockTm = mock(TelephonyManager.class);
Jason Monkb5746272014-11-12 16:50:31 -050081 mMockSm = mock(SubscriptionManager.class);
Jason Monkf13b4b32014-11-07 16:39:34 -050082 mMockCm = mock(ConnectivityManager.class);
Jason Monkc6cc6262015-06-11 11:10:15 -040083 mMockSubDefaults = mock(SubscriptionDefaults.class);
Jason Monkd8e4bf42014-12-12 10:23:12 -050084 mNetCapabilities = new NetworkCapabilities();
Jason Monkf13b4b32014-11-07 16:39:34 -050085 when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true);
Jason Monkd8e4bf42014-12-12 10:23:12 -050086 when(mMockCm.getDefaultNetworkCapabilitiesForUser(0)).thenReturn(
87 new NetworkCapabilities[] { mNetCapabilities });
Jason Monke0cdb602014-11-05 12:39:45 -050088
Jason Monke0cdb602014-11-05 12:39:45 -050089 mSignalStrength = mock(SignalStrength.class);
90 mServiceState = mock(ServiceState.class);
Jason Monkf13b4b32014-11-07 16:39:34 -050091
Jason Monkd2263cd2014-11-10 14:22:56 -050092 mConfig = new Config();
93 mConfig.hspaDataDistinguishable = true;
Jason Monk07b75fe2015-05-14 16:47:03 -040094 mCallbackHandler = mock(CallbackHandler.class);
Jason Monkb5746272014-11-12 16:50:31 -050095 mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
Jason Monk07b75fe2015-05-14 16:47:03 -040096 mConfig, Looper.getMainLooper(), mCallbackHandler,
Jason Monkf668d7c2016-01-14 10:38:41 -050097 mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
Jason Monkc6cc6262015-06-11 11:10:15 -040098 mMockSubDefaults);
Jason Monkf13b4b32014-11-07 16:39:34 -050099 setupNetworkController();
Jason Monkc6cc6262015-06-11 11:10:15 -0400100
101 // Trigger blank callbacks to always get the current state (some tests don't trigger
102 // changes from default state).
103 mNetworkController.addSignalCallback(null);
104 mNetworkController.addEmergencyListener(null);
Jason Monkf13b4b32014-11-07 16:39:34 -0500105 }
106
107 protected void setupNetworkController() {
Jason Monkb5746272014-11-12 16:50:31 -0500108 // For now just pretend to be the data sim, so we can test that too.
Jason Monk07b75fe2015-05-14 16:47:03 -0400109 mSubId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
Jason Monkf6a3cf92016-02-29 13:01:08 -0500110 when(mMockTm.getDataEnabled(mSubId)).thenReturn(true);
Jason Monkc6cc6262015-06-11 11:10:15 -0400111 setDefaultSubId(mSubId);
112 setSubscriptions(mSubId);
Jason Monk18985e02015-01-07 12:07:06 -0500113 mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId);
Leigh Anned0a62792014-11-13 14:27:10 -0800114 mPhoneStateListener = mMobileSignalController.mPhoneStateListener;
Jason Monkc6cc6262015-06-11 11:10:15 -0400115 }
Jason Monk07b75fe2015-05-14 16:47:03 -0400116
Jason Monkc6cc6262015-06-11 11:10:15 -0400117 protected void setDefaultSubId(int subId) {
118 when(mMockSubDefaults.getDefaultDataSubId()).thenReturn(subId);
119 when(mMockSubDefaults.getDefaultVoiceSubId()).thenReturn(subId);
120 }
121
122 protected void setSubscriptions(int... subIds) {
123 List<SubscriptionInfo> subs = new ArrayList<SubscriptionInfo>();
124 for (int subId : subIds) {
125 SubscriptionInfo subscription = mock(SubscriptionInfo.class);
126 when(subscription.getSubscriptionId()).thenReturn(subId);
127 subs.add(subscription);
128 }
129 when(mMockSm.getActiveSubscriptionInfoList()).thenReturn(subs);
130 mNetworkController.doUpdateMobileControllers();
Jason Monke0cdb602014-11-05 12:39:45 -0500131 }
132
Leigh Anned0a62792014-11-13 14:27:10 -0800133 protected NetworkControllerImpl setUpNoMobileData() {
134 when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false);
135 NetworkControllerImpl networkControllerNoMobile
136 = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
Jason Monk07b75fe2015-05-14 16:47:03 -0400137 mConfig, Looper.getMainLooper(), mCallbackHandler,
138 mock(AccessPointControllerImpl.class),
Jason Monkf668d7c2016-01-14 10:38:41 -0500139 mock(DataUsageController.class), mMockSubDefaults);
Leigh Anned0a62792014-11-13 14:27:10 -0800140
141 setupNetworkController();
142
143 return networkControllerNoMobile;
144
145 }
146
Jason Monke0cdb602014-11-05 12:39:45 -0500147 @Override
148 protected void tearDown() throws Exception {
149 StringWriter sw = new StringWriter();
150 PrintWriter pw = new PrintWriter(sw);
151 mNetworkController.dump(null, pw, null);
152 pw.flush();
153 Log.d(TAG, sw.toString());
154 super.tearDown();
155 }
156
Jason Monkf13b4b32014-11-07 16:39:34 -0500157 // 2 Bars 3G GSM.
158 public void setupDefaultSignal() {
159 setIsGsm(true);
160 setVoiceRegState(ServiceState.STATE_IN_SERVICE);
161 setGsmRoaming(false);
162 setLevel(DEFAULT_LEVEL);
163 updateDataConnectionState(TelephonyManager.DATA_CONNECTED,
164 TelephonyManager.NETWORK_TYPE_UMTS);
Jason Monk33f8ae72015-05-08 10:45:15 -0400165 setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, true, true);
Jason Monkf13b4b32014-11-07 16:39:34 -0500166 }
167
Jason Monk33f8ae72015-05-08 10:45:15 -0400168 public void setConnectivity(int networkType, boolean inetCondition, boolean isConnected) {
Jason Monke0cdb602014-11-05 12:39:45 -0500169 Intent i = new Intent(ConnectivityManager.INET_CONDITION_ACTION);
Jason Monkd8e4bf42014-12-12 10:23:12 -0500170 // TODO: Separate out into several NetworkCapabilities.
171 if (isConnected) {
172 mNetCapabilities.addTransportType(networkType);
173 } else {
174 mNetCapabilities.removeTransportType(networkType);
175 }
Jason Monk33f8ae72015-05-08 10:45:15 -0400176 if (inetCondition) {
Jason Monkd8e4bf42014-12-12 10:23:12 -0500177 mNetCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
178 } else {
179 mNetCapabilities.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
180 }
Jason Monke0cdb602014-11-05 12:39:45 -0500181
Jason Monke0cdb602014-11-05 12:39:45 -0500182 mNetworkController.onReceive(mContext, i);
183 }
184
185 public void setGsmRoaming(boolean isRoaming) {
186 when(mServiceState.getRoaming()).thenReturn(isRoaming);
187 updateServiceState();
188 }
189
Jason Monkf13b4b32014-11-07 16:39:34 -0500190 public void setCdmaRoaming(boolean isRoaming) {
191 when(mServiceState.getCdmaEriIconIndex()).thenReturn(isRoaming ?
192 EriInfo.ROAMING_INDICATOR_ON : EriInfo.ROAMING_INDICATOR_OFF);
193 when(mServiceState.getCdmaEriIconMode()).thenReturn(isRoaming ?
194 EriInfo.ROAMING_ICON_MODE_NORMAL : -1);
195 updateServiceState();
196 }
197
Jason Monke0cdb602014-11-05 12:39:45 -0500198 public void setVoiceRegState(int voiceRegState) {
199 when(mServiceState.getVoiceRegState()).thenReturn(voiceRegState);
200 updateServiceState();
201 }
202
Jason Monkf13b4b32014-11-07 16:39:34 -0500203 public void setDataRegState(int dataRegState) {
204 when(mServiceState.getDataRegState()).thenReturn(dataRegState);
205 updateServiceState();
206 }
207
Jason Monke0cdb602014-11-05 12:39:45 -0500208 public void setIsEmergencyOnly(boolean isEmergency) {
209 when(mServiceState.isEmergencyOnly()).thenReturn(isEmergency);
210 updateServiceState();
211 }
212
213 public void setCdmaLevel(int level) {
214 when(mSignalStrength.getCdmaLevel()).thenReturn(level);
215 updateSignalStrength();
216 }
217
218 public void setLevel(int level) {
219 when(mSignalStrength.getLevel()).thenReturn(level);
220 updateSignalStrength();
221 }
222
223 public void setIsGsm(boolean gsm) {
224 when(mSignalStrength.isGsm()).thenReturn(gsm);
225 updateSignalStrength();
226 }
227
228 public void setCdmaEri(int index, int mode) {
229 // TODO: Figure this out.
230 }
231
232 private void updateSignalStrength() {
233 Log.d(TAG, "Sending Signal Strength: " + mSignalStrength);
234 mPhoneStateListener.onSignalStrengthsChanged(mSignalStrength);
235 }
236
Jason Monk67b2c162016-01-12 10:24:09 -0500237 protected void updateServiceState() {
Jason Monke0cdb602014-11-05 12:39:45 -0500238 Log.d(TAG, "Sending Service State: " + mServiceState);
239 mPhoneStateListener.onServiceStateChanged(mServiceState);
240 }
241
242 public void updateCallState(int state) {
243 // Inputs not currently used in NetworkControllerImpl.
244 mPhoneStateListener.onCallStateChanged(state, "0123456789");
245 }
246
247 public void updateDataConnectionState(int dataState, int dataNetType) {
Jason Monk67b2c162016-01-12 10:24:09 -0500248 when(mServiceState.getDataNetworkType()).thenReturn(dataNetType);
Jason Monke0cdb602014-11-05 12:39:45 -0500249 mPhoneStateListener.onDataConnectionStateChanged(dataState, dataNetType);
250 }
251
252 public void updateDataActivity(int dataActivity) {
253 mPhoneStateListener.onDataActivity(dataActivity);
254 }
255
Andrew Flynn5e751472015-05-01 11:50:07 -0400256 public void setCarrierNetworkChange(boolean enable) {
257 Log.d(TAG, "setCarrierNetworkChange(" + enable + ")");
258 mPhoneStateListener.onCarrierNetworkChange(enable);
259 }
260
Jason Monk21d05a02014-12-02 12:46:58 -0500261 protected void verifyHasNoSims(boolean hasNoSimsVisible) {
262 ArgumentCaptor<Boolean> hasNoSimsArg = ArgumentCaptor.forClass(Boolean.class);
263
Jason Monk07b75fe2015-05-14 16:47:03 -0400264 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setNoSims(hasNoSimsArg.capture());
265 assertEquals("No sims", hasNoSimsVisible, (boolean) hasNoSimsArg.getValue());
Jason Monk21d05a02014-12-02 12:46:58 -0500266 }
267
Jason Monkf13b4b32014-11-07 16:39:34 -0500268 protected void verifyLastQsMobileDataIndicators(boolean visible, int icon, int typeIcon,
Jason Monkb5746272014-11-12 16:50:31 -0500269 boolean dataIn, boolean dataOut) {
Jason Monk07b75fe2015-05-14 16:47:03 -0400270 ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500271 ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500272 ArgumentCaptor<Boolean> dataInArg = ArgumentCaptor.forClass(Boolean.class);
273 ArgumentCaptor<Boolean> dataOutArg = ArgumentCaptor.forClass(Boolean.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500274
Jason Monk07b75fe2015-05-14 16:47:03 -0400275 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
276 ArgumentCaptor.forClass(IconState.class).capture(),
277 iconArg.capture(),
278 ArgumentCaptor.forClass(Integer.class).capture(),
Jason Monk07b75fe2015-05-14 16:47:03 -0400279 typeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(),
280 ArgumentCaptor.forClass(String.class).capture(),
281 ArgumentCaptor.forClass(String.class).capture(),
282 ArgumentCaptor.forClass(Boolean.class).capture(),
283 ArgumentCaptor.forClass(Integer.class).capture());
284 IconState iconState = iconArg.getValue();
285 assertEquals("Visibility in, quick settings", visible, iconState.visible);
286 assertEquals("Signal icon in, quick settings", icon, iconState.icon);
Jason Monkf13b4b32014-11-07 16:39:34 -0500287 assertEquals("Data icon in, quick settings", typeIcon, (int) typeIconArg.getValue());
288 assertEquals("Data direction in, in quick settings", dataIn,
289 (boolean) dataInArg.getValue());
290 assertEquals("Data direction out, in quick settings", dataOut,
291 (boolean) dataOutArg.getValue());
Jason Monkf13b4b32014-11-07 16:39:34 -0500292 }
293
294 protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon) {
Jason Monk07b75fe2015-05-14 16:47:03 -0400295 ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500296 ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
Jason Monke0cdb602014-11-05 12:39:45 -0500297
298 // TODO: Verify all fields.
Jason Monk07b75fe2015-05-14 16:47:03 -0400299 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
300 iconArg.capture(),
301 ArgumentCaptor.forClass(IconState.class).capture(),
Andrew Flynn2fdbe122015-06-01 16:34:21 -0400302 typeIconArg.capture(),
Jason Monk07b75fe2015-05-14 16:47:03 -0400303 ArgumentCaptor.forClass(Integer.class).capture(),
304 ArgumentCaptor.forClass(Boolean.class).capture(),
305 ArgumentCaptor.forClass(Boolean.class).capture(),
Jason Monke0cdb602014-11-05 12:39:45 -0500306 ArgumentCaptor.forClass(String.class).capture(),
307 ArgumentCaptor.forClass(String.class).capture(),
Jason Monkb5746272014-11-12 16:50:31 -0500308 ArgumentCaptor.forClass(Boolean.class).capture(),
309 ArgumentCaptor.forClass(Integer.class).capture());
Jason Monk07b75fe2015-05-14 16:47:03 -0400310 IconState iconState = iconArg.getValue();
Jason Monke0cdb602014-11-05 12:39:45 -0500311
Jason Monkf13b4b32014-11-07 16:39:34 -0500312 assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue());
Jason Monk07b75fe2015-05-14 16:47:03 -0400313 assertEquals("Visibility in status bar", visible, iconState.visible);
Jason Monke0cdb602014-11-05 12:39:45 -0500314 }
Leigh Anned0a62792014-11-13 14:27:10 -0800315
Leigh Anned0a62792014-11-13 14:27:10 -0800316 protected void assertNetworkNameEquals(String expected) {
Jason Monk07b75fe2015-05-14 16:47:03 -0400317 assertEquals("Network name", expected, mMobileSignalController.getState().networkName);
Leigh Anned0a62792014-11-13 14:27:10 -0800318 }
Jason Monke0cdb602014-11-05 12:39:45 -0500319}