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