13a5b9323f422134b68a92c36813001ec8bed2866Jack Yu/*
23a5b9323f422134b68a92c36813001ec8bed2866Jack Yu * Copyright (C) 2016 The Android Open Source Project
33a5b9323f422134b68a92c36813001ec8bed2866Jack Yu *
43a5b9323f422134b68a92c36813001ec8bed2866Jack Yu * Licensed under the Apache License, Version 2.0 (the "License");
53a5b9323f422134b68a92c36813001ec8bed2866Jack Yu * you may not use this file except in compliance with the License.
63a5b9323f422134b68a92c36813001ec8bed2866Jack Yu * You may obtain a copy of the License at
73a5b9323f422134b68a92c36813001ec8bed2866Jack Yu *
83a5b9323f422134b68a92c36813001ec8bed2866Jack Yu *      http://www.apache.org/licenses/LICENSE-2.0
93a5b9323f422134b68a92c36813001ec8bed2866Jack Yu *
103a5b9323f422134b68a92c36813001ec8bed2866Jack Yu * Unless required by applicable law or agreed to in writing, software
113a5b9323f422134b68a92c36813001ec8bed2866Jack Yu * distributed under the License is distributed on an "AS IS" BASIS,
123a5b9323f422134b68a92c36813001ec8bed2866Jack Yu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133a5b9323f422134b68a92c36813001ec8bed2866Jack Yu * See the License for the specific language governing permissions and
143a5b9323f422134b68a92c36813001ec8bed2866Jack Yu * limitations under the License.
153a5b9323f422134b68a92c36813001ec8bed2866Jack Yu */
163a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
17e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yupackage com.android.internal.telephony.dataconnection;
183a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
193a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport android.net.LinkProperties;
203a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport android.os.AsyncResult;
213a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport android.os.Handler;
223a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport android.os.HandlerThread;
233a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport android.test.suitebuilder.annotation.SmallTest;
243a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
25e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.DctConstants;
26e8eb48626c3e6ad93c1839b1a9e87030c4b33ce4Jack Yuimport com.android.internal.telephony.TelephonyTest;
273a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport com.android.internal.telephony.dataconnection.DataConnection.ConnectionParams;
283a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport com.android.internal.telephony.dataconnection.DataConnection.UpdateLinkPropertyResult;
293a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport com.android.internal.util.IState;
303a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport com.android.internal.util.StateMachine;
313a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
323a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport org.junit.After;
333a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport org.junit.Before;
343a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport org.junit.Test;
353a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport org.mockito.Mock;
363a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
373a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport java.lang.reflect.Method;
383a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport java.util.ArrayList;
393a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport java.util.HashMap;
403a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
413a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
423a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport static org.junit.Assert.assertEquals;
433a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport static org.junit.Assert.fail;
443a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport static org.mockito.Mockito.any;
453a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport static org.mockito.Mockito.doReturn;
463a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport static org.mockito.Mockito.eq;
473a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport static org.mockito.Mockito.times;
483a5b9323f422134b68a92c36813001ec8bed2866Jack Yuimport static org.mockito.Mockito.verify;
493a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
503a5b9323f422134b68a92c36813001ec8bed2866Jack Yupublic class DcControllerTest extends TelephonyTest {
513a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
523a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private static final int DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT = 1;
533a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private static final int EVENT_DATA_STATE_CHANGED = 0x00040007;
543a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
553a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    @Mock
563a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    DataConnection mDc;
573a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    @Mock
583a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    HashMap<ApnContext, ConnectionParams> mApnContexts;
593a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
603a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    UpdateLinkPropertyResult mResult;
613a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
623a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private DcController mDcc;
637e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan    private DcControllerTestHandler mDcControllerTestHandler;
643a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
653a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private class DcControllerTestHandler extends HandlerThread {
663a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
673a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        private DcControllerTestHandler(String name) {
683a5b9323f422134b68a92c36813001ec8bed2866Jack Yu            super(name);
693a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        }
703a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
713a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        private Handler mHandler;
723a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
733a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        @Override
743a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        public void onLooperPrepared() {
753a5b9323f422134b68a92c36813001ec8bed2866Jack Yu            mHandler = new Handler();
763a5b9323f422134b68a92c36813001ec8bed2866Jack Yu            mDcc = DcController.makeDcc(mPhone, mDcTracker, mHandler);
773a5b9323f422134b68a92c36813001ec8bed2866Jack Yu            setReady(true);
783a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        }
793a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    }
803a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
813a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    private IState getCurrentState() {
823a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        try {
833a5b9323f422134b68a92c36813001ec8bed2866Jack Yu            Method method = StateMachine.class.getDeclaredMethod("getCurrentState");
843a5b9323f422134b68a92c36813001ec8bed2866Jack Yu            method.setAccessible(true);
853a5b9323f422134b68a92c36813001ec8bed2866Jack Yu            return (IState) method.invoke(mDcc);
863a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        } catch (Exception e) {
873a5b9323f422134b68a92c36813001ec8bed2866Jack Yu            fail(e.toString());
883a5b9323f422134b68a92c36813001ec8bed2866Jack Yu            return null;
893a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        }
903a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    }
913a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
923a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    @Before
933a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    public void setUp() throws Exception {
943a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        super.setUp(getClass().getSimpleName());
953a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
963a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        doReturn("fake.action_detached").when(mPhone).getActionDetached();
973a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        mDc.mApnContexts = mApnContexts;
983a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        doReturn(1).when(mApnContexts).size();
993a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
1003a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        LinkProperties lp = new LinkProperties();
1013a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        mResult = new UpdateLinkPropertyResult(lp);
1023a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        doReturn(mResult).when(mDc).updateLinkProperty(any(DataCallResponse.class));
1033a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
1047e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mDcControllerTestHandler = new DcControllerTestHandler(TAG);
1057e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mDcControllerTestHandler.start();
1063a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        waitUntilReady();
1073a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    }
1083a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
1093a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    @After
1103a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    public void tearDown() throws Exception {
1117e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mDcControllerTestHandler.quitSafely();
1123a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        super.tearDown();
1133a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    }
1143a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
1153a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    @Test
1163a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    @SmallTest
1173a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    public void testDataDormant() {
1183a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        assertEquals("DccDefaultState", getCurrentState().getName());
1193a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        ArrayList<DataCallResponse> l = new ArrayList<DataCallResponse>();
1203a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        DataCallResponse dcResponse = DcTrackerTest.createDataCallResponse();
1213a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        dcResponse.active = DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT;
1223a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        l.add(dcResponse);
1233a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
1243a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        mDc.mCid = 1;
1253a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        mDcc.addActiveDcByCid(mDc);
1263a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
1273a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        mDcc.sendMessage(EVENT_DATA_STATE_CHANGED, new AsyncResult(null, l, null));
1283a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        waitForMs(100);
1293a5b9323f422134b68a92c36813001ec8bed2866Jack Yu
1303a5b9323f422134b68a92c36813001ec8bed2866Jack Yu        verify(mDcTracker, times(1)).sendStopNetStatPoll(eq(DctConstants.Activity.DORMANT));
1313a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    }
1323a5b9323f422134b68a92c36813001ec8bed2866Jack Yu}