• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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