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