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