• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.internal.telephony.dataconnection;
18 
19 import static junit.framework.Assert.assertFalse;
20 import static junit.framework.Assert.assertTrue;
21 import static junit.framework.Assert.fail;
22 
23 import static org.junit.Assert.assertEquals;
24 import static org.mockito.Mockito.doReturn;
25 
26 import android.net.Uri;
27 import android.os.PersistableBundle;
28 import android.telephony.CarrierConfigManager;
29 import android.telephony.ServiceState;
30 import android.telephony.TelephonyManager;
31 import android.telephony.data.ApnSetting;
32 import android.test.suitebuilder.annotation.SmallTest;
33 
34 import com.android.internal.telephony.PhoneConstants;
35 import com.android.internal.telephony.TelephonyTest;
36 
37 import org.junit.After;
38 import org.junit.Before;
39 import org.junit.Test;
40 
41 import java.lang.reflect.Field;
42 import java.lang.reflect.Modifier;
43 import java.net.InetAddress;
44 import java.util.ArrayList;
45 import java.util.List;
46 
47 public class ApnSettingTest extends TelephonyTest {
48 
49     private PersistableBundle mBundle;
50 
51     @Before
setUp()52     public void setUp() throws Exception {
53         super.setUp(getClass().getSimpleName());
54         mBundle = mContextFixture.getCarrierConfigBundle();
55     }
56 
57     @After
tearDown()58     public void tearDown() throws Exception {
59         super.tearDown();
60     }
61 
createApnSetting(int apnTypesBitmask)62     static ApnSetting createApnSetting(int apnTypesBitmask) {
63         return createApnSettingInternal(apnTypesBitmask, true);
64     }
65 
createDisabledApnSetting(int apnTypesBitmask)66     private static ApnSetting createDisabledApnSetting(int apnTypesBitmask) {
67         return createApnSettingInternal(apnTypesBitmask, false);
68     }
69 
createApnSettingInternal(int apnTypeBitmask, boolean carrierEnabled)70     private static ApnSetting createApnSettingInternal(int apnTypeBitmask, boolean carrierEnabled) {
71         return ApnSetting.makeApnSetting(
72                 2163,                   // id
73                 "44010",                // numeric
74                 "sp-mode",              // name
75                 "spmode.ne.jp",         // apn
76                 null,                     // proxy
77                 -1,                     // port
78                 null,                     // mmsc
79                 null,                     // mmsproxy
80                 -1,                     // mmsport
81                 "",                     // user
82                 "",                     // password
83                 -1,                     // authtype
84                 apnTypeBitmask,               // types
85                 ApnSetting.PROTOCOL_IP,                   // protocol
86                 ApnSetting.PROTOCOL_IP,                   // roaming_protocol
87                 carrierEnabled,         // carrier_enabled
88                 0,                      // networktype_bitmask
89                 0,                      // profile_id
90                 false,                  // modem_cognitive
91                 0,                      // max_conns
92                 0,                      // wait_time
93                 0,                      // max_conns_time
94                 0,                      // mtu
95                 -1,                     // mvno_type
96                 "");                    // mnvo_match_data
97     }
98 
assertApnSettingsEqual(List<ApnSetting> a1, List<ApnSetting> a2)99     private static void assertApnSettingsEqual(List<ApnSetting> a1, List<ApnSetting> a2) {
100         assertEquals(a1.size(), a2.size());
101         for (int i = 0; i < a1.size(); ++i) {
102             assertApnSettingEqual(a1.get(i), a2.get(i));
103         }
104     }
105 
assertApnSettingEqual(ApnSetting a1, ApnSetting a2)106     private static void assertApnSettingEqual(ApnSetting a1, ApnSetting a2) {
107         assertEquals(a1.getEntryName(), a2.getEntryName());
108         assertEquals(a1.getApnName(), a2.getApnName());
109         assertEquals(a1.getProxyAddressAsString(), a2.getProxyAddressAsString());
110         assertEquals(a1.getProxyPort(), a2.getProxyPort());
111         assertEquals(a1.getMmsc(), a2.getMmsc());
112         assertEquals(a1.getMmsProxyAddressAsString(), a2.getMmsProxyAddressAsString());
113         assertEquals(a1.getMmsProxyPort(), a2.getMmsProxyPort());
114         assertEquals(a1.getUser(), a2.getUser());
115         assertEquals(a1.getPassword(), a2.getPassword());
116         assertEquals(a1.getAuthType(), a2.getAuthType());
117         assertEquals(a1.getId(), a2.getId());
118         assertEquals(a1.getOperatorNumeric(), a2.getOperatorNumeric());
119         assertEquals(a1.getProtocol(), a2.getProtocol());
120         assertEquals(a1.getRoamingProtocol(), a2.getRoamingProtocol());
121         assertEquals(a1.getApnTypeBitmask(), a2.getApnTypeBitmask());
122         assertEquals(a1.isEnabled(), a2.isEnabled());
123         assertEquals(a1.getProfileId(), a2.getProfileId());
124         assertEquals(a1.isPersistent(), a2.isPersistent());
125         assertEquals(a1.getMaxConns(), a2.getMaxConns());
126         assertEquals(a1.getWaitTime(), a2.getWaitTime());
127         assertEquals(a1.getMaxConnsTime(), a2.getMaxConnsTime());
128         assertEquals(a1.getMtu(), a2.getMtu());
129         assertEquals(a1.getMvnoType(), a2.getMvnoType());
130         assertEquals(a1.getMvnoMatchData(), a2.getMvnoMatchData());
131         assertEquals(a1.getNetworkTypeBitmask(), a2.getNetworkTypeBitmask());
132         assertEquals(a1.getApnSetId(), a2.getApnSetId());
133         assertEquals(a1.getSkip464Xlat(), a2.getSkip464Xlat());
134     }
135 
136     @Test
137     @SmallTest
testFromString()138     public void testFromString() throws Exception {
139         final int dunTypesBitmask = ApnSetting.TYPE_DUN;
140         final int mmsTypesBitmask = ApnSetting.TYPE_MMS | ApnSetting.TYPE_ALL;
141 
142         ApnSetting expectedApn;
143         String testString;
144 
145         // A real-world v1 example string.
146         testString = "Vodafone IT,web.omnitel.it,,,,,,,,,222,10,,DUN";
147         expectedApn = ApnSetting.makeApnSetting(
148                 -1, "22210", "Vodafone IT", "web.omnitel.it", "", -1, null, "", -1, "", "", 0,
149                 dunTypesBitmask, ApnSetting.PROTOCOL_IP, ApnSetting.PROTOCOL_IP, true,
150                 0, 0, false, 0, 0, 0, 0, -1, "");
151         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
152 
153         // A v2 string.
154         testString = "[ApnSettingV2] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,14";
155         int networkTypeBitmask = 1 << (13 - 1);
156         expectedApn = ApnSetting.makeApnSetting(
157                 -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
158                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
159                 networkTypeBitmask, 0, false, 0, 0, 0, 0, -1, "");
160         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
161 
162         // A v2 string with spaces.
163         testString = "[ApnSettingV2] Name,apn, ,,,,,,,,123,45,,mms|*,IPV6, IP,true,14";
164         expectedApn = ApnSetting.makeApnSetting(
165                 -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
166                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
167                 networkTypeBitmask, 0, false, 0, 0, 0, 0, -1, "");
168         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
169 
170         // A v3 string.
171         testString = "[ApnSettingV3] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,14,,,,,,,spn,testspn";
172         expectedApn = ApnSetting.makeApnSetting(
173                 -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
174                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
175                 networkTypeBitmask, 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "testspn");
176         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
177 
178         // A v4 string with network type bitmask.
179         testString =
180                 "[ApnSettingV4] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,6";
181         networkTypeBitmask = 1 << (6 - 1);
182         expectedApn = ApnSetting.makeApnSetting(
183                 -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
184                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
185                 networkTypeBitmask, 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "testspn");
186         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
187 
188         testString =
189                 "[ApnSettingV4] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,"
190                         + "4|5|6|7|8|12|13|14|19";
191         // The value was calculated by adding "4|5|6|7|8|12|13|14|19".
192         networkTypeBitmask = 276728;
193         expectedApn = ApnSetting.makeApnSetting(
194                 -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
195                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
196                 networkTypeBitmask, 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "testspn");
197         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
198 
199         // A v4 string with network type bitmask and compatible bearer bitmask.
200         testString =
201                 "[ApnSettingV4] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,8,,,,,,,spn,testspn, 6";
202         networkTypeBitmask = 1 << (6 - 1);
203         expectedApn = ApnSetting.makeApnSetting(
204                 -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
205                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
206                 networkTypeBitmask, 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "testspn");
207         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
208 
209         // A v4 string with network type bitmask and incompatible bearer bitmask.
210         testString =
211                 "[ApnSettingV4] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,9,,,,,,,spn,testspn, 6";
212         expectedApn = ApnSetting.makeApnSetting(
213                 -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
214                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
215                 networkTypeBitmask, 0, false, 0,
216                 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "testspn");
217         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
218 
219         // A v5 string with apnSetId=0
220         testString =
221                 "[ApnSettingV5] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,0,0";
222         expectedApn = ApnSetting.makeApnSetting(
223                 -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
224                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
225                 0, 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "testspn");
226         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
227 
228         // A v5 string with apnSetId=3
229         testString =
230                 "[ApnSettingV5] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,0,3";
231         expectedApn = ApnSetting.makeApnSetting(
232                 -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
233                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
234                 0, 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "testspn", 3, -1, -1);
235         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
236 
237         // A v6 string with carrierId=100
238         testString =
239             "[ApnSettingV5] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,0,3,"
240                 + "100";
241         expectedApn = ApnSetting.makeApnSetting(
242             -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
243             mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
244             0, 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "testspn", 3, 100, -1);
245         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
246 
247         // A v7 string with skip_464xlat=1
248         testString =
249             "[ApnSettingV7] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,0,3,"
250                 + "-1, 1";
251         expectedApn = ApnSetting.makeApnSetting(
252             -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
253             mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
254             0, 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "testspn", 3, -1, 1);
255         assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));
256 
257         // Return no apn if insufficient fields given.
258         testString = "[ApnSettingV3] Name,apn,,,,,,,,,123, 45,,mms|*";
259         assertEquals(null, ApnSetting.fromString(testString));
260 
261         testString = "Name,apn,,,,,,,,,123, 45,";
262         assertEquals(null, ApnSetting.fromString(testString));
263     }
264 
265     @Test
266     @SmallTest
testArrayFromString()267     public void testArrayFromString() throws Exception {
268         final int mmsTypesBitmask = ApnSetting.TYPE_MMS;
269         // Test a multiple v3 string.
270         String testString =
271                 "[ApnSettingV3] Name,apn,,,,,,,,,123,45,,mms,IPV6,IP,true,14,,,,,,,spn,testspn";
272         testString +=
273                 " ;[ApnSettingV3] Name1,apn1,,,,,,,,,123,46,,mms,IPV6,IP,true,12,,,,,,,gid,testGid";
274         testString +=
275                 " ;[ApnSettingV3] Name1,apn2,,,,,,,,,123,46,,mms,IPV6,IP,true,12,,,,,,,,";
276         testString +=
277                 " ;[ApnSettingV5] Name1,apn2,,,,,,,,,123,46,,mms,IPV6,IP,true,0,,,,,,,,,,3";
278         List<ApnSetting> expectedApns = new ArrayList<ApnSetting>();
279         expectedApns.add(ApnSetting.makeApnSetting(
280                 -1, "12345", "Name", "apn", "", -1, null, "", -1, "", "", 0,
281                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
282                 1 << (13 - 1), 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "testspn"));
283         expectedApns.add(ApnSetting.makeApnSetting(
284                 -1, "12346", "Name1", "apn1", "", -1, null, "", -1, "", "", 0,
285                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
286                 1 << (12 - 1), 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_GID, "testGid"));
287         expectedApns.add(ApnSetting.makeApnSetting(
288                 -1, "12346", "Name1", "apn2", "", -1, null, "", -1, "", "", 0,
289                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
290                 1 << (12 - 1), 0, false, 0, 0, 0, 0, -1, ""));
291         expectedApns.add(ApnSetting.makeApnSetting(
292                 -1, "12346", "Name1", "apn2", "", -1, null, "", -1, "", "", 0,
293                 mmsTypesBitmask, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
294                 0, 0, false, 0, 0, 0, 0, -1, "", 3, -1, -1));
295         assertApnSettingsEqual(expectedApns, ApnSetting.arrayFromString(testString));
296     }
297 
298     @Test
299     @SmallTest
testToString()300     public void testToString() throws Exception {
301         // Use default apn_set_id constructor.
302         ApnSetting apn = ApnSetting.makeApnSetting(
303                 99, "12345", "Name", "apn", null, 10,
304                 null, null, -1, "user", "password", 0,
305                 ApnSetting.TYPE_DEFAULT, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
306                 4096, 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "");
307         String expected = "[ApnSettingV7] Name, 99, 12345, apn, null, "
308                 + "null, null, null, 10, 0, hipri | default, "
309                 + "IPV6, IP, true, 0, false, 0, 0, 0, 0, spn, , false, 4096, 0, -1, -1";
310         assertEquals(expected, apn.toString());
311 
312         final int networkTypeBitmask = 1 << (14 - 1);
313         apn = ApnSetting.makeApnSetting(
314                 99, "12345", "Name", "apn", null, 10,
315                 null, null, -1, "user", "password", 0,
316                 ApnSetting.TYPE_DEFAULT, ApnSetting.PROTOCOL_IPV6, ApnSetting.PROTOCOL_IP, true,
317                 networkTypeBitmask, 0, false, 0, 0, 0, 0, ApnSetting.MVNO_TYPE_SPN, "", 3, -1, 1);
318         expected = "[ApnSettingV7] Name, 99, 12345, apn, null, "
319                 + "null, null, null, 10, 0, hipri | default, "
320                 + "IPV6, IP, true, 0, false, 0, 0, 0, 0, spn, , false, 8192, 3, -1, 1";
321         assertEquals(expected, apn.toString());
322     }
323 
324     @Test
325     @SmallTest
testIsMetered()326     public void testIsMetered() throws Exception {
327         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
328                 new String[]{PhoneConstants.APN_TYPE_DEFAULT, PhoneConstants.APN_TYPE_MMS});
329 
330         doReturn(false).when(mServiceState).getDataRoaming();
331         doReturn(1).when(mPhone).getSubId();
332 
333         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_DEFAULT), mPhone));
334 
335         assertTrue(ApnSettingUtils.isMetered(
336                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS), mPhone));
337 
338         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_MMS), mPhone));
339 
340         assertTrue(ApnSettingUtils.isMetered(
341                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_MMS), mPhone));
342 
343         assertTrue(ApnSettingUtils.isMetered(
344                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_DUN), mPhone));
345 
346         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_ALL), mPhone));
347 
348         assertFalse(ApnSettingUtils.isMetered(
349                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_FOTA), mPhone));
350 
351         assertFalse(ApnSettingUtils.isMetered(
352                 createApnSetting(ApnSetting.TYPE_IA | ApnSetting.TYPE_CBS), mPhone));
353 
354         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DEFAULT, mPhone));
355         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_MMS, mPhone));
356         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_SUPL, mPhone));
357         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_CBS, mPhone));
358         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DUN, mPhone));
359         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_FOTA, mPhone));
360         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_IA, mPhone));
361         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_HIPRI, mPhone));
362         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_XCAP, mPhone));
363 
364         // Carrier config settings changes.
365         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
366                 new String[]{PhoneConstants.APN_TYPE_DEFAULT});
367 
368         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DEFAULT, mPhone));
369         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_MMS, mPhone));
370     }
371 
372     @Test
373     @SmallTest
testIsRoamingMetered()374     public void testIsRoamingMetered() throws Exception {
375         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
376                 new String[]{PhoneConstants.APN_TYPE_DEFAULT, PhoneConstants.APN_TYPE_MMS});
377         doReturn(true).when(mServiceState).getDataRoaming();
378         doReturn(1).when(mPhone).getSubId();
379 
380         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_DEFAULT), mPhone));
381 
382         assertTrue(ApnSettingUtils.isMetered(
383                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS), mPhone));
384 
385         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_MMS), mPhone));
386 
387         assertTrue(ApnSettingUtils.isMetered(
388                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_MMS), mPhone));
389 
390         assertTrue(ApnSettingUtils.isMetered(
391                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_DUN), mPhone));
392 
393         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_ALL), mPhone));
394 
395         assertFalse(ApnSettingUtils.isMetered(
396                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_FOTA), mPhone));
397 
398         assertFalse(ApnSettingUtils.isMetered(
399                 createApnSetting(ApnSetting.TYPE_IA | ApnSetting.TYPE_CBS), mPhone));
400 
401         // Carrier config settings changes.
402         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
403                 new String[]{PhoneConstants.APN_TYPE_FOTA});
404 
405         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DEFAULT, mPhone));
406         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_MMS, mPhone));
407         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_FOTA, mPhone));
408         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_XCAP, mPhone));
409     }
410 
411     @Test
412     @SmallTest
testIsMeteredAnother()413     public void testIsMeteredAnother() throws Exception {
414         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
415                 new String[]{PhoneConstants.APN_TYPE_SUPL, PhoneConstants.APN_TYPE_CBS});
416 
417         doReturn(false).when(mServiceState).getDataRoaming();
418         doReturn(1).when(mPhone).getSubId();
419 
420         assertTrue(ApnSettingUtils.isMetered(
421                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_CBS), mPhone));
422 
423         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_SUPL), mPhone));
424 
425         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_CBS), mPhone));
426 
427         assertTrue(ApnSettingUtils.isMetered(
428                 createApnSetting(ApnSetting.TYPE_FOTA | ApnSetting.TYPE_CBS), mPhone));
429 
430         assertTrue(ApnSettingUtils.isMetered(
431                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_IA), mPhone));
432 
433         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_ALL), mPhone));
434 
435         assertFalse(ApnSettingUtils.isMetered(
436                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_IMS), mPhone));
437 
438         assertFalse(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_IMS), mPhone));
439         assertFalse(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_XCAP), mPhone));
440     }
441 
442     @Test
443     @SmallTest
testIsRoamingMeteredAnother()444     public void testIsRoamingMeteredAnother() throws Exception {
445         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
446                 new String[]{PhoneConstants.APN_TYPE_SUPL, PhoneConstants.APN_TYPE_CBS});
447         doReturn(true).when(mServiceState).getDataRoaming();
448         doReturn(2).when(mPhone).getSubId();
449 
450         assertTrue(ApnSettingUtils.isMetered(
451                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_CBS), mPhone));
452 
453         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_SUPL), mPhone));
454 
455         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_CBS), mPhone));
456 
457         assertTrue(ApnSettingUtils.isMetered(
458                 createApnSetting(ApnSetting.TYPE_FOTA | ApnSetting.TYPE_CBS), mPhone));
459 
460         assertTrue(ApnSettingUtils.isMetered(
461                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_IA), mPhone));
462 
463         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_ALL), mPhone));
464 
465         assertFalse(ApnSettingUtils.isMetered(
466                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_IMS), mPhone));
467 
468         assertFalse(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_IMS), mPhone));
469 
470         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_SUPL, mPhone));
471         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_CBS, mPhone));
472         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DEFAULT, mPhone));
473         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_MMS, mPhone));
474         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DUN, mPhone));
475         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_FOTA, mPhone));
476         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_IA, mPhone));
477         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_HIPRI, mPhone));
478         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_XCAP, mPhone));
479     }
480 
481     @Test
482     @SmallTest
testIsMeteredNothingCharged()483     public void testIsMeteredNothingCharged() throws Exception {
484         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
485                 new String[]{});
486 
487         doReturn(false).when(mServiceState).getDataRoaming();
488         doReturn(3).when(mPhone).getSubId();
489 
490         assertFalse(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_IMS), mPhone));
491 
492         assertFalse(ApnSettingUtils.isMetered(
493                 createApnSetting(ApnSetting.TYPE_IMS | ApnSetting.TYPE_MMS), mPhone));
494 
495         assertFalse(ApnSettingUtils.isMetered(
496                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_FOTA), mPhone));
497 
498         assertFalse(ApnSettingUtils.isMetered(
499                 createApnSetting(ApnSetting.TYPE_ALL), mPhone));
500     }
501 
502     @Test
503     @SmallTest
testIsRoamingMeteredNothingCharged()504     public void testIsRoamingMeteredNothingCharged() throws Exception {
505         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
506                 new String[]{});
507         doReturn(true).when(mServiceState).getDataRoaming();
508         doReturn(3).when(mPhone).getSubId();
509 
510         assertFalse(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_IMS), mPhone));
511 
512         assertFalse(ApnSettingUtils.isMetered(
513                 createApnSetting(ApnSetting.TYPE_IMS | ApnSetting.TYPE_MMS), mPhone));
514 
515         assertFalse(ApnSettingUtils.isMetered(
516                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_FOTA), mPhone));
517 
518         assertFalse(ApnSettingUtils.isMetered(
519                 createApnSetting(ApnSetting.TYPE_ALL), mPhone));
520     }
521 
522     @Test
523     @SmallTest
testCanHandleType()524     public void testCanHandleType() throws Exception {
525         String types[] = {"mms"};
526 
527         assertTrue(createApnSetting(ApnSetting.TYPE_ALL)
528                 .canHandleType(ApnSetting.TYPE_MMS));
529 
530         assertFalse(createApnSetting(ApnSetting.TYPE_DEFAULT)
531                 .canHandleType(ApnSetting.TYPE_MMS));
532 
533         assertTrue(createApnSetting(ApnSetting.TYPE_DEFAULT)
534                 .canHandleType(ApnSetting.TYPE_DEFAULT));
535 
536         // Hipri is asymmetric
537         assertTrue(createApnSetting(ApnSetting.TYPE_DEFAULT)
538                 .canHandleType(ApnSetting.TYPE_HIPRI));
539         assertFalse(createApnSetting(ApnSetting.TYPE_HIPRI)
540                 .canHandleType(ApnSetting.TYPE_DEFAULT));
541 
542 
543         assertTrue(createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
544                 .canHandleType(ApnSetting.TYPE_DEFAULT));
545 
546         assertTrue(createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
547                 .canHandleType(ApnSetting.TYPE_MMS));
548 
549         assertFalse(createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
550                 .canHandleType(ApnSetting.TYPE_SUPL));
551 
552         // special IA case - doesn't match wildcards
553         assertFalse(createApnSetting(ApnSetting.TYPE_ALL)
554                 .canHandleType(ApnSetting.TYPE_IA));
555         assertTrue(createApnSetting(
556                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_IA)
557                 .canHandleType(ApnSetting.TYPE_IA));
558 
559         // same for emergency, mcx, and xcap
560         assertFalse(createApnSetting(ApnSetting.TYPE_ALL)
561                 .canHandleType(ApnSetting.TYPE_EMERGENCY));
562         assertTrue(createApnSetting(
563                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_EMERGENCY)
564                 .canHandleType(ApnSetting.TYPE_EMERGENCY));
565         assertFalse(createApnSetting(ApnSetting.TYPE_ALL)
566                 .canHandleType(ApnSetting.TYPE_MCX));
567         assertTrue(createApnSetting(
568                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_MCX)
569                 .canHandleType(ApnSetting.TYPE_MCX));
570         assertFalse(createApnSetting(ApnSetting.TYPE_ALL)
571                 .canHandleType(ApnSetting.TYPE_XCAP));
572         assertTrue(createApnSetting(
573                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_XCAP)
574                 .canHandleType(ApnSetting.TYPE_XCAP));
575 
576         // check carrier disabled
577         assertFalse(createDisabledApnSetting(ApnSetting.TYPE_ALL)
578                 .canHandleType(ApnSetting.TYPE_MMS));
579         assertFalse(createDisabledApnSetting(ApnSetting.TYPE_DEFAULT)
580                 .canHandleType(ApnSetting.TYPE_DEFAULT));
581         assertFalse(createDisabledApnSetting(ApnSetting.TYPE_DEFAULT)
582                 .canHandleType(ApnSetting.TYPE_HIPRI));
583         assertFalse(createDisabledApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
584                 .canHandleType(ApnSetting.TYPE_DEFAULT));
585         assertFalse(createDisabledApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
586                 .canHandleType(ApnSetting.TYPE_MMS));
587         assertFalse(createDisabledApnSetting(
588                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_IA)
589                 .canHandleType(ApnSetting.TYPE_IA));
590         assertFalse(createDisabledApnSetting(
591                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_XCAP)
592                 .canHandleType(ApnSetting.TYPE_XCAP));
593     }
594 
595     @Test
596     @SmallTest
testEquals()597     public void testEquals() throws Exception {
598         final int dummyInt = 1;
599         final String dummyString = "dummy";
600         final String[] dummyStringArr = new String[] {"dummy"};
601         final InetAddress dummyProxyAddress = InetAddress.getByAddress(new byte[]{0, 0, 0, 0});
602         final Uri dummyUri = Uri.parse("www.google.com");
603         // base apn
604         ApnSetting baseApn = createApnSetting(ApnSetting.TYPE_MMS | ApnSetting.TYPE_DEFAULT);
605         Field[] fields = ApnSetting.class.getDeclaredFields();
606         for (Field f : fields) {
607             int modifiers = f.getModifiers();
608             if (Modifier.isStatic(modifiers) || !Modifier.isFinal(modifiers)) {
609                 continue;
610             }
611             f.setAccessible(true);
612             ApnSetting testApn = null;
613             if (int.class.equals(f.getType())) {
614                 testApn = ApnSetting.makeApnSetting(baseApn);
615                 f.setInt(testApn, dummyInt + f.getInt(testApn));
616             } else if (boolean.class.equals(f.getType())) {
617                 testApn = ApnSetting.makeApnSetting(baseApn);
618                 f.setBoolean(testApn, !f.getBoolean(testApn));
619             } else if (String.class.equals(f.getType())) {
620                 testApn = ApnSetting.makeApnSetting(baseApn);
621                 f.set(testApn, dummyString);
622             } else if (String[].class.equals(f.getType())) {
623                 testApn = ApnSetting.makeApnSetting(baseApn);
624                 f.set(testApn, dummyStringArr);
625             } else if (InetAddress.class.equals(f.getType())) {
626                 testApn = ApnSetting.makeApnSetting(baseApn);
627                 f.set(testApn, dummyProxyAddress);
628             } else if (Uri.class.equals(f.getType())) {
629                 testApn = ApnSetting.makeApnSetting(baseApn);
630                 f.set(testApn, dummyUri);
631             } else {
632                 fail("Unsupported field:" + f.getName());
633             }
634             if (testApn != null) {
635                 assertFalse(f.getName() + " is NOT checked", testApn.equals(baseApn));
636             }
637         }
638     }
639 
640     @Test
641     @SmallTest
testEqualsRoamingProtocol()642     public void testEqualsRoamingProtocol() throws Exception {
643         ApnSetting apn1 = ApnSetting.makeApnSetting(
644                 1234,
645                 "310260",
646                 "",
647                 "ims",
648                 null,
649                 -1,
650                 null,
651                 null,
652                 -1,
653                 "",
654                 "",
655                 -1,
656                 ApnSetting.TYPE_IMS,
657                 ApnSetting.PROTOCOL_IPV6,
658                 -1,
659                 true,
660                 ServiceState.convertBearerBitmaskToNetworkTypeBitmask(131071),
661                 0,
662                 false,
663                 0,
664                 0,
665                 0,
666                 1440,
667                 -1,
668                 "");
669 
670         ApnSetting apn2 = ApnSetting.makeApnSetting(
671                 1235,
672                 "310260",
673                 "",
674                 "ims",
675                 null,
676                 -1,
677                 null,
678                 null,
679                 -1,
680                 "",
681                 "",
682                 -1,
683                 ApnSetting.TYPE_IMS,
684                 ApnSetting.PROTOCOL_IPV6,
685                 ApnSetting.PROTOCOL_IPV6,
686                 true,
687                 ServiceState.convertBearerBitmaskToNetworkTypeBitmask(131072),
688                 0,
689                 false,
690                 0,
691                 0,
692                 0,
693                 1440,
694                 -1,
695                 "");
696 
697         assertTrue(apn1.equals(apn2, false));
698         assertFalse(apn1.equals(apn2, true));
699     }
700 
701     @Test
702     @SmallTest
testCanHandleNetwork()703     public void testCanHandleNetwork() throws Exception {
704         ApnSetting apn1 = ApnSetting.makeApnSetting(
705                 1234,
706                 "310260",
707                 "",
708                 "ims",
709                 null,
710                 -1,
711                 null,
712                 null,
713                 -1,
714                 "",
715                 "",
716                 -1,
717                 ApnSetting.TYPE_IMS,
718                 ApnSetting.PROTOCOL_IPV6,
719                 -1,
720                 true,
721                 (int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE
722                         | TelephonyManager.NETWORK_TYPE_BITMASK_UMTS),
723                 0,
724                 false,
725                 0,
726                 0,
727                 0,
728                 1440,
729                 -1,
730                 "");
731 
732         ApnSetting apn2 = ApnSetting.makeApnSetting(
733                 1235,
734                 "310260",
735                 "",
736                 "ims",
737                 null,
738                 -1,
739                 null,
740                 null,
741                 -1,
742                 "",
743                 "",
744                 -1,
745                 ApnSetting.TYPE_IMS,
746                 ApnSetting.PROTOCOL_IPV6,
747                 ApnSetting.PROTOCOL_IPV6,
748                 true,
749                 (int) (TelephonyManager.NETWORK_TYPE_BITMASK_EDGE
750                         | TelephonyManager.NETWORK_TYPE_BITMASK_GPRS),
751                 0,
752                 false,
753                 0,
754                 0,
755                 0,
756                 1440,
757                 -1,
758                 "");
759 
760         assertFalse(apn1.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_1xRTT));
761         assertTrue(apn1.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_LTE));
762         assertTrue(apn1.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_UMTS));
763 
764         assertFalse(apn2.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_1xRTT));
765         assertFalse(apn2.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_LTE));
766         assertTrue(apn2.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_GPRS));
767         assertTrue(apn2.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_EDGE));
768 
769         assertTrue(apn2.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_GSM));
770     }
771 }
772