1/*
2 * Copyright (C) 2017 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
17package com.android.providers.telephony;
18
19import android.content.ContentValues;
20import android.content.pm.PackageManager;
21import android.content.pm.ProviderInfo;
22import android.content.res.Resources;
23import android.database.Cursor;
24import android.database.SQLException;
25import android.test.mock.MockContentResolver;
26import android.test.mock.MockContext;
27import android.test.suitebuilder.annotation.SmallTest;
28import android.text.TextUtils;
29import android.util.Log;
30
31import com.android.providers.telephony.CarrierProvider;
32
33import junit.framework.TestCase;
34
35import org.junit.Test;
36
37
38/**
39 * Tests for testing CRUD operations of CarrierProvider.
40 * Uses TelephonyProviderTestable to set up in-memory database
41 *
42 * Build, install and run the tests by running the commands below:
43 *     runtest --path <dir or file>
44 *     runtest --path <dir or file> --test-method <testMethodName>
45 *     e.g.)
46 *         runtest --path tests/src/com/android/providers/telephony/CarrierProviderTest.java \
47 *                 --test-method testInsertCarriers
48 */
49public class CarrierProviderTest extends TestCase {
50
51    private static final String TAG = "CarrierProviderTest";
52
53    private MockContextWithProvider mContext;
54    private MockContentResolver mContentResolver;
55    private CarrierProviderTestable mCarrierProviderTestable;
56
57    public static final int dummy_type = 1;
58    public static final String dummy_mnc = "MNC001";
59    public static final String dummy_mnc2 = "MNC002";
60    public static final String dummy_mcc = "MCC005";
61    public static final String dummy_key1 = "PUBKEY1";
62    public static final String dummy_key2 = "PUBKEY2";
63    public static final String dummy_mvno_type = "100";
64    public static final String dummy_mvno_match_data = "101";
65    public static final String  dummy_key_identifier_data = "key_identifier1";
66    public static final long  dummy_key_expiration = 1496795015L;
67
68
69    /**
70     * This is used to give the CarrierProviderTest a mocked context which takes a
71     * CarrierProvider and attaches it to the ContentResolver.
72     */
73    private class MockContextWithProvider extends MockContext {
74        private final MockContentResolver mResolver;
75
76        public MockContextWithProvider(CarrierProvider carrierProvider) {
77            mResolver = new MockContentResolver();
78
79            ProviderInfo providerInfo = new ProviderInfo();
80            providerInfo.authority = CarrierProvider.PROVIDER_NAME;
81
82            // Add context to given telephonyProvider
83            carrierProvider.attachInfoForTesting(this, providerInfo);
84            Log.d(TAG, "MockContextWithProvider: carrierProvider.getContext(): "
85                    + carrierProvider.getContext());
86
87            // Add given telephonyProvider to mResolver, so that mResolver can send queries
88            // to the provider.
89            mResolver.addProvider(CarrierProvider.PROVIDER_NAME, carrierProvider);
90            Log.d(TAG, "MockContextWithProvider: Add carrierProvider to mResolver");
91        }
92
93        @Override
94        public Object getSystemService(String name) {
95            Log.d(TAG, "getSystemService: returning null");
96            return null;
97        }
98
99        @Override
100        public Resources getResources() {
101            Log.d(TAG, "getResources: returning null");
102            return null;
103        }
104
105        @Override
106        public MockContentResolver getContentResolver() {
107            return mResolver;
108        }
109
110        // Gives permission to write to the APN table within the MockContext
111        @Override
112        public int checkCallingOrSelfPermission(String permission) {
113            if (TextUtils.equals(permission, "android.permission.WRITE_APN_SETTINGS")) {
114                Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
115                        + ", returning PackageManager.PERMISSION_GRANTED");
116                return PackageManager.PERMISSION_GRANTED;
117            } else {
118                Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
119                        + ", returning PackageManager.PERMISSION_DENIED");
120                return PackageManager.PERMISSION_DENIED;
121            }
122        }
123    }
124
125    @Override
126    protected void setUp() throws Exception {
127        super.setUp();
128        mCarrierProviderTestable = new CarrierProviderTestable();
129        mContext = new MockContextWithProvider(mCarrierProviderTestable);
130        mContentResolver = (MockContentResolver) mContext.getContentResolver();
131    }
132
133    @Override
134    protected void tearDown() throws Exception {
135        super.tearDown();
136        mCarrierProviderTestable.closeDatabase();
137    }
138
139    /**
140     * Test inserting values in carrier key table.
141     */
142    @Test
143    @SmallTest
144    public void testInsertCertificates() {
145        int count = -1;
146        ContentValues contentValues = new ContentValues();
147        contentValues.put(CarrierDatabaseHelper.KEY_TYPE, dummy_type);
148        contentValues.put(CarrierDatabaseHelper.MCC, dummy_mcc);
149        contentValues.put(CarrierDatabaseHelper.MNC, dummy_mnc);
150        contentValues.put(CarrierDatabaseHelper.MVNO_TYPE, dummy_mvno_type);
151        contentValues.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, dummy_mvno_match_data);
152        contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, dummy_key_identifier_data);
153        contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, dummy_key1.getBytes());
154        contentValues.put(CarrierDatabaseHelper.EXPIRATION_TIME, dummy_key_expiration);
155
156        try {
157            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValues);
158        } catch (Exception e) {
159            Log.d(TAG, "Error inserting certificates:" + e);
160        }
161        try {
162            Cursor countCursor = mContentResolver.query(CarrierProvider.CONTENT_URI,
163                    new String[]{"count(*) AS count"},
164                    null,
165                    null,
166                    null);
167            countCursor.moveToFirst();
168            count = countCursor.getInt(0);
169        } catch (Exception e) {
170            Log.d(TAG, "Exception in getting count:" + e);
171        }
172        assertEquals(1, count);
173    }
174
175    /**
176     * Test update & query.
177     */
178    @Test
179    @SmallTest
180    public void testUpdateCertificates() {
181        String key = null;
182        ContentValues contentValues = new ContentValues();
183        contentValues.put(CarrierDatabaseHelper.KEY_TYPE, dummy_type);
184        contentValues.put(CarrierDatabaseHelper.MCC, dummy_mcc);
185        contentValues.put(CarrierDatabaseHelper.MNC, dummy_mnc);
186        contentValues.put(CarrierDatabaseHelper.MVNO_TYPE, dummy_mvno_type);
187        contentValues.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, dummy_mvno_match_data);
188        contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, dummy_key_identifier_data);
189        contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, dummy_key1.getBytes());
190        contentValues.put(CarrierDatabaseHelper.EXPIRATION_TIME, dummy_key_expiration);
191
192        try {
193            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValues);
194        } catch (Exception e) {
195            Log.d(TAG, "Error inserting certificates:" + e);
196        }
197
198        try {
199            ContentValues updatedValues = new ContentValues();
200            updatedValues.put(CarrierDatabaseHelper.PUBLIC_KEY, dummy_key2);
201            mContentResolver.update(CarrierProvider.CONTENT_URI, updatedValues,
202                    "mcc=? and mnc=? and key_type=?", new String[] { dummy_mcc, dummy_mnc,
203                            String.valueOf(dummy_type) });
204        } catch (Exception e) {
205            Log.d(TAG, "Error updating values:" + e);
206        }
207
208        try {
209            String[] columns ={CarrierDatabaseHelper.PUBLIC_KEY};
210            Cursor findEntry = mContentResolver.query(CarrierProvider.CONTENT_URI, columns,
211                    "mcc=? and mnc=? and key_type=?",
212                    new String[] { dummy_mcc, dummy_mnc, String.valueOf(dummy_type) }, null);
213            findEntry.moveToFirst();
214            key = findEntry.getString(0);
215        } catch (Exception e) {
216            Log.d(TAG, "Query failed:" + e);
217        }
218        assertEquals(key, dummy_key2);
219    }
220
221    /**
222     * Test inserting multiple certs
223     */
224    @Test
225    @SmallTest
226    public void testMultipleCertificates() {
227        int count = -1;
228        ContentValues contentValues = new ContentValues();
229        contentValues.put(CarrierDatabaseHelper.KEY_TYPE, dummy_type);
230        contentValues.put(CarrierDatabaseHelper.MCC, dummy_mcc);
231        contentValues.put(CarrierDatabaseHelper.MNC, dummy_mnc);
232        contentValues.put(CarrierDatabaseHelper.MVNO_TYPE, dummy_mvno_type);
233        contentValues.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, dummy_mvno_match_data);
234        contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, dummy_key_identifier_data);
235        contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, dummy_key1.getBytes());
236
237        ContentValues contentValuesNew = new ContentValues();
238        contentValuesNew.put(CarrierDatabaseHelper.KEY_TYPE, dummy_type);
239        contentValuesNew.put(CarrierDatabaseHelper.MCC, dummy_mcc);
240        contentValuesNew.put(CarrierDatabaseHelper.MNC, dummy_mnc2);
241        contentValuesNew.put(CarrierDatabaseHelper.MVNO_TYPE, dummy_mvno_type);
242        contentValuesNew.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, dummy_mvno_match_data);
243        contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, dummy_key_identifier_data);
244        contentValuesNew.put(CarrierDatabaseHelper.PUBLIC_KEY, dummy_key2.getBytes());
245
246        try {
247            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValues);
248            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValuesNew);
249        } catch (Exception e) {
250            System.out.println("Error inserting certificates:: " + e);
251        }
252
253        try {
254            Cursor countCursor = mContentResolver.query(CarrierProvider.CONTENT_URI,
255                    new String[]{"count(*) AS count"},
256                    null,
257                    null,
258                    null);
259            countCursor.moveToFirst();
260            count = countCursor.getInt(0);
261        } catch (Exception e) {
262            Log.d(TAG, "Exception in getting count:" + e);
263        }
264        assertEquals(2, count);
265    }
266
267    /**
268     * Test inserting duplicate values in carrier key table. Ensure that a SQLException is thrown.
269     */
270    @Test(expected = SQLException.class)
271    public void testDuplicateFailure() {
272        ContentValues contentValues = new ContentValues();
273        contentValues.put(CarrierDatabaseHelper.KEY_TYPE, dummy_type);
274        contentValues.put(CarrierDatabaseHelper.MCC, dummy_mcc);
275        contentValues.put(CarrierDatabaseHelper.MNC, dummy_mnc);
276        contentValues.put(CarrierDatabaseHelper.MVNO_TYPE, dummy_mvno_type);
277        contentValues.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, dummy_mvno_match_data);
278        contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, dummy_key1.getBytes());
279
280        try {
281            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValues);
282        } catch (Exception e) {
283            Log.d(TAG, "Error inserting certificates:: " + e);
284        }
285        try {
286            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValues);
287        } catch (Exception e) {
288            Log.d(TAG, "Error inserting certificates:: " + e);
289        }
290    }
291
292    /**
293     * Test delete.
294     */
295    @Test
296    @SmallTest
297    public void testDelete() {
298        int numRowsDeleted = -1;
299        ContentValues contentValues = new ContentValues();
300        contentValues.put(CarrierDatabaseHelper.KEY_TYPE, dummy_type);
301        contentValues.put(CarrierDatabaseHelper.MCC, dummy_mcc);
302        contentValues.put(CarrierDatabaseHelper.MNC, dummy_mnc);
303        contentValues.put(CarrierDatabaseHelper.MVNO_TYPE, dummy_mvno_type);
304        contentValues.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, dummy_mvno_match_data);
305        contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, dummy_key_identifier_data);
306        contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, dummy_key1.getBytes());
307        contentValues.put(CarrierDatabaseHelper.EXPIRATION_TIME, dummy_key_expiration);
308
309        try {
310            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValues);
311        } catch (Exception e) {
312            Log.d(TAG, "Error inserting certificates:" + e);
313        }
314
315        try {
316            String whereClause = "mcc=? and mnc=?";
317            String[] whereArgs = new String[] { dummy_mcc, dummy_mnc };
318            numRowsDeleted = mContentResolver.delete(CarrierProvider.CONTENT_URI, whereClause, whereArgs);
319        } catch (Exception e) {
320            Log.d(TAG, "Error updating values:" + e);
321        }
322        assertEquals(numRowsDeleted, 1);
323    }
324
325}
326