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