1/* 2 * Copyright (C) 2006 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.internal.telephony.dataconnection; 18 19import com.android.internal.telephony.ContextFixture; 20import com.android.internal.telephony.dataconnection.TelephonyNetworkFactory; 21import com.android.internal.telephony.mocks.ConnectivityServiceMock; 22import com.android.internal.telephony.mocks.DcTrackerMock; 23import com.android.internal.telephony.mocks.PhoneSwitcherMock; 24import com.android.internal.telephony.mocks.SubscriptionControllerMock; 25import com.android.internal.telephony.mocks.SubscriptionMonitorMock; 26import com.android.internal.telephony.mocks.TelephonyRegistryMock; 27import com.android.internal.telephony.test.SimulatedCommands; 28 29import android.content.Context; 30import android.os.AsyncResult; 31import android.os.Binder; 32import android.os.Handler; 33import android.os.HandlerThread; 34import android.os.Looper; 35import android.os.Message; 36import android.net.ConnectivityManager; 37import android.net.IConnectivityManager; 38import android.net.NetworkCapabilities; 39import android.net.NetworkRequest; 40 41import android.test.AndroidTestCase; 42import android.test.suitebuilder.annotation.SmallTest; 43 44import android.telephony.Rlog; 45 46 47public class TelephonyNetworkFactoryTest extends AndroidTestCase { 48 private final static String LOG_TAG = "TelephonyNetworkFactoryTest"; 49 50 private void waitABit() { 51 try { 52 Thread.sleep(250); 53 } catch (Exception e) {} 54 } 55 56 private String mTestName = ""; 57 58 private void log(String str) { 59 Rlog.d(LOG_TAG + " " + mTestName, str); 60 } 61 62 private class TestSetup { 63 final TelephonyRegistryMock telephonyRegistryMock; 64 final PhoneSwitcherMock phoneSwitcherMock; 65 final SubscriptionControllerMock subscriptionControllerMock; 66 final SubscriptionMonitorMock subscriptionMonitorMock; 67 final HandlerThread handlerThread; 68 final ConnectivityServiceMock connectivityServiceMock; 69 final Looper looper; 70 DcTrackerMock dcTrackerMock; 71 final Context contextMock; 72 73 TestSetup(int numPhones) { 74 handlerThread = new HandlerThread("TelephonyNetworkFactoryTest"); 75 handlerThread.start(); 76 looper = handlerThread.getLooper(); 77 78 Handler myHandler = new Handler(looper) { 79 public void handleMessage(Message msg) { 80 if (dcTrackerMock == null) dcTrackerMock = new DcTrackerMock(); 81 } 82 }; 83 myHandler.obtainMessage(0).sendToTarget(); 84 85 final ContextFixture contextFixture = new ContextFixture(); 86 String[] networkConfigString = getContext().getResources().getStringArray( 87 com.android.internal.R.array.networkAttributes); 88 contextFixture.putStringArrayResource(com.android.internal.R.array.networkAttributes, 89 networkConfigString); 90 contextMock = contextFixture.getTestDouble(); 91 92 connectivityServiceMock = new ConnectivityServiceMock(contextMock); 93 ConnectivityManager cm = 94 new ConnectivityManager(contextMock, connectivityServiceMock); 95 contextFixture.setSystemService(Context.CONNECTIVITY_SERVICE, cm); 96 97 telephonyRegistryMock = new TelephonyRegistryMock(); 98 phoneSwitcherMock = new PhoneSwitcherMock(numPhones, looper); 99 subscriptionControllerMock = 100 new SubscriptionControllerMock(contextMock, telephonyRegistryMock, numPhones); 101 subscriptionMonitorMock = new SubscriptionMonitorMock(numPhones); 102 } 103 104 void die() { 105 looper.quit(); 106 handlerThread.quit(); 107 } 108 } 109 110 private TelephonyNetworkFactory makeTnf(int phoneId, TestSetup ts) { 111 return new TelephonyNetworkFactory(ts.phoneSwitcherMock, ts.subscriptionControllerMock, 112 ts.subscriptionMonitorMock, ts.looper, ts.contextMock, phoneId, ts.dcTrackerMock); 113 } 114 115 private NetworkRequest makeSubSpecificDefaultRequest(TestSetup ts, int subId) { 116 NetworkCapabilities netCap = (new NetworkCapabilities()). 117 addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET). 118 addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED). 119 addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 120 netCap.setNetworkSpecifier(Integer.toString(subId)); 121 return ts.connectivityServiceMock.requestNetwork(netCap, null, 0, new Binder(), -1); 122 } 123 private NetworkRequest makeSubSpecificMmsRequest(TestSetup ts, int subId) { 124 NetworkCapabilities netCap = (new NetworkCapabilities()). 125 addCapability(NetworkCapabilities.NET_CAPABILITY_MMS). 126 addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED). 127 addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 128 netCap.setNetworkSpecifier(Integer.toString(subId)); 129 return ts.connectivityServiceMock.requestNetwork(netCap, null, 0, new Binder(), -1); 130 } 131 132 133 /** 134 * Test that phone active changes cause the DcTracker to get poked. 135 */ 136 @SmallTest 137 public void testActive() throws Exception { 138 mTestName = "testActive"; 139 final int numberOfPhones = 1; 140 final int phoneId = 0; 141 final int subId = 0; 142 143 TestSetup ts = new TestSetup(numberOfPhones); 144 145 TelephonyNetworkFactory tnf = makeTnf(phoneId, ts); 146 147 ts.subscriptionControllerMock.setDefaultDataSubId(subId); 148 ts.subscriptionControllerMock.setSlotSubId(phoneId, subId); 149 ts.subscriptionMonitorMock.notifySubscriptionChanged(phoneId); 150 ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(phoneId); 151 152 ts.connectivityServiceMock.addDefaultRequest(); 153 waitABit(); 154 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) { 155 fail("pretest of LiveRequests != 0"); 156 } 157 158 ts.phoneSwitcherMock.setPhoneActive(phoneId, true); 159 waitABit(); 160 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 1) { 161 fail("post-active test of LiveRequests != 1"); 162 } 163 164 NetworkRequest subSpecificDefault = makeSubSpecificDefaultRequest(ts, subId); 165 waitABit(); 166 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 2) { 167 fail("post-second-request test of LiveRequests != 2"); 168 } 169 170 ts.phoneSwitcherMock.setPhoneActive(phoneId, false); 171 waitABit(); 172 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) { 173 fail("post-inactive test of LiveRequests != 0"); 174 } 175 176 NetworkRequest subSpecificMms = makeSubSpecificMmsRequest(ts, subId); 177 waitABit(); 178 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) { 179 fail("post-mms-add test of LiveRequests != 0"); 180 } 181 182 ts.phoneSwitcherMock.setPhoneActive(phoneId, true); 183 waitABit(); 184 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 3) { 185 fail("post-active-mms-add test of LiveRequests != 3"); 186 } 187 188 ts.connectivityServiceMock.releaseNetworkRequest(subSpecificDefault); 189 waitABit(); 190 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 2) { 191 fail("post-remove-default test of LiveRequests != 2"); 192 } 193 194 ts.phoneSwitcherMock.setPhoneActive(phoneId, false); 195 waitABit(); 196 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) { 197 fail("test 8, LiveRequests != 0"); 198 } 199 200 ts.connectivityServiceMock.releaseNetworkRequest(subSpecificMms); 201 waitABit(); 202 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) { 203 fail("test 9, LiveRequests != 0"); 204 } 205 206 ts.phoneSwitcherMock.setPhoneActive(phoneId, true); 207 waitABit(); 208 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 1) { 209 fail("test 10, LiveRequests != 1," + ts.dcTrackerMock.getNumberOfLiveRequests()); 210 } 211 212 ts.die(); 213 } 214 215 /** 216 * Test that network request changes cause the DcTracker to get poked. 217 */ 218 @SmallTest 219 public void testRequests() throws Exception { 220 mTestName = "testActive"; 221 final int numberOfPhones = 2; 222 final int phoneId = 0; 223 final int altPhoneId = 1; 224 final int subId = 0; 225 final int altSubId = 1; 226 final int unusedSubId = 2; 227 228 TestSetup ts = new TestSetup(numberOfPhones); 229 230 TelephonyNetworkFactory tnf = makeTnf(phoneId, ts); 231 232 ts.subscriptionControllerMock.setDefaultDataSubId(subId); 233 ts.subscriptionControllerMock.setSlotSubId(phoneId, subId); 234 ts.subscriptionMonitorMock.notifySubscriptionChanged(phoneId); 235 ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(phoneId); 236 waitABit(); 237 238 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) { 239 fail("test 1, LiveRequests != 0"); 240 } 241 242 ts.phoneSwitcherMock.setPhoneActive(phoneId, true); 243 waitABit(); 244 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) { 245 fail("test 2, LiveRequests != 0"); 246 } 247 248 ts.connectivityServiceMock.addDefaultRequest(); 249 waitABit(); 250 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 1) { 251 fail("test 3, LiveRequests != 1"); 252 } 253 254 ts.subscriptionControllerMock.setSlotSubId(altPhoneId, altSubId); 255 waitABit(); 256 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 1) { 257 fail("test 4, LiveRequests != 1"); 258 } 259 260 ts.subscriptionControllerMock.setDefaultDataSubId(altSubId); 261 ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(phoneId); 262 ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(altPhoneId); 263 waitABit(); 264 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) { 265 fail("test 5, LiveRequests != 0"); 266 } 267 268 NetworkRequest subSpecificMms = makeSubSpecificMmsRequest(ts, subId); 269 waitABit(); 270 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 1) { 271 fail("test 6, LiveRequests != 1"); 272 } 273 274 ts.subscriptionControllerMock.setSlotSubId(phoneId, unusedSubId); 275 ts.subscriptionMonitorMock.notifySubscriptionChanged(phoneId); 276 waitABit(); 277 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) { 278 fail("test 7, LiveRequests != 0"); 279 } 280 281 NetworkRequest subSpecificDefault = makeSubSpecificDefaultRequest(ts, subId); 282 waitABit(); 283 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) { 284 fail("test 8, LiveRequests != 0"); 285 } 286 287 ts.subscriptionControllerMock.setSlotSubId(phoneId, subId); 288 ts.subscriptionMonitorMock.notifySubscriptionChanged(phoneId); 289 waitABit(); 290 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 2) { 291 fail("test 9, LiveRequests != 2"); 292 } 293 294 ts.subscriptionControllerMock.setDefaultDataSubId(subId); 295 ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(phoneId); 296 ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(altPhoneId); 297 ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(phoneId); 298 waitABit(); 299 if (ts.dcTrackerMock.getNumberOfLiveRequests() != 3) { 300 fail("test 10, LiveRequests != 3"); 301 } 302 ts.die(); 303 } 304} 305