1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.internal.telephony.dataconnection;
18
19import static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
20import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_ADDRESS;
21import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_DNS;
22import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_GATEWAY;
23import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_IFNAME;
24import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_PCSCF_ADDRESS;
25
26import static org.junit.Assert.assertEquals;
27import static org.junit.Assert.fail;
28import static org.mockito.Mockito.any;
29import static org.mockito.Mockito.doReturn;
30import static org.mockito.Mockito.eq;
31import static org.mockito.Mockito.times;
32import static org.mockito.Mockito.verify;
33
34import android.net.LinkAddress;
35import android.net.LinkProperties;
36import android.net.NetworkUtils;
37import android.os.AsyncResult;
38import android.os.Handler;
39import android.os.HandlerThread;
40import android.telephony.data.DataCallResponse;
41import android.test.suitebuilder.annotation.SmallTest;
42
43import com.android.internal.telephony.DctConstants;
44import com.android.internal.telephony.TelephonyTest;
45import com.android.internal.telephony.dataconnection.DataConnection.ConnectionParams;
46import com.android.internal.telephony.dataconnection.DataConnection.UpdateLinkPropertyResult;
47import com.android.internal.util.IState;
48import com.android.internal.util.StateMachine;
49
50import org.junit.After;
51import org.junit.Before;
52import org.junit.Test;
53import org.mockito.Mock;
54
55import java.lang.reflect.Method;
56import java.util.ArrayList;
57import java.util.Arrays;
58import java.util.HashMap;
59
60public class DcControllerTest extends TelephonyTest {
61
62    private static final int DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT = 1;
63    private static final int EVENT_DATA_STATE_CHANGED = 0x00040007;
64
65    @Mock
66    DataConnection mDc;
67    @Mock
68    HashMap<ApnContext, ConnectionParams> mApnContexts;
69    @Mock
70    DataServiceManager mDataServiceManager;
71
72    UpdateLinkPropertyResult mResult;
73
74    private DcController mDcc;
75    private DcControllerTestHandler mDcControllerTestHandler;
76
77    private class DcControllerTestHandler extends HandlerThread {
78
79        private DcControllerTestHandler(String name) {
80            super(name);
81        }
82
83        private Handler mHandler;
84
85        @Override
86        public void onLooperPrepared() {
87            mHandler = new Handler();
88            mDcc = DcController.makeDcc(mPhone, mDcTracker, mDataServiceManager, mHandler);
89            mDcc.start();
90            setReady(true);
91        }
92    }
93
94    private IState getCurrentState() {
95        try {
96            Method method = StateMachine.class.getDeclaredMethod("getCurrentState");
97            method.setAccessible(true);
98            return (IState) method.invoke(mDcc);
99        } catch (Exception e) {
100            fail(e.toString());
101            return null;
102        }
103    }
104
105    @Before
106    public void setUp() throws Exception {
107        super.setUp(getClass().getSimpleName());
108
109        doReturn("fake.action_detached").when(mPhone).getActionDetached();
110        mDc.mApnContexts = mApnContexts;
111        doReturn(1).when(mApnContexts).size();
112
113        LinkProperties lp = new LinkProperties();
114        mResult = new UpdateLinkPropertyResult(lp);
115        doReturn(mResult).when(mDc).updateLinkProperty(any(DataCallResponse.class));
116
117        mDcControllerTestHandler = new DcControllerTestHandler(TAG);
118        mDcControllerTestHandler.start();
119        waitUntilReady();
120    }
121
122    @After
123    public void tearDown() throws Exception {
124        mDcControllerTestHandler.quit();
125        super.tearDown();
126    }
127
128    @Test
129    @SmallTest
130    public void testDataDormant() throws Exception {
131        assertEquals("DccDefaultState", getCurrentState().getName());
132        ArrayList<DataCallResponse> l = new ArrayList<DataCallResponse>();
133        DataCallResponse dcResponse = new DataCallResponse(0, -1, 1,
134                DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT, "IP", FAKE_IFNAME,
135                Arrays.asList(new LinkAddress(NetworkUtils.numericToInetAddress(FAKE_ADDRESS), 0)),
136                Arrays.asList(NetworkUtils.numericToInetAddress(FAKE_DNS)),
137                Arrays.asList(NetworkUtils.numericToInetAddress(FAKE_GATEWAY)),
138                Arrays.asList(FAKE_PCSCF_ADDRESS),
139                1440);
140
141        l.add(dcResponse);
142
143        mDc.mCid = 1;
144        mDcc.addActiveDcByCid(mDc);
145
146        mDcc.sendMessage(EVENT_DATA_STATE_CHANGED, new AsyncResult(null, l, null));
147        waitForMs(100);
148
149        verify(mDcTracker, times(1)).sendStopNetStatPoll(eq(DctConstants.Activity.DORMANT));
150    }
151}