1 /*
2  * Copyright (C) 2019 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.mms.service;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.testng.Assert.assertThrows;
22 
23 import android.content.ContentProvider;
24 import android.content.ContentValues;
25 import android.content.Context;
26 import android.database.Cursor;
27 import android.net.Uri;
28 import android.provider.Telephony;
29 import android.telephony.data.ApnSetting;
30 
31 import androidx.test.core.app.ApplicationProvider;
32 
33 import com.android.mms.service.exception.ApnException;
34 
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.junit.runner.RunWith;
38 import org.robolectric.RobolectricTestRunner;
39 import org.robolectric.fakes.RoboCursor;
40 import org.robolectric.shadows.ShadowContentResolver;
41 
42 import java.util.Arrays;
43 
44 @RunWith(RobolectricTestRunner.class)
45 public final class ApnSettingsTest {
46 
47     private Context context;
48 
49     @Before
setUp()50     public void setUp() {
51         context = ApplicationProvider.getApplicationContext();
52     }
53 
54     @Test
load_noApnSettings_throwsApnException()55     public void load_noApnSettings_throwsApnException() {
56         assertThrows(ApnException.class,
57                 () -> ApnSettings.load(context, "apnName", /* subId= */ 0, "requestId"));
58     }
59 
60     @Test
getApnSettingsFromCursor_validSettings_correctApnSettingsLoaded()61     public void getApnSettingsFromCursor_validSettings_correctApnSettingsLoaded() throws Exception {
62         createApnSettingsCursor("mmscUrl", "mmsProxy", /* proxyPort= */ "123");
63         ApnSettings apnSettings = ApnSettings.load(context, "apnName", /* subId= */ 0, "requestId");
64 
65         assertThat(apnSettings.getProxyPort()).isEqualTo(123);
66         assertThat(apnSettings.getMmscUrl()).isEqualTo("mmscUrl");
67         assertThat(apnSettings.getProxyAddress()).isEqualTo("mmsProxy");
68     }
69 
70     @Test
getApnSettingsFromCursor_nullMmsPort_defaultProxyPortUsed()71     public void getApnSettingsFromCursor_nullMmsPort_defaultProxyPortUsed() throws Exception {
72         createApnSettingsCursor("mmscUrl", "mmsProxy", /* proxyPort= */ null);
73         ApnSettings apnSettings = ApnSettings.load(context, "apnName", /* subId= */ 0, "requestId");
74         assertThat(apnSettings.getProxyPort()).isEqualTo(80);
75     }
76 
77     @Test
getApnSettingsFromCursor_emptyMmsPort_defaultProxyPortUsed()78     public void getApnSettingsFromCursor_emptyMmsPort_defaultProxyPortUsed() throws Exception {
79         createApnSettingsCursor("mmscUrl", "mmsProxy",
80                 /* proxyPort= */ "");
81         ApnSettings apnSettings = ApnSettings.load(context, "apnName", /* subId= */ 0, "requestId");
82         assertThat(apnSettings.getProxyPort()).isEqualTo(80);
83     }
84 
createApnSettingsCursor(String mmscUrl, String mmsProxy, String proxyPort)85     private void createApnSettingsCursor(String mmscUrl, String mmsProxy, String proxyPort) {
86         Object[][] apnValues =
87                 {new Object[]{ApnSetting.TYPE_MMS_STRING, mmscUrl, mmsProxy, proxyPort}};
88         RoboCursor cursor = new RoboCursor();
89         cursor.setResults(apnValues);
90         cursor.setColumnNames(Arrays.asList(Telephony.Carriers.TYPE, Telephony.Carriers.MMSC,
91                 Telephony.Carriers.MMSPROXY, Telephony.Carriers.MMSPORT));
92 
93         ShadowContentResolver.registerProviderInternal(
94                 Telephony.Carriers.CONTENT_URI.getAuthority(), new FakeApnSettingsProvider(cursor));
95     }
96 
97     private final class FakeApnSettingsProvider extends ContentProvider {
98 
99         private final Cursor cursor;
100 
FakeApnSettingsProvider(Cursor cursor)101         FakeApnSettingsProvider(Cursor cursor) {
102             this.cursor = cursor;
103         }
104 
105         @Override
onCreate()106         public boolean onCreate() {
107             return false;
108         }
109 
110         @Override
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)111         public Cursor query(Uri uri, String[] projection,
112                 String selection, String[] selectionArgs, String sortOrder) {
113             return cursor;
114         }
115 
116         @Override
getType(Uri uri)117         public String getType(Uri uri) {
118             return null;
119         }
120 
121         @Override
insert(Uri uri, ContentValues values)122         public Uri insert(Uri uri, ContentValues values) {
123             return null;
124         }
125 
126         @Override
delete(Uri uri, String selection, String[] selectionArgs)127         public int delete(Uri uri, String selection, String[] selectionArgs) {
128             return 0;
129         }
130 
131         @Override
update(Uri uri, ContentValues values, String selection, String[] selectionArgs)132         public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
133             return 0;
134         }
135     }
136 
137 }
138