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
198e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
200e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yuimport static com.android.internal.telephony.dataconnection.ApnSettingTest.createApnSetting;
218e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
228e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.junit.Assert.assertArrayEquals;
238e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.junit.Assert.assertEquals;
248e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.junit.Assert.assertFalse;
258e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.junit.Assert.assertTrue;
268e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.junit.Assert.fail;
278e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Matchers.any;
288e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Matchers.anyInt;
298e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Matchers.anyLong;
308e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Matchers.anyString;
318e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Matchers.eq;
328e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Mockito.doAnswer;
338e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Mockito.doReturn;
348e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Mockito.never;
358e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Mockito.times;
368e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Mockito.verify;
378e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
3827b650c406018355a88a41528db7859e232728a0Jack Yuimport android.app.AlarmManager;
3927b650c406018355a88a41528db7859e232728a0Jack Yuimport android.app.PendingIntent;
4027b650c406018355a88a41528db7859e232728a0Jack Yuimport android.content.Context;
417d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yuimport android.content.Intent;
4227b650c406018355a88a41528db7859e232728a0Jack Yuimport android.database.Cursor;
4327b650c406018355a88a41528db7859e232728a0Jack Yuimport android.database.MatrixCursor;
4427b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.LinkProperties;
450979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yuimport android.net.NetworkCapabilities;
460979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yuimport android.net.NetworkRequest;
4727b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.Uri;
4840cd4e909fd3a8ee462475814a949e08391ff8f5fionaxuimport android.os.AsyncResult;
4927b650c406018355a88a41528db7859e232728a0Jack Yuimport android.os.HandlerThread;
50783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yuimport android.os.IBinder;
5127b650c406018355a88a41528db7859e232728a0Jack Yuimport android.os.Message;
52783061ca03572618c01ce244d70d82fa4328d45ffionaxuimport android.os.PersistableBundle;
535fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajanimport android.provider.Settings;
5427b650c406018355a88a41528db7859e232728a0Jack Yuimport android.provider.Telephony;
55e73ef117c8f5a7ea2feaa9ba8a15ec2de4137c7dJordan Liuimport android.support.test.filters.FlakyTest;
56783061ca03572618c01ce244d70d82fa4328d45ffionaxuimport android.telephony.CarrierConfigManager;
5727b650c406018355a88a41528db7859e232728a0Jack Yuimport android.telephony.ServiceState;
584c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxuimport android.telephony.SubscriptionInfo;
594c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxuimport android.telephony.SubscriptionManager;
6027b650c406018355a88a41528db7859e232728a0Jack Yuimport android.test.mock.MockContentProvider;
6127b650c406018355a88a41528db7859e232728a0Jack Yuimport android.test.mock.MockContentResolver;
6227b650c406018355a88a41528db7859e232728a0Jack Yuimport android.test.suitebuilder.annotation.MediumTest;
630e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yuimport android.test.suitebuilder.annotation.SmallTest;
640979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yuimport android.util.LocalLog;
6527b650c406018355a88a41528db7859e232728a0Jack Yu
66e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.DctConstants;
67e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.ISub;
68e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.Phone;
69e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.PhoneConstants;
70e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.TelephonyTest;
7127b650c406018355a88a41528db7859e232728a0Jack Yu
7227b650c406018355a88a41528db7859e232728a0Jack Yuimport org.junit.After;
7327b650c406018355a88a41528db7859e232728a0Jack Yuimport org.junit.Before;
74802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport org.junit.Ignore;
7527b650c406018355a88a41528db7859e232728a0Jack Yuimport org.junit.Test;
7627b650c406018355a88a41528db7859e232728a0Jack Yuimport org.mockito.ArgumentCaptor;
77783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yuimport org.mockito.Mock;
784c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxuimport org.mockito.invocation.InvocationOnMock;
794c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxuimport org.mockito.stubbing.Answer;
8027b650c406018355a88a41528db7859e232728a0Jack Yu
811d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yuimport java.lang.reflect.Method;
8227b650c406018355a88a41528db7859e232728a0Jack Yuimport java.util.Arrays;
8327b650c406018355a88a41528db7859e232728a0Jack Yuimport java.util.List;
8427b650c406018355a88a41528db7859e232728a0Jack Yuimport java.util.regex.Matcher;
8527b650c406018355a88a41528db7859e232728a0Jack Yuimport java.util.regex.Pattern;
8627b650c406018355a88a41528db7859e232728a0Jack Yu
8727b650c406018355a88a41528db7859e232728a0Jack Yupublic class DcTrackerTest extends TelephonyTest {
8827b650c406018355a88a41528db7859e232728a0Jack Yu
8927b650c406018355a88a41528db7859e232728a0Jack Yu    private final static String[] sNetworkAttributes = new String[]{
9027b650c406018355a88a41528db7859e232728a0Jack Yu            "mobile,0,0,0,-1,true", "mobile_mms,2,0,2,60000,true",
9127b650c406018355a88a41528db7859e232728a0Jack Yu            "mobile_supl,3,0,2,60000,true", "mobile_dun,4,0,2,60000,true",
9227b650c406018355a88a41528db7859e232728a0Jack Yu            "mobile_hipri,5,0,3,60000,true", "mobile_fota,10,0,2,60000,true",
9327b650c406018355a88a41528db7859e232728a0Jack Yu            "mobile_ims,11,0,2,60000,true", "mobile_cbs,12,0,2,60000,true",
9427b650c406018355a88a41528db7859e232728a0Jack Yu            "mobile_ia,14,0,2,-1,true", "mobile_emergency,15,0,2,-1,true"};
9527b650c406018355a88a41528db7859e232728a0Jack Yu
961d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu    private final static List<String> sApnTypes = Arrays.asList(
9727b650c406018355a88a41528db7859e232728a0Jack Yu            "default", "mms", "cbs", "fota", "supl", "ia", "emergency", "dun", "hipri", "ims");
98ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu    private static final int LTE_BEARER_BITMASK = 1 << (ServiceState.RIL_RADIO_TECHNOLOGY_LTE - 1);
99ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu    private static final int EHRPD_BEARER_BITMASK =
100ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu            1 << (ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD - 1);
1018e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    public static final String FAKE_APN1 = "FAKE APN 1";
1028e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    public static final String FAKE_APN2 = "FAKE APN 2";
1038e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    public static final String FAKE_APN3 = "FAKE APN 3";
104ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu    public static final String FAKE_APN4 = "FAKE APN 4";
1055fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan    public static final String FAKE_APN5 = "FAKE APN 5";
1068e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    public static final String FAKE_IFNAME = "FAKE IFNAME";
1078e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    public static final String FAKE_PCSCF_ADDRESS = "22.33.44.55";
1088e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    public static final String FAKE_GATEWAY = "11.22.33.44";
1098e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    public static final String FAKE_DNS = "55.66.77.88";
1108e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    public static final String FAKE_ADDRESS = "99.88.77.66";
11127b650c406018355a88a41528db7859e232728a0Jack Yu
112783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu    @Mock
113783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu    ISub mIsub;
114783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu    @Mock
115783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu    IBinder mBinder;
1160979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu    @Mock
1170979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu    NetworkRequest mNetworkRequest;
1184c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    @Mock
1194c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    SubscriptionInfo mSubscriptionInfo;
1200e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @Mock
1210e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    ApnContext mApnContext;
1220e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @Mock
1230e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    ApnSetting mApnSetting;
1240e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @Mock
1250e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    DcAsyncChannel mDcac;
126783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu
12727b650c406018355a88a41528db7859e232728a0Jack Yu    private DcTracker mDct;
1287e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan    private DcTrackerTestHandler mDcTrackerTestHandler;
12927b650c406018355a88a41528db7859e232728a0Jack Yu
13027b650c406018355a88a41528db7859e232728a0Jack Yu    private AlarmManager mAlarmManager;
13127b650c406018355a88a41528db7859e232728a0Jack Yu
132783061ca03572618c01ce244d70d82fa4328d45ffionaxu    private PersistableBundle mBundle;
133783061ca03572618c01ce244d70d82fa4328d45ffionaxu
1344c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    private SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangedListener;
1354c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu
13627b650c406018355a88a41528db7859e232728a0Jack Yu    private final ApnSettingContentProvider mApnSettingContentProvider =
13727b650c406018355a88a41528db7859e232728a0Jack Yu            new ApnSettingContentProvider();
13827b650c406018355a88a41528db7859e232728a0Jack Yu
13927b650c406018355a88a41528db7859e232728a0Jack Yu    private class DcTrackerTestHandler extends HandlerThread {
14027b650c406018355a88a41528db7859e232728a0Jack Yu
14127b650c406018355a88a41528db7859e232728a0Jack Yu        private DcTrackerTestHandler(String name) {
14227b650c406018355a88a41528db7859e232728a0Jack Yu            super(name);
14327b650c406018355a88a41528db7859e232728a0Jack Yu        }
14427b650c406018355a88a41528db7859e232728a0Jack Yu
14527b650c406018355a88a41528db7859e232728a0Jack Yu        @Override
14627b650c406018355a88a41528db7859e232728a0Jack Yu        public void onLooperPrepared() {
14727b650c406018355a88a41528db7859e232728a0Jack Yu            mDct = new DcTracker(mPhone);
14827b650c406018355a88a41528db7859e232728a0Jack Yu            setReady(true);
14927b650c406018355a88a41528db7859e232728a0Jack Yu        }
15027b650c406018355a88a41528db7859e232728a0Jack Yu    }
15127b650c406018355a88a41528db7859e232728a0Jack Yu
15227b650c406018355a88a41528db7859e232728a0Jack Yu    private class ApnSettingContentProvider extends MockContentProvider {
15327b650c406018355a88a41528db7859e232728a0Jack Yu
15427b650c406018355a88a41528db7859e232728a0Jack Yu        @Override
15527b650c406018355a88a41528db7859e232728a0Jack Yu        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
15627b650c406018355a88a41528db7859e232728a0Jack Yu                            String sortOrder) {
15727b650c406018355a88a41528db7859e232728a0Jack Yu            logd("ApnSettingContentProvider: query");
15827b650c406018355a88a41528db7859e232728a0Jack Yu            logd("   uri = " + uri);
15927b650c406018355a88a41528db7859e232728a0Jack Yu            logd("   projection = " + Arrays.toString(projection));
16027b650c406018355a88a41528db7859e232728a0Jack Yu            logd("   selection = " + selection);
16127b650c406018355a88a41528db7859e232728a0Jack Yu            logd("   selectionArgs = " + Arrays.toString(selectionArgs));
16227b650c406018355a88a41528db7859e232728a0Jack Yu            logd("   sortOrder = " + sortOrder);
16327b650c406018355a88a41528db7859e232728a0Jack Yu
16427b650c406018355a88a41528db7859e232728a0Jack Yu            if (uri.compareTo(Telephony.Carriers.CONTENT_URI) == 0) {
16527b650c406018355a88a41528db7859e232728a0Jack Yu                if (projection == null && selectionArgs == null && selection != null) {
16627b650c406018355a88a41528db7859e232728a0Jack Yu
16727b650c406018355a88a41528db7859e232728a0Jack Yu                    Pattern pattern = Pattern.compile("^numeric = '([0-9]*)'");
16827b650c406018355a88a41528db7859e232728a0Jack Yu                    Matcher matcher = pattern.matcher(selection);
16927b650c406018355a88a41528db7859e232728a0Jack Yu                    if (!matcher.find()) {
17027b650c406018355a88a41528db7859e232728a0Jack Yu                        logd("Cannot find MCC/MNC from " + selection);
17127b650c406018355a88a41528db7859e232728a0Jack Yu                        return null;
17227b650c406018355a88a41528db7859e232728a0Jack Yu                    }
17327b650c406018355a88a41528db7859e232728a0Jack Yu
17427b650c406018355a88a41528db7859e232728a0Jack Yu                    String plmn = matcher.group(1);
17527b650c406018355a88a41528db7859e232728a0Jack Yu
17627b650c406018355a88a41528db7859e232728a0Jack Yu                    logd("Query '" + plmn + "' APN settings");
17727b650c406018355a88a41528db7859e232728a0Jack Yu                    MatrixCursor mc = new MatrixCursor(
17827b650c406018355a88a41528db7859e232728a0Jack Yu                            new String[]{Telephony.Carriers._ID, Telephony.Carriers.NUMERIC,
17927b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.NAME, Telephony.Carriers.APN,
18027b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.PROXY, Telephony.Carriers.PORT,
18127b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MMSC, Telephony.Carriers.MMSPROXY,
18227b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MMSPORT, Telephony.Carriers.USER,
18327b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.PASSWORD, Telephony.Carriers.AUTH_TYPE,
18427b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.TYPE,
18527b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.PROTOCOL,
18627b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.ROAMING_PROTOCOL,
18727b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.CARRIER_ENABLED, Telephony.Carriers.BEARER,
18827b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.BEARER_BITMASK,
18927b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.PROFILE_ID,
19027b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MODEM_COGNITIVE,
19127b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MAX_CONNS, Telephony.Carriers.WAIT_TIME,
19227b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MAX_CONNS_TIME, Telephony.Carriers.MTU,
19327b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MVNO_TYPE,
19427b650c406018355a88a41528db7859e232728a0Jack Yu                                    Telephony.Carriers.MVNO_MATCH_DATA});
19527b650c406018355a88a41528db7859e232728a0Jack Yu
19627b650c406018355a88a41528db7859e232728a0Jack Yu                    mc.addRow(new Object[]{
19727b650c406018355a88a41528db7859e232728a0Jack Yu                            2163,                   // id
19827b650c406018355a88a41528db7859e232728a0Jack Yu                            plmn,                   // numeric
19927b650c406018355a88a41528db7859e232728a0Jack Yu                            "sp-mode",              // name
20027b650c406018355a88a41528db7859e232728a0Jack Yu                            FAKE_APN1,              // apn
20127b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // proxy
20227b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // port
20327b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsc
20427b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsproxy
20527b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsport
20627b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // user
20727b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // password
20827b650c406018355a88a41528db7859e232728a0Jack Yu                            -1,                     // authtype
20927b650c406018355a88a41528db7859e232728a0Jack Yu                            "default,supl",         // types
21027b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // protocol
21127b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // roaming_protocol
21227b650c406018355a88a41528db7859e232728a0Jack Yu                            1,                      // carrier_enabled
213ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            ServiceState.RIL_RADIO_TECHNOLOGY_LTE, // bearer
21427b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // bearer_bitmask
21527b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // profile_id
21627b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // modem_cognitive
21727b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns
21827b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // wait_time
21927b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns_time
22027b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // mtu
22127b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mvno_type
22227b650c406018355a88a41528db7859e232728a0Jack Yu                            ""                      // mnvo_match_data
22327b650c406018355a88a41528db7859e232728a0Jack Yu                    });
22427b650c406018355a88a41528db7859e232728a0Jack Yu
22527b650c406018355a88a41528db7859e232728a0Jack Yu                    mc.addRow(new Object[]{
22627b650c406018355a88a41528db7859e232728a0Jack Yu                            2164,                   // id
22727b650c406018355a88a41528db7859e232728a0Jack Yu                            plmn,                   // numeric
22827b650c406018355a88a41528db7859e232728a0Jack Yu                            "mopera U",             // name
22927b650c406018355a88a41528db7859e232728a0Jack Yu                            FAKE_APN2,              // apn
23027b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // proxy
23127b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // port
23227b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsc
23327b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsproxy
23427b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsport
23527b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // user
23627b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // password
23727b650c406018355a88a41528db7859e232728a0Jack Yu                            -1,                     // authtype
23827b650c406018355a88a41528db7859e232728a0Jack Yu                            "default,supl",         // types
23927b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // protocol
24027b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // roaming_protocol
24127b650c406018355a88a41528db7859e232728a0Jack Yu                            1,                      // carrier_enabled
242ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            ServiceState.RIL_RADIO_TECHNOLOGY_LTE, // bearer,
24327b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // bearer_bitmask
24427b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // profile_id
24527b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // modem_cognitive
24627b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns
24727b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // wait_time
24827b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns_time
24927b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // mtu
25027b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mvno_type
25127b650c406018355a88a41528db7859e232728a0Jack Yu                            ""                      // mnvo_match_data
25227b650c406018355a88a41528db7859e232728a0Jack Yu                    });
25327b650c406018355a88a41528db7859e232728a0Jack Yu
25427b650c406018355a88a41528db7859e232728a0Jack Yu                    mc.addRow(new Object[]{
25527b650c406018355a88a41528db7859e232728a0Jack Yu                            2165,                   // id
25627b650c406018355a88a41528db7859e232728a0Jack Yu                            plmn,                   // numeric
25727b650c406018355a88a41528db7859e232728a0Jack Yu                            "b-mobile for Nexus",   // name
25827b650c406018355a88a41528db7859e232728a0Jack Yu                            FAKE_APN3,              // apn
25927b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // proxy
26027b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // port
26127b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsc
26227b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsproxy
26327b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mmsport
26427b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // user
26527b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // password
2668e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                            -1,                     // authtype
267783061ca03572618c01ce244d70d82fa4328d45ffionaxu                            "ims",                  // types
26827b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // protocol
26927b650c406018355a88a41528db7859e232728a0Jack Yu                            "IP",                   // roaming_protocol
27027b650c406018355a88a41528db7859e232728a0Jack Yu                            1,                      // carrier_enabled
27127b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // bearer
27227b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // bearer_bitmask
27327b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // profile_id
27427b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // modem_cognitive
27527b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns
27627b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // wait_time
27727b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // max_conns_time
27827b650c406018355a88a41528db7859e232728a0Jack Yu                            0,                      // mtu
27927b650c406018355a88a41528db7859e232728a0Jack Yu                            "",                     // mvno_type
28027b650c406018355a88a41528db7859e232728a0Jack Yu                            ""                      // mnvo_match_data
28127b650c406018355a88a41528db7859e232728a0Jack Yu                    });
28227b650c406018355a88a41528db7859e232728a0Jack Yu
283ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                    mc.addRow(new Object[]{
284ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            2166,                   // id
285ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            plmn,                   // numeric
286ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "sp-mode ehrpd",        // name
287ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            FAKE_APN4,              // apn
288ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "",                     // proxy
289ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "",                     // port
290ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "",                     // mmsc
291ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "",                     // mmsproxy
292ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "",                     // mmsport
293ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "",                     // user
294ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "",                     // password
295ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            -1,                     // authtype
296ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "default,supl",         // types
297ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "IP",                   // protocol
298ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "IP",                   // roaming_protocol
299ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            1,                      // carrier_enabled
300ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD, // bearer
301ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            0,                      // bearer_bitmask
302ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            0,                      // profile_id
303ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            0,                      // modem_cognitive
304ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            0,                      // max_conns
305ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            0,                      // wait_time
306ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            0,                      // max_conns_time
307ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            0,                      // mtu
308ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            "",                     // mvno_type
309ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                            ""                      // mnvo_match_data
310ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                    });
311ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu
3125fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                    mc.addRow(new Object[]{
3135fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            2166,                   // id
3145fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            plmn,                   // numeric
3155fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "b-mobile for Nexus",   // name
3165fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            FAKE_APN5,              // apn
3175fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "",                     // proxy
3185fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "",                     // port
3195fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "",                     // mmsc
3205fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "",                     // mmsproxy
3215fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "",                     // mmsport
3225fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "",                     // user
3235fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "",                     // password
3245fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            -1,                     // authtype
3255fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "dun",                  // types
3265fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "IP",                   // protocol
3275fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "IP",                   // roaming_protocol
3285fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            1,                      // carrier_enabled
3295fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            0,                      // bearer
3305fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            0,                      // bearer_bitmask
3315fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            0,                      // profile_id
3325fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            0,                      // modem_cognitive
3335fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            0,                      // max_conns
3345fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            0,                      // wait_time
3355fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            0,                      // max_conns_time
3365fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            0,                      // mtu
3375fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            "",                     // mvno_type
3385fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                            ""                      // mnvo_match_data
3395fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                    });
34027b650c406018355a88a41528db7859e232728a0Jack Yu                    return mc;
34127b650c406018355a88a41528db7859e232728a0Jack Yu                }
34227b650c406018355a88a41528db7859e232728a0Jack Yu            }
34327b650c406018355a88a41528db7859e232728a0Jack Yu
34427b650c406018355a88a41528db7859e232728a0Jack Yu            return null;
34527b650c406018355a88a41528db7859e232728a0Jack Yu        }
34627b650c406018355a88a41528db7859e232728a0Jack Yu    }
34727b650c406018355a88a41528db7859e232728a0Jack Yu
34827b650c406018355a88a41528db7859e232728a0Jack Yu    @Before
34927b650c406018355a88a41528db7859e232728a0Jack Yu    public void setUp() throws Exception {
35027b650c406018355a88a41528db7859e232728a0Jack Yu        logd("DcTrackerTest +Setup!");
35127b650c406018355a88a41528db7859e232728a0Jack Yu        super.setUp(getClass().getSimpleName());
35227b650c406018355a88a41528db7859e232728a0Jack Yu
35327b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn("fake.action_detached").when(mPhone).getActionDetached();
35427b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn("fake.action_attached").when(mPhone).getActionAttached();
355ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_LTE).when(mServiceState)
356ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                .getRilDataRadioTechnology();
35727b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn("44010").when(mSimRecords).getOperatorNumeric();
35827b650c406018355a88a41528db7859e232728a0Jack Yu
35927b650c406018355a88a41528db7859e232728a0Jack Yu        mContextFixture.putStringArrayResource(com.android.internal.R.array.networkAttributes,
36027b650c406018355a88a41528db7859e232728a0Jack Yu                sNetworkAttributes);
36127b650c406018355a88a41528db7859e232728a0Jack Yu        mContextFixture.putStringArrayResource(com.android.internal.R.array.
36227b650c406018355a88a41528db7859e232728a0Jack Yu                config_mobile_tcp_buffers, new String[]{
36327b650c406018355a88a41528db7859e232728a0Jack Yu                "umts:131072,262144,1452032,4096,16384,399360",
36427b650c406018355a88a41528db7859e232728a0Jack Yu                "hspa:131072,262144,2441216,4096,16384,399360",
36527b650c406018355a88a41528db7859e232728a0Jack Yu                "hsupa:131072,262144,2441216,4096,16384,399360",
36627b650c406018355a88a41528db7859e232728a0Jack Yu                "hsdpa:131072,262144,2441216,4096,16384,399360",
36727b650c406018355a88a41528db7859e232728a0Jack Yu                "hspap:131072,262144,2441216,4096,16384,399360",
36827b650c406018355a88a41528db7859e232728a0Jack Yu                "edge:16384,32768,131072,4096,16384,65536",
36927b650c406018355a88a41528db7859e232728a0Jack Yu                "gprs:4096,8192,24576,4096,8192,24576",
37027b650c406018355a88a41528db7859e232728a0Jack Yu                "1xrtt:16384,32768,131070,4096,16384,102400",
37127b650c406018355a88a41528db7859e232728a0Jack Yu                "evdo:131072,262144,1048576,4096,16384,524288",
37227b650c406018355a88a41528db7859e232728a0Jack Yu                "lte:524288,1048576,8388608,262144,524288,4194304"});
37327b650c406018355a88a41528db7859e232728a0Jack Yu
3747d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        ((MockContentResolver) mContext.getContentResolver()).addProvider(
37527b650c406018355a88a41528db7859e232728a0Jack Yu                Telephony.Carriers.CONTENT_URI.getAuthority(), mApnSettingContentProvider);
37627b650c406018355a88a41528db7859e232728a0Jack Yu
37727b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn(true).when(mSimRecords).getRecordsLoaded();
37827b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn(PhoneConstants.State.IDLE).when(mCT).getState();
37927b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn(true).when(mSST).getDesiredPowerState();
380f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu        doReturn(true).when(mSST).getPowerStateFromCarrier();
3814c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        doAnswer(
3824c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                new Answer<Void>() {
3834c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                    @Override
3844c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                    public Void answer(InvocationOnMock invocation) throws Throwable {
3854c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                        mOnSubscriptionsChangedListener =
3864c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                                (SubscriptionManager.OnSubscriptionsChangedListener)
3874c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                                        invocation.getArguments()[0];
3884c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                        return null;
3894c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                    }
3904c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                }
3914c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        ).when(mSubscriptionManager).addOnSubscriptionsChangedListener(any());
3924c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(anyInt());
39327b650c406018355a88a41528db7859e232728a0Jack Yu
394783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu        doReturn(1).when(mIsub).getDefaultDataSubId();
395783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu        doReturn(mIsub).when(mBinder).queryLocalInterface(anyString());
3961d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        mServiceManagerMockedServices.put("isub", mBinder);
397783e33ac9e332b7eefa6bb125fbdb82e0c928c73Jack Yu
39891abb5484d609dd4f117dd3dc234fe9a1b619c91Jack Yu        mContextFixture.putStringArrayResource(
39991abb5484d609dd4f117dd3dc234fe9a1b619c91Jack Yu                com.android.internal.R.array.config_cell_retries_per_error_code,
40091abb5484d609dd4f117dd3dc234fe9a1b619c91Jack Yu                new String[]{"36,2"});
40191abb5484d609dd4f117dd3dc234fe9a1b619c91Jack Yu
4027d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
403783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mBundle = mContextFixture.getCarrierConfigBundle();
40427b650c406018355a88a41528db7859e232728a0Jack Yu
4050e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mSimulatedCommands.setDataCallResponse(true, createDataCallResponse());
4060e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
4077e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mDcTrackerTestHandler = new DcTrackerTestHandler(getClass().getSimpleName());
4087e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mDcTrackerTestHandler.start();
40927b650c406018355a88a41528db7859e232728a0Jack Yu        waitUntilReady();
41027b650c406018355a88a41528db7859e232728a0Jack Yu        waitForMs(600);
41127b650c406018355a88a41528db7859e232728a0Jack Yu        logd("DcTrackerTest -Setup!");
41227b650c406018355a88a41528db7859e232728a0Jack Yu    }
41327b650c406018355a88a41528db7859e232728a0Jack Yu
41427b650c406018355a88a41528db7859e232728a0Jack Yu    @After
41527b650c406018355a88a41528db7859e232728a0Jack Yu    public void tearDown() throws Exception {
41627b650c406018355a88a41528db7859e232728a0Jack Yu        logd("DcTrackerTest -tearDown");
41727b650c406018355a88a41528db7859e232728a0Jack Yu        mDct.removeCallbacksAndMessages(null);
41827b650c406018355a88a41528db7859e232728a0Jack Yu        mDct = null;
419ae6e8f99bdb297f906d6dcdc0a385ba27eee47fdJack Yu        mDcTrackerTestHandler.quit();
42027b650c406018355a88a41528db7859e232728a0Jack Yu        super.tearDown();
42127b650c406018355a88a41528db7859e232728a0Jack Yu    }
42227b650c406018355a88a41528db7859e232728a0Jack Yu
4237d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    // Create a successful data response
4243a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    public static DataCallResponse createDataCallResponse() {
4257d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
4268e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        return new DataCallResponse(0, -1, 1, 2, "IP", FAKE_IFNAME,
4278e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                FAKE_ADDRESS, FAKE_DNS, FAKE_GATEWAY, FAKE_PCSCF_ADDRESS, 1440);
4288e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    }
4298e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
4308e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    private void verifyDataProfile(DataProfile dp, String apn, int profileId,
431ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                                   int supportedApnTypesBitmap, int type, int bearerBitmask) {
4328e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals(profileId, dp.profileId);
4338e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals(apn, dp.apn);
4348e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals("IP", dp.protocol);
4358e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals(0, dp.authType);
4368e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals("", dp.user);
4378e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals("", dp.password);
438ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        assertEquals(type, dp.type);
4398e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals(0, dp.maxConnsTime);
4408e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals(0, dp.maxConns);
4418e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals(0, dp.waitTime);
4428e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertTrue(dp.enabled);
4438e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals(supportedApnTypesBitmap, dp.supportedApnTypesBitmap);
4448e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals("IP", dp.roamingProtocol);
445ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        assertEquals(bearerBitmask, dp.bearerBitmap);
4468e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals(0, dp.mtu);
4478e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals("", dp.mvnoType);
4488e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals("", dp.mvnoMatchData);
4498e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertFalse(dp.modemCognitive);
4507d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    }
45127b650c406018355a88a41528db7859e232728a0Jack Yu
4527d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    private void verifyDataConnected(final String apnSetting) {
45327b650c406018355a88a41528db7859e232728a0Jack Yu        verify(mPhone, times(1)).notifyDataConnection(eq(Phone.REASON_CONNECTED),
45427b650c406018355a88a41528db7859e232728a0Jack Yu                eq(PhoneConstants.APN_TYPE_DEFAULT));
45527b650c406018355a88a41528db7859e232728a0Jack Yu
456bff465198e751438912fd301fbf20a8d35da1b95Jack Yu        verify(mAlarmManager, times(1)).set(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
45727b650c406018355a88a41528db7859e232728a0Jack Yu                any(PendingIntent.class));
45827b650c406018355a88a41528db7859e232728a0Jack Yu
4597d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        assertEquals(apnSetting, mDct.getActiveApnString(PhoneConstants.APN_TYPE_DEFAULT));
46027b650c406018355a88a41528db7859e232728a0Jack Yu        assertArrayEquals(new String[]{PhoneConstants.APN_TYPE_DEFAULT}, mDct.getActiveApnTypes());
46127b650c406018355a88a41528db7859e232728a0Jack Yu
46227b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
46327b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT));
46427b650c406018355a88a41528db7859e232728a0Jack Yu
46527b650c406018355a88a41528db7859e232728a0Jack Yu        LinkProperties linkProperties = mDct.getLinkProperties(PhoneConstants.APN_TYPE_DEFAULT);
46627b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(FAKE_IFNAME, linkProperties.getInterfaceName());
46727b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(1, linkProperties.getAddresses().size());
46827b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(FAKE_ADDRESS, linkProperties.getAddresses().get(0).getHostAddress());
46927b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(1, linkProperties.getDnsServers().size());
47027b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(FAKE_DNS, linkProperties.getDnsServers().get(0).getHostAddress());
47127b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(FAKE_GATEWAY, linkProperties.getRoutes().get(0).getGateway().getHostAddress());
47227b650c406018355a88a41528db7859e232728a0Jack Yu    }
47327b650c406018355a88a41528db7859e232728a0Jack Yu
474fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu    private boolean isDataAllowed(DataConnectionReasons dataConnectionReasons) {
4751d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        try {
4763d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu            Method method = DcTracker.class.getDeclaredMethod("isDataAllowed",
477fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu                    DataConnectionReasons.class);
4781d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu            method.setAccessible(true);
479fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu            return (boolean) method.invoke(mDct, dataConnectionReasons);
4801d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        } catch (Exception e) {
4811d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu            fail(e.toString());
4821d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu            return false;
4831d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu        }
4841d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu    }
4851d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu
4867d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    // Test the normal data call setup scenario.
48727b650c406018355a88a41528db7859e232728a0Jack Yu    @Test
48827b650c406018355a88a41528db7859e232728a0Jack Yu    @MediumTest
48927b650c406018355a88a41528db7859e232728a0Jack Yu    public void testDataSetup() {
49027b650c406018355a88a41528db7859e232728a0Jack Yu
4910979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mDct.setDataEnabled(true);
4920979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
4937d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mSimulatedCommands.setDataCallResponse(true, createDataCallResponse());
4947d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
495fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        DataConnectionReasons dataConnectionReasons = new DataConnectionReasons();
496fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        boolean allowed = isDataAllowed(dataConnectionReasons);
497fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        assertFalse(dataConnectionReasons.toString(), allowed);
4981d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu
4997d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        logd("Sending EVENT_RECORDS_LOADED");
5007d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
5017d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        waitForMs(200);
5027d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5037d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        ArgumentCaptor<String> apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
5047d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
5057d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(Phone.REASON_SIM_LOADED), apnTypeArgumentCaptor.capture(),
5067d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
5077d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5087d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
5097d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5107d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
5117d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
5127d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        waitForMs(200);
5137d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5147d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
5157d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
5167d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(Phone.REASON_DATA_ATTACHED), apnTypeArgumentCaptor.capture(),
5177d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
5187d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5197d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
5207d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5217d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
5227d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
5237d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(Phone.REASON_DATA_ENABLED), apnTypeArgumentCaptor.capture(),
5247d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
52527b650c406018355a88a41528db7859e232728a0Jack Yu
5267d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
5277d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5287d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        logd("Sending EVENT_ENABLE_NEW_APN");
5297d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // APN id 0 is APN_TYPE_DEFAULT
5307d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mDct.setEnabled(0, true);
5317d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        waitForMs(200);
5327d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
533fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        dataConnectionReasons = new DataConnectionReasons();
534fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        allowed = isDataAllowed(dataConnectionReasons);
535fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        assertTrue(dataConnectionReasons.toString(), allowed);
5361d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu
537f9339819516dbe67fb8fcef846a0ae4441ef17bdPaul Duffin        ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
5387d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Verify if RIL command was sent properly.
5397d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
540ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(),
5418e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                eq(false), eq(false), any(Message.class));
542ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, LTE_BEARER_BITMASK);
5437d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5447d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verifyDataConnected(FAKE_APN1);
5457d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    }
5467d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5477d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    // Test the scenario where the first data call setup is failed, and then retry the setup later.
5487d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    @Test
5497d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    @MediumTest
5507d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu    public void testDataRetry() {
5510979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
5520979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mDct.setDataEnabled(true);
5530979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
5547d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // LOST_CONNECTION(0x10004) is a non-permanent failure, so we'll retry data setup later.
5558e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        DataCallResponse dcResponse = new DataCallResponse(0x10004, -1, 1, 2, "IP", FAKE_IFNAME,
5568e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                FAKE_ADDRESS, FAKE_DNS, FAKE_GATEWAY, FAKE_PCSCF_ADDRESS, 1440);
5577d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Simulate RIL fails the data call setup
5587d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mSimulatedCommands.setDataCallResponse(false, dcResponse);
55927b650c406018355a88a41528db7859e232728a0Jack Yu
560fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        DataConnectionReasons dataConnectionReasons = new DataConnectionReasons();
561fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        boolean allowed = isDataAllowed(dataConnectionReasons);
562fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        assertFalse(dataConnectionReasons.toString(), allowed);
5631d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu
56427b650c406018355a88a41528db7859e232728a0Jack Yu        logd("Sending EVENT_RECORDS_LOADED");
56527b650c406018355a88a41528db7859e232728a0Jack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
56627b650c406018355a88a41528db7859e232728a0Jack Yu        waitForMs(200);
56727b650c406018355a88a41528db7859e232728a0Jack Yu
56827b650c406018355a88a41528db7859e232728a0Jack Yu        ArgumentCaptor<String> apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
56927b650c406018355a88a41528db7859e232728a0Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
57027b650c406018355a88a41528db7859e232728a0Jack Yu                eq(Phone.REASON_SIM_LOADED), apnTypeArgumentCaptor.capture(),
57127b650c406018355a88a41528db7859e232728a0Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
57227b650c406018355a88a41528db7859e232728a0Jack Yu
57327b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
57427b650c406018355a88a41528db7859e232728a0Jack Yu
57527b650c406018355a88a41528db7859e232728a0Jack Yu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
57627b650c406018355a88a41528db7859e232728a0Jack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
57727b650c406018355a88a41528db7859e232728a0Jack Yu        waitForMs(200);
57827b650c406018355a88a41528db7859e232728a0Jack Yu
57927b650c406018355a88a41528db7859e232728a0Jack Yu        apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
58027b650c406018355a88a41528db7859e232728a0Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
58127b650c406018355a88a41528db7859e232728a0Jack Yu                eq(Phone.REASON_DATA_ATTACHED), apnTypeArgumentCaptor.capture(),
58227b650c406018355a88a41528db7859e232728a0Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
58327b650c406018355a88a41528db7859e232728a0Jack Yu
58427b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
58527b650c406018355a88a41528db7859e232728a0Jack Yu
58627b650c406018355a88a41528db7859e232728a0Jack Yu        apnTypeArgumentCaptor = ArgumentCaptor.forClass(String.class);
58727b650c406018355a88a41528db7859e232728a0Jack Yu        verify(mPhone, times(sNetworkAttributes.length)).notifyDataConnection(
58827b650c406018355a88a41528db7859e232728a0Jack Yu                eq(Phone.REASON_DATA_ENABLED), apnTypeArgumentCaptor.capture(),
58927b650c406018355a88a41528db7859e232728a0Jack Yu                eq(PhoneConstants.DataState.DISCONNECTED));
59027b650c406018355a88a41528db7859e232728a0Jack Yu
59127b650c406018355a88a41528db7859e232728a0Jack Yu        assertEquals(sApnTypes, apnTypeArgumentCaptor.getAllValues());
59227b650c406018355a88a41528db7859e232728a0Jack Yu
59327b650c406018355a88a41528db7859e232728a0Jack Yu        logd("Sending EVENT_ENABLE_NEW_APN");
59427b650c406018355a88a41528db7859e232728a0Jack Yu        // APN id 0 is APN_TYPE_DEFAULT
59527b650c406018355a88a41528db7859e232728a0Jack Yu        mDct.setEnabled(0, true);
59627b650c406018355a88a41528db7859e232728a0Jack Yu        waitForMs(200);
5977d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
5983d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
599fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        dataConnectionReasons = new DataConnectionReasons();
600fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        allowed = isDataAllowed(dataConnectionReasons);
601fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        assertTrue(dataConnectionReasons.toString(), allowed);
6021d70c5957152ac4c8541f530e42ce596ca3f11d5Jack Yu
603f9339819516dbe67fb8fcef846a0ae4441ef17bdPaul Duffin        ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
6047d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Verify if RIL command was sent properly.
6057d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
606ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(),
6078e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                eq(false), eq(false), any(Message.class));
608ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, LTE_BEARER_BITMASK);
6097d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
6107d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Make sure we never notify connected because the data call setup is supposed to fail.
6117d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mPhone, never()).notifyDataConnection(eq(Phone.REASON_CONNECTED),
6127d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                eq(PhoneConstants.APN_TYPE_DEFAULT));
6137d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
6147d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Verify the retry manger schedule another data call setup.
6157d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verify(mAlarmManager, times(1)).setExact(eq(AlarmManager.ELAPSED_REALTIME_WAKEUP),
6167d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu                anyLong(), any(PendingIntent.class));
6177d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
6187d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // This time we'll let RIL command succeed.
6197d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mSimulatedCommands.setDataCallResponse(true, createDataCallResponse());
6207d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
6217d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Simulate the timer expires.
6227d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        Intent intent = new Intent("com.android.internal.telephony.data-reconnect.default");
6237d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        intent.putExtra("reconnect_alarm_extra_type", PhoneConstants.APN_TYPE_DEFAULT);
6247d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, 0);
6257d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
6267d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        mContext.sendBroadcast(intent);
6277d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        waitForMs(200);
6287d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
629f9339819516dbe67fb8fcef846a0ae4441ef17bdPaul Duffin        dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
6307d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Verify if RIL command was sent properly.
6318e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        verify(mSimulatedCommandsVerifier, times(2)).setupDataCall(
632ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(),
6338e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                eq(false), eq(false), any(Message.class));
634ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verifyDataProfile(dpCaptor.getValue(), FAKE_APN2, 0, 5, 1, LTE_BEARER_BITMASK);
6357d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu
6367d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        // Verify connected with APN2 setting.
6377d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu        verifyDataConnected(FAKE_APN2);
63827b650c406018355a88a41528db7859e232728a0Jack Yu    }
639783061ca03572618c01ce244d70d82fa4328d45ffionaxu
640783061ca03572618c01ce244d70d82fa4328d45ffionaxu    @Test
641783061ca03572618c01ce244d70d82fa4328d45ffionaxu    @MediumTest
642802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan    @Ignore
643802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan    @FlakyTest
644783061ca03572618c01ce244d70d82fa4328d45ffionaxu    public void testUserDisableData() throws Exception {
645783061ca03572618c01ce244d70d82fa4328d45ffionaxu        //step 1: setup two DataCalls one for Metered: default, another one for Non-metered: IMS
646783061ca03572618c01ce244d70d82fa4328d45ffionaxu        //set Default and MMS to be metered in the CarrierConfigManager
647783061ca03572618c01ce244d70d82fa4328d45ffionaxu        boolean dataEnabled = mDct.getDataEnabled();
648783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
649783061ca03572618c01ce244d70d82fa4328d45ffionaxu                new String[]{PhoneConstants.APN_TYPE_DEFAULT, PhoneConstants.APN_TYPE_MMS});
650783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setEnabled(5, true);
651783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setEnabled(0, true);
652783061ca03572618c01ce244d70d82fa4328d45ffionaxu
653783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending EVENT_RECORDS_LOADED");
654783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
655783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
656783061ca03572618c01ce244d70d82fa4328d45ffionaxu
657783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
658783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
659783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
660783061ca03572618c01ce244d70d82fa4328d45ffionaxu
661783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending DATA_ENABLED_CMD");
662783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setDataEnabled(true);
663783061ca03572618c01ce244d70d82fa4328d45ffionaxu
664783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
665f9339819516dbe67fb8fcef846a0ae4441ef17bdPaul Duffin        ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
6668e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        verify(mSimulatedCommandsVerifier, times(2)).setupDataCall(
667ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(),
6688e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                eq(false), eq(false), any(Message.class));
669ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, LTE_BEARER_BITMASK);
670783061ca03572618c01ce244d70d82fa4328d45ffionaxu
671783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending DATA_DISABLED_CMD");
672783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setDataEnabled(false);
673783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
674783061ca03572618c01ce244d70d82fa4328d45ffionaxu
675783061ca03572618c01ce244d70d82fa4328d45ffionaxu        // expected tear down all metered DataConnections
676783061ca03572618c01ce244d70d82fa4328d45ffionaxu        verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall(anyInt(), anyInt(),
677783061ca03572618c01ce244d70d82fa4328d45ffionaxu                any(Message.class));
678783061ca03572618c01ce244d70d82fa4328d45ffionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
679783061ca03572618c01ce244d70d82fa4328d45ffionaxu        assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT));
680783061ca03572618c01ce244d70d82fa4328d45ffionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS));
681783061ca03572618c01ce244d70d82fa4328d45ffionaxu
682783061ca03572618c01ce244d70d82fa4328d45ffionaxu        // reset the setting at the end of this test
683783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setDataEnabled(dataEnabled);
684783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
685783061ca03572618c01ce244d70d82fa4328d45ffionaxu    }
686783061ca03572618c01ce244d70d82fa4328d45ffionaxu
687783061ca03572618c01ce244d70d82fa4328d45ffionaxu    @Test
688783061ca03572618c01ce244d70d82fa4328d45ffionaxu    @MediumTest
689783061ca03572618c01ce244d70d82fa4328d45ffionaxu    public void testUserDisableRoaming() throws Exception {
690783061ca03572618c01ce244d70d82fa4328d45ffionaxu        //step 1: setup two DataCalls one for Metered: default, another one for Non-metered: IMS
6913d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        //step 2: set roaming disabled, data is enabled
6923d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        //step 3: under roaming service
6933d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        //step 4: only tear down metered data connections.
6943d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
695783061ca03572618c01ce244d70d82fa4328d45ffionaxu        //set Default and MMS to be metered in the CarrierConfigManager
6965b83d07ba19e20cf2811824cc2bed96953d1134dJack Yu        boolean roamingEnabled = mDct.getDataRoamingEnabled();
6973d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        boolean dataEnabled = mDct.getDataEnabled();
6983d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
6993d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
700783061ca03572618c01ce244d70d82fa4328d45ffionaxu                new String[]{PhoneConstants.APN_TYPE_DEFAULT, PhoneConstants.APN_TYPE_MMS});
701783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setEnabled(5, true);
702783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setEnabled(0, true);
703783061ca03572618c01ce244d70d82fa4328d45ffionaxu
704783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending EVENT_RECORDS_LOADED");
705783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
706783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
707783061ca03572618c01ce244d70d82fa4328d45ffionaxu
708783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
709783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
710783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
711783061ca03572618c01ce244d70d82fa4328d45ffionaxu
712783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending DATA_ENABLED_CMD");
713783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.setDataEnabled(true);
714783061ca03572618c01ce244d70d82fa4328d45ffionaxu
7158e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        waitForMs(300);
716f9339819516dbe67fb8fcef846a0ae4441ef17bdPaul Duffin        ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
7178e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        verify(mSimulatedCommandsVerifier, times(2)).setupDataCall(
718ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(),
7198e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                eq(false), eq(false), any(Message.class));
720ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, LTE_BEARER_BITMASK);
721783061ca03572618c01ce244d70d82fa4328d45ffionaxu
7223d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        //user is in roaming
7233d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        doReturn(true).when(mServiceState).getDataRoaming();
724783061ca03572618c01ce244d70d82fa4328d45ffionaxu        logd("Sending DISABLE_ROAMING_CMD");
72521e6af8d6197a071d025733fffeffc157d0085bcfionaxu        mDct.setDataRoamingEnabledByUser(false);
726783061ca03572618c01ce244d70d82fa4328d45ffionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_ROAMING_ON));
727783061ca03572618c01ce244d70d82fa4328d45ffionaxu        waitForMs(200);
728783061ca03572618c01ce244d70d82fa4328d45ffionaxu
729783061ca03572618c01ce244d70d82fa4328d45ffionaxu        // expected tear down all metered DataConnections
7303d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall(anyInt(), anyInt(),
731783061ca03572618c01ce244d70d82fa4328d45ffionaxu                any(Message.class));
7323d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
7333d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT));
7343d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS));
7353d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
7363d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        // reset roaming settings / data enabled settings at end of this test
73721e6af8d6197a071d025733fffeffc157d0085bcfionaxu        mDct.setDataRoamingEnabledByUser(roamingEnabled);
7383d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        mDct.setDataEnabled(dataEnabled);
7393d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        waitForMs(200);
7403d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu    }
7413d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
7423d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu    @Test
7433d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu    @MediumTest
7443d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu    public void testDataCallOnUserDisableRoaming() throws Exception {
7453d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        //step 1: mock under roaming service and user disabled roaming from settings.
7463d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        //step 2: user toggled data settings on
7473d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        //step 3: only non-metered data call is established
7483d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
7495b83d07ba19e20cf2811824cc2bed96953d1134dJack Yu        boolean roamingEnabled = mDct.getDataRoamingEnabled();
7503d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        boolean dataEnabled = mDct.getDataEnabled();
7510e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(true).when(mServiceState).getDataRoaming();
7523d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
7533d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        //set Default and MMS to be metered in the CarrierConfigManager
7543d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
7553d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu                new String[]{PhoneConstants.APN_TYPE_DEFAULT, PhoneConstants.APN_TYPE_MMS});
7563d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        mDct.setEnabled(5, true);
7573d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        mDct.setEnabled(0, true);
7580e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
7590e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending DATA_ENABLED_CMD");
7600e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.setDataEnabled(true);
7613d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
7623d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        logd("Sending DISABLE_ROAMING_CMD");
76321e6af8d6197a071d025733fffeffc157d0085bcfionaxu        mDct.setDataRoamingEnabledByUser(false);
7643d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
7653d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        logd("Sending EVENT_RECORDS_LOADED");
7663d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
7673d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        waitForMs(200);
7683d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
7693d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
7703d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
7713d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        waitForMs(200);
7723d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
7733d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        waitForMs(200);
774f9339819516dbe67fb8fcef846a0ae4441ef17bdPaul Duffin        ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
7753d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
776ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(),
7778e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                eq(false), eq(false), any(Message.class));
778ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verifyDataProfile(dpCaptor.getValue(), FAKE_APN3, 2, 64, 0, 0);
7793d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu
7803d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
781783061ca03572618c01ce244d70d82fa4328d45ffionaxu        assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT));
7823d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS));
783ecb75ffc91e7036ae87c5f0488fa871d4e079922Jack Yu
784ecb75ffc91e7036ae87c5f0488fa871d4e079922Jack Yu        // reset roaming settings / data enabled settings at end of this test
78521e6af8d6197a071d025733fffeffc157d0085bcfionaxu        mDct.setDataRoamingEnabledByUser(roamingEnabled);
786ecb75ffc91e7036ae87c5f0488fa871d4e079922Jack Yu        mDct.setDataEnabled(dataEnabled);
787ecb75ffc91e7036ae87c5f0488fa871d4e079922Jack Yu        waitForMs(200);
788783061ca03572618c01ce244d70d82fa4328d45ffionaxu    }
7890979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
7900979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu    // Test the default data switch scenario.
7910979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu    @Test
7920979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu    @MediumTest
7930979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu    public void testDDSResetAutoAttach() throws Exception {
7940979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
7950979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mDct.setDataEnabled(true);
7960979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
7970979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mContextFixture.putBooleanResource(
7980979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu                com.android.internal.R.bool.config_auto_attach_data_on_creation, true);
7990979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
8000979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mSimulatedCommands.setDataCallResponse(true, createDataCallResponse());
8010979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
802fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        DataConnectionReasons dataConnectionReasons = new DataConnectionReasons();
803fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        boolean allowed = isDataAllowed(dataConnectionReasons);
804fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        assertFalse(dataConnectionReasons.toString(), allowed);
8050979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
8060979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        ArgumentCaptor<Integer> intArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
8070979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        verify(mUiccController, times(1)).registerForIccChanged(eq(mDct),
8080979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu                intArgumentCaptor.capture(), eq(null));
8090979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        // Ideally this should send EVENT_ICC_CHANGED.
8100979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mDct.sendMessage(mDct.obtainMessage(intArgumentCaptor.getValue(), null));
8110979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        waitForMs(100);
8120979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
8130979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        verify(mSimRecords, times(1)).registerForRecordsLoaded(eq(mDct),
8140979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu                intArgumentCaptor.capture(), eq(null));
8150979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        // Ideally this should send EVENT_RECORDS_LOADED.
8160979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mDct.sendMessage(mDct.obtainMessage(intArgumentCaptor.getValue(), null));
8170979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        waitForMs(100);
8180979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
8190979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        verify(mSST, times(1)).registerForDataConnectionAttached(eq(mDct),
8200979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu                intArgumentCaptor.capture(), eq(null));
8210979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        // Ideally this should send EVENT_DATA_CONNECTION_ATTACHED");
8220979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mDct.sendMessage(mDct.obtainMessage(intArgumentCaptor.getValue(), null));
8230979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        waitForMs(200);
8240979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
82564fbcce906012e4b429c354ba3a200a6ee410010Lorenzo Colitti        NetworkRequest nr = new NetworkRequest.Builder()
82664fbcce906012e4b429c354ba3a200a6ee410010Lorenzo Colitti                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
8270979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        LocalLog l = new LocalLog(100);
8280979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mDct.requestNetwork(nr, l);
8290979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        waitForMs(200);
8300979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
8310979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        verifyDataConnected(FAKE_APN1);
8320979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
8330979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        assertTrue(mDct.getAutoAttachOnCreation());
8340979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mDct.update();
8350979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        // The auto attach flag should be reset after update
8360979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        assertFalse(mDct.getAutoAttachOnCreation());
8370979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
8380979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        verify(mSST, times(1)).registerForDataConnectionDetached(eq(mDct),
8390979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu                intArgumentCaptor.capture(), eq(null));
8400979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        // Ideally this should send EVENT_DATA_CONNECTION_DETACHED
8410979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        mDct.sendMessage(mDct.obtainMessage(intArgumentCaptor.getValue(), null));
8420979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        waitForMs(200);
8430979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu
8440979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu        // Data should not be allowed since auto attach flag has been reset.
845fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        dataConnectionReasons = new DataConnectionReasons();
846fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        allowed = isDataAllowed(dataConnectionReasons);
847fe4a960eef43178ab7284e8fd470d83a3b107427Jack Yu        assertFalse(dataConnectionReasons.toString(), allowed);
8480979b71e48405cab10bdf1d1b4170cfce72838a7Jack Yu    }
8494c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu
8504c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    // Test for API carrierActionSetMeteredApnsEnabled.
85192428df50d736a3d1d0f32779a22c65fcec0efabJordan Liu    @FlakyTest
852cc940f429180765b6072a071becae8117e665954Amit Mahajan    @Ignore
8534c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    @Test
8544c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    @MediumTest
8554c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    public void testCarrierActionSetMeteredApnsEnabled() throws Exception {
8564c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        //step 1: setup two DataCalls one for Internet and IMS
8574c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        //step 2: set data is enabled
8584c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        //step 3: cold sim is detected
8594c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        //step 4: all data connection is torn down
8604c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
8614c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                new String[]{PhoneConstants.APN_TYPE_DEFAULT, PhoneConstants.APN_TYPE_MMS});
8624c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu
8634c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        boolean dataEnabled = mDct.getDataEnabled();
8644c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        mDct.setDataEnabled(true);
8654c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu
8664c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        mDct.setEnabled(5, true);
8674c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        mDct.setEnabled(0, true);
8684c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu
8694c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        logd("Sending EVENT_RECORDS_LOADED");
8704c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
8714c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        waitForMs(200);
8724c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu
8734c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
8744c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
8754c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        waitForMs(200);
8764c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu
877f9339819516dbe67fb8fcef846a0ae4441ef17bdPaul Duffin        ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
8788e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        verify(mSimulatedCommandsVerifier, times(2)).setupDataCall(
879ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(),
8808e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                eq(false), eq(false), any(Message.class));
881ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, LTE_BEARER_BITMASK);
8824c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
8834c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu
88440cd4e909fd3a8ee462475814a949e08391ff8f5fionaxu        Message msg = mDct.obtainMessage(DctConstants.EVENT_SET_CARRIER_DATA_ENABLED);
88540cd4e909fd3a8ee462475814a949e08391ff8f5fionaxu        AsyncResult.forMessage(msg).result = false;
88640cd4e909fd3a8ee462475814a949e08391ff8f5fionaxu        mDct.sendMessage(msg);
8876a7fb078d1cacba7cf2e83b71242bb5c4c27c975fionaxu
8884c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        waitForMs(100);
8894c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu
8904c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        // Validate all metered data connections have been torn down
8914c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall(anyInt(), anyInt(),
8924c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                any(Message.class));
8934c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
8944c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT));
8954c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu
8964c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        // Reset settings at the end of test
8974c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        mDct.setDataEnabled(dataEnabled);
8984c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        waitForMs(200);
8994c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    }
9000e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9010e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    private void initApns(String targetApn, String[] canHandleTypes) {
9020e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(targetApn).when(mApnContext).getApnType();
9030e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(true).when(mApnContext).isConnectable();
9040e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        ApnSetting apnSetting = createApnSetting(canHandleTypes);
9050e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(apnSetting).when(mApnContext).getNextApnSetting();
9060e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(apnSetting).when(mApnContext).getApnSetting();
9070e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(mDcac).when(mApnContext).getDcAc();
9080e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(true).when(mApnContext).isEnabled();
9090e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(true).when(mApnContext).getDependencyMet();
9100e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(true).when(mApnContext).isReady();
9110e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(true).when(mApnContext).hasNoRestrictedRequests(eq(true));
9120e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    }
9130e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9140e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    // Test the emergency APN setup.
9150e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @Test
9160e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @SmallTest
9170e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    public void testTrySetupDataEmergencyApn() throws Exception {
9180e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        initApns(PhoneConstants.APN_TYPE_EMERGENCY, new String[]{PhoneConstants.APN_TYPE_ALL});
9190e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, mApnContext));
9200e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
9210e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9220e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
923ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), any(DataProfile.class),
9240e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                eq(false), eq(false), any(Message.class));
9250e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    }
9260e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9270e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    // Test the unmetered APN setup when data is disabled.
9280e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @Test
9290e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @SmallTest
9300e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    public void testTrySetupDataUnmeteredDataDisabled() throws Exception {
9310e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        initApns(PhoneConstants.APN_TYPE_FOTA, new String[]{PhoneConstants.APN_TYPE_ALL});
9320e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.setDataEnabled(false);
9330e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9340e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
9350e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                new String[]{PhoneConstants.APN_TYPE_DEFAULT});
9360e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9370e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_RECORDS_LOADED");
9380e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
9390e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
9400e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9410e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
9420e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
9430e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
9440e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9450e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, mApnContext));
9460e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
9470e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9480e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
949ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), any(DataProfile.class),
9500e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                eq(false), eq(false), any(Message.class));
9510e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    }
9520e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9530e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    // Test the metered APN setup when data is disabled.
9540e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @Test
9550e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @SmallTest
9560e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    public void testTrySetupMeteredDataDisabled() throws Exception {
9570e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL});
9580e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.setDataEnabled(false);
9590e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9600e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
9610e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                new String[]{PhoneConstants.APN_TYPE_DEFAULT});
9620e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9630e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_RECORDS_LOADED");
9640e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
9650e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
9660e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9670e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
9680e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
9690e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
9700e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9710e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, mApnContext));
9720e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
9730e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9740e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        verify(mSimulatedCommandsVerifier, times(0)).setupDataCall(
9750e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                anyInt(), any(DataProfile.class), eq(false), eq(false), any(Message.class));
9760e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    }
9770e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9780e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    // Test the restricted data request when data is disabled.
9790e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @Test
9800e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @SmallTest
9810e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    public void testTrySetupRestrictedDataDisabled() throws Exception {
9820e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL});
9830e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(false).when(mApnContext).hasNoRestrictedRequests(eq(true));
9840e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9850e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.setDataEnabled(false);
9860e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9870e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
9880e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                new String[]{PhoneConstants.APN_TYPE_DEFAULT});
9890e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9900e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_RECORDS_LOADED");
9910e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
9920e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
9930e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9940e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
9950e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
9960e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
9970e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
9980e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, mApnContext));
9990e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
10000e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10010e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
10020e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                anyInt(), any(DataProfile.class), eq(false), eq(false), any(Message.class));
10030e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    }
10040e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10050e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    // Test the default data when data is not connectable.
10060e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @Test
10070e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @SmallTest
10080e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    public void testTrySetupNotConnectable() throws Exception {
10090e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL});
10100e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(false).when(mApnContext).isConnectable();
10110e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.setDataEnabled(true);
10120e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10130e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
10140e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                new String[]{PhoneConstants.APN_TYPE_DEFAULT});
10150e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10160e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_RECORDS_LOADED");
10170e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
10180e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
10190e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10200e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
10210e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
10220e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
10230e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10240e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, mApnContext));
10250e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
10260e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10270e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        verify(mSimulatedCommandsVerifier, times(0)).setupDataCall(
10280e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                anyInt(), any(DataProfile.class), eq(false), eq(false), any(Message.class));
10290e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    }
10300e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10310e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    // Test the default data on IWLAN.
10320e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @Test
10330e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @SmallTest
10340e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    public void testTrySetupDefaultOnIWLAN() throws Exception {
10350e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL});
10360e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN).when(mServiceState)
10370e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                .getRilDataRadioTechnology();
10380e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.setDataEnabled(true);
10390e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10400e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
10410e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                new String[]{PhoneConstants.APN_TYPE_DEFAULT});
10420e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10430e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_RECORDS_LOADED");
10440e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
10450e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
10460e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10470e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
10480e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
10490e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
10500e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10510e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, mApnContext));
10520e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
10530e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10540e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        verify(mSimulatedCommandsVerifier, times(0)).setupDataCall(
10550e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                anyInt(), any(DataProfile.class), eq(false), eq(false), any(Message.class));
10560e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    }
10570e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10580e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    // Test the default data when the phone is in ECBM.
10590e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @Test
10600e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    @SmallTest
10610e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    public void testTrySetupDefaultInECBM() throws Exception {
10620e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL});
10630e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        doReturn(true).when(mPhone).isInEcm();
10640e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.setDataEnabled(true);
10650e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10660e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
10670e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                new String[]{PhoneConstants.APN_TYPE_DEFAULT});
10680e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10690e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_RECORDS_LOADED");
10700e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
10710e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
10720e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10730e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
10740e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
10750e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
10760e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10770e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, mApnContext));
10780e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        waitForMs(200);
10790e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu
10800e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu        verify(mSimulatedCommandsVerifier, times(0)).setupDataCall(
10810e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu                anyInt(), any(DataProfile.class), eq(false), eq(false), any(Message.class));
10820e5d8e352cb1334da6a3e6b1014307483b7a53abJack Yu    }
1083ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu
1084ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu    // Test update waiting apn list when on data rat change
1085ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu    @Test
1086ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu    @SmallTest
1087ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu    public void testUpdateWaitingApnListOnDataRatChange() throws Exception {
1088ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD).when(mServiceState)
1089ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                .getRilDataRadioTechnology();
1090ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
1091ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                new String[]{PhoneConstants.APN_TYPE_DEFAULT});
1092ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        mDct.setEnabled(0, true);
1093ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        mDct.setDataEnabled(true);
1094ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL});
1095ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu
1096ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        logd("Sending EVENT_RECORDS_LOADED");
1097ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
1098ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        waitForMs(200);
1099ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu
1100ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
1101ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
1102ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        waitForMs(200);
1103ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu
1104ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
1105ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        // Verify if RIL command was sent properly.
1106ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verify(mSimulatedCommandsVerifier).setupDataCall(
1107ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(),
1108ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(false), eq(false), any(Message.class));
1109ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verifyDataProfile(dpCaptor.getValue(), FAKE_APN4, 0, 5, 2, EHRPD_BEARER_BITMASK);
1110ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
1111ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu
1112ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        //data rat change from ehrpd to lte
1113ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        logd("Sending EVENT_DATA_RAT_CHANGED");
1114ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_LTE).when(mServiceState)
1115ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                .getRilDataRadioTechnology();
1116ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_RAT_CHANGED, null));
1117ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        waitForMs(200);
1118ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu
1119ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        // Verify the disconnected data call due to rat change and retry manger schedule another
1120ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        // data call setup
1121ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall(anyInt(), anyInt(),
1122ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                any(Message.class));
1123ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verify(mAlarmManager, times(1)).setExact(eq(AlarmManager.ELAPSED_REALTIME_WAKEUP),
1124ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                anyLong(), any(PendingIntent.class));
1125ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu
1126ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        // Simulate the timer expires.
1127ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        Intent intent = new Intent("com.android.internal.telephony.data-reconnect.default");
1128ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        intent.putExtra("reconnect_alarm_extra_type", PhoneConstants.APN_TYPE_DEFAULT);
1129ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, 0);
1130ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
1131ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        mContext.sendBroadcast(intent);
1132ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        waitForMs(200);
1133ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu
1134ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        // Verify if RIL command was sent properly.
1135ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verify(mSimulatedCommandsVerifier).setupDataCall(
1136ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(),
1137ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu                eq(false), eq(false), any(Message.class));
1138ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, LTE_BEARER_BITMASK);
1139ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
1140ced725ec28e37e37a61bbfa56a931b7f12ab9db7fionaxu    }
1141796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu
11425fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan    // Test for fetchDunApn()
11435fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan    @Test
11445fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan    @SmallTest
11455fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan    public void testFetchDunApn() {
11465fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        logd("Sending EVENT_RECORDS_LOADED");
11475fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
11485fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        waitForMs(200);
11495fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan
11505fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        String dunApnString = "[ApnSettingV3]HOT mobile PC,pc.hotm,,,,,,,,,440,10,,DUN,,,true,"
11515fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                + "0,,,,,,,,";
11525fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        ApnSetting dunApnExpected = ApnSetting.fromString(dunApnString);
11535fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan
11545fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        Settings.Global.putString(mContext.getContentResolver(),
11555fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                Settings.Global.TETHER_DUN_APN, dunApnString);
11565fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        // should return APN from Setting
11575fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        ApnSetting dunApn = mDct.fetchDunApn();
11585fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        assertTrue(dunApnExpected.equals(dunApn));
11595fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan
11605fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        Settings.Global.putString(mContext.getContentResolver(),
11615fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan                Settings.Global.TETHER_DUN_APN, null);
11625fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        // should return APN from db
11635fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        dunApn = mDct.fetchDunApn();
11645fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan        assertEquals(FAKE_APN5, dunApn.apn);
11655fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan    }
11665fd5bb14cf73b74120041e4cc317684c5a43a67cAmit Mahajan
1167796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu    // Test oos
1168796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu    @Test
1169796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu    @SmallTest
1170796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu    public void testDataRatChangeOOS() throws Exception {
1171796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD).when(mServiceState)
1172796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu                .getRilDataRadioTechnology();
1173796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
1174796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu                new String[]{PhoneConstants.APN_TYPE_DEFAULT});
1175796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        mDct.setEnabled(0, true);
1176796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        mDct.setDataEnabled(true);
1177796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL});
1178796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu
1179796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        logd("Sending EVENT_RECORDS_LOADED");
1180796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
1181796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        waitForMs(200);
1182796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu
1183796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
1184796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
1185796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        waitForMs(200);
1186796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu
1187796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
1188796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        // Verify if RIL command was sent properly.
1189796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        verify(mSimulatedCommandsVerifier).setupDataCall(
1190796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu                eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(),
1191796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu                eq(false), eq(false), any(Message.class));
1192796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        verifyDataProfile(dpCaptor.getValue(), FAKE_APN4, 0, 5, 2, EHRPD_BEARER_BITMASK);
1193796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
1194796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu
1195796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        // Data rat change from ehrpd to unknown due to OOS
1196796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        logd("Sending EVENT_DATA_RAT_CHANGED");
1197796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN).when(mServiceState)
1198796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu                .getRilDataRadioTechnology();
1199796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_RAT_CHANGED, null));
1200796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        waitForMs(200);
1201796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu
1202796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        // Verify data connection is on
1203796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        verify(mSimulatedCommandsVerifier, times(0)).deactivateDataCall(anyInt(), anyInt(),
1204796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu                any(Message.class));
1205796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu
1206796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        // Data rat resume from unknown to ehrpd
1207796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD).when(mServiceState)
1208796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu                .getRilDataRadioTechnology();
1209796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_RAT_CHANGED, null));
1210796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        waitForMs(200);
1211796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu
1212796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        // Verify the same data connection
1213796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        assertEquals(FAKE_APN4, mDct.getActiveApnString(PhoneConstants.APN_TYPE_DEFAULT));
1214796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu        assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState());
1215796abd05cbdabaa0f0392e7e146265ed8b779410fionaxu    }
1216783061ca03572618c01ce244d70d82fa4328d45ffionaxu}
1217