DcTrackerTest.java revision 783061ca03572618c01ce244d70d82fa4328d45f
127b650c406018355a88a41528db7859e232728a0Jack Yu/*
227b650c406018355a88a41528db7859e232728a0Jack Yu * Copyright (C) 2016 The Android Open Source Project
327b650c406018355a88a41528db7859e232728a0Jack Yu *
427b650c406018355a88a41528db7859e232728a0Jack Yu * Licensed under the Apache License, Version 2.0 (the "License");
527b650c406018355a88a41528db7859e232728a0Jack Yu * you may not use this file except in compliance with the License.
627b650c406018355a88a41528db7859e232728a0Jack Yu * You may obtain a copy of the License at
727b650c406018355a88a41528db7859e232728a0Jack Yu *
827b650c406018355a88a41528db7859e232728a0Jack Yu *      http://www.apache.org/licenses/LICENSE-2.0
927b650c406018355a88a41528db7859e232728a0Jack Yu *
1027b650c406018355a88a41528db7859e232728a0Jack Yu * Unless required by applicable law or agreed to in writing, software
1127b650c406018355a88a41528db7859e232728a0Jack Yu * distributed under the License is distributed on an "AS IS" BASIS,
1227b650c406018355a88a41528db7859e232728a0Jack Yu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327b650c406018355a88a41528db7859e232728a0Jack Yu * See the License for the specific language governing permissions and
1427b650c406018355a88a41528db7859e232728a0Jack Yu * limitations under the License.
1527b650c406018355a88a41528db7859e232728a0Jack Yu */
1627b650c406018355a88a41528db7859e232728a0Jack Yu
17e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yupackage com.android.internal.telephony.dataconnection;
1827b650c406018355a88a41528db7859e232728a0Jack Yu
1927b650c406018355a88a41528db7859e232728a0Jack Yuimport android.app.AlarmManager;
2027b650c406018355a88a41528db7859e232728a0Jack Yuimport android.app.PendingIntent;
2127b650c406018355a88a41528db7859e232728a0Jack Yuimport android.content.Context;
227d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yuimport android.content.Intent;
2327b650c406018355a88a41528db7859e232728a0Jack Yuimport android.database.Cursor;
2427b650c406018355a88a41528db7859e232728a0Jack Yuimport android.database.MatrixCursor;
2527b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.LinkProperties;
2627b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.Uri;
2727b650c406018355a88a41528db7859e232728a0Jack Yuimport android.os.HandlerThread;
28783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yuimport android.os.IBinder;
2927b650c406018355a88a41528db7859e232728a0Jack Yuimport android.os.Message;
30783061ca03572618c01ce244d70d82fa4328d45ffionaxuimport android.os.PersistableBundle;
3127b650c406018355a88a41528db7859e232728a0Jack Yuimport android.provider.Telephony;
32783061ca03572618c01ce244d70d82fa4328d45ffionaxuimport android.telephony.CarrierConfigManager;
3327b650c406018355a88a41528db7859e232728a0Jack Yuimport android.telephony.ServiceState;
3427b650c406018355a88a41528db7859e232728a0Jack Yuimport android.test.mock.MockContentProvider;
3527b650c406018355a88a41528db7859e232728a0Jack Yuimport android.test.mock.MockContentResolver;
3627b650c406018355a88a41528db7859e232728a0Jack Yuimport android.test.suitebuilder.annotation.MediumTest;
3727b650c406018355a88a41528db7859e232728a0Jack Yu
38e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.DctConstants;
39e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.ISub;
40e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.Phone;
41e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.PhoneConstants;
42e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.RILConstants;
43e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.TelephonyTest;
4427b650c406018355a88a41528db7859e232728a0Jack Yu
4527b650c406018355a88a41528db7859e232728a0Jack Yuimport org.junit.After;
4627b650c406018355a88a41528db7859e232728a0Jack Yuimport org.junit.Before;
4727b650c406018355a88a41528db7859e232728a0Jack Yuimport org.junit.Test;
4827b650c406018355a88a41528db7859e232728a0Jack Yuimport org.mockito.ArgumentCaptor;
49783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yuimport org.mockito.Mock;
5027b650c406018355a88a41528db7859e232728a0Jack Yu
511d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yuimport java.lang.reflect.Method;
5227b650c406018355a88a41528db7859e232728a0Jack Yuimport java.util.Arrays;
5327b650c406018355a88a41528db7859e232728a0Jack Yuimport java.util.List;
5427b650c406018355a88a41528db7859e232728a0Jack Yuimport java.util.regex.Matcher;
5527b650c406018355a88a41528db7859e232728a0Jack Yuimport java.util.regex.Pattern;
5627b650c406018355a88a41528db7859e232728a0Jack Yu
5727b650c406018355a88a41528db7859e232728a0Jack Yuimport static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
5827b650c406018355a88a41528db7859e232728a0Jack Yuimport static org.junit.Assert.assertArrayEquals;
5927b650c406018355a88a41528db7859e232728a0Jack Yuimport static org.junit.Assert.assertEquals;
601d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yuimport static org.junit.Assert.assertFalse;
6127b650c406018355a88a41528db7859e232728a0Jack Yuimport static org.junit.Assert.assertTrue;
621d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yuimport static org.junit.Assert.fail;
6327b650c406018355a88a41528db7859e232728a0Jack Yuimport static org.mockito.Matchers.any;
64783061ca03572618c01ce244d70d82fa4328d45ffionaxuimport static org.mockito.Matchers.anyInt;
6527b650c406018355a88a41528db7859e232728a0Jack Yuimport static org.mockito.Matchers.anyLong;
66783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yuimport static org.mockito.Matchers.anyString;
6727b650c406018355a88a41528db7859e232728a0Jack Yuimport static org.mockito.Matchers.eq;
6827b650c406018355a88a41528db7859e232728a0Jack Yuimport static org.mockito.Mockito.doReturn;
697d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yuimport static org.mockito.Mockito.never;
7027b650c406018355a88a41528db7859e232728a0Jack Yuimport static org.mockito.Mockito.times;
7127b650c406018355a88a41528db7859e232728a0Jack Yuimport static org.mockito.Mockito.verify;
7227b650c406018355a88a41528db7859e232728a0Jack Yu
7327b650c406018355a88a41528db7859e232728a0Jack Yupublic class DcTrackerTest extends TelephonyTest {
7427b650c406018355a88a41528db7859e232728a0Jack Yu
7527b650c406018355a88a41528db7859e232728a0Jack Yu    private final static String[] sNetworkAttributes = new String[]{
7627b650c406018355a88a41528db7859e232728a0Jack Yu            "mobile,0,0,0,-1,true", "mobile_mms,2,0,2,60000,true",
7727b650c406018355a88a41528db7859e232728a0Jack Yu            "mobile_supl,3,0,2,60000,true", "mobile_dun,4,0,2,60000,true",
7827b650c406018355a88a41528db7859e232728a0Jack Yu            "mobile_hipri,5,0,3,60000,true", "mobile_fota,10,0,2,60000,true",
7927b650c406018355a88a41528db7859e232728a0Jack Yu            "mobile_ims,11,0,2,60000,true", "mobile_cbs,12,0,2,60000,true",
8027b650c406018355a88a41528db7859e232728a0Jack Yu            "mobile_ia,14,0,2,-1,true", "mobile_emergency,15,0,2,-1,true"};
8127b650c406018355a88a41528db7859e232728a0Jack Yu
821d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu    private final static List<String> sApnTypes = Arrays.asList(
8327b650c406018355a88a41528db7859e232728a0Jack Yu            "default", "mms", "cbs", "fota", "supl", "ia", "emergency", "dun", "hipri", "ims");
8427b650c406018355a88a41528db7859e232728a0Jack Yu
853a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private static final String FAKE_APN1 = "FAKE APN 1";
863a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private static final String FAKE_APN2 = "FAKE APN 2";
873a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private static final String FAKE_APN3 = "FAKE APN 3";
883a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private static final String FAKE_IFNAME = "FAKE IFNAME";
893a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private static final String FAKE_PCSCF_ADDRESS = "22.33.44.55";
903a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private static final String FAKE_GATEWAY = "11.22.33.44";
913a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private static final String FAKE_DNS = "55.66.77.88";
923a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private static final String FAKE_ADDRESS = "99.88.77.66";
9327b650c406018355a88a41528db7859e232728a0Jack Yu
94783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu    @Mock
95783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu    ISub mIsub;
96783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu    @Mock
97783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu    IBinder mBinder;
98783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu
9927b650c406018355a88a41528db7859e232728a0Jack Yu    private DcTracker mDct;
10027b650c406018355a88a41528db7859e232728a0Jack Yu
10127b650c406018355a88a41528db7859e232728a0Jack Yu    private AlarmManager mAlarmManager;
10227b650c406018355a88a41528db7859e232728a0Jack Yu
103783061ca03572618c01ce244d70d82fa4328d45ffionaxu    private PersistableBundle mBundle;
104783061ca03572618c01ce244d70d82fa4328d45ffionaxu
10527b650c406018355a88a41528db7859e232728a0Jack Yu    private final ApnSettingContentProvider mApnSettingContentProvider =
10627b650c406018355a88a41528db7859e232728a0Jack Yu            new ApnSettingContentProvider();
10727b650c406018355a88a41528db7859e232728a0Jack Yu
10827b650c406018355a88a41528db7859e232728a0Jack Yu    private class DcTrackerTestHandler extends HandlerThread {
10927b650c406018355a88a41528db7859e232728a0Jack Yu
11027b650c406018355a88a41528db7859e232728a0Jack Yu        private DcTrackerTestHandler(String name) {
11127b650c406018355a88a41528db7859e232728a0Jack Yu            super(name);
11227b650c406018355a88a41528db7859e232728a0Jack Yu        }
11327b650c406018355a88a41528db7859e232728a0Jack Yu
11427b650c406018355a88a41528db7859e232728a0Jack Yu        @Override
11527b650c406018355a88a41528db7859e232728a0Jack Yu        public void onLooperPrepared() {
11627b650c406018355a88a41528db7859e232728a0Jack Yu            mDct = new DcTracker(mPhone);
11727b650c406018355a88a41528db7859e232728a0Jack Yu            setReady(true);
11827b650c406018355a88a41528db7859e232728a0Jack Yu        }
11927b650c406018355a88a41528db7859e232728a0Jack Yu    }
12027b650c406018355a88a41528db7859e232728a0Jack Yu
12127b650c406018355a88a41528db7859e232728a0Jack Yu    private class ApnSettingContentProvider extends MockContentProvider {
12227b650c406018355a88a41528db7859e232728a0Jack Yu
12327b650c406018355a88a41528db7859e232728a0Jack Yu        @Override
12427b650c406018355a88a41528db7859e232728a0Jack Yu        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
12527b650c406018355a88a41528db7859e232728a0Jack Yu                            String sortOrder) {
12627b650c406018355a88a41528db7859e232728a0Jack Yu            logd("ApnSettingContentProvider: query");
12727b650c406018355a88a41528db7859e232728a0Jack Yu            logd("   uri = " + uri);
12827b650c406018355a88a41528db7859e232728a0Jack Yu            logd("   projection = " + Arrays.toString(projection));
12927b650c406018355a88a41528db7859e232728a0Jack Yu            logd("   selection = " + selection);
13027b650c406018355a88a41528db7859e232728a0Jack Yu            logd("   selectionArgs = " + Arrays.toString(selectionArgs));
13127b650c406018355a88a41528db7859e232728a0Jack Yu            logd("   sortOrder = " + sortOrder);
13227b650c406018355a88a41528db7859e232728a0Jack Yu
13327b650c406018355a88a41528db7859e232728a0Jack Yu            if (uri.compareTo(Telephony.Carriers.CONTENT_URI) == 0) {
13427b650c406018355a88a41528db7859e232728a0Jack Yu                if (projection == null && selectionArgs == null && selection != null) {
13527b650c406018355a88a41528db7859e232728a0Jack Yu
13627b650c406018355a88a41528db7859e232728a0Jack Yu                    Pattern pattern = Pattern.compile("^numeric = '([0-9]*)'");
13727b650c406018355a88a41528db7859e232728a0Jack Yu                    Matcher matcher = pattern.matcher(selection);
13827b650c406018355a88a41528db7859e232728a0Jack Yu                    if (!matcher.find()) {
13927b650c406018355a88a41528db7859e232728a0Jack Yu                        logd("Cannot find MCC/MNC from " + selection);
14027b650c406018355a88a41528db7859e232728a0Jack Yu                        return null;
14127b650c406018355a88a41528db7859e232728a0Jack Yu                    }
14227b650c406018355a88a41528db7859e232728a0Jack Yu
14327b650c406018355a88a41528db7859e232728a0Jack Yu                    String plmn = matcher.group(1);
14427b650c406018355a88a41528db7859e232728a0Jack Yu
14527b650c406018355a88a41528db7859e232728a0Jack Yu                    logd("Query '" + plmn + "' APN settings");
14627b650c406018355a88a41528db7859e232728a0Jack Yu                    MatrixCursor mc = new MatrixCursor(
14727b650c406018355a88a41528db7859e232728a0Jack Yu                            new String[]{Telephony.Carriers._ID, Telephony.Carriers.NUMERIC,
14827b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.NAME, Telephony.Carriers.APN,
14927b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.PROXY, Telephony.Carriers.PORT,
15027b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MMSC, Telephony.Carriers.MMSPROXY,
15127b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MMSPORT, Telephony.Carriers.USER,
15227b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.PASSWORD, Telephony.Carriers.AUTH_TYPE,
15327b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.TYPE,
15427b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.PROTOCOL,
15527b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.ROAMING_PROTOCOL,
15627b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.CARRIER_ENABLED, Telephony.Carriers.BEARER,
15727b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.BEARER_BITMASK,
15827b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.PROFILE_ID,
15927b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MODEM_COGNITIVE,
16027b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MAX_CONNS, Telephony.Carriers.WAIT_TIME,
16127b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MAX_CONNS_TIME, Telephony.Carriers.MTU,
16227b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MVNO_TYPE,
16327b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MVNO_MATCH_DATA});
16427b650c406018355a88a41528db7859e232728a0Jack Yu
16527b650c406018355a88a41528db7859e232728a0Jack Yu                    mc.addRow(new Object[]{
16627b650c406018355a88a41528db7859e232728a0Jack Yu                            2163,                   // id
16727b650c406018355a88a41528db7859e232728a0Jack Yu                            plmn,                   // numeric
16827b650c406018355a88a41528db7859e232728a0Jack Yu                            "sp-mode",              // name
16927b650c406018355a88a41528db7859e232728a0Jack Yu                            FAKE_APN1,              // apn
17027b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // proxy
17127b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // port
17227b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsc
17327b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsproxy
17427b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsport
17527b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // user
17627b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // password
17727b650c406018355a88a41528db7859e232728a0Jack Yu                            -1,                     // authtype
17827b650c406018355a88a41528db7859e232728a0Jack Yu                            "default,supl",         // types
17927b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // protocol
18027b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // roaming_protocol
18127b650c406018355a88a41528db7859e232728a0Jack Yu                            1,                      // carrier_enabled
18227b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // bearer
18327b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // bearer_bitmask
18427b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // profile_id
18527b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // modem_cognitive
18627b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns
18727b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // wait_time
18827b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns_time
18927b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // mtu
19027b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mvno_type
19127b650c406018355a88a41528db7859e232728a0Jack Yu                            ""                      // mnvo_match_data
19227b650c406018355a88a41528db7859e232728a0Jack Yu                    });
19327b650c406018355a88a41528db7859e232728a0Jack Yu
19427b650c406018355a88a41528db7859e232728a0Jack Yu                    mc.addRow(new Object[]{
19527b650c406018355a88a41528db7859e232728a0Jack Yu                            2164,                   // id
19627b650c406018355a88a41528db7859e232728a0Jack Yu                            plmn,                   // numeric
19727b650c406018355a88a41528db7859e232728a0Jack Yu                            "mopera U",             // name
19827b650c406018355a88a41528db7859e232728a0Jack Yu                            FAKE_APN2,              // apn
19927b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // proxy
20027b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // port
20127b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsc
20227b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsproxy
20327b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsport
20427b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // user
20527b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // password
20627b650c406018355a88a41528db7859e232728a0Jack Yu                            -1,                     // authtype
20727b650c406018355a88a41528db7859e232728a0Jack Yu                            "default,supl",         // types
20827b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // protocol
20927b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // roaming_protocol
21027b650c406018355a88a41528db7859e232728a0Jack Yu                            1,                      // carrier_enabled
21127b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // bearer
21227b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // bearer_bitmask
21327b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // profile_id
21427b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // modem_cognitive
21527b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns
21627b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // wait_time
21727b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns_time
21827b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // mtu
21927b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mvno_type
22027b650c406018355a88a41528db7859e232728a0Jack Yu                            ""                      // mnvo_match_data
22127b650c406018355a88a41528db7859e232728a0Jack Yu                    });
22227b650c406018355a88a41528db7859e232728a0Jack Yu
22327b650c406018355a88a41528db7859e232728a0Jack Yu                    mc.addRow(new Object[]{
22427b650c406018355a88a41528db7859e232728a0Jack Yu                            2165,                   // id
22527b650c406018355a88a41528db7859e232728a0Jack Yu                            plmn,                   // numeric
22627b650c406018355a88a41528db7859e232728a0Jack Yu                            "b-mobile for Nexus",   // name
22727b650c406018355a88a41528db7859e232728a0Jack Yu                            FAKE_APN3,              // apn
22827b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // proxy
22927b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // port
23027b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsc
23127b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsproxy
23227b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsport
23327b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // user
23427b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // password
23527b650c406018355a88a41528db7859e232728a0Jack Yu                            3,                      // authtype
236783061ca03572618c01ce244d70d82fa4328d45ffionaxu                            "ims",                  // types
23727b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // protocol
23827b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // roaming_protocol
23927b650c406018355a88a41528db7859e232728a0Jack Yu                            1,                      // carrier_enabled
24027b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // bearer
24127b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // bearer_bitmask
24227b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // profile_id
24327b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // modem_cognitive
24427b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns
24527b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // wait_time
24627b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns_time
24727b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // mtu
24827b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mvno_type
24927b650c406018355a88a41528db7859e232728a0Jack Yu                            ""                      // mnvo_match_data
25027b650c406018355a88a41528db7859e232728a0Jack Yu                    });
25127b650c406018355a88a41528db7859e232728a0Jack Yu
25227b650c406018355a88a41528db7859e232728a0Jack Yu                    return mc;
25327b650c406018355a88a41528db7859e232728a0Jack Yu                }
25427b650c406018355a88a41528db7859e232728a0Jack Yu            }
25527b650c406018355a88a41528db7859e232728a0Jack Yu
25627b650c406018355a88a41528db7859e232728a0Jack Yu            return null;
25727b650c406018355a88a41528db7859e232728a0Jack Yu        }
25827b650c406018355a88a41528db7859e232728a0Jack Yu    }
25927b650c406018355a88a41528db7859e232728a0Jack Yu
26027b650c406018355a88a41528db7859e232728a0Jack Yu    @Before
26127b650c406018355a88a41528db7859e232728a0Jack Yu    public void setUp() throws Exception {
26227b650c406018355a88a41528db7859e232728a0Jack Yu        logd("DcTrackerTest +Setup!");
26327b650c406018355a88a41528db7859e232728a0Jack Yu        super.setUp(getClass().getSimpleName());
26427b650c406018355a88a41528db7859e232728a0Jack Yu
26527b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn("fake.action_detached").when(mPhone).getActionDetached();
26627b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn("fake.action_attached").when(mPhone).getActionAttached();
26727b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn("44010").when(mSimRecords).getOperatorNumeric();
26827b650c406018355a88a41528db7859e232728a0Jack Yu
26927b650c406018355a88a41528db7859e232728a0Jack Yu        mContextFixture.putStringArrayResource(com.android.internal.R.array.networkAttributes,
27027b650c406018355a88a41528db7859e232728a0Jack Yu                sNetworkAttributes);
27127b650c406018355a88a41528db7859e232728a0Jack Yu        mContextFixture.putStringArrayResource(com.android.internal.R.array.
27227b650c406018355a88a41528db7859e232728a0Jack Yu                config_mobile_tcp_buffers, new String[]{
27327b650c406018355a88a41528db7859e232728a0Jack Yu                "umts:131072,262144,1452032,4096,16384,399360",
27427b650c406018355a88a41528db7859e232728a0Jack Yu                "hspa:131072,262144,2441216,4096,16384,399360",
27527b650c406018355a88a41528db7859e232728a0Jack Yu                "hsupa:131072,262144,2441216,4096,16384,399360",
27627b650c406018355a88a41528db7859e232728a0Jack Yu                "hsdpa:131072,262144,2441216,4096,16384,399360",
27727b650c406018355a88a41528db7859e232728a0Jack Yu                "hspap:131072,262144,2441216,4096,16384,399360",
27827b650c406018355a88a41528db7859e232728a0Jack Yu                "edge:16384,32768,131072,4096,16384,65536",
27927b650c406018355a88a41528db7859e232728a0Jack Yu                "gprs:4096,8192,24576,4096,8192,24576",
28027b650c406018355a88a41528db7859e232728a0Jack Yu                "1xrtt:16384,32768,131070,4096,16384,102400",
28127b650c406018355a88a41528db7859e232728a0Jack Yu                "evdo:131072,262144,1048576,4096,16384,524288",
28227b650c406018355a88a41528db7859e232728a0Jack Yu                "lte:524288,1048576,8388608,262144,524288,4194304"});
28327b650c406018355a88a41528db7859e232728a0Jack Yu
2847d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        ((MockContentResolver) mContext.getContentResolver()).addProvider(
28527b650c406018355a88a41528db7859e232728a0Jack Yu                Telephony.Carriers.CONTENT_URI.getAuthority(), mApnSettingContentProvider);
28627b650c406018355a88a41528db7859e232728a0Jack Yu
28727b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn(true).when(mSimRecords).getRecordsLoaded();
28827b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn(PhoneConstants.State.IDLE).when(mCT).getState();
28927b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn(true).when(mSST).getDesiredPowerState();
29027b650c406018355a88a41528db7859e232728a0Jack Yu
291783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu        doReturn(1).when(mIsub).getDefaultDataSubId();
292783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu        doReturn(mIsub).when(mBinder).queryLocalInterface(anyString());
2931d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        mServiceManagerMockedServices.put("isub", mBinder);
294783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu
29591abb5484d609dd4f117dd3dc234fe9a1b619c91Jack Yu        mContextFixture.putStringArrayResource(
29691abb5484d609dd4f117dd3dc234fe9a1b619c91Jack Yu                com.android.internal.R.array.config_cell_retries_per_error_code,
29791abb5484d609dd4f117dd3dc234fe9a1b619c91Jack Yu                new String[]{"36,2"});
29891abb5484d609dd4f117dd3dc234fe9a1b619c91Jack Yu
2997d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
300783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mBundle = mContextFixture.getCarrierConfigBundle();
30127b650c406018355a88a41528db7859e232728a0Jack Yu
30227b650c406018355a88a41528db7859e232728a0Jack Yu        new DcTrackerTestHandler(getClass().getSimpleName()).start();
30327b650c406018355a88a41528db7859e232728a0Jack Yu        waitUntilReady();
30427b650c406018355a88a41528db7859e232728a0Jack Yu        waitForMs(600);
30527b650c406018355a88a41528db7859e232728a0Jack Yu        logd("DcTrackerTest -Setup!");
30627b650c406018355a88a41528db7859e232728a0Jack Yu    }
30727b650c406018355a88a41528db7859e232728a0Jack Yu
30827b650c406018355a88a41528db7859e232728a0Jack Yu    @After
30927b650c406018355a88a41528db7859e232728a0Jack Yu    public void tearDown() throws Exception {
31027b650c406018355a88a41528db7859e232728a0Jack Yu        logd("DcTrackerTest -tearDown");
31127b650c406018355a88a41528db7859e232728a0Jack Yu        mDct.removeCallbacksAndMessages(null);
31227b650c406018355a88a41528db7859e232728a0Jack Yu        mDct = null;
31327b650c406018355a88a41528db7859e232728a0Jack Yu        super.tearDown();
31427b650c406018355a88a41528db7859e232728a0Jack Yu    }
31527b650c406018355a88a41528db7859e232728a0Jack Yu
3167d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    // Create a successful data response
3173a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    public static DataCallResponse createDataCallResponse() {
3187d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
3197d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        DataCallResponse dcResponse = new DataCallResponse();
3207d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
3217d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.version = 11;
3227d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.status = 0;
3237d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.suggestedRetryTime = RILConstants.MAX_INT; // No retry suggested by the modem
3247d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.cid = 1;
3257d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.active = 2;
3267d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.type = "IP";
3277d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.ifname = FAKE_IFNAME;
3287d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.mtu = 1440;
3297d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.addresses = new String[]{FAKE_ADDRESS};
3307d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.dnses = new String[]{FAKE_DNS};
3317d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.gateways = new String[]{FAKE_GATEWAY};
3327d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.pcscf = new String[]{FAKE_PCSCF_ADDRESS};
3337d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        return dcResponse;
3347d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    }
33527b650c406018355a88a41528db7859e232728a0Jack Yu
3367d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    private void verifyDataConnected(final String apnSetting) {
33727b650c406018355a88a41528db7859e232728a0Jack Yu        verify(mPhone, times(1)).notifyDataConnection(eq(Phone.REASON_CONNECTED),
33827b650c406018355a88a41528db7859e232728a0Jack Yu                eq(PhoneConstants.APN_TYPE_DEFAULT));
33927b650c406018355a88a41528db7859e232728a0Jack Yu
34027b650c406018355a88a41528db7859e232728a0Jack Yu        verify(mAlarmManager, times(1)).set(eq(AlarmManager.ELAPSED_REALTIME_WAKEUP), anyLong(),
34127b650c406018355a88a41528db7859e232728a0Jack Yu                any(PendingIntent.class));
34227b650c406018355a88a41528db7859e232728a0Jack Yu
3437d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        assertEquals(apnSetting, mDct.getActiveApnString(PhoneConstants.APN_TYPE_DEFAULT));
34427b650c406018355a88a41528db7859e232728a0Jack Yu        assertArrayEquals(new String[]{PhoneConstants.APN_TYPE_DEFAULT}, mDct.getActiveApnTypes());
34527b650c406018355a88a41528db7859e232728a0Jack Yu        assertTrue(mDct.getAnyDataEnabled());
34627b650c406018355a88a41528db7859e232728a0Jack Yu        assertTrue(mDct.getDataEnabled());
34727b650c406018355a88a41528db7859e232728a0Jack Yu
34827b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
34927b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT));
35027b650c406018355a88a41528db7859e232728a0Jack Yu
35127b650c406018355a88a41528db7859e232728a0Jack Yu        LinkProperties linkProperties = mDct.getLinkProperties(PhoneConstants.APN_TYPE_DEFAULT);
35227b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(FAKE_IFNAME, linkProperties.getInterfaceName());
35327b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(1, linkProperties.getAddresses().size());
35427b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(FAKE_ADDRESS, linkProperties.getAddresses().get(0).getHostAddress());
35527b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(1, linkProperties.getDnsServers().size());
35627b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(FAKE_DNS, linkProperties.getDnsServers().get(0).getHostAddress());
35727b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(FAKE_GATEWAY, linkProperties.getRoutes().get(0).getGateway().getHostAddress());
35827b650c406018355a88a41528db7859e232728a0Jack Yu    }
35927b650c406018355a88a41528db7859e232728a0Jack Yu
3601d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu    private boolean isDataAllowed(StringBuilder sb) {
3611d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        try {
3621d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu            Method method = DcTracker.class.getDeclaredMethod("isDataAllowed", StringBuilder.class);
3631d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu            method.setAccessible(true);
3641d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu            return (boolean) method.invoke(mDct, sb);
3651d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        } catch (Exception e) {
3661d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu            fail(e.toString());
3671d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu            return false;
3681d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        }
3691d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu    }
3701d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu
3717d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    // Test the normal data call setup scenario.
37227b650c406018355a88a41528db7859e232728a0Jack Yu    @Test
37327b650c406018355a88a41528db7859e232728a0Jack Yu    @MediumTest
37427b650c406018355a88a41528db7859e232728a0Jack Yu    public void testDataSetup() {
37527b650c406018355a88a41528db7859e232728a0Jack Yu
3767d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mSimulatedCommands.setDataCallResponse(true, createDataCallResponse());
3777d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
3781d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        StringBuilder sb = new StringBuilder();
3791d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        boolean allowed = isDataAllowed(sb);
3801d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        assertFalse(sb.toString(), allowed);
3811d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu
3827d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        logd("Sending EVENT_RECORDS_LOADED");
3837d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
3847d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        waitForMs(200);
3857d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
3867d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        ArgumentCaptor<String> apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
3877d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
3887d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(Phone.REASON_SIM_LOADED), apnTypeArgumentCaptor.capture(),
3897d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
3907d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
3917d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
3927d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
3937d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
3947d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
3957d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        waitForMs(200);
3967d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
3977d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
3987d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
3997d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(Phone.REASON_DATA_ATTACHED), apnTypeArgumentCaptor.capture(),
4007d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
4017d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4027d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
4037d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4047d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
4057d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
4067d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(Phone.REASON_DATA_ENABLED), apnTypeArgumentCaptor.capture(),
4077d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
40827b650c406018355a88a41528db7859e232728a0Jack Yu
4097d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
4107d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4117d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        logd("Sending EVENT_ENABLE_NEW_APN");
4127d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // APN id 0 is APN_TYPE_DEFAULT
4137d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mDct.setEnabled(0, true);
4147d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        waitForMs(200);
4157d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4161d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        sb.setLength(0);
4171d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        allowed = isDataAllowed(sb);
4181d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        assertTrue(sb.toString(), allowed);
4191d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu
4207d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Verify if RIL command was sent properly.
4217d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
4227d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS), eq(0), eq(FAKE_APN1),
4237d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(""), eq(""), eq(0), eq("IP"), any(Message.class));
4247d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4257d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verifyDataConnected(FAKE_APN1);
4267d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    }
4277d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4287d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    // Test the scenario where the first data call setup is failed, and then retry the setup later.
4297d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    @Test
4307d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    @MediumTest
4317d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    public void testDataRetry() {
4327d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        DataCallResponse dcResponse = createDataCallResponse();
4337d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // LOST_CONNECTION(0x10004) is a non-permanent failure, so we'll retry data setup later.
4347d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        dcResponse.status = 0x10004;
4357d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Simulate RIL fails the data call setup
4367d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mSimulatedCommands.setDataCallResponse(false, dcResponse);
43727b650c406018355a88a41528db7859e232728a0Jack Yu
4381d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        StringBuilder sb = new StringBuilder();
4391d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        boolean allowed = isDataAllowed(sb);
4401d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        assertFalse(sb.toString(), allowed);
4411d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu
44227b650c406018355a88a41528db7859e232728a0Jack Yu        logd("Sending EVENT_RECORDS_LOADED");
44327b650c406018355a88a41528db7859e232728a0Jack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
44427b650c406018355a88a41528db7859e232728a0Jack Yu        waitForMs(200);
44527b650c406018355a88a41528db7859e232728a0Jack Yu
44627b650c406018355a88a41528db7859e232728a0Jack Yu        ArgumentCaptor<String> apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
44727b650c406018355a88a41528db7859e232728a0Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
44827b650c406018355a88a41528db7859e232728a0Jack Yu                eq(Phone.REASON_SIM_LOADED), apnTypeArgumentCaptor.capture(),
44927b650c406018355a88a41528db7859e232728a0Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
45027b650c406018355a88a41528db7859e232728a0Jack Yu
45127b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
45227b650c406018355a88a41528db7859e232728a0Jack Yu
45327b650c406018355a88a41528db7859e232728a0Jack Yu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
45427b650c406018355a88a41528db7859e232728a0Jack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
45527b650c406018355a88a41528db7859e232728a0Jack Yu        waitForMs(200);
45627b650c406018355a88a41528db7859e232728a0Jack Yu
45727b650c406018355a88a41528db7859e232728a0Jack Yu        apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
45827b650c406018355a88a41528db7859e232728a0Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
45927b650c406018355a88a41528db7859e232728a0Jack Yu                eq(Phone.REASON_DATA_ATTACHED), apnTypeArgumentCaptor.capture(),
46027b650c406018355a88a41528db7859e232728a0Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
46127b650c406018355a88a41528db7859e232728a0Jack Yu
46227b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
46327b650c406018355a88a41528db7859e232728a0Jack Yu
46427b650c406018355a88a41528db7859e232728a0Jack Yu        apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
46527b650c406018355a88a41528db7859e232728a0Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
46627b650c406018355a88a41528db7859e232728a0Jack Yu                eq(Phone.REASON_DATA_ENABLED), apnTypeArgumentCaptor.capture(),
46727b650c406018355a88a41528db7859e232728a0Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
46827b650c406018355a88a41528db7859e232728a0Jack Yu
46927b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
47027b650c406018355a88a41528db7859e232728a0Jack Yu
47127b650c406018355a88a41528db7859e232728a0Jack Yu        logd("Sending EVENT_ENABLE_NEW_APN");
47227b650c406018355a88a41528db7859e232728a0Jack Yu        // APN id 0 is APN_TYPE_DEFAULT
47327b650c406018355a88a41528db7859e232728a0Jack Yu        mDct.setEnabled(0, true);
47427b650c406018355a88a41528db7859e232728a0Jack Yu        waitForMs(200);
4757d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4761d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        sb.setLength(0);
4771d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        allowed = isDataAllowed(sb);
4781d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        assertTrue(sb.toString(), allowed);
4791d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu
4807d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Verify if RIL command was sent properly.
4817d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
4827d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS), eq(0), eq(FAKE_APN1),
4837d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(""), eq(""), eq(0), eq("IP"), any(Message.class));
4847d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4857d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Make sure we never notify connected because the data call setup is supposed to fail.
4867d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mPhone, never()).notifyDataConnection(eq(Phone.REASON_CONNECTED),
4877d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(PhoneConstants.APN_TYPE_DEFAULT));
4887d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4897d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Verify the retry manger schedule another data call setup.
4907d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mAlarmManager, times(1)).setExact(eq(AlarmManager.ELAPSED_REALTIME_WAKEUP),
4917d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                anyLong(), any(PendingIntent.class));
4927d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4937d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // This time we'll let RIL command succeed.
4947d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mSimulatedCommands.setDataCallResponse(true, createDataCallResponse());
4957d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4967d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Simulate the timer expires.
4977d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        Intent intent = new Intent("com.android.internal.telephony.data-reconnect.default");
4987d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        intent.putExtra("reconnect_alarm_extra_type", PhoneConstants.APN_TYPE_DEFAULT);
4997d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, 0);
5007d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
5017d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mContext.sendBroadcast(intent);
5027d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        waitForMs(200);
5037d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5047d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Verify if RIL command was sent properly.
5057d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
5067d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS), eq(0), eq(FAKE_APN2),
5077d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(""), eq(""), eq(0), eq("IP"), any(Message.class));
5087d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5097d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Verify connected with APN2 setting.
5107d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verifyDataConnected(FAKE_APN2);
51127b650c406018355a88a41528db7859e232728a0Jack Yu    }
512783061ca03572618c01ce244d70d82fa4328d45ffionaxu
513783061ca03572618c01ce244d70d82fa4328d45ffionaxu    @Test
514783061ca03572618c01ce244d70d82fa4328d45ffionaxu    @MediumTest
515783061ca03572618c01ce244d70d82fa4328d45ffionaxu    public void testUserDisableData() throws Exception {
516783061ca03572618c01ce244d70d82fa4328d45ffionaxu        //step 1: setup two DataCalls one for Metered: default, another one for Non-metered: IMS
517783061ca03572618c01ce244d70d82fa4328d45ffionaxu        //set Default and MMS to be metered in the CarrierConfigManager
518783061ca03572618c01ce244d70d82fa4328d45ffionaxu        boolean dataEnabled = mDct.getDataEnabled();
519783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
520783061ca03572618c01ce244d70d82fa4328d45ffionaxu                new String[]{PhoneConstants.APN_TYPE_DEFAULT, PhoneConstants.APN_TYPE_MMS});
521783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setEnabled(5, true);
522783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setEnabled(0, true);
523783061ca03572618c01ce244d70d82fa4328d45ffionaxu
524783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending EVENT_RECORDS_LOADED");
525783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
526783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
527783061ca03572618c01ce244d70d82fa4328d45ffionaxu
528783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
529783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
530783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
531783061ca03572618c01ce244d70d82fa4328d45ffionaxu
532783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending DATA_ENABLED_CMD");
533783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setDataEnabled(true);
534783061ca03572618c01ce244d70d82fa4328d45ffionaxu
535783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
536783061ca03572618c01ce244d70d82fa4328d45ffionaxu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
537783061ca03572618c01ce244d70d82fa4328d45ffionaxu                eq(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS), eq(0), eq(FAKE_APN1),
538783061ca03572618c01ce244d70d82fa4328d45ffionaxu                eq(""), eq(""), eq(0), eq("IP"), any(Message.class));
539783061ca03572618c01ce244d70d82fa4328d45ffionaxu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
540783061ca03572618c01ce244d70d82fa4328d45ffionaxu                eq(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS), eq(2), eq(FAKE_APN3),
541783061ca03572618c01ce244d70d82fa4328d45ffionaxu                eq(""), eq(""), eq(3), eq("IP"), any(Message.class));
542783061ca03572618c01ce244d70d82fa4328d45ffionaxu
543783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending DATA_DISABLED_CMD");
544783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setDataEnabled(false);
545783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
546783061ca03572618c01ce244d70d82fa4328d45ffionaxu
547783061ca03572618c01ce244d70d82fa4328d45ffionaxu        // expected tear down all metered DataConnections
548783061ca03572618c01ce244d70d82fa4328d45ffionaxu        verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall(anyInt(), anyInt(),
549783061ca03572618c01ce244d70d82fa4328d45ffionaxu                any(Message.class));
550783061ca03572618c01ce244d70d82fa4328d45ffionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
551783061ca03572618c01ce244d70d82fa4328d45ffionaxu        assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT));
552783061ca03572618c01ce244d70d82fa4328d45ffionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS));
553783061ca03572618c01ce244d70d82fa4328d45ffionaxu
554783061ca03572618c01ce244d70d82fa4328d45ffionaxu        // reset the setting at the end of this test
555783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setDataEnabled(dataEnabled);
556783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
557783061ca03572618c01ce244d70d82fa4328d45ffionaxu    }
558783061ca03572618c01ce244d70d82fa4328d45ffionaxu
559783061ca03572618c01ce244d70d82fa4328d45ffionaxu    @Test
560783061ca03572618c01ce244d70d82fa4328d45ffionaxu    @MediumTest
561783061ca03572618c01ce244d70d82fa4328d45ffionaxu    public void testUserDisableRoaming() throws Exception {
562783061ca03572618c01ce244d70d82fa4328d45ffionaxu        //step 1: setup two DataCalls one for Metered: default, another one for Non-metered: IMS
563783061ca03572618c01ce244d70d82fa4328d45ffionaxu        //set Default and MMS to be metered in the CarrierConfigManager
564783061ca03572618c01ce244d70d82fa4328d45ffionaxu        boolean roamingEnabled = mDct.getDataOnRoamingEnabled();
565783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
566783061ca03572618c01ce244d70d82fa4328d45ffionaxu                new String[]{PhoneConstants.APN_TYPE_DEFAULT, PhoneConstants.APN_TYPE_MMS});
567783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setEnabled(5, true);
568783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setEnabled(0, true);
569783061ca03572618c01ce244d70d82fa4328d45ffionaxu
570783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending EVENT_RECORDS_LOADED");
571783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
572783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
573783061ca03572618c01ce244d70d82fa4328d45ffionaxu
574783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
575783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
576783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
577783061ca03572618c01ce244d70d82fa4328d45ffionaxu
578783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending DATA_ENABLED_CMD");
579783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setDataEnabled(true);
580783061ca03572618c01ce244d70d82fa4328d45ffionaxu
581783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
582783061ca03572618c01ce244d70d82fa4328d45ffionaxu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
583783061ca03572618c01ce244d70d82fa4328d45ffionaxu                eq(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS), eq(0), eq(FAKE_APN1),
584783061ca03572618c01ce244d70d82fa4328d45ffionaxu                eq(""), eq(""), eq(0), eq("IP"), any(Message.class));
585783061ca03572618c01ce244d70d82fa4328d45ffionaxu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
586783061ca03572618c01ce244d70d82fa4328d45ffionaxu                eq(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS), eq(2), eq(FAKE_APN3),
587783061ca03572618c01ce244d70d82fa4328d45ffionaxu                eq(""), eq(""), eq(3), eq("IP"), any(Message.class));
588783061ca03572618c01ce244d70d82fa4328d45ffionaxu
589783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending DISABLE_ROAMING_CMD");
590783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setDataOnRoamingEnabled(false);
591783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_ROAMING_ON));
592783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
593783061ca03572618c01ce244d70d82fa4328d45ffionaxu
594783061ca03572618c01ce244d70d82fa4328d45ffionaxu        // expected tear down all metered DataConnections
595783061ca03572618c01ce244d70d82fa4328d45ffionaxu        verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall(anyInt(), anyInt(),
596783061ca03572618c01ce244d70d82fa4328d45ffionaxu                any(Message.class));
597783061ca03572618c01ce244d70d82fa4328d45ffionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
598783061ca03572618c01ce244d70d82fa4328d45ffionaxu        assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT));
599783061ca03572618c01ce244d70d82fa4328d45ffionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS));
600783061ca03572618c01ce244d70d82fa4328d45ffionaxu
601783061ca03572618c01ce244d70d82fa4328d45ffionaxu        // reset roaming settings at end of this test
602783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setDataOnRoamingEnabled(roamingEnabled);
603783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
604783061ca03572618c01ce244d70d82fa4328d45ffionaxu    }
605783061ca03572618c01ce244d70d82fa4328d45ffionaxu}
606