16be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu/*
26be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * Copyright (C) 2016 The Android Open Source Project
36be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu *
46be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * Licensed under the Apache License, Version 2.0 (the "License");
56be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * you may not use this file except in compliance with the License.
66be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * You may obtain a copy of the License at
76be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu *
86be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu *      http://www.apache.org/licenses/LICENSE-2.0
96be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu *
106be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * Unless required by applicable law or agreed to in writing, software
116be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * distributed under the License is distributed on an "AS IS" BASIS,
126be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * See the License for the specific language governing permissions and
146be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * limitations under the License
156be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu */
166be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
176be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liupackage com.android.providers.telephony;
186be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
196be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.annotation.TargetApi;
206be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.content.ContentProvider;
216be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.content.ContentResolver;
226be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.content.ContentValues;
236be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.content.Context;
246be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.content.pm.PackageManager;
256be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.content.pm.ProviderInfo;
266be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.content.res.Resources;
276be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.database.Cursor;
286cf9bda025d069022162ca347667562664aa0b95Jordan Liuimport android.database.ContentObserver;
296be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.database.DatabaseErrorHandler;
306be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.database.sqlite.SQLiteDatabase;
316be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.database.sqlite.SQLiteOpenHelper;
326be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.database.sqlite.SQLiteDatabase.CursorFactory;
336be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.net.Uri;
346be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.os.Build;
356be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.os.FileUtils;
366be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.provider.Telephony.Carriers;
376be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.telephony.SubscriptionManager;
386be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.test.AndroidTestCase;
396be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.test.mock.MockContentProvider;
406be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.test.mock.MockContentResolver;
416be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.test.mock.MockContext;
42c7c60081080acf8053ca4c8125b986ba3df786c0Jordan Liuimport android.test.suitebuilder.annotation.SmallTest;
436be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.text.TextUtils;
446be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport android.util.Log;
456be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
466be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport com.android.providers.telephony.TelephonyProvider;
476be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
486be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport junit.framework.TestCase;
496be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
506be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport org.junit.After;
516be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport org.junit.Before;
526be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liuimport org.junit.Test;
536be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
546be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
556be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu/**
566be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * Tests for testing CRUD operations of TelephonyProvider.
576be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * Uses a MockContentResolver to get permission WRITE_APN_SETTINGS in order to test insert/delete
586be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * Uses TelephonyProviderTestable to set up in-memory database
596be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu *
606be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu * Build, install and run the tests by running the commands below:
616be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu *     runtest --path <dir or file>
626be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu *     runtest --path <dir or file> --test-method <testMethodName>
636be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu *     e.g.)
646be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu *         runtest --path tests/src/com/android/providers/telephony/TelephonyProviderTest.java \
656be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu *                 --test-method testInsertCarriers
666be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu */
676be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liupublic class TelephonyProviderTest extends TestCase {
686be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    private static final String TAG = "TelephonyProviderTest";
696be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
706be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    private MockContextWithProvider mContext;
716be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    private MockContentResolver mContentResolver;
726be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    private TelephonyProviderTestable mTelephonyProviderTestable;
736be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
746cf9bda025d069022162ca347667562664aa0b95Jordan Liu    private int notifyChangeCount;
756cf9bda025d069022162ca347667562664aa0b95Jordan Liu
766be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
776be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    /**
786be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu     * This is used to give the TelephonyProviderTest a mocked context which takes a
796be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu     * TelephonyProvider and attaches it to the ContentResolver with telephony authority.
806be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu     * The mocked context also gives WRITE_APN_SETTINGS permissions
816be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu     */
826be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    private class MockContextWithProvider extends MockContext {
836be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        private final MockContentResolver mResolver;
846be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
856be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        public MockContextWithProvider(TelephonyProvider telephonyProvider) {
866cf9bda025d069022162ca347667562664aa0b95Jordan Liu            mResolver = new MockContentResolver() {
876cf9bda025d069022162ca347667562664aa0b95Jordan Liu                @Override
886cf9bda025d069022162ca347667562664aa0b95Jordan Liu                public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork,
896cf9bda025d069022162ca347667562664aa0b95Jordan Liu                        int userHandle) {
906cf9bda025d069022162ca347667562664aa0b95Jordan Liu                    notifyChangeCount++;
916cf9bda025d069022162ca347667562664aa0b95Jordan Liu                }
926cf9bda025d069022162ca347667562664aa0b95Jordan Liu            };
936be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
946be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            // Add authority="telephony" to given telephonyProvider
956be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            ProviderInfo providerInfo = new ProviderInfo();
966be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            providerInfo.authority = "telephony";
976be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
986be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            // Add context to given telephonyProvider
996be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            telephonyProvider.attachInfoForTesting(this, providerInfo);
1006be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            Log.d(TAG, "MockContextWithProvider: telephonyProvider.getContext(): "
1016be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                    + telephonyProvider.getContext());
1026be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
1036be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            // Add given telephonyProvider to mResolver with authority="telephony" so that
1046be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            // mResolver can send queries to mTelephonyProvider
1056be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            mResolver.addProvider("telephony", telephonyProvider);
1066be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            Log.d(TAG, "MockContextWithProvider: Add telephonyProvider to mResolver");
1076be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        }
1086be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
1096be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        @Override
1106be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        public Object getSystemService(String name) {
1116be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            Log.d(TAG, "getSystemService: returning null");
1126be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            return null;
1136be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        }
1146be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
1156be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        @Override
1166be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        public Resources getResources() {
1176be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            Log.d(TAG, "getResources: returning null");
1186be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            return null;
1196be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        }
1206be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
1216be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        @Override
1226be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        public MockContentResolver getContentResolver() {
1236be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            return mResolver;
1246be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        }
1256be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
1266be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // Gives permission to write to the APN table within the MockContext
1276be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        @Override
1286be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        public int checkCallingOrSelfPermission(String permission) {
1296be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            if (TextUtils.equals(permission, "android.permission.WRITE_APN_SETTINGS")) {
1306be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
1316be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                        + ", returning PackageManager.PERMISSION_GRANTED");
1326be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                return PackageManager.PERMISSION_GRANTED;
1336be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            } else {
1346be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
1356be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                        + ", returning PackageManager.PERMISSION_DENIED");
1366be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                return PackageManager.PERMISSION_DENIED;
1376be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            }
1386be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        }
1396be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    }
1406be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
1416be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    @Override
1426be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    protected void setUp() throws Exception {
1436be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        super.setUp();
1446be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        mTelephonyProviderTestable = new TelephonyProviderTestable();
1456be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        mContext = new MockContextWithProvider(mTelephonyProviderTestable);
1466be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        mContentResolver = (MockContentResolver) mContext.getContentResolver();
1476cf9bda025d069022162ca347667562664aa0b95Jordan Liu        notifyChangeCount = 0;
1486be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    }
1496be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
1506be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    @Override
1516be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    protected void tearDown() throws Exception {
1526be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        super.tearDown();
1536be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        mTelephonyProviderTestable.closeDatabase();
1546be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    }
1556be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
1566be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    /**
1576cf9bda025d069022162ca347667562664aa0b95Jordan Liu     * Test bulk inserting, querying;
1586cf9bda025d069022162ca347667562664aa0b95Jordan Liu     * Verify that the inserted values match the result of the query.
1596cf9bda025d069022162ca347667562664aa0b95Jordan Liu     */
1606cf9bda025d069022162ca347667562664aa0b95Jordan Liu    @Test
1616cf9bda025d069022162ca347667562664aa0b95Jordan Liu    @SmallTest
1626cf9bda025d069022162ca347667562664aa0b95Jordan Liu    public void testBulkInsertCarriers() {
1636cf9bda025d069022162ca347667562664aa0b95Jordan Liu        // insert 2 test contentValues
1646cf9bda025d069022162ca347667562664aa0b95Jordan Liu        ContentValues contentValues = new ContentValues();
1656cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final String insertApn = "exampleApnName";
1666cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final String insertName = "exampleName";
1676cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final Integer insertCurrent = 1;
1686cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final String insertNumeric = "123456";
1696cf9bda025d069022162ca347667562664aa0b95Jordan Liu        contentValues.put(Carriers.APN, insertApn);
1706cf9bda025d069022162ca347667562664aa0b95Jordan Liu        contentValues.put(Carriers.NAME, insertName);
1716cf9bda025d069022162ca347667562664aa0b95Jordan Liu        contentValues.put(Carriers.CURRENT, insertCurrent);
1726cf9bda025d069022162ca347667562664aa0b95Jordan Liu        contentValues.put(Carriers.NUMERIC, insertNumeric);
1736cf9bda025d069022162ca347667562664aa0b95Jordan Liu
1746cf9bda025d069022162ca347667562664aa0b95Jordan Liu        ContentValues contentValues2 = new ContentValues();
1756cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final String insertApn2 = "exampleApnName2";
1766cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final String insertName2 = "exampleName2";
1776cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final Integer insertCurrent2 = 1;
1786cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final String insertNumeric2 = "789123";
1796cf9bda025d069022162ca347667562664aa0b95Jordan Liu        contentValues2.put(Carriers.APN, insertApn2);
1806cf9bda025d069022162ca347667562664aa0b95Jordan Liu        contentValues2.put(Carriers.NAME, insertName2);
1816cf9bda025d069022162ca347667562664aa0b95Jordan Liu        contentValues2.put(Carriers.CURRENT, insertCurrent2);
1826cf9bda025d069022162ca347667562664aa0b95Jordan Liu        contentValues2.put(Carriers.NUMERIC, insertNumeric2);
1836cf9bda025d069022162ca347667562664aa0b95Jordan Liu
1846cf9bda025d069022162ca347667562664aa0b95Jordan Liu        Log.d(TAG, "testInsertCarriers: Bulk inserting contentValues=" + contentValues
1856cf9bda025d069022162ca347667562664aa0b95Jordan Liu                + ", " + contentValues2);
1866cf9bda025d069022162ca347667562664aa0b95Jordan Liu        ContentValues[] values = new ContentValues[]{ contentValues, contentValues2 };
1876cf9bda025d069022162ca347667562664aa0b95Jordan Liu        int rows = mContentResolver.bulkInsert(Carriers.CONTENT_URI, values);
1886cf9bda025d069022162ca347667562664aa0b95Jordan Liu        assertEquals(2, rows);
1896cf9bda025d069022162ca347667562664aa0b95Jordan Liu        assertEquals(1, notifyChangeCount);
1906cf9bda025d069022162ca347667562664aa0b95Jordan Liu
1916cf9bda025d069022162ca347667562664aa0b95Jordan Liu        // get values in table
1926cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final String[] testProjection =
1936cf9bda025d069022162ca347667562664aa0b95Jordan Liu        {
1946cf9bda025d069022162ca347667562664aa0b95Jordan Liu            Carriers.APN,
1956cf9bda025d069022162ca347667562664aa0b95Jordan Liu            Carriers.NAME,
1966cf9bda025d069022162ca347667562664aa0b95Jordan Liu            Carriers.CURRENT,
1976cf9bda025d069022162ca347667562664aa0b95Jordan Liu        };
1986cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final String selection = Carriers.NUMERIC + "=?";
1996cf9bda025d069022162ca347667562664aa0b95Jordan Liu        String[] selectionArgs = { insertNumeric };
2006cf9bda025d069022162ca347667562664aa0b95Jordan Liu        Log.d(TAG, "testInsertCarriers query projection: " + testProjection
2016cf9bda025d069022162ca347667562664aa0b95Jordan Liu                + "\ntestInsertCarriers selection: " + selection
2026cf9bda025d069022162ca347667562664aa0b95Jordan Liu                + "\ntestInsertCarriers selectionArgs: " + selectionArgs);
2036cf9bda025d069022162ca347667562664aa0b95Jordan Liu        Cursor cursor = mContentResolver.query(Carriers.CONTENT_URI,
2046cf9bda025d069022162ca347667562664aa0b95Jordan Liu                testProjection, selection, selectionArgs, null);
2056cf9bda025d069022162ca347667562664aa0b95Jordan Liu
2066cf9bda025d069022162ca347667562664aa0b95Jordan Liu        // verify that inserted values match results of query
2076cf9bda025d069022162ca347667562664aa0b95Jordan Liu        assertNotNull(cursor);
2086cf9bda025d069022162ca347667562664aa0b95Jordan Liu        assertEquals(1, cursor.getCount());
2096cf9bda025d069022162ca347667562664aa0b95Jordan Liu        cursor.moveToFirst();
2106cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final String resultApn = cursor.getString(0);
2116cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final String resultName = cursor.getString(1);
2126cf9bda025d069022162ca347667562664aa0b95Jordan Liu        final Integer resultCurrent = cursor.getInt(2);
2136cf9bda025d069022162ca347667562664aa0b95Jordan Liu        assertEquals(insertApn, resultApn);
2146cf9bda025d069022162ca347667562664aa0b95Jordan Liu        assertEquals(insertName, resultName);
2156cf9bda025d069022162ca347667562664aa0b95Jordan Liu        assertEquals(insertCurrent, resultCurrent);
2166cf9bda025d069022162ca347667562664aa0b95Jordan Liu    }
2176cf9bda025d069022162ca347667562664aa0b95Jordan Liu
2186cf9bda025d069022162ca347667562664aa0b95Jordan Liu    /**
2196be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu     * Test inserting, querying, and deleting values in carriers table.
2206be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu     * Verify that the inserted values match the result of the query and are deleted.
2216be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu     */
2226be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    @Test
223c7c60081080acf8053ca4c8125b986ba3df786c0Jordan Liu    @SmallTest
2246be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    public void testInsertCarriers() {
2256be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // insert test contentValues
2266be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        ContentValues contentValues = new ContentValues();
2276be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String insertApn = "exampleApnName";
2286be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String insertName = "exampleName";
2296be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final Integer insertCurrent = 1;
2306be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String insertNumeric = "123456";
2316be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        contentValues.put(Carriers.APN, insertApn);
2326be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        contentValues.put(Carriers.NAME, insertName);
2336be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        contentValues.put(Carriers.CURRENT, insertCurrent);
2346be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        contentValues.put(Carriers.NUMERIC, insertNumeric);
2356be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
2366be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        Log.d(TAG, "testInsertCarriers Inserting contentValues: " + contentValues);
2376be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        mContentResolver.insert(Carriers.CONTENT_URI, contentValues);
2386be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
2396be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // get values in table
2406be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String[] testProjection =
2416be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        {
2426be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            Carriers.APN,
2436be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            Carriers.NAME,
2446be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            Carriers.CURRENT,
2456be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        };
2466be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String selection = Carriers.NUMERIC + "=?";
2476be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        String[] selectionArgs = { insertNumeric };
2486be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        Log.d(TAG, "testInsertCarriers query projection: " + testProjection
2496be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                + "\ntestInsertCarriers selection: " + selection
2506be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                + "\ntestInsertCarriers selectionArgs: " + selectionArgs);
2516be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        Cursor cursor = mContentResolver.query(Carriers.CONTENT_URI,
2526be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                testProjection, selection, selectionArgs, null);
2536be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
2546be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // verify that inserted values match results of query
2556be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertNotNull(cursor);
2566be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(1, cursor.getCount());
2576be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        cursor.moveToFirst();
2586be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String resultApn = cursor.getString(0);
2596be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String resultName = cursor.getString(1);
2606be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final Integer resultCurrent = cursor.getInt(2);
2616be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(insertApn, resultApn);
2626be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(insertName, resultName);
2636be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(insertCurrent, resultCurrent);
2646be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
2656be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // delete test content
2666be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String selectionToDelete = Carriers.NUMERIC + "=?";
2676be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        String[] selectionArgsToDelete = { insertNumeric };
2686be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        Log.d(TAG, "testInsertCarriers deleting selection: " + selectionToDelete
2696be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                + "testInsertCarriers selectionArgs: " + selectionArgs);
2706be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        int numRowsDeleted = mContentResolver.delete(Carriers.CONTENT_URI,
2716be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                selectionToDelete, selectionArgsToDelete);
2726be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(1, numRowsDeleted);
2736be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
2746be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // verify that deleted values are gone
2756be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        cursor = mContentResolver.query(Carriers.CONTENT_URI,
2766be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                testProjection, selection, selectionArgs, null);
2776be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(0, cursor.getCount());
2786be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    }
2796be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
2806be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    /**
2816be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu     * Test inserting, querying, and deleting values in carriers table.
2826be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu     * Verify that the inserted values match the result of the query and are deleted.
2836be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu     */
2846be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    @Test
285c7c60081080acf8053ca4c8125b986ba3df786c0Jordan Liu    @SmallTest
2866be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    public void testSimTable() {
2876be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // insert test contentValues
2886be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        ContentValues contentValues = new ContentValues();
2896be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final int insertSubId = 11;
2906be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String insertDisplayName = "exampleDisplayName";
2916be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String insertCarrierName = "exampleCarrierName";
2926be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String insertIccId = "exampleIccId";
2936be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        contentValues.put(SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID, insertSubId);
2946be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        contentValues.put(SubscriptionManager.DISPLAY_NAME, insertDisplayName);
2956be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        contentValues.put(SubscriptionManager.CARRIER_NAME, insertCarrierName);
2966be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        contentValues.put(SubscriptionManager.ICC_ID, insertIccId);
2976be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
2986be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        Log.d(TAG, "testSimTable Inserting contentValues: " + contentValues);
2996be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        mContentResolver.insert(SubscriptionManager.CONTENT_URI, contentValues);
3006be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
3016be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // get values in table
3026be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String[] testProjection =
3036be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        {
3046be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID,
3056be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu            SubscriptionManager.CARRIER_NAME,
3066be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        };
3076be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String selection = SubscriptionManager.DISPLAY_NAME + "=?";
3086be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        String[] selectionArgs = { insertDisplayName };
3096be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        Log.d(TAG,"\ntestSimTable selection: " + selection
3106be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                + "\ntestSimTable selectionArgs: " + selectionArgs.toString());
3116be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        Cursor cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
3126be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                testProjection, selection, selectionArgs, null);
3136be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
3146be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // verify that inserted values match results of query
3156be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertNotNull(cursor);
3166be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(1, cursor.getCount());
3176be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        cursor.moveToFirst();
3186be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final int resultSubId = cursor.getInt(0);
3196be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String resultCarrierName = cursor.getString(1);
3206be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(insertSubId, resultSubId);
3216be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(insertCarrierName, resultCarrierName);
3226be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
3236be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // delete test content
3246be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        final String selectionToDelete = SubscriptionManager.DISPLAY_NAME + "=?";
3256be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        String[] selectionArgsToDelete = { insertDisplayName };
3266be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        Log.d(TAG, "testSimTable deleting selection: " + selectionToDelete
3276be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                + "testSimTable selectionArgs: " + selectionArgs);
3286be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        int numRowsDeleted = mContentResolver.delete(SubscriptionManager.CONTENT_URI,
3296be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                selectionToDelete, selectionArgsToDelete);
3306be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(1, numRowsDeleted);
3316be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu
3326be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        // verify that deleted values are gone
3336be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
3346be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu                testProjection, selection, selectionArgs, null);
3356be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu        assertEquals(0, cursor.getCount());
3366be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu    }
3376be205a1b573f0bd1a0678729ff1ad6e4a6e4e72Jordan Liu}
338