1/*
2 * Copyright (C) 2010 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 android.net.NetworkCapabilities;
20import android.net.NetworkConfig;
21import android.net.NetworkRequest;
22import android.test.suitebuilder.annotation.SmallTest;
23import android.util.LocalLog;
24
25import com.android.internal.R;
26import com.android.internal.telephony.DctConstants;
27import com.android.internal.telephony.PhoneConstants;
28import com.android.internal.telephony.TelephonyTest;
29
30import org.junit.After;
31import org.junit.Before;
32import org.junit.Test;
33import org.mockito.Mock;
34
35import static junit.framework.Assert.assertEquals;
36import static junit.framework.Assert.assertFalse;
37import static junit.framework.Assert.assertNull;
38import static junit.framework.Assert.assertTrue;
39import static org.mockito.Matchers.eq;
40import static org.mockito.Mockito.mock;
41import static org.mockito.Mockito.never;
42import static org.mockito.Mockito.times;
43import static org.mockito.Mockito.verify;
44
45public class ApnContextTest extends TelephonyTest {
46
47    @Mock
48    NetworkConfig mNetworkConfig;
49    @Mock
50    ApnSetting mApnSetting;
51
52    private ApnContext mApnContext;
53
54    @Before
55    public void setUp() throws Exception {
56        super.setUp(getClass().getSimpleName());
57        mNetworkConfig.dependencyMet = true;
58        mApnContext = new ApnContext(mPhone, PhoneConstants.APN_TYPE_DEFAULT, TAG, mNetworkConfig,
59                mDcTracker);
60    }
61
62    @After
63    public void tearDown() throws Exception {
64        mApnContext = null;
65        super.tearDown();
66    }
67
68    @Test
69    @SmallTest
70    public void testSetGetApnSetting() throws Exception {
71        mApnContext.setApnSetting(mApnSetting);
72        assertEquals(mApnSetting, mApnContext.getApnSetting());
73    }
74
75    @Test
76    @SmallTest
77    public void testGetApnType() throws Exception {
78        assertEquals(PhoneConstants.APN_TYPE_DEFAULT, mApnContext.getApnType());
79    }
80
81    @Test
82    @SmallTest
83    public void testConnectionGeneration() throws Exception {
84        for (int i = 0; i < 100; i++) {
85            mApnContext.incAndGetConnectionGeneration();
86            assertEquals(i + 1, mApnContext.getConnectionGeneration());
87        }
88    }
89
90    @Test
91    @SmallTest
92    public void testDataCallAsyncChannel() throws Exception {
93
94        DcAsyncChannel dcAc = mock(DcAsyncChannel.class);
95
96        mApnContext.setDataConnectionAc(dcAc);
97        assertEquals(dcAc, mApnContext.getDcAc());
98        mApnContext.releaseDataConnection("");
99        assertNull(mApnContext.getDcAc());
100        assertEquals(DctConstants.State.IDLE, mApnContext.getState());
101    }
102
103    @Test
104    @SmallTest
105    public void testDependencyMet() throws Exception {
106        assertTrue(mApnContext.getDependencyMet());
107        mApnContext.setDependencyMet(false);
108        assertFalse(mApnContext.getDependencyMet());
109    }
110
111    @Test
112    @SmallTest
113    public void testReason() throws Exception {
114        mApnContext.setReason("dataEnabled");
115        assertEquals("dataEnabled", mApnContext.getReason());
116        mApnContext.setReason("simLoaded");
117        assertEquals("simLoaded", mApnContext.getReason());
118    }
119
120    @Test
121    @SmallTest
122    public void testState() throws Exception {
123        mApnContext.setState(DctConstants.State.DISCONNECTING);
124        assertEquals(DctConstants.State.DISCONNECTING, mApnContext.getState());
125        mApnContext.setEnabled(true);
126        mApnContext.setDependencyMet(true);
127        assertFalse(mApnContext.isConnectable());
128
129        mApnContext.setState(DctConstants.State.SCANNING);
130        assertTrue(mApnContext.isConnectable());
131        assertTrue(mApnContext.isConnectedOrConnecting());
132
133        mApnContext.setState(DctConstants.State.FAILED);
134        assertTrue(mApnContext.isDisconnected());
135        mApnContext.setState(DctConstants.State.IDLE);
136        assertTrue(mApnContext.isDisconnected());
137    }
138
139    @Test
140    @SmallTest
141    public void testNetworkRequest() throws Exception {
142        LocalLog log = new LocalLog(3);
143        NetworkRequest nr = new NetworkRequest.Builder().build();
144        mApnContext.requestNetwork(nr, log);
145
146        verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(true));
147        mApnContext.requestNetwork(nr, log);
148        verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(true));
149
150        mApnContext.releaseNetwork(nr, log);
151        verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(false));
152        mApnContext.releaseNetwork(nr, log);
153        verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(false));
154    }
155
156    @Test
157    @SmallTest
158    public void testConcurrentVoiceAndDataAllowed() throws Exception {
159        mApnContext.setConcurrentVoiceAndDataAllowed(true);
160        assertTrue(mApnContext.isConcurrentVoiceAndDataAllowed());
161        mApnContext.setConcurrentVoiceAndDataAllowed(false);
162        assertFalse(mApnContext.isConcurrentVoiceAndDataAllowed());
163    }
164
165    @Test
166    @SmallTest
167    public void testEnableDisable() throws Exception {
168        mApnContext.setEnabled(true);
169        assertTrue(mApnContext.isEnabled());
170        mApnContext.setEnabled(false);
171        assertFalse(mApnContext.isEnabled());
172    }
173
174    @Test
175    @SmallTest
176    public void testProvisionApn() throws Exception {
177        mContextFixture.putResource(R.string.mobile_provisioning_apn, "fake_apn");
178
179        ApnSetting myApn = new ApnSetting(
180                2163,                   // id
181                "44010",                // numeric
182                "sp-mode",              // name
183                "fake_apn",             // apn
184                "",                     // proxy
185                "",                     // port
186                "",                     // mmsc
187                "",                     // mmsproxy
188                "",                     // mmsport
189                "",                     // user
190                "",                     // password
191                -1,                     // authtype
192                new String[]{"default", "supl"},     // types
193                "IP",                   // protocol
194                "IP",                   // roaming_protocol
195                true,                   // carrier_enabled
196                0,                      // bearer
197                0,                      // bearer_bitmask
198                0,                      // profile_id
199                false,                  // modem_cognitive
200                0,                      // max_conns
201                0,                      // wait_time
202                0,                      // max_conns_time
203                0,                      // mtu
204                "",                     // mvno_type
205                "");                    // mnvo_match_data
206
207        mApnContext.setApnSetting(myApn);
208        assertTrue(mApnContext.isProvisioningApn());
209        mApnContext.setApnSetting(mApnSetting);
210        assertFalse(mApnContext.isProvisioningApn());
211    }
212
213    @Test
214    @SmallTest
215    public void testIsReady() throws Exception {
216        mApnContext.setEnabled(true);
217        mApnContext.setDependencyMet(true);
218        assertTrue(mApnContext.isReady());
219
220        mApnContext.setEnabled(false);
221        assertFalse(mApnContext.isReady());
222
223        mApnContext.setDependencyMet(false);
224        assertFalse(mApnContext.isReady());
225
226        mApnContext.setEnabled(true);
227        assertFalse(mApnContext.isReady());
228    }
229
230    @Test
231    @SmallTest
232    public void testErrorCodeRetry() throws Exception {
233        mContextFixture.putStringArrayResource(
234                com.android.internal.R.array.config_cell_retries_per_error_code,
235                new String[]{"36,2"});
236        mApnContext.resetErrorCodeRetries();
237
238        assertFalse(mApnContext.restartOnError(36));
239        assertTrue(mApnContext.restartOnError(36));
240        assertFalse(mApnContext.restartOnError(37));
241    }
242}
243