NetworkControllerBaseTest.java revision 5504d39b7f880fa8b8660e5d4b014ec559124cf9
1/* 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 */ 16 17package com.android.systemui.statusbar.policy; 18 19import static org.mockito.Mockito.mock; 20import static org.mockito.Mockito.when; 21 22import android.content.Intent; 23import android.net.ConnectivityManager; 24import android.net.NetworkCapabilities; 25import android.net.wifi.WifiManager; 26import android.telephony.PhoneStateListener; 27import android.telephony.ServiceState; 28import android.telephony.SignalStrength; 29import android.telephony.SubscriptionInfo; 30import android.telephony.SubscriptionManager; 31import android.telephony.TelephonyManager; 32import android.util.Log; 33 34import com.android.internal.telephony.IccCardConstants; 35import com.android.internal.telephony.cdma.EriInfo; 36import com.android.systemui.SysuiTestCase; 37import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback; 38import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config; 39import com.android.systemui.statusbar.policy.NetworkControllerImpl.SignalCluster; 40 41import org.mockito.ArgumentCaptor; 42import org.mockito.Mockito; 43 44import java.io.PrintWriter; 45import java.io.StringWriter; 46import java.util.ArrayList; 47import java.util.List; 48 49public class NetworkControllerBaseTest extends SysuiTestCase { 50 private static final String TAG = "NetworkControllerBaseTest"; 51 protected static final int DEFAULT_LEVEL = 2; 52 protected static final int DEFAULT_SIGNAL_STRENGTH = 53 TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL]; 54 protected static final int DEFAULT_QS_SIGNAL_STRENGTH = 55 TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL]; 56 protected static final int DEFAULT_ICON = TelephonyIcons.ICON_3G; 57 protected static final int DEFAULT_QS_ICON = TelephonyIcons.QS_ICON_3G; 58 59 protected NetworkControllerImpl mNetworkController; 60 protected MobileSignalController mMobileSignalController; 61 protected PhoneStateListener mPhoneStateListener; 62 protected SignalCluster mSignalCluster; 63 protected NetworkSignalChangedCallback mNetworkSignalChangedCallback; 64 private SignalStrength mSignalStrength; 65 private ServiceState mServiceState; 66 protected ConnectivityManager mMockCm; 67 protected WifiManager mMockWm; 68 protected SubscriptionManager mMockSm; 69 protected TelephonyManager mMockTm; 70 protected Config mConfig; 71 72 protected int mSubId; 73 74 private NetworkCapabilities mNetCapabilities; 75 76 @Override 77 protected void setUp() throws Exception { 78 super.setUp(); 79 80 mMockWm = mock(WifiManager.class); 81 mMockTm = mock(TelephonyManager.class); 82 mMockSm = mock(SubscriptionManager.class); 83 mMockCm = mock(ConnectivityManager.class); 84 mNetCapabilities = new NetworkCapabilities(); 85 when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true); 86 when(mMockCm.getDefaultNetworkCapabilitiesForUser(0)).thenReturn( 87 new NetworkCapabilities[] { mNetCapabilities }); 88 89 mSignalStrength = mock(SignalStrength.class); 90 mServiceState = mock(ServiceState.class); 91 92 mConfig = new Config(); 93 mConfig.hspaDataDistinguishable = true; 94 mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm, 95 mConfig, mock(AccessPointControllerImpl.class), 96 mock(MobileDataControllerImpl.class)); 97 setupNetworkController(); 98 } 99 100 protected void setupNetworkController() { 101 // For now just pretend to be the data sim, so we can test that too. 102 mSubId = SubscriptionManager.getDefaultDataSubId(); 103 SubscriptionInfo subscription = mock(SubscriptionInfo.class); 104 List<SubscriptionInfo> subs = new ArrayList<SubscriptionInfo>(); 105 when(subscription.getSubscriptionId()).thenReturn(mSubId); 106 subs.add(subscription); 107 mNetworkController.setCurrentSubscriptions(subs); 108 mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId); 109 mPhoneStateListener = mMobileSignalController.mPhoneStateListener; 110 mSignalCluster = mock(SignalCluster.class); 111 mNetworkSignalChangedCallback = mock(NetworkSignalChangedCallback.class); 112 mNetworkController.addSignalCluster(mSignalCluster); 113 mNetworkController.addNetworkSignalChangedCallback(mNetworkSignalChangedCallback); 114 } 115 116 protected NetworkControllerImpl setUpNoMobileData() { 117 when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false); 118 NetworkControllerImpl networkControllerNoMobile 119 = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm, 120 mConfig, mock(AccessPointControllerImpl.class), 121 mock(MobileDataControllerImpl.class)); 122 123 setupNetworkController(); 124 125 return networkControllerNoMobile; 126 127 } 128 129 @Override 130 protected void tearDown() throws Exception { 131 StringWriter sw = new StringWriter(); 132 PrintWriter pw = new PrintWriter(sw); 133 mNetworkController.dump(null, pw, null); 134 pw.flush(); 135 Log.d(TAG, sw.toString()); 136 super.tearDown(); 137 } 138 139 // 2 Bars 3G GSM. 140 public void setupDefaultSignal() { 141 setIsGsm(true); 142 setVoiceRegState(ServiceState.STATE_IN_SERVICE); 143 setGsmRoaming(false); 144 setLevel(DEFAULT_LEVEL); 145 updateDataConnectionState(TelephonyManager.DATA_CONNECTED, 146 TelephonyManager.NETWORK_TYPE_UMTS); 147 setConnectivity(100, ConnectivityManager.TYPE_MOBILE, true); 148 } 149 150 public void setConnectivity(int inetCondition, int networkType, boolean isConnected) { 151 Intent i = new Intent(ConnectivityManager.INET_CONDITION_ACTION); 152 // TODO: Separate out into several NetworkCapabilities. 153 if (isConnected) { 154 mNetCapabilities.addTransportType(networkType); 155 } else { 156 mNetCapabilities.removeTransportType(networkType); 157 } 158 if (inetCondition != 0) { 159 mNetCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); 160 } else { 161 mNetCapabilities.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); 162 } 163 164 mNetworkController.onReceive(mContext, i); 165 } 166 167 public void setGsmRoaming(boolean isRoaming) { 168 when(mServiceState.getRoaming()).thenReturn(isRoaming); 169 updateServiceState(); 170 } 171 172 public void setCdmaRoaming(boolean isRoaming) { 173 when(mServiceState.getCdmaEriIconIndex()).thenReturn(isRoaming ? 174 EriInfo.ROAMING_INDICATOR_ON : EriInfo.ROAMING_INDICATOR_OFF); 175 when(mServiceState.getCdmaEriIconMode()).thenReturn(isRoaming ? 176 EriInfo.ROAMING_ICON_MODE_NORMAL : -1); 177 updateServiceState(); 178 } 179 180 public void setVoiceRegState(int voiceRegState) { 181 when(mServiceState.getVoiceRegState()).thenReturn(voiceRegState); 182 updateServiceState(); 183 } 184 185 public void setDataRegState(int dataRegState) { 186 when(mServiceState.getDataRegState()).thenReturn(dataRegState); 187 updateServiceState(); 188 } 189 190 public void setIsEmergencyOnly(boolean isEmergency) { 191 when(mServiceState.isEmergencyOnly()).thenReturn(isEmergency); 192 updateServiceState(); 193 } 194 195 public void setCdmaLevel(int level) { 196 when(mSignalStrength.getCdmaLevel()).thenReturn(level); 197 updateSignalStrength(); 198 } 199 200 public void setLevel(int level) { 201 when(mSignalStrength.getLevel()).thenReturn(level); 202 updateSignalStrength(); 203 } 204 205 public void setIsGsm(boolean gsm) { 206 when(mSignalStrength.isGsm()).thenReturn(gsm); 207 updateSignalStrength(); 208 } 209 210 public void setCdmaEri(int index, int mode) { 211 // TODO: Figure this out. 212 } 213 214 private void updateSignalStrength() { 215 Log.d(TAG, "Sending Signal Strength: " + mSignalStrength); 216 mPhoneStateListener.onSignalStrengthsChanged(mSignalStrength); 217 } 218 219 private void updateServiceState() { 220 Log.d(TAG, "Sending Service State: " + mServiceState); 221 mPhoneStateListener.onServiceStateChanged(mServiceState); 222 } 223 224 public void updateCallState(int state) { 225 // Inputs not currently used in NetworkControllerImpl. 226 mPhoneStateListener.onCallStateChanged(state, "0123456789"); 227 } 228 229 public void updateDataConnectionState(int dataState, int dataNetType) { 230 mPhoneStateListener.onDataConnectionStateChanged(dataState, dataNetType); 231 } 232 233 public void updateDataActivity(int dataActivity) { 234 mPhoneStateListener.onDataActivity(dataActivity); 235 } 236 237 public void setCarrierNetworkChange(boolean enable) { 238 Log.d(TAG, "setCarrierNetworkChange(" + enable + ")"); 239 mPhoneStateListener.onCarrierNetworkChange(enable); 240 } 241 242 protected void verifyHasNoSims(boolean hasNoSimsVisible) { 243 ArgumentCaptor<Boolean> hasNoSimsArg = ArgumentCaptor.forClass(Boolean.class); 244 245 Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setNoSims(hasNoSimsArg.capture()); 246 assertEquals("No sims in status bar", hasNoSimsVisible, (boolean) hasNoSimsArg.getValue()); 247 248 Mockito.verify(mNetworkSignalChangedCallback, Mockito.atLeastOnce()) 249 .onNoSimVisibleChanged(hasNoSimsArg.capture()); 250 assertEquals("No sims in quick settings", hasNoSimsVisible, 251 (boolean) hasNoSimsArg.getValue()); 252 } 253 254 protected void verifyLastQsMobileDataIndicators(boolean visible, int icon, int typeIcon, 255 boolean dataIn, boolean dataOut) { 256 ArgumentCaptor<Integer> iconArg = ArgumentCaptor.forClass(Integer.class); 257 ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class); 258 ArgumentCaptor<Boolean> visibleArg = ArgumentCaptor.forClass(Boolean.class); 259 ArgumentCaptor<Boolean> dataInArg = ArgumentCaptor.forClass(Boolean.class); 260 ArgumentCaptor<Boolean> dataOutArg = ArgumentCaptor.forClass(Boolean.class); 261 262 Mockito.verify(mNetworkSignalChangedCallback, Mockito.atLeastOnce()) 263 .onMobileDataSignalChanged(visibleArg.capture(), iconArg.capture(), 264 ArgumentCaptor.forClass(String.class).capture(), 265 typeIconArg.capture(), 266 dataInArg.capture(), 267 dataOutArg.capture(), 268 ArgumentCaptor.forClass(String.class).capture(), 269 ArgumentCaptor.forClass(String.class).capture(), 270 ArgumentCaptor.forClass(Boolean.class).capture()); 271 assertEquals("Visibility in, quick settings", visible, (boolean) visibleArg.getValue()); 272 assertEquals("Signal icon in, quick settings", icon, (int) iconArg.getValue()); 273 assertEquals("Data icon in, quick settings", typeIcon, (int) typeIconArg.getValue()); 274 assertEquals("Data direction in, in quick settings", dataIn, 275 (boolean) dataInArg.getValue()); 276 assertEquals("Data direction out, in quick settings", dataOut, 277 (boolean) dataOutArg.getValue()); 278 } 279 280 protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon) { 281 verifyLastMobileDataIndicators(visible, icon, icon, typeIcon); 282 } 283 284 protected void verifyLastMobileDataIndicators(boolean visible, int strengthIcon, 285 int darkStrengthIcon, int typeIcon) { 286 ArgumentCaptor<Integer> strengthIconArg = ArgumentCaptor.forClass(Integer.class); 287 ArgumentCaptor<Integer> darkStrengthIconArg = ArgumentCaptor.forClass(Integer.class); 288 ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class); 289 ArgumentCaptor<Boolean> visibleArg = ArgumentCaptor.forClass(Boolean.class); 290 291 // TODO: Verify all fields. 292 Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setMobileDataIndicators( 293 visibleArg.capture(), strengthIconArg.capture(), darkStrengthIconArg.capture(), 294 typeIconArg.capture(), 295 ArgumentCaptor.forClass(String.class).capture(), 296 ArgumentCaptor.forClass(String.class).capture(), 297 ArgumentCaptor.forClass(Boolean.class).capture(), 298 ArgumentCaptor.forClass(Integer.class).capture()); 299 300 assertEquals("Signal strength icon in status bar", strengthIcon, 301 (int) strengthIconArg.getValue()); 302 assertEquals("Signal strength icon (dark mode) in status bar", darkStrengthIcon, 303 (int) darkStrengthIconArg.getValue()); 304 assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue()); 305 assertEquals("Visibility in status bar", visible, (boolean) visibleArg.getValue()); 306 } 307 308 protected void assertNetworkNameEquals(String expected) { 309 assertEquals("Network name", expected, mNetworkController.getMobileDataNetworkName()); 310 } 311} 312