diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 97e9b69..5b3670b 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -47,6 +47,7 @@
 import android.util.Xml;
 
 import com.android.internal.util.XmlUtils;
+import com.android.internal.annotations.VisibleForTesting;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -152,6 +153,84 @@
         CARRIERS_UNIQUE_FIELDS.add(PROFILE_ID);
     }
 
+    @VisibleForTesting
+    public static final String CREATE_CARRIERS_TABLE_STRING = "CREATE TABLE " + CARRIERS_TABLE +
+            "(_id INTEGER PRIMARY KEY," +
+            NAME + " TEXT DEFAULT ''," +
+            NUMERIC + " TEXT DEFAULT ''," +
+            MCC + " TEXT DEFAULT ''," +
+            MNC + " TEXT DEFAULT ''," +
+            APN + " TEXT DEFAULT ''," +
+            USER + " TEXT DEFAULT ''," +
+            SERVER + " TEXT DEFAULT ''," +
+            PASSWORD + " TEXT DEFAULT ''," +
+            PROXY + " TEXT DEFAULT ''," +
+            PORT + " TEXT DEFAULT ''," +
+            MMSPROXY + " TEXT DEFAULT ''," +
+            MMSPORT + " TEXT DEFAULT ''," +
+            MMSC + " TEXT DEFAULT ''," +
+            AUTH_TYPE + " INTEGER DEFAULT -1," +
+            TYPE + " TEXT DEFAULT ''," +
+            CURRENT + " INTEGER," +
+            PROTOCOL + " TEXT DEFAULT 'IP'," +
+            ROAMING_PROTOCOL + " TEXT DEFAULT 'IP'," +
+            CARRIER_ENABLED + " BOOLEAN DEFAULT 1," +
+            BEARER + " INTEGER DEFAULT 0," +
+            BEARER_BITMASK + " INTEGER DEFAULT 0," +
+            MVNO_TYPE + " TEXT DEFAULT ''," +
+            MVNO_MATCH_DATA + " TEXT DEFAULT ''," +
+            SUBSCRIPTION_ID + " INTEGER DEFAULT "
+            + SubscriptionManager.INVALID_SUBSCRIPTION_ID + "," +
+            PROFILE_ID + " INTEGER DEFAULT 0," +
+            MODEM_COGNITIVE + " BOOLEAN DEFAULT 0," +
+            MAX_CONNS + " INTEGER DEFAULT 0," +
+            WAIT_TIME + " INTEGER DEFAULT 0," +
+            MAX_CONNS_TIME + " INTEGER DEFAULT 0," +
+            MTU + " INTEGER DEFAULT 0," +
+            EDITED + " INTEGER DEFAULT " + UNEDITED + "," +
+            USER_VISIBLE + " BOOLEAN DEFAULT 1," +
+            // Uniqueness collisions are used to trigger merge code so if a field is listed
+            // here it means we will accept both (user edited + new apn_conf definition)
+            // Columns not included in UNIQUE constraint: name, current, edited,
+            // user, server, password, authtype, type, protocol, roaming_protocol, sub_id,
+            // modem_cognitive, max_conns, wait_time, max_conns_time, mtu, bearer_bitmask,
+            // user_visible
+            "UNIQUE (" + TextUtils.join(", ", CARRIERS_UNIQUE_FIELDS) + "));";
+
+    @VisibleForTesting
+    public static final String CREATE_SIMINFO_TABLE_STRING = "CREATE TABLE " + SIMINFO_TABLE + "("
+            + SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID
+                + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+            + SubscriptionManager.ICC_ID + " TEXT NOT NULL,"
+            + SubscriptionManager.SIM_SLOT_INDEX
+                + " INTEGER DEFAULT " + SubscriptionManager.SIM_NOT_INSERTED + ","
+            + SubscriptionManager.DISPLAY_NAME + " TEXT,"
+            + SubscriptionManager.CARRIER_NAME + " TEXT,"
+            + SubscriptionManager.NAME_SOURCE
+                + " INTEGER DEFAULT " + SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE + ","
+            + SubscriptionManager.COLOR
+                + " INTEGER DEFAULT " + SubscriptionManager.COLOR_DEFAULT + ","
+            + SubscriptionManager.NUMBER + " TEXT,"
+            + SubscriptionManager.DISPLAY_NUMBER_FORMAT
+                + " INTEGER NOT NULL DEFAULT " + SubscriptionManager.DISPLAY_NUMBER_DEFAULT + ","
+            + SubscriptionManager.DATA_ROAMING
+                + " INTEGER DEFAULT " + SubscriptionManager.DATA_ROAMING_DEFAULT + ","
+            + SubscriptionManager.MCC + " INTEGER DEFAULT 0,"
+            + SubscriptionManager.MNC + " INTEGER DEFAULT 0,"
+            + SubscriptionManager.CB_EXTREME_THREAT_ALERT + " INTEGER DEFAULT 1,"
+            + SubscriptionManager.CB_SEVERE_THREAT_ALERT + " INTEGER DEFAULT 1,"
+            + SubscriptionManager.CB_AMBER_ALERT + " INTEGER DEFAULT 1,"
+            + SubscriptionManager.CB_EMERGENCY_ALERT + " INTEGER DEFAULT 1,"
+            + SubscriptionManager.CB_ALERT_SOUND_DURATION + " INTEGER DEFAULT 4,"
+            + SubscriptionManager.CB_ALERT_REMINDER_INTERVAL + " INTEGER DEFAULT 0,"
+            + SubscriptionManager.CB_ALERT_VIBRATE + " INTEGER DEFAULT 1,"
+            + SubscriptionManager.CB_ALERT_SPEECH + " INTEGER DEFAULT 1,"
+            + SubscriptionManager.CB_ETWS_TEST_ALERT + " INTEGER DEFAULT 0,"
+            + SubscriptionManager.CB_CHANNEL_50_ALERT + " INTEGER DEFAULT 1,"
+            + SubscriptionManager.CB_CMAS_TEST_ALERT + " INTEGER DEFAULT 0,"
+            + SubscriptionManager.CB_OPT_OUT_DIALOG + " INTEGER DEFAULT 1"
+            + ");";
+
     static {
         s_urlMatcher.addURI("telephony", "carriers", URL_TELEPHONY);
         s_urlMatcher.addURI("telephony", "carriers/current", URL_CURRENT);
@@ -248,81 +327,14 @@
 
         private void createSimInfoTable(SQLiteDatabase db) {
             if (DBG) log("dbh.createSimInfoTable:+");
-            db.execSQL("CREATE TABLE " + SIMINFO_TABLE + "("
-                    + SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
-                    + SubscriptionManager.ICC_ID + " TEXT NOT NULL,"
-                    + SubscriptionManager.SIM_SLOT_INDEX + " INTEGER DEFAULT " + SubscriptionManager.SIM_NOT_INSERTED + ","
-                    + SubscriptionManager.DISPLAY_NAME + " TEXT,"
-                    + SubscriptionManager.CARRIER_NAME + " TEXT,"
-                    + SubscriptionManager.NAME_SOURCE + " INTEGER DEFAULT " + SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE + ","
-                    + SubscriptionManager.COLOR + " INTEGER DEFAULT " + SubscriptionManager.COLOR_DEFAULT + ","
-                    + SubscriptionManager.NUMBER + " TEXT,"
-                    + SubscriptionManager.DISPLAY_NUMBER_FORMAT + " INTEGER NOT NULL DEFAULT " + SubscriptionManager.DISPLAY_NUMBER_DEFAULT + ","
-                    + SubscriptionManager.DATA_ROAMING + " INTEGER DEFAULT " + SubscriptionManager.DATA_ROAMING_DEFAULT + ","
-                    + SubscriptionManager.MCC + " INTEGER DEFAULT 0,"
-                    + SubscriptionManager.MNC + " INTEGER DEFAULT 0,"
-                    + SubscriptionManager.SIM_PROVISIONING_STATUS + " INTEGER DEFAULT " + SubscriptionManager.SIM_PROVISIONED + ","
-                    + SubscriptionManager.CB_EXTREME_THREAT_ALERT + " INTEGER DEFAULT 1,"
-                    + SubscriptionManager.CB_SEVERE_THREAT_ALERT + " INTEGER DEFAULT 1,"
-                    + SubscriptionManager.CB_AMBER_ALERT + " INTEGER DEFAULT 1,"
-                    + SubscriptionManager.CB_EMERGENCY_ALERT + " INTEGER DEFAULT 1,"
-                    + SubscriptionManager.CB_ALERT_SOUND_DURATION + " INTEGER DEFAULT 4,"
-                    + SubscriptionManager.CB_ALERT_REMINDER_INTERVAL + " INTEGER DEFAULT 0,"
-                    + SubscriptionManager.CB_ALERT_VIBRATE + " INTEGER DEFAULT 1,"
-                    + SubscriptionManager.CB_ALERT_SPEECH + " INTEGER DEFAULT 1,"
-                    + SubscriptionManager.CB_ETWS_TEST_ALERT + " INTEGER DEFAULT 0,"
-                    + SubscriptionManager.CB_CHANNEL_50_ALERT + " INTEGER DEFAULT 1,"
-                    + SubscriptionManager.CB_CMAS_TEST_ALERT + " INTEGER DEFAULT 0,"
-                    + SubscriptionManager.CB_OPT_OUT_DIALOG + " INTEGER DEFAULT 1"
-                    + ");");
+            db.execSQL(CREATE_SIMINFO_TABLE_STRING);
             if (DBG) log("dbh.createSimInfoTable:-");
         }
 
         private void createCarriersTable(SQLiteDatabase db, String tableName) {
             // Set up the database schema
             if (DBG) log("dbh.createCarriersTable: " + tableName);
-            db.execSQL("CREATE TABLE " + tableName +
-                    "(_id INTEGER PRIMARY KEY," +
-                    NAME + " TEXT DEFAULT ''," +
-                    NUMERIC + " TEXT DEFAULT ''," +
-                    MCC + " TEXT DEFAULT ''," +
-                    MNC + " TEXT DEFAULT ''," +
-                    APN + " TEXT DEFAULT ''," +
-                    USER + " TEXT DEFAULT ''," +
-                    SERVER + " TEXT DEFAULT ''," +
-                    PASSWORD + " TEXT DEFAULT ''," +
-                    PROXY + " TEXT DEFAULT ''," +
-                    PORT + " TEXT DEFAULT ''," +
-                    MMSPROXY + " TEXT DEFAULT ''," +
-                    MMSPORT + " TEXT DEFAULT ''," +
-                    MMSC + " TEXT DEFAULT ''," +
-                    AUTH_TYPE + " INTEGER DEFAULT -1," +
-                    TYPE + " TEXT DEFAULT ''," +
-                    CURRENT + " INTEGER," +
-                    PROTOCOL + " TEXT DEFAULT 'IP'," +
-                    ROAMING_PROTOCOL + " TEXT DEFAULT 'IP'," +
-                    CARRIER_ENABLED + " BOOLEAN DEFAULT 1," +
-                    BEARER + " INTEGER DEFAULT 0," +
-                    BEARER_BITMASK + " INTEGER DEFAULT 0," +
-                    MVNO_TYPE + " TEXT DEFAULT ''," +
-                    MVNO_MATCH_DATA + " TEXT DEFAULT ''," +
-                    SUBSCRIPTION_ID + " INTEGER DEFAULT "
-                    + SubscriptionManager.INVALID_SUBSCRIPTION_ID + "," +
-                    PROFILE_ID + " INTEGER DEFAULT 0," +
-                    MODEM_COGNITIVE + " BOOLEAN DEFAULT 0," +
-                    MAX_CONNS + " INTEGER DEFAULT 0," +
-                    WAIT_TIME + " INTEGER DEFAULT 0," +
-                    MAX_CONNS_TIME + " INTEGER DEFAULT 0," +
-                    MTU + " INTEGER DEFAULT 0," +
-                    EDITED + " INTEGER DEFAULT " + UNEDITED + "," +
-                    USER_VISIBLE + " BOOLEAN DEFAULT 1," +
-                    // Uniqueness collisions are used to trigger merge code so if a field is listed
-                    // here it means we will accept both (user edited + new apn_conf definition)
-                    // Columns not included in UNIQUE constraint: name, current, edited,
-                    // user, server, password, authtype, type, protocol, roaming_protocol, sub_id,
-                    // modem_cognitive, max_conns, wait_time, max_conns_time, mtu, bearer_bitmask,
-                    // user_visible
-                    "UNIQUE (" + TextUtils.join(", ", CARRIERS_UNIQUE_FIELDS) + "));");
+            db.execSQL(CREATE_CARRIERS_TABLE_STRING);
             if (DBG) log("dbh.createCarriersTable:-");
         }
 
@@ -1453,13 +1465,31 @@
         }
     }
 
+    /**
+     * These methods can be overridden in a subclass for testing TelephonyProvider using an
+     * in-memory database.
+     */
+    SQLiteDatabase getReadableDatabase() {
+        return mOpenHelper.getReadableDatabase();
+    }
+    SQLiteDatabase getWritableDatabase() {
+        return mOpenHelper.getWritableDatabase();
+    }
+    void initDatabaseWithDatabaseHelper(SQLiteDatabase db) {
+        mOpenHelper.initDatabase(db);
+    }
+    boolean needApnDbUpdate() {
+        return mOpenHelper.apnDbUpdateNeeded();
+    }
+
+
     @Override
     public boolean onCreate() {
         mOpenHelper = new DatabaseHelper(getContext());
 
         // Call getReadableDatabase() to make sure onUpgrade is called
         if (VDBG) log("onCreate: calling getReadableDatabase to trigger onUpgrade");
-        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+        SQLiteDatabase db = getReadableDatabase();
 
         // Update APN db on build update
         String newBuildId = SystemProperties.get("ro.build.id", null);
@@ -1551,7 +1581,7 @@
 
     private void setPreferredApn(Long id, int subId) {
         log("setPreferredApn: _id " + id + " subId " + subId);
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getWritableDatabase();
         // query all unique fields from id
         String[] proj = CARRIERS_UNIQUE_FIELDS.toArray(new String[CARRIERS_UNIQUE_FIELDS.size()]);
         Cursor c = db.query(CARRIERS_TABLE, proj, "_id=" + id, null, null, null, null);
@@ -1579,7 +1609,7 @@
 
     private long getPreferredApnIdFromApn(int subId) {
         log("getPreferredApnIdFromApn: for subId " + subId);
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getWritableDatabase();
         String where = TextUtils.join("=? and ", CARRIERS_UNIQUE_FIELDS) + "=?";
         String[] whereArgs = new String[CARRIERS_UNIQUE_FIELDS.size()];
         SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE_FULL_APN,
@@ -1733,7 +1763,7 @@
             }
         }
 
-        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+        SQLiteDatabase db = getReadableDatabase();
         Cursor ret = null;
         try {
             // Exclude entries marked deleted
@@ -1788,7 +1818,7 @@
 
         checkPermission();
 
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getWritableDatabase();
         int match = s_urlMatcher.match(url);
         boolean notify = false;
         switch (match)
@@ -1938,7 +1968,7 @@
 
         checkPermission();
 
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getWritableDatabase();
         int match = s_urlMatcher.match(url);
         switch (match)
         {
@@ -2073,7 +2103,7 @@
 
         checkPermission();
 
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getWritableDatabase();
         int match = s_urlMatcher.match(url);
         switch (match)
         {
@@ -2228,7 +2258,7 @@
     private DatabaseHelper mOpenHelper;
 
     private void restoreDefaultAPN(int subId) {
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getWritableDatabase();
 
         try {
             db.delete(CARRIERS_TABLE, null, null);
@@ -2236,16 +2266,16 @@
             loge("got exception when deleting to restore: " + e);
         }
         setPreferredApnId((long) INVALID_APN_ID, subId);
-        mOpenHelper.initDatabase(db);
+        initDatabaseWithDatabaseHelper(db);
     }
 
     private synchronized void updateApnDb() {
-        if (!mOpenHelper.apnDbUpdateNeeded()) {
+        if (!needApnDbUpdate()) {
             log("Skipping apn db update since apn-conf has not changed.");
             return;
         }
 
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getWritableDatabase();
 
         // Delete preferred APN for all subIds
         deletePreferredApnId();
@@ -2258,7 +2288,7 @@
             loge("got exception when deleting to update: " + e);
         }
 
-        mOpenHelper.initDatabase(db);
+        initDatabaseWithDatabaseHelper(db);
 
         // Notify listereners of DB change since DB has been updated
         getContext().getContentResolver().notifyChange(
diff --git a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
new file mode 100644
index 0000000..dfbb992
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.providers.telephony;
+
+import android.annotation.TargetApi;
+import android.content.ContentProvider;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.database.DatabaseErrorHandler;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteDatabase.CursorFactory;
+import android.net.Uri;
+import android.os.Build;
+import android.os.FileUtils;
+import android.provider.Telephony.Carriers;
+import android.telephony.SubscriptionManager;
+import android.test.AndroidTestCase;
+import android.test.mock.MockContentProvider;
+import android.test.mock.MockContentResolver;
+import android.test.mock.MockContext;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.providers.telephony.TelephonyProvider;
+
+import junit.framework.TestCase;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ * Tests for testing CRUD operations of TelephonyProvider.
+ * Uses a MockContentResolver to get permission WRITE_APN_SETTINGS in order to test insert/delete
+ * Uses TelephonyProviderTestable to set up in-memory database
+ *
+ * Build, install and run the tests by running the commands below:
+ *     runtest --path <dir or file>
+ *     runtest --path <dir or file> --test-method <testMethodName>
+ *     e.g.)
+ *         runtest --path tests/src/com/android/providers/telephony/TelephonyProviderTest.java \
+ *                 --test-method testInsertCarriers
+ */
+public class TelephonyProviderTest extends TestCase {
+    private static final String TAG = "TelephonyProviderTest";
+
+    private MockContextWithProvider mContext;
+    private MockContentResolver mContentResolver;
+    private TelephonyProviderTestable mTelephonyProviderTestable;
+
+
+    /**
+     * This is used to give the TelephonyProviderTest a mocked context which takes a
+     * TelephonyProvider and attaches it to the ContentResolver with telephony authority.
+     * The mocked context also gives WRITE_APN_SETTINGS permissions
+     */
+    private class MockContextWithProvider extends MockContext {
+        private final MockContentResolver mResolver;
+
+        public MockContextWithProvider(TelephonyProvider telephonyProvider) {
+            mResolver = new MockContentResolver();
+
+            // Add authority="telephony" to given telephonyProvider
+            ProviderInfo providerInfo = new ProviderInfo();
+            providerInfo.authority = "telephony";
+
+            // Add context to given telephonyProvider
+            telephonyProvider.attachInfoForTesting(this, providerInfo);
+            Log.d(TAG, "MockContextWithProvider: telephonyProvider.getContext(): "
+                    + telephonyProvider.getContext());
+
+            // Add given telephonyProvider to mResolver with authority="telephony" so that
+            // mResolver can send queries to mTelephonyProvider
+            mResolver.addProvider("telephony", telephonyProvider);
+            Log.d(TAG, "MockContextWithProvider: Add telephonyProvider to mResolver");
+        }
+
+        @Override
+        public Object getSystemService(String name) {
+            Log.d(TAG, "getSystemService: returning null");
+            return null;
+        }
+
+        @Override
+        public Resources getResources() {
+            Log.d(TAG, "getResources: returning null");
+            return null;
+        }
+
+        @Override
+        public MockContentResolver getContentResolver() {
+            return mResolver;
+        }
+
+        // Gives permission to write to the APN table within the MockContext
+        @Override
+        public int checkCallingOrSelfPermission(String permission) {
+            if (TextUtils.equals(permission, "android.permission.WRITE_APN_SETTINGS")) {
+                Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
+                        + ", returning PackageManager.PERMISSION_GRANTED");
+                return PackageManager.PERMISSION_GRANTED;
+            } else {
+                Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
+                        + ", returning PackageManager.PERMISSION_DENIED");
+                return PackageManager.PERMISSION_DENIED;
+            }
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mTelephonyProviderTestable = new TelephonyProviderTestable();
+        mContext = new MockContextWithProvider(mTelephonyProviderTestable);
+        mContentResolver = (MockContentResolver) mContext.getContentResolver();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mTelephonyProviderTestable.closeDatabase();
+    }
+
+    /**
+     * Test inserting, querying, and deleting values in carriers table.
+     * Verify that the inserted values match the result of the query and are deleted.
+     */
+    @Test
+    public void testInsertCarriers() {
+        // insert test contentValues
+        ContentValues contentValues = new ContentValues();
+        final String insertApn = "exampleApnName";
+        final String insertName = "exampleName";
+        final Integer insertCurrent = 1;
+        final String insertNumeric = "123456";
+        contentValues.put(Carriers.APN, insertApn);
+        contentValues.put(Carriers.NAME, insertName);
+        contentValues.put(Carriers.CURRENT, insertCurrent);
+        contentValues.put(Carriers.NUMERIC, insertNumeric);
+
+        Log.d(TAG, "testInsertCarriers Inserting contentValues: " + contentValues);
+        mContentResolver.insert(Carriers.CONTENT_URI, contentValues);
+
+        // get values in table
+        final String[] testProjection =
+        {
+            Carriers.APN,
+            Carriers.NAME,
+            Carriers.CURRENT,
+        };
+        final String selection = Carriers.NUMERIC + "=?";
+        String[] selectionArgs = { insertNumeric };
+        Log.d(TAG, "testInsertCarriers query projection: " + testProjection
+                + "\ntestInsertCarriers selection: " + selection
+                + "\ntestInsertCarriers selectionArgs: " + selectionArgs);
+        Cursor cursor = mContentResolver.query(Carriers.CONTENT_URI,
+                testProjection, selection, selectionArgs, null);
+
+        // verify that inserted values match results of query
+        assertNotNull(cursor);
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        final String resultApn = cursor.getString(0);
+        final String resultName = cursor.getString(1);
+        final Integer resultCurrent = cursor.getInt(2);
+        assertEquals(insertApn, resultApn);
+        assertEquals(insertName, resultName);
+        assertEquals(insertCurrent, resultCurrent);
+
+        // delete test content
+        final String selectionToDelete = Carriers.NUMERIC + "=?";
+        String[] selectionArgsToDelete = { insertNumeric };
+        Log.d(TAG, "testInsertCarriers deleting selection: " + selectionToDelete
+                + "testInsertCarriers selectionArgs: " + selectionArgs);
+        int numRowsDeleted = mContentResolver.delete(Carriers.CONTENT_URI,
+                selectionToDelete, selectionArgsToDelete);
+        assertEquals(1, numRowsDeleted);
+
+        // verify that deleted values are gone
+        cursor = mContentResolver.query(Carriers.CONTENT_URI,
+                testProjection, selection, selectionArgs, null);
+        assertEquals(0, cursor.getCount());
+    }
+
+    /**
+     * Test inserting, querying, and deleting values in carriers table.
+     * Verify that the inserted values match the result of the query and are deleted.
+     */
+    @Test
+    public void testSimTable() {
+        // insert test contentValues
+        ContentValues contentValues = new ContentValues();
+        final int insertSubId = 11;
+        final String insertDisplayName = "exampleDisplayName";
+        final String insertCarrierName = "exampleCarrierName";
+        final String insertIccId = "exampleIccId";
+        contentValues.put(SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID, insertSubId);
+        contentValues.put(SubscriptionManager.DISPLAY_NAME, insertDisplayName);
+        contentValues.put(SubscriptionManager.CARRIER_NAME, insertCarrierName);
+        contentValues.put(SubscriptionManager.ICC_ID, insertIccId);
+
+        Log.d(TAG, "testSimTable Inserting contentValues: " + contentValues);
+        mContentResolver.insert(SubscriptionManager.CONTENT_URI, contentValues);
+
+        // get values in table
+        final String[] testProjection =
+        {
+            SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID,
+            SubscriptionManager.CARRIER_NAME,
+        };
+        final String selection = SubscriptionManager.DISPLAY_NAME + "=?";
+        String[] selectionArgs = { insertDisplayName };
+        Log.d(TAG,"\ntestSimTable selection: " + selection
+                + "\ntestSimTable selectionArgs: " + selectionArgs.toString());
+        Cursor cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
+                testProjection, selection, selectionArgs, null);
+
+        // verify that inserted values match results of query
+        assertNotNull(cursor);
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        final int resultSubId = cursor.getInt(0);
+        final String resultCarrierName = cursor.getString(1);
+        assertEquals(insertSubId, resultSubId);
+        assertEquals(insertCarrierName, resultCarrierName);
+
+        // delete test content
+        final String selectionToDelete = SubscriptionManager.DISPLAY_NAME + "=?";
+        String[] selectionArgsToDelete = { insertDisplayName };
+        Log.d(TAG, "testSimTable deleting selection: " + selectionToDelete
+                + "testSimTable selectionArgs: " + selectionArgs);
+        int numRowsDeleted = mContentResolver.delete(SubscriptionManager.CONTENT_URI,
+                selectionToDelete, selectionArgsToDelete);
+        assertEquals(1, numRowsDeleted);
+
+        // verify that deleted values are gone
+        cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
+                testProjection, selection, selectionArgs, null);
+        assertEquals(0, cursor.getCount());
+    }
+}
diff --git a/tests/src/com/android/providers/telephony/TelephonyProviderTestable.java b/tests/src/com/android/providers/telephony/TelephonyProviderTestable.java
new file mode 100644
index 0000000..b736545
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/TelephonyProviderTestable.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.providers.telephony;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.provider.Telephony;
+import android.telephony.SubscriptionManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.List;
+import java.util.ArrayList;
+import com.android.providers.telephony.TelephonyProvider;
+import static android.provider.Telephony.Carriers.*;
+
+/**
+ * A subclass of TelephonyProvider used for testing on an in-memory database
+ */
+public class TelephonyProviderTestable extends TelephonyProvider {
+    private static final String TAG = "TelephonyProviderTestable";
+
+    private InMemoryTelephonyProviderDbHelper mDbHelper;
+
+    @Override
+    public boolean onCreate() {
+        Log.d(TAG, "onCreate called: mDbHelper = new InMemoryTelephonyProviderDbHelper()");
+        mDbHelper = new InMemoryTelephonyProviderDbHelper();
+        return true;
+    }
+
+    // close mDbHelper database object
+    protected void closeDatabase() {
+        mDbHelper.close();
+    }
+
+    @Override
+    SQLiteDatabase getReadableDatabase() {
+        Log.d(TAG, "getReadableDatabase called");
+        return mDbHelper.getReadableDatabase();
+    }
+
+    @Override
+    SQLiteDatabase getWritableDatabase() {
+        Log.d(TAG, "getWritableDatabase called");
+        return mDbHelper.getWritableDatabase();
+    }
+
+    @Override
+    void initDatabaseWithDatabaseHelper(SQLiteDatabase db) {
+        Log.d(TAG, "initDatabaseWithDatabaseHelper called; doing nothing");
+    }
+
+    @Override
+    boolean needApnDbUpdate() {
+        Log.d(TAG, "needApnDbUpdate called; returning false");
+        return false;
+    }
+
+    /**
+     * An in memory DB for TelephonyProviderTestable to use
+     */
+    public static class InMemoryTelephonyProviderDbHelper extends SQLiteOpenHelper {
+
+
+        public InMemoryTelephonyProviderDbHelper() {
+            super(null,      // no context is needed for in-memory db
+                    null,    // db file name is null for in-memory db
+                    null,    // CursorFactory is null by default
+                    1);      // db version is no-op for tests
+            Log.d(TAG, "InMemoryTelephonyProviderDbHelper creating in-memory database");
+        }
+
+        @Override
+        public void onCreate(SQLiteDatabase db) {
+            // Set up the carriers table
+            Log.d(TAG, "InMemoryTelephonyProviderDbHelper onCreate creating the carriers table");
+            db.execSQL(CREATE_CARRIERS_TABLE_STRING);
+
+            // set up the siminfo table
+            Log.d(TAG, "InMemoryTelephonyProviderDbHelper onCreate creating the siminfo table");
+            db.execSQL(CREATE_SIMINFO_TABLE_STRING);
+        }
+
+        @Override
+        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+            Log.d(TAG, "InMemoryTelephonyProviderDbHelper onUpgrade doing nothing");
+            return;
+        }
+    }
+}
