• 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.Parcel;
28 import android.os.PersistableBundle;
29 import android.telephony.CarrierConfigManager;
30 import android.telephony.ServiceState;
31 import android.telephony.TelephonyManager;
32 import android.telephony.data.ApnSetting;
33 import android.test.suitebuilder.annotation.SmallTest;
34 
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.List;
45 
46 public class ApnSettingTest extends TelephonyTest {
47 
48     private PersistableBundle mBundle;
49 
50     @Before
setUp()51     public void setUp() throws Exception {
52         super.setUp(getClass().getSimpleName());
53         mBundle = mContextFixture.getCarrierConfigBundle();
54     }
55 
56     @After
tearDown()57     public void tearDown() throws Exception {
58         mBundle = null;
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 new ApnSetting.Builder()
72                 .setId(2163)
73                 .setOperatorNumeric("44010")
74                 .setEntryName("sp-mode")
75                 .setApnName("fake_apn")
76                 .setApnTypeBitmask(apnTypeBitmask)
77                 .setProtocol(ApnSetting.PROTOCOL_IP)
78                 .setRoamingProtocol(ApnSetting.PROTOCOL_IP)
79                 .setCarrierEnabled(carrierEnabled)
80                 .build();
81     }
82 
assertApnSettingsEqual(List<ApnSetting> a1, List<ApnSetting> a2)83     private static void assertApnSettingsEqual(List<ApnSetting> a1, List<ApnSetting> a2) {
84         assertEquals(a1.size(), a2.size());
85         for (int i = 0; i < a1.size(); ++i) {
86             assertApnSettingEqual(a1.get(i), a2.get(i));
87         }
88     }
89 
assertApnSettingEqual(ApnSetting a1, ApnSetting a2)90     private static void assertApnSettingEqual(ApnSetting a1, ApnSetting a2) {
91         assertEquals(a1.getEntryName(), a2.getEntryName());
92         assertEquals(a1.getApnName(), a2.getApnName());
93         assertEquals(a1.getProxyAddressAsString(), a2.getProxyAddressAsString());
94         assertEquals(a1.getProxyPort(), a2.getProxyPort());
95         assertEquals(a1.getMmsc(), a2.getMmsc());
96         assertEquals(a1.getMmsProxyAddressAsString(), a2.getMmsProxyAddressAsString());
97         assertEquals(a1.getMmsProxyPort(), a2.getMmsProxyPort());
98         assertEquals(a1.getUser(), a2.getUser());
99         assertEquals(a1.getPassword(), a2.getPassword());
100         assertEquals(a1.getAuthType(), a2.getAuthType());
101         assertEquals(a1.getId(), a2.getId());
102         assertEquals(a1.getOperatorNumeric(), a2.getOperatorNumeric());
103         assertEquals(a1.getProtocol(), a2.getProtocol());
104         assertEquals(a1.getRoamingProtocol(), a2.getRoamingProtocol());
105         assertEquals(a1.getApnTypeBitmask(), a2.getApnTypeBitmask());
106         assertEquals(a1.isEnabled(), a2.isEnabled());
107         assertEquals(a1.getProfileId(), a2.getProfileId());
108         assertEquals(a1.isPersistent(), a2.isPersistent());
109         assertEquals(a1.getMaxConns(), a2.getMaxConns());
110         assertEquals(a1.getWaitTime(), a2.getWaitTime());
111         assertEquals(a1.getMaxConnsTime(), a2.getMaxConnsTime());
112         assertEquals(a1.getMtuV4(), a2.getMtuV4());
113         assertEquals(a1.getMvnoType(), a2.getMvnoType());
114         assertEquals(a1.getMvnoMatchData(), a2.getMvnoMatchData());
115         assertEquals(a1.getNetworkTypeBitmask(), a2.getNetworkTypeBitmask());
116         assertEquals(a1.getApnSetId(), a2.getApnSetId());
117         assertEquals(a1.getSkip464Xlat(), a2.getSkip464Xlat());
118     }
119 
120     @Test
121     @SmallTest
testIsMetered()122     public void testIsMetered() {
123         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
124                 new String[]{ApnSetting.TYPE_DEFAULT_STRING, ApnSetting.TYPE_MMS_STRING});
125 
126         doReturn(false).when(mServiceState).getDataRoaming();
127         doReturn(1).when(mPhone).getSubId();
128 
129         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_DEFAULT), mPhone));
130 
131         assertTrue(ApnSettingUtils.isMetered(
132                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS), mPhone));
133 
134         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_MMS), mPhone));
135 
136         assertTrue(ApnSettingUtils.isMetered(
137                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_MMS), mPhone));
138 
139         assertTrue(ApnSettingUtils.isMetered(
140                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_DUN), mPhone));
141 
142         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_ALL), mPhone));
143 
144         assertFalse(ApnSettingUtils.isMetered(
145                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_FOTA), mPhone));
146 
147         assertFalse(ApnSettingUtils.isMetered(
148                 createApnSetting(ApnSetting.TYPE_IA | ApnSetting.TYPE_CBS), mPhone));
149 
150         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DEFAULT, mPhone));
151         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_MMS, mPhone));
152         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_SUPL, mPhone));
153         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_CBS, mPhone));
154         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DUN, mPhone));
155         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_FOTA, mPhone));
156         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_IA, mPhone));
157         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_HIPRI, mPhone));
158         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_XCAP, mPhone));
159         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_ENTERPRISE, mPhone));
160 
161         // Carrier config settings changes.
162         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
163                 new String[]{ApnSetting.TYPE_DEFAULT_STRING});
164 
165         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DEFAULT, mPhone));
166         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_MMS, mPhone));
167     }
168 
169     @Test
170     @SmallTest
testIsRoamingMetered()171     public void testIsRoamingMetered() {
172         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
173                 new String[]{ApnSetting.TYPE_DEFAULT_STRING, ApnSetting.TYPE_MMS_STRING});
174         doReturn(true).when(mServiceState).getDataRoaming();
175         doReturn(1).when(mPhone).getSubId();
176 
177         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_DEFAULT), mPhone));
178 
179         assertTrue(ApnSettingUtils.isMetered(
180                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS), mPhone));
181 
182         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_MMS), mPhone));
183 
184         assertTrue(ApnSettingUtils.isMetered(
185                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_MMS), mPhone));
186 
187         assertTrue(ApnSettingUtils.isMetered(
188                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_DUN), mPhone));
189 
190         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_ALL), mPhone));
191 
192         assertFalse(ApnSettingUtils.isMetered(
193                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_FOTA), mPhone));
194 
195         assertFalse(ApnSettingUtils.isMetered(
196                 createApnSetting(ApnSetting.TYPE_IA | ApnSetting.TYPE_CBS), mPhone));
197 
198         // Carrier config settings changes.
199         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
200                 new String[]{ApnSetting.TYPE_FOTA_STRING});
201 
202         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DEFAULT, mPhone));
203         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_MMS, mPhone));
204         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_FOTA, mPhone));
205         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_XCAP, mPhone));
206         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_ENTERPRISE, mPhone));
207     }
208 
209     @Test
210     @SmallTest
testIsMeteredAnother()211     public void testIsMeteredAnother() {
212         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
213                 new String[]{ApnSetting.TYPE_SUPL_STRING, ApnSetting.TYPE_CBS_STRING});
214 
215         doReturn(false).when(mServiceState).getDataRoaming();
216         doReturn(1).when(mPhone).getSubId();
217 
218         assertTrue(ApnSettingUtils.isMetered(
219                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_CBS), mPhone));
220 
221         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_SUPL), mPhone));
222 
223         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_CBS), mPhone));
224 
225         assertTrue(ApnSettingUtils.isMetered(
226                 createApnSetting(ApnSetting.TYPE_FOTA | ApnSetting.TYPE_CBS), mPhone));
227 
228         assertTrue(ApnSettingUtils.isMetered(
229                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_IA), mPhone));
230 
231         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_ALL), mPhone));
232 
233         assertFalse(ApnSettingUtils.isMetered(
234                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_IMS), mPhone));
235 
236         assertFalse(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_IMS), mPhone));
237         assertFalse(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_XCAP), mPhone));
238         assertFalse(ApnSettingUtils.isMetered(
239                 createApnSetting(ApnSetting.TYPE_ENTERPRISE), mPhone));
240     }
241 
242     @Test
243     @SmallTest
testIsRoamingMeteredAnother()244     public void testIsRoamingMeteredAnother() {
245         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
246                 new String[]{ApnSetting.TYPE_SUPL_STRING, ApnSetting.TYPE_CBS_STRING});
247         doReturn(true).when(mServiceState).getDataRoaming();
248         doReturn(2).when(mPhone).getSubId();
249 
250         assertTrue(ApnSettingUtils.isMetered(
251                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_CBS), mPhone));
252 
253         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_SUPL), mPhone));
254 
255         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_CBS), mPhone));
256 
257         assertTrue(ApnSettingUtils.isMetered(
258                 createApnSetting(ApnSetting.TYPE_FOTA | ApnSetting.TYPE_CBS), mPhone));
259 
260         assertTrue(ApnSettingUtils.isMetered(
261                 createApnSetting(ApnSetting.TYPE_SUPL | ApnSetting.TYPE_IA), mPhone));
262 
263         assertTrue(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_ALL), mPhone));
264 
265         assertFalse(ApnSettingUtils.isMetered(
266                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_IMS), mPhone));
267 
268         assertFalse(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_IMS), mPhone));
269 
270         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_SUPL, mPhone));
271         assertTrue(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_CBS, mPhone));
272         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DEFAULT, mPhone));
273         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_MMS, mPhone));
274         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_DUN, mPhone));
275         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_FOTA, mPhone));
276         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_IA, mPhone));
277         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_HIPRI, mPhone));
278         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_XCAP, mPhone));
279         assertFalse(ApnSettingUtils.isMeteredApnType(ApnSetting.TYPE_ENTERPRISE, mPhone));
280     }
281 
282     @Test
283     @SmallTest
testIsMeteredNothingCharged()284     public void testIsMeteredNothingCharged() {
285         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
286                 new String[]{});
287 
288         doReturn(false).when(mServiceState).getDataRoaming();
289         doReturn(3).when(mPhone).getSubId();
290 
291         assertFalse(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_IMS), mPhone));
292 
293         assertFalse(ApnSettingUtils.isMetered(
294                 createApnSetting(ApnSetting.TYPE_IMS | ApnSetting.TYPE_MMS), mPhone));
295 
296         assertFalse(ApnSettingUtils.isMetered(
297                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_FOTA), mPhone));
298 
299         assertFalse(ApnSettingUtils.isMetered(
300                 createApnSetting(ApnSetting.TYPE_ALL), mPhone));
301     }
302 
303     @Test
304     @SmallTest
testIsRoamingMeteredNothingCharged()305     public void testIsRoamingMeteredNothingCharged() {
306         mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
307                 new String[]{});
308         doReturn(true).when(mServiceState).getDataRoaming();
309         doReturn(3).when(mPhone).getSubId();
310 
311         assertFalse(ApnSettingUtils.isMetered(createApnSetting(ApnSetting.TYPE_IMS), mPhone));
312 
313         assertFalse(ApnSettingUtils.isMetered(
314                 createApnSetting(ApnSetting.TYPE_IMS | ApnSetting.TYPE_MMS), mPhone));
315 
316         assertFalse(ApnSettingUtils.isMetered(
317                 createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_FOTA), mPhone));
318 
319         assertFalse(ApnSettingUtils.isMetered(
320                 createApnSetting(ApnSetting.TYPE_ALL), mPhone));
321     }
322 
323     @Test
324     @SmallTest
testCanHandleType()325     public void testCanHandleType() {
326         String types[] = {"mms"};
327 
328         assertTrue(createApnSetting(ApnSetting.TYPE_ALL)
329                 .canHandleType(ApnSetting.TYPE_MMS));
330 
331         assertFalse(createApnSetting(ApnSetting.TYPE_DEFAULT)
332                 .canHandleType(ApnSetting.TYPE_MMS));
333 
334         assertTrue(createApnSetting(ApnSetting.TYPE_DEFAULT)
335                 .canHandleType(ApnSetting.TYPE_DEFAULT));
336 
337         // Hipri is asymmetric
338         assertTrue(createApnSetting(ApnSetting.TYPE_DEFAULT)
339                 .canHandleType(ApnSetting.TYPE_HIPRI));
340         assertFalse(createApnSetting(ApnSetting.TYPE_HIPRI)
341                 .canHandleType(ApnSetting.TYPE_DEFAULT));
342 
343 
344         assertTrue(createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
345                 .canHandleType(ApnSetting.TYPE_DEFAULT));
346 
347         assertTrue(createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
348                 .canHandleType(ApnSetting.TYPE_MMS));
349 
350         assertFalse(createApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
351                 .canHandleType(ApnSetting.TYPE_SUPL));
352 
353         // special IA case - doesn't match wildcards
354         assertFalse(createApnSetting(ApnSetting.TYPE_ALL)
355                 .canHandleType(ApnSetting.TYPE_IA));
356         assertTrue(createApnSetting(
357                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_IA)
358                 .canHandleType(ApnSetting.TYPE_IA));
359 
360         // same for emergency, mcx, xcap, and enterprise
361         assertFalse(createApnSetting(ApnSetting.TYPE_ALL)
362                 .canHandleType(ApnSetting.TYPE_EMERGENCY));
363         assertTrue(createApnSetting(
364                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_EMERGENCY)
365                 .canHandleType(ApnSetting.TYPE_EMERGENCY));
366         assertFalse(createApnSetting(ApnSetting.TYPE_ALL)
367                 .canHandleType(ApnSetting.TYPE_MCX));
368         assertTrue(createApnSetting(
369                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_MCX)
370                 .canHandleType(ApnSetting.TYPE_MCX));
371         assertFalse(createApnSetting(ApnSetting.TYPE_ALL)
372                 .canHandleType(ApnSetting.TYPE_XCAP));
373         assertTrue(createApnSetting(
374                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_XCAP)
375                 .canHandleType(ApnSetting.TYPE_XCAP));
376         assertFalse(createApnSetting(ApnSetting.TYPE_ALL)
377                 .canHandleType(ApnSetting.TYPE_ENTERPRISE));
378         assertTrue(createApnSetting(
379                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_ENTERPRISE)
380                 .canHandleType(ApnSetting.TYPE_ENTERPRISE));
381 
382         // check carrier disabled
383         assertFalse(createDisabledApnSetting(ApnSetting.TYPE_ALL)
384                 .canHandleType(ApnSetting.TYPE_MMS));
385         assertFalse(createDisabledApnSetting(ApnSetting.TYPE_DEFAULT)
386                 .canHandleType(ApnSetting.TYPE_DEFAULT));
387         assertFalse(createDisabledApnSetting(ApnSetting.TYPE_DEFAULT)
388                 .canHandleType(ApnSetting.TYPE_HIPRI));
389         assertFalse(createDisabledApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
390                 .canHandleType(ApnSetting.TYPE_DEFAULT));
391         assertFalse(createDisabledApnSetting(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
392                 .canHandleType(ApnSetting.TYPE_MMS));
393         assertFalse(createDisabledApnSetting(
394                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_IA)
395                 .canHandleType(ApnSetting.TYPE_IA));
396         assertFalse(createDisabledApnSetting(
397                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_XCAP)
398                 .canHandleType(ApnSetting.TYPE_XCAP));
399         assertFalse(createDisabledApnSetting(
400                 ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS | ApnSetting.TYPE_ENTERPRISE)
401                 .canHandleType(ApnSetting.TYPE_ENTERPRISE));
402     }
403 
404     @Test
405     @SmallTest
testEquals()406     public void testEquals() throws Exception {
407         final int dummyInt = 1;
408         final int dummyLong = 1;
409         final String dummyString = "dummy";
410         final String[] dummyStringArr = new String[] {"dummy"};
411         final InetAddress dummyProxyAddress = InetAddress.getByAddress(new byte[]{0, 0, 0, 0});
412         final Uri dummyUri = Uri.parse("www.google.com");
413         // base apn
414         ApnSetting baseApn = createApnSetting(ApnSetting.TYPE_MMS | ApnSetting.TYPE_DEFAULT);
415         Field[] fields = ApnSetting.class.getDeclaredFields();
416         for (Field f : fields) {
417             int modifiers = f.getModifiers();
418             if (Modifier.isStatic(modifiers) || !Modifier.isFinal(modifiers)) {
419                 continue;
420             }
421             f.setAccessible(true);
422             ApnSetting testApn = null;
423             if (int.class.equals(f.getType())) {
424                 testApn = ApnSetting.makeApnSetting(baseApn);
425                 f.setInt(testApn, dummyInt + f.getInt(testApn));
426             } else if (long.class.equals(f.getType())) {
427                 testApn = ApnSetting.makeApnSetting(baseApn);
428                 f.setLong(testApn, dummyLong + f.getLong(testApn));
429             } else if (boolean.class.equals(f.getType())) {
430                 testApn = ApnSetting.makeApnSetting(baseApn);
431                 f.setBoolean(testApn, !f.getBoolean(testApn));
432             } else if (String.class.equals(f.getType())) {
433                 testApn = ApnSetting.makeApnSetting(baseApn);
434                 f.set(testApn, dummyString);
435             } else if (String[].class.equals(f.getType())) {
436                 testApn = ApnSetting.makeApnSetting(baseApn);
437                 f.set(testApn, dummyStringArr);
438             } else if (InetAddress.class.equals(f.getType())) {
439                 testApn = ApnSetting.makeApnSetting(baseApn);
440                 f.set(testApn, dummyProxyAddress);
441             } else if (Uri.class.equals(f.getType())) {
442                 testApn = ApnSetting.makeApnSetting(baseApn);
443                 f.set(testApn, dummyUri);
444             } else {
445                 fail("Unsupported field:" + f.getName());
446             }
447             if (testApn != null) {
448                 assertFalse(f.getName() + " is NOT checked", testApn.equals(baseApn));
449             }
450         }
451     }
452 
453     @Test
454     @SmallTest
testEqualsRoamingProtocol()455     public void testEqualsRoamingProtocol() {
456         ApnSetting apn1 = new ApnSetting.Builder()
457                 .setId(1234)
458                 .setOperatorNumeric("310260")
459                 .setEntryName("ims")
460                 .setApnName("ims")
461                 .setApnTypeBitmask(ApnSetting.TYPE_IMS)
462                 .setProtocol(ApnSetting.PROTOCOL_IPV6)
463                 .setNetworkTypeBitmask(
464                         ServiceState.convertBearerBitmaskToNetworkTypeBitmask(131071))
465                 .setMtuV4(1440)
466                 .setCarrierEnabled(true)
467                 .build();
468 
469         ApnSetting apn2 = new ApnSetting.Builder()
470                 .setId(1235)
471                 .setOperatorNumeric("310260")
472                 .setEntryName("ims")
473                 .setApnName("ims")
474                 .setApnTypeBitmask(ApnSetting.TYPE_IMS)
475                 .setProtocol(ApnSetting.PROTOCOL_IPV6)
476                 .setRoamingProtocol(ApnSetting.PROTOCOL_IPV6)
477                 .setNetworkTypeBitmask(
478                         ServiceState.convertBearerBitmaskToNetworkTypeBitmask(131072))
479                 .setMtuV4(1440)
480                 .setCarrierEnabled(true)
481                 .build();
482 
483         assertTrue(apn1.equals(apn2, false));
484         assertFalse(apn1.equals(apn2, true));
485     }
486 
487     @Test
488     @SmallTest
testCanHandleNetwork()489     public void testCanHandleNetwork() {
490         ApnSetting apn1 = new ApnSetting.Builder()
491                 .setId(1234)
492                 .setOperatorNumeric("310260")
493                 .setEntryName("ims")
494                 .setApnName("ims")
495                 .setApnTypeBitmask(ApnSetting.TYPE_IMS)
496                 .setProtocol(ApnSetting.PROTOCOL_IPV6)
497                 .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE
498                         | TelephonyManager.NETWORK_TYPE_BITMASK_UMTS))
499                 .setMtuV4(1440)
500                 .setCarrierEnabled(true)
501                 .build();
502 
503         ApnSetting apn2 = new ApnSetting.Builder()
504                 .setId(1235)
505                 .setOperatorNumeric("310260")
506                 .setEntryName("ims")
507                 .setApnName("ims")
508                 .setApnTypeBitmask(ApnSetting.TYPE_IMS)
509                 .setProtocol(ApnSetting.PROTOCOL_IPV6)
510                 .setRoamingProtocol(ApnSetting.PROTOCOL_IPV6)
511                 .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_EDGE
512                         | TelephonyManager.NETWORK_TYPE_BITMASK_GPRS))
513                 .setMtuV4(1440)
514                 .setCarrierEnabled(true)
515                 .build();
516 
517         assertFalse(apn1.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_1xRTT));
518         assertTrue(apn1.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_LTE));
519         assertTrue(apn1.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_UMTS));
520 
521         assertFalse(apn2.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_1xRTT));
522         assertFalse(apn2.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_LTE));
523         assertTrue(apn2.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_GPRS));
524         assertTrue(apn2.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_EDGE));
525 
526         assertTrue(apn2.canSupportNetworkType(TelephonyManager.NETWORK_TYPE_GSM));
527     }
528 
529     @Test
testParcel()530     public void testParcel() {
531         ApnSetting apn = createApnSetting(ApnSetting.TYPE_DEFAULT);
532 
533         Parcel parcel = Parcel.obtain();
534         apn.writeToParcel(parcel, 0 /* flags */);
535         parcel.setDataPosition(0);
536 
537         ApnSetting fromParcel = ApnSetting.CREATOR.createFromParcel(parcel);
538 
539         assertEquals(apn, fromParcel);
540 
541         parcel.recycle();
542     }
543 
544     @Test
testBuild_mmsProxyAddrStartsWithHttp()545     public void testBuild_mmsProxyAddrStartsWithHttp() {
546         ApnSetting apn1 = new ApnSetting.Builder()
547                 .setId(1234)
548                 .setOperatorNumeric("310260")
549                 .setEntryName("mms")
550                 .setApnName("mms")
551                 .setApnTypeBitmask(ApnSetting.TYPE_MMS)
552                 .setProtocol(ApnSetting.PROTOCOL_IPV6)
553                 .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE
554                         | TelephonyManager.NETWORK_TYPE_BITMASK_UMTS))
555                 .setMtuV4(1440)
556                 .setCarrierEnabled(true)
557                 .setMmsProxyAddress("http://proxy.mobile.att.net")
558                 .build();
559         assertEquals("proxy.mobile.att.net", apn1.getMmsProxyAddressAsString());
560 
561         ApnSetting apn2 = new ApnSetting.Builder()
562                 .setId(1235)
563                 .setOperatorNumeric("310260")
564                 .setEntryName("mms")
565                 .setApnName("mms")
566                 .setApnTypeBitmask(ApnSetting.TYPE_MMS)
567                 .setProtocol(ApnSetting.PROTOCOL_IPV6)
568                 .setRoamingProtocol(ApnSetting.PROTOCOL_IPV6)
569                 .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_EDGE
570                         | TelephonyManager.NETWORK_TYPE_BITMASK_GPRS))
571                 .setMtuV4(1440)
572                 .setCarrierEnabled(true)
573                 .setMmsProxyAddress("https://proxy.mobile.att.net")
574                 .build();
575         assertEquals("proxy.mobile.att.net", apn2.getMmsProxyAddressAsString());
576 
577         ApnSetting apn3 = new ApnSetting.Builder()
578                 .setId(1236)
579                 .setOperatorNumeric("310260")
580                 .setEntryName("mms")
581                 .setApnName("mms")
582                 .setApnTypeBitmask(ApnSetting.TYPE_MMS)
583                 .setProtocol(ApnSetting.PROTOCOL_IPV6)
584                 .setRoamingProtocol(ApnSetting.PROTOCOL_IPV6)
585                 .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_EDGE
586                         | TelephonyManager.NETWORK_TYPE_BITMASK_GPRS))
587                 .setMtuV4(1440)
588                 .setCarrierEnabled(true)
589                 .setMmsProxyAddress("proxy.mobile.att.net")
590                 .build();
591         assertEquals("proxy.mobile.att.net", apn3.getMmsProxyAddressAsString());
592     }
593 }
594