1 /* 2 * Copyright (C) 2018 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.providers.telephony; 18 19 import static android.provider.Telephony.Carriers; 20 21 import static org.junit.Assert.assertArrayEquals; 22 import static org.junit.Assert.assertTrue; 23 24 import android.content.Context; 25 import android.database.Cursor; 26 import android.database.sqlite.SQLiteDatabase; 27 import android.database.sqlite.SQLiteOpenHelper; 28 import android.provider.Telephony; 29 import android.telephony.SubscriptionManager; 30 import android.text.TextUtils; 31 import android.util.Log; 32 33 import androidx.test.InstrumentationRegistry; 34 35 import org.junit.Before; 36 import org.junit.Test; 37 import org.junit.runner.RunWith; 38 import org.junit.runners.JUnit4; 39 40 import java.util.ArrayList; 41 import java.util.Arrays; 42 import java.util.List; 43 44 /** 45 * To run this test, run the following from the dir: packages/providers/TelephonyProvider 46 * atest TelephonyProviderTests:TelephonyDatabaseHelperTest 47 * Or 48 * runtest --path tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java 49 */ 50 @RunWith(JUnit4.class) 51 public final class TelephonyDatabaseHelperTest { 52 53 private final static String TAG = TelephonyDatabaseHelperTest.class.getSimpleName(); 54 55 private Context mContext; 56 private TelephonyProvider.DatabaseHelper mHelper; // the actual class being tested 57 private SQLiteOpenHelper mInMemoryDbHelper; // used to give us an in-memory db 58 59 @Before setUp()60 public void setUp() { 61 Log.d(TAG, "setUp() +"); 62 mContext = InstrumentationRegistry.getContext(); 63 mHelper = new TelephonyProviderTestable().new DatabaseHelper(mContext); 64 mInMemoryDbHelper = new InMemoryTelephonyProviderV5DbHelper(); 65 Log.d(TAG, "setUp() -"); 66 } 67 68 @Test databaseHelperOnUpgrade_hasApnSetIdField()69 public void databaseHelperOnUpgrade_hasApnSetIdField() { 70 Log.d(TAG, "databaseHelperOnUpgrade_hasApnSetIdField"); 71 // (5 << 16 | 6) is the first upgrade trigger in onUpgrade 72 SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase(); 73 mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext)); 74 75 // the upgraded db must have the APN_SET_ID field 76 Cursor cursor = db.query("carriers", null, null, null, null, null, null); 77 String[] upgradedColumns = cursor.getColumnNames(); 78 Log.d(TAG, "carriers columns: " + Arrays.toString(upgradedColumns)); 79 80 assertTrue(Arrays.asList(upgradedColumns).contains(Carriers.APN_SET_ID)); 81 } 82 83 @Test databaseHelperOnUpgrade_hasCarrierIdField()84 public void databaseHelperOnUpgrade_hasCarrierIdField() { 85 Log.d(TAG, "databaseHelperOnUpgrade_hasSubscriptionTypeField"); 86 // (5 << 16 | 6) is the first upgrade trigger in onUpgrade 87 SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase(); 88 mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext)); 89 90 // the upgraded db must have the Telephony.Carriers.CARRIER_ID field 91 Cursor cursor = db.query("carriers", null, null, null, null, null, null); 92 String[] upgradedColumns = cursor.getColumnNames(); 93 Log.d(TAG, "carriers columns: " + Arrays.toString(upgradedColumns)); 94 assertTrue(Arrays.asList(upgradedColumns).contains(Carriers.CARRIER_ID)); 95 } 96 97 @Test databaseHelperOnUpgrade_hasCountryIsoField()98 public void databaseHelperOnUpgrade_hasCountryIsoField() { 99 Log.d(TAG, "databaseHelperOnUpgrade_hasCountryIsoField"); 100 SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase(); 101 mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext)); 102 103 // the upgraded db must have the Telephony.Carriers.CARRIER_ID field 104 Cursor cursor = db.query("simInfo", null, null, null, null, null, null); 105 String[] upgradedColumns = cursor.getColumnNames(); 106 Log.d(TAG, "iso columns: " + Arrays.toString(upgradedColumns)); 107 assertTrue(Arrays.asList(upgradedColumns).contains(SubscriptionManager.ISO_COUNTRY_CODE)); 108 } 109 110 @Test databaseHelperOnUpgrade_hasProfileClassField()111 public void databaseHelperOnUpgrade_hasProfileClassField() { 112 Log.d(TAG, "databaseHelperOnUpgrade_hasProfileClassField"); 113 SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase(); 114 mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext)); 115 116 // the upgraded db must have the PROFILE_CLASS field 117 Cursor cursor = db.query("siminfo", null, null, null, null, null, null); 118 String[] upgradedColumns = cursor.getColumnNames(); 119 Log.d(TAG, "profile class columns: " + Arrays.toString(upgradedColumns)); 120 assertTrue(Arrays.asList(upgradedColumns).contains(SubscriptionManager.PROFILE_CLASS)); 121 } 122 123 @Test databaseHelperOnUpgrade_hasSkip464XlatField()124 public void databaseHelperOnUpgrade_hasSkip464XlatField() { 125 Log.d(TAG, "databaseHelperOnUpgrade_hasSkip464XlatField"); 126 // (5 << 16 | 6) is the first upgrade trigger in onUpgrade 127 SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase(); 128 mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext)); 129 130 // the upgraded db must have the Telephony.Carriers.CARRIER_ID field 131 Cursor cursor = db.query("carriers", null, null, null, null, null, null); 132 String[] upgradedColumns = cursor.getColumnNames(); 133 Log.d(TAG, "carriers columns: " + Arrays.toString(upgradedColumns)); 134 assertTrue(Arrays.asList(upgradedColumns).contains(Carriers.SKIP_464XLAT)); 135 } 136 137 @Test databaseHelperOnUpgrade_columnsMatchNewlyCreatedDb()138 public void databaseHelperOnUpgrade_columnsMatchNewlyCreatedDb() { 139 Log.d(TAG, "databaseHelperOnUpgrade_columnsMatchNewlyCreatedDb"); 140 // (5 << 16 | 6) is the first upgrade trigger in onUpgrade 141 SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase(); 142 mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext)); 143 144 // compare upgraded carriers table to a carriers table created from scratch 145 db.execSQL(TelephonyProvider.getStringForCarrierTableCreation("carriers_full")); 146 147 Cursor cursor = db.query("carriers", null, null, null, null, null, null); 148 String[] upgradedColumns = cursor.getColumnNames(); 149 Log.d(TAG, "carriers columns: " + Arrays.toString(upgradedColumns)); 150 151 cursor = db.query("carriers_full", null, null, null, null, null, null); 152 String[] fullColumns = cursor.getColumnNames(); 153 Log.d(TAG, "carriers_full colunmns: " + Arrays.toString(fullColumns)); 154 155 assertArrayEquals("Carriers table from onUpgrade doesn't match full table", 156 fullColumns, upgradedColumns); 157 158 // compare upgraded siminfo table to siminfo table created from scratch 159 db.execSQL(TelephonyProvider.getStringForSimInfoTableCreation("siminfo_full")); 160 161 cursor = db.query("siminfo", null, null, null, null, null, null); 162 upgradedColumns = cursor.getColumnNames(); 163 Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns)); 164 165 cursor = db.query("siminfo_full", null, null, null, null, null, null); 166 fullColumns = cursor.getColumnNames(); 167 Log.d(TAG, "siminfo_full colunmns: " + Arrays.toString(fullColumns)); 168 169 assertArrayEquals("Siminfo table from onUpgrade doesn't match full table", 170 fullColumns, upgradedColumns); 171 } 172 173 @Test databaseHelperOnUpgrade_hasSubscriptionTypeField()174 public void databaseHelperOnUpgrade_hasSubscriptionTypeField() { 175 Log.d(TAG, "databaseHelperOnUpgrade_hasSubscriptionTypeField"); 176 // (5 << 16 | 6) is the first upgrade trigger in onUpgrade 177 SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase(); 178 mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext)); 179 180 // the upgraded db must have the SubscriptionManager.SUBSCRIPTION_TYPE field 181 Cursor cursor = db.query("siminfo", null, null, null, null, null, null); 182 String[] upgradedColumns = cursor.getColumnNames(); 183 Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns)); 184 185 assertTrue(Arrays.asList(upgradedColumns).contains(SubscriptionManager.SUBSCRIPTION_TYPE)); 186 } 187 188 @Test databaseHelperOnUpgrade_hasImsRcsUceEnabledField()189 public void databaseHelperOnUpgrade_hasImsRcsUceEnabledField() { 190 Log.d(TAG, "databaseHelperOnUpgrade_hasImsRcsUceEnabledField"); 191 // (5 << 16 | 6) is the first upgrade trigger in onUpgrade 192 SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase(); 193 mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext)); 194 195 // the upgraded db must have the SubscriptionManager.SUBSCRIPTION_TYPE field 196 Cursor cursor = db.query("siminfo", null, null, null, null, null, null); 197 String[] upgradedColumns = cursor.getColumnNames(); 198 Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns)); 199 200 assertTrue(Arrays.asList(upgradedColumns).contains( 201 Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED)); 202 } 203 204 /** 205 * Helper for an in memory DB used to test the TelephonyProvider#DatabaseHelper. 206 * 207 * We pass this in-memory db to DatabaseHelper#onUpgrade so we can use the actual function 208 * without using the actual telephony db. 209 */ 210 private static class InMemoryTelephonyProviderV5DbHelper extends SQLiteOpenHelper { 211 InMemoryTelephonyProviderV5DbHelper()212 public InMemoryTelephonyProviderV5DbHelper() { 213 super(InstrumentationRegistry.getContext(), 214 null, // db file name is null for in-memory db 215 null, // CursorFactory is null by default 216 1); // in-memory db version doesn't seem to matter 217 Log.d(TAG, "InMemoryTelephonyProviderV5DbHelper creating in-memory database"); 218 } 219 220 @Override onCreate(SQLiteDatabase db)221 public void onCreate(SQLiteDatabase db) { 222 // Set up the carriers table without any fields added in onUpgrade 223 // since these are the initial fields, there is no need to update this test fixture in 224 // the future 225 List<String> originalUniqueFields = new ArrayList<String>(); 226 originalUniqueFields.add(Carriers.NUMERIC); 227 originalUniqueFields.add(Carriers.MCC); 228 originalUniqueFields.add(Carriers.MNC); 229 originalUniqueFields.add(Carriers.APN); 230 originalUniqueFields.add(Carriers.PROXY); 231 originalUniqueFields.add(Carriers.PORT); 232 originalUniqueFields.add(Carriers.MMSPROXY); 233 originalUniqueFields.add(Carriers.MMSPORT); 234 originalUniqueFields.add(Carriers.MMSC); 235 Log.d(TAG, "InMemoryTelephonyProviderV5DbHelper onCreate creating the carriers table"); 236 db.execSQL( 237 "CREATE TABLE carriers" + 238 "(_id INTEGER PRIMARY KEY," + 239 Carriers.NAME + " TEXT DEFAULT ''," + 240 Carriers.NUMERIC + " TEXT DEFAULT ''," + 241 Carriers.MCC + " TEXT DEFAULT ''," + 242 Carriers.MNC + " TEXT DEFAULT ''," + 243 Carriers.APN + " TEXT DEFAULT ''," + 244 Carriers.USER + " TEXT DEFAULT ''," + 245 Carriers.SERVER + " TEXT DEFAULT ''," + 246 Carriers.PASSWORD + " TEXT DEFAULT ''," + 247 Carriers.PROXY + " TEXT DEFAULT ''," + 248 Carriers.PORT + " TEXT DEFAULT ''," + 249 Carriers.MMSPROXY + " TEXT DEFAULT ''," + 250 Carriers.MMSPORT + " TEXT DEFAULT ''," + 251 Carriers.MMSC + " TEXT DEFAULT ''," + 252 Carriers.TYPE + " TEXT DEFAULT ''," + 253 Carriers.CURRENT + " INTEGER," + 254 "UNIQUE (" + TextUtils.join(", ", originalUniqueFields) + "));"); 255 256 // set up the siminfo table without any fields added in onUpgrade 257 // since these are the initial fields, there is no need to update this test fixture in 258 // the future 259 Log.d(TAG, "InMemoryTelephonyProviderV5DbHelper onCreate creating the siminfo table"); 260 db.execSQL( 261 "CREATE TABLE siminfo (" 262 + Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID 263 + " INTEGER PRIMARY KEY AUTOINCREMENT," 264 + Telephony.SimInfo.COLUMN_ICC_ID + " TEXT NOT NULL," 265 + Telephony.SimInfo.COLUMN_SIM_SLOT_INDEX 266 + " INTEGER DEFAULT " + Telephony.SimInfo.SIM_NOT_INSERTED + "," 267 + Telephony.SimInfo.COLUMN_DISPLAY_NAME + " TEXT," 268 + Telephony.SimInfo.COLUMN_NAME_SOURCE 269 + " INTEGER DEFAULT " + Telephony.SimInfo.NAME_SOURCE_CARRIER_ID + "," 270 + Telephony.SimInfo.COLUMN_COLOR 271 + " INTEGER DEFAULT " + Telephony.SimInfo.COLOR_DEFAULT + "," 272 + Telephony.SimInfo.COLUMN_NUMBER + " TEXT," 273 + Telephony.SimInfo.COLUMN_DISPLAY_NUMBER_FORMAT + " INTEGER NOT NULL" 274 + " DEFAULT " + Telephony.SimInfo.DISPLAY_NUMBER_DEFAULT + "," 275 + Telephony.SimInfo.COLUMN_DATA_ROAMING 276 + " INTEGER DEFAULT " + Telephony.SimInfo.DATA_ROAMING_DISABLE + "," 277 + Telephony.SimInfo.COLUMN_CARD_ID + " TEXT NOT NULL" 278 + ");"); 279 } 280 281 @Override onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)282 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 283 Log.d(TAG, "InMemoryTelephonyProviderV5DbHelper onUpgrade doing nothing"); 284 return; 285 } 286 } 287 } 288