blob: d85b0594344f534bacdeef7be61b468f81eebe08 [file] [log] [blame]
Jason Monke0cdb602014-11-05 12:39:45 -05001
2package com.android.systemui.statusbar.policy;
3
4import static org.mockito.Mockito.mock;
5import static org.mockito.Mockito.when;
6
Jason Monkd8e4bf42014-12-12 10:23:12 -05007import java.io.PrintWriter;
8import java.io.StringWriter;
9import java.util.ArrayList;
10import java.util.List;
11
12import org.mockito.ArgumentCaptor;
13import org.mockito.Mockito;
14
Jason Monke0cdb602014-11-05 12:39:45 -050015import android.content.Intent;
16import android.net.ConnectivityManager;
Jason Monkd8e4bf42014-12-12 10:23:12 -050017import android.net.NetworkCapabilities;
Jason Monkf13b4b32014-11-07 16:39:34 -050018import android.net.wifi.WifiManager;
Jason Monke0cdb602014-11-05 12:39:45 -050019import android.telephony.PhoneStateListener;
20import android.telephony.ServiceState;
21import android.telephony.SignalStrength;
Jason Monkb5746272014-11-12 16:50:31 -050022import android.telephony.SubscriptionInfo;
23import android.telephony.SubscriptionManager;
Jason Monkf13b4b32014-11-07 16:39:34 -050024import android.telephony.TelephonyManager;
Jason Monke0cdb602014-11-05 12:39:45 -050025import android.test.AndroidTestCase;
26import android.util.Log;
27
Jason Monkf13b4b32014-11-07 16:39:34 -050028import com.android.internal.telephony.cdma.EriInfo;
29import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
Jason Monkd2263cd2014-11-10 14:22:56 -050030import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
Jason Monke0cdb602014-11-05 12:39:45 -050031import com.android.systemui.statusbar.policy.NetworkControllerImpl.SignalCluster;
32
Jason Monke0cdb602014-11-05 12:39:45 -050033public class NetworkControllerBaseTest extends AndroidTestCase {
34 private static final String TAG = "NetworkControllerBaseTest";
Jason Monkf13b4b32014-11-07 16:39:34 -050035 protected static final int DEFAULT_LEVEL = 2;
36 protected static final int DEFAULT_SIGNAL_STRENGTH =
37 TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL];
38 protected static final int DEFAULT_QS_SIGNAL_STRENGTH =
39 TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL];
40 protected static final int DEFAULT_ICON = TelephonyIcons.ICON_3G;
41 protected static final int DEFAULT_QS_ICON = TelephonyIcons.QS_ICON_3G;
Jason Monke0cdb602014-11-05 12:39:45 -050042
43 protected NetworkControllerImpl mNetworkController;
44 protected PhoneStateListener mPhoneStateListener;
45 protected SignalCluster mSignalCluster;
Jason Monkf13b4b32014-11-07 16:39:34 -050046 protected NetworkSignalChangedCallback mNetworkSignalChangedCallback;
Jason Monke0cdb602014-11-05 12:39:45 -050047 private SignalStrength mSignalStrength;
48 private ServiceState mServiceState;
Jason Monkf13b4b32014-11-07 16:39:34 -050049 protected ConnectivityManager mMockCm;
50 protected WifiManager mMockWm;
Jason Monkb5746272014-11-12 16:50:31 -050051 protected SubscriptionManager mMockSm;
Jason Monkf13b4b32014-11-07 16:39:34 -050052 protected TelephonyManager mMockTm;
Jason Monkd2263cd2014-11-10 14:22:56 -050053 protected Config mConfig;
Jason Monke0cdb602014-11-05 12:39:45 -050054
Jason Monkd8e4bf42014-12-12 10:23:12 -050055 private NetworkCapabilities mNetCapabilities;
56
Jason Monke0cdb602014-11-05 12:39:45 -050057 @Override
58 protected void setUp() throws Exception {
59 super.setUp();
60 // Mockito stuff.
61 System.setProperty("dexmaker.dexcache", mContext.getCacheDir().getPath());
62 Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
63
Jason Monkf13b4b32014-11-07 16:39:34 -050064 mMockWm = mock(WifiManager.class);
65 mMockTm = mock(TelephonyManager.class);
Jason Monkb5746272014-11-12 16:50:31 -050066 mMockSm = mock(SubscriptionManager.class);
Jason Monkf13b4b32014-11-07 16:39:34 -050067 mMockCm = mock(ConnectivityManager.class);
Jason Monkd8e4bf42014-12-12 10:23:12 -050068 mNetCapabilities = new NetworkCapabilities();
Jason Monkf13b4b32014-11-07 16:39:34 -050069 when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true);
Jason Monkd8e4bf42014-12-12 10:23:12 -050070 when(mMockCm.getDefaultNetworkCapabilitiesForUser(0)).thenReturn(
71 new NetworkCapabilities[] { mNetCapabilities });
Jason Monke0cdb602014-11-05 12:39:45 -050072
Jason Monke0cdb602014-11-05 12:39:45 -050073 mSignalStrength = mock(SignalStrength.class);
74 mServiceState = mock(ServiceState.class);
Jason Monkf13b4b32014-11-07 16:39:34 -050075
Jason Monkd2263cd2014-11-10 14:22:56 -050076 mConfig = new Config();
77 mConfig.hspaDataDistinguishable = true;
Jason Monkb5746272014-11-12 16:50:31 -050078 mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
Jason Monkd2263cd2014-11-10 14:22:56 -050079 mConfig, mock(AccessPointControllerImpl.class),
80 mock(MobileDataControllerImpl.class));
Jason Monkf13b4b32014-11-07 16:39:34 -050081 setupNetworkController();
82 }
83
84 protected void setupNetworkController() {
Jason Monkb5746272014-11-12 16:50:31 -050085 // For now just pretend to be the data sim, so we can test that too.
86 final int subId = SubscriptionManager.getDefaultDataSubId();
87 SubscriptionInfo subscription = mock(SubscriptionInfo.class);
88 List<SubscriptionInfo> subs = new ArrayList<SubscriptionInfo>();
89 when(subscription.getSubscriptionId()).thenReturn(subId);
90 subs.add(subscription);
91 mNetworkController.setCurrentSubscriptions(subs);
92 mPhoneStateListener =
93 mNetworkController.mMobileSignalControllers.get(subId).mPhoneStateListener;
Jason Monkd2263cd2014-11-10 14:22:56 -050094 mSignalCluster = mock(SignalCluster.class);
95 mNetworkSignalChangedCallback = mock(NetworkSignalChangedCallback.class);
Jason Monke0cdb602014-11-05 12:39:45 -050096 mNetworkController.addSignalCluster(mSignalCluster);
Jason Monkf13b4b32014-11-07 16:39:34 -050097 mNetworkController.addNetworkSignalChangedCallback(mNetworkSignalChangedCallback);
Jason Monke0cdb602014-11-05 12:39:45 -050098 }
99
100 @Override
101 protected void tearDown() throws Exception {
102 StringWriter sw = new StringWriter();
103 PrintWriter pw = new PrintWriter(sw);
104 mNetworkController.dump(null, pw, null);
105 pw.flush();
106 Log.d(TAG, sw.toString());
107 super.tearDown();
108 }
109
Jason Monkf13b4b32014-11-07 16:39:34 -0500110 // 2 Bars 3G GSM.
111 public void setupDefaultSignal() {
112 setIsGsm(true);
113 setVoiceRegState(ServiceState.STATE_IN_SERVICE);
114 setGsmRoaming(false);
115 setLevel(DEFAULT_LEVEL);
116 updateDataConnectionState(TelephonyManager.DATA_CONNECTED,
117 TelephonyManager.NETWORK_TYPE_UMTS);
118 setConnectivity(100, ConnectivityManager.TYPE_MOBILE, true);
119 }
120
Jason Monke0cdb602014-11-05 12:39:45 -0500121 public void setConnectivity(int inetCondition, int networkType, boolean isConnected) {
122 Intent i = new Intent(ConnectivityManager.INET_CONDITION_ACTION);
Jason Monkd8e4bf42014-12-12 10:23:12 -0500123 // TODO: Separate out into several NetworkCapabilities.
124 if (isConnected) {
125 mNetCapabilities.addTransportType(networkType);
126 } else {
127 mNetCapabilities.removeTransportType(networkType);
128 }
129 if (inetCondition != 0) {
130 mNetCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
131 } else {
132 mNetCapabilities.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
133 }
Jason Monke0cdb602014-11-05 12:39:45 -0500134
Jason Monke0cdb602014-11-05 12:39:45 -0500135 mNetworkController.onReceive(mContext, i);
136 }
137
138 public void setGsmRoaming(boolean isRoaming) {
139 when(mServiceState.getRoaming()).thenReturn(isRoaming);
140 updateServiceState();
141 }
142
Jason Monkf13b4b32014-11-07 16:39:34 -0500143 public void setCdmaRoaming(boolean isRoaming) {
144 when(mServiceState.getCdmaEriIconIndex()).thenReturn(isRoaming ?
145 EriInfo.ROAMING_INDICATOR_ON : EriInfo.ROAMING_INDICATOR_OFF);
146 when(mServiceState.getCdmaEriIconMode()).thenReturn(isRoaming ?
147 EriInfo.ROAMING_ICON_MODE_NORMAL : -1);
148 updateServiceState();
149 }
150
Jason Monke0cdb602014-11-05 12:39:45 -0500151 public void setVoiceRegState(int voiceRegState) {
152 when(mServiceState.getVoiceRegState()).thenReturn(voiceRegState);
153 updateServiceState();
154 }
155
Jason Monkf13b4b32014-11-07 16:39:34 -0500156 public void setDataRegState(int dataRegState) {
157 when(mServiceState.getDataRegState()).thenReturn(dataRegState);
158 updateServiceState();
159 }
160
Jason Monke0cdb602014-11-05 12:39:45 -0500161 public void setIsEmergencyOnly(boolean isEmergency) {
162 when(mServiceState.isEmergencyOnly()).thenReturn(isEmergency);
163 updateServiceState();
164 }
165
166 public void setCdmaLevel(int level) {
167 when(mSignalStrength.getCdmaLevel()).thenReturn(level);
168 updateSignalStrength();
169 }
170
171 public void setLevel(int level) {
172 when(mSignalStrength.getLevel()).thenReturn(level);
173 updateSignalStrength();
174 }
175
176 public void setIsGsm(boolean gsm) {
177 when(mSignalStrength.isGsm()).thenReturn(gsm);
178 updateSignalStrength();
179 }
180
181 public void setCdmaEri(int index, int mode) {
182 // TODO: Figure this out.
183 }
184
185 private void updateSignalStrength() {
186 Log.d(TAG, "Sending Signal Strength: " + mSignalStrength);
187 mPhoneStateListener.onSignalStrengthsChanged(mSignalStrength);
188 }
189
190 private void updateServiceState() {
191 Log.d(TAG, "Sending Service State: " + mServiceState);
192 mPhoneStateListener.onServiceStateChanged(mServiceState);
193 }
194
195 public void updateCallState(int state) {
196 // Inputs not currently used in NetworkControllerImpl.
197 mPhoneStateListener.onCallStateChanged(state, "0123456789");
198 }
199
200 public void updateDataConnectionState(int dataState, int dataNetType) {
201 mPhoneStateListener.onDataConnectionStateChanged(dataState, dataNetType);
202 }
203
204 public void updateDataActivity(int dataActivity) {
205 mPhoneStateListener.onDataActivity(dataActivity);
206 }
207
Jason Monk21d05a02014-12-02 12:46:58 -0500208 protected void verifyHasNoSims(boolean hasNoSimsVisible) {
209 ArgumentCaptor<Boolean> hasNoSimsArg = ArgumentCaptor.forClass(Boolean.class);
210
211 Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setNoSims(hasNoSimsArg.capture());
212 assertEquals("No sims in status bar", hasNoSimsVisible, (boolean) hasNoSimsArg.getValue());
213
214 Mockito.verify(mNetworkSignalChangedCallback, Mockito.atLeastOnce())
215 .onNoSimVisibleChanged(hasNoSimsArg.capture());
216 assertEquals("No sims in quick settings", hasNoSimsVisible,
217 (boolean) hasNoSimsArg.getValue());
218 }
219
Jason Monkf13b4b32014-11-07 16:39:34 -0500220 protected void verifyLastQsMobileDataIndicators(boolean visible, int icon, int typeIcon,
Jason Monkb5746272014-11-12 16:50:31 -0500221 boolean dataIn, boolean dataOut) {
Jason Monke0cdb602014-11-05 12:39:45 -0500222 ArgumentCaptor<Integer> iconArg = ArgumentCaptor.forClass(Integer.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500223 ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
224 ArgumentCaptor<Boolean> visibleArg = ArgumentCaptor.forClass(Boolean.class);
225 ArgumentCaptor<Boolean> dataInArg = ArgumentCaptor.forClass(Boolean.class);
226 ArgumentCaptor<Boolean> dataOutArg = ArgumentCaptor.forClass(Boolean.class);
Jason Monkf13b4b32014-11-07 16:39:34 -0500227
228 Mockito.verify(mNetworkSignalChangedCallback, Mockito.atLeastOnce())
229 .onMobileDataSignalChanged(visibleArg.capture(), iconArg.capture(),
230 ArgumentCaptor.forClass(String.class).capture(),
231 typeIconArg.capture(),
232 dataInArg.capture(),
233 dataOutArg.capture(),
234 ArgumentCaptor.forClass(String.class).capture(),
235 ArgumentCaptor.forClass(String.class).capture(),
Jason Monkf13b4b32014-11-07 16:39:34 -0500236 ArgumentCaptor.forClass(Boolean.class).capture());
237 assertEquals("Visibility in, quick settings", visible, (boolean) visibleArg.getValue());
238 assertEquals("Signal icon in, quick settings", icon, (int) iconArg.getValue());
239 assertEquals("Data icon in, quick settings", typeIcon, (int) typeIconArg.getValue());
240 assertEquals("Data direction in, in quick settings", dataIn,
241 (boolean) dataInArg.getValue());
242 assertEquals("Data direction out, in quick settings", dataOut,
243 (boolean) dataOutArg.getValue());
Jason Monkf13b4b32014-11-07 16:39:34 -0500244 }
245
246 protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon) {
247 ArgumentCaptor<Integer> iconArg = ArgumentCaptor.forClass(Integer.class);
248 ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
Jason Monke0cdb602014-11-05 12:39:45 -0500249 ArgumentCaptor<Boolean> visibleArg = ArgumentCaptor.forClass(Boolean.class);
250
251 // TODO: Verify all fields.
252 Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setMobileDataIndicators(
Jason Monkf13b4b32014-11-07 16:39:34 -0500253 visibleArg.capture(), iconArg.capture(), typeIconArg.capture(),
Jason Monke0cdb602014-11-05 12:39:45 -0500254 ArgumentCaptor.forClass(String.class).capture(),
255 ArgumentCaptor.forClass(String.class).capture(),
Jason Monkb5746272014-11-12 16:50:31 -0500256 ArgumentCaptor.forClass(Boolean.class).capture(),
257 ArgumentCaptor.forClass(Integer.class).capture());
Jason Monke0cdb602014-11-05 12:39:45 -0500258
Jason Monkf13b4b32014-11-07 16:39:34 -0500259 assertEquals("Signal icon in status bar", icon, (int) iconArg.getValue());
260 assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue());
261 assertEquals("Visibility in status bar", visible, (boolean) visibleArg.getValue());
Jason Monke0cdb602014-11-05 12:39:45 -0500262 }
263}