1 2package com.android.systemui.statusbar.policy; 3 4import static org.mockito.Mockito.mock; 5import static org.mockito.Mockito.when; 6 7import 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 15import android.content.Intent; 16import android.net.ConnectivityManager; 17import android.net.NetworkCapabilities; 18import android.net.wifi.WifiManager; 19import android.telephony.PhoneStateListener; 20import android.telephony.ServiceState; 21import android.telephony.SignalStrength; 22import android.telephony.SubscriptionInfo; 23import android.telephony.SubscriptionManager; 24import android.telephony.TelephonyManager; 25import android.test.AndroidTestCase; 26import android.util.Log; 27 28import com.android.internal.telephony.cdma.EriInfo; 29import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback; 30import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config; 31import com.android.systemui.statusbar.policy.NetworkControllerImpl.SignalCluster; 32 33public class NetworkControllerBaseTest extends AndroidTestCase { 34 private static final String TAG = "NetworkControllerBaseTest"; 35 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; 42 43 protected NetworkControllerImpl mNetworkController; 44 protected PhoneStateListener mPhoneStateListener; 45 protected SignalCluster mSignalCluster; 46 protected NetworkSignalChangedCallback mNetworkSignalChangedCallback; 47 private SignalStrength mSignalStrength; 48 private ServiceState mServiceState; 49 protected ConnectivityManager mMockCm; 50 protected WifiManager mMockWm; 51 protected SubscriptionManager mMockSm; 52 protected TelephonyManager mMockTm; 53 protected Config mConfig; 54 55 private NetworkCapabilities mNetCapabilities; 56 57 @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 64 mMockWm = mock(WifiManager.class); 65 mMockTm = mock(TelephonyManager.class); 66 mMockSm = mock(SubscriptionManager.class); 67 mMockCm = mock(ConnectivityManager.class); 68 mNetCapabilities = new NetworkCapabilities(); 69 when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true); 70 when(mMockCm.getDefaultNetworkCapabilitiesForUser(0)).thenReturn( 71 new NetworkCapabilities[] { mNetCapabilities }); 72 73 mSignalStrength = mock(SignalStrength.class); 74 mServiceState = mock(ServiceState.class); 75 76 mConfig = new Config(); 77 mConfig.hspaDataDistinguishable = true; 78 mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm, 79 mConfig, mock(AccessPointControllerImpl.class), 80 mock(MobileDataControllerImpl.class)); 81 setupNetworkController(); 82 } 83 84 protected void setupNetworkController() { 85 // 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; 94 mSignalCluster = mock(SignalCluster.class); 95 mNetworkSignalChangedCallback = mock(NetworkSignalChangedCallback.class); 96 mNetworkController.addSignalCluster(mSignalCluster); 97 mNetworkController.addNetworkSignalChangedCallback(mNetworkSignalChangedCallback); 98 } 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 110 // 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 121 public void setConnectivity(int inetCondition, int networkType, boolean isConnected) { 122 Intent i = new Intent(ConnectivityManager.INET_CONDITION_ACTION); 123 // 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 } 134 135 mNetworkController.onReceive(mContext, i); 136 } 137 138 public void setGsmRoaming(boolean isRoaming) { 139 when(mServiceState.getRoaming()).thenReturn(isRoaming); 140 updateServiceState(); 141 } 142 143 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 151 public void setVoiceRegState(int voiceRegState) { 152 when(mServiceState.getVoiceRegState()).thenReturn(voiceRegState); 153 updateServiceState(); 154 } 155 156 public void setDataRegState(int dataRegState) { 157 when(mServiceState.getDataRegState()).thenReturn(dataRegState); 158 updateServiceState(); 159 } 160 161 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 208 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 220 protected void verifyLastQsMobileDataIndicators(boolean visible, int icon, int typeIcon, 221 boolean dataIn, boolean dataOut) { 222 ArgumentCaptor<Integer> iconArg = ArgumentCaptor.forClass(Integer.class); 223 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); 227 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(), 236 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()); 244 } 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); 249 ArgumentCaptor<Boolean> visibleArg = ArgumentCaptor.forClass(Boolean.class); 250 251 // TODO: Verify all fields. 252 Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setMobileDataIndicators( 253 visibleArg.capture(), iconArg.capture(), typeIconArg.capture(), 254 ArgumentCaptor.forClass(String.class).capture(), 255 ArgumentCaptor.forClass(String.class).capture(), 256 ArgumentCaptor.forClass(Boolean.class).capture(), 257 ArgumentCaptor.forClass(Integer.class).capture()); 258 259 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()); 262 } 263} 264