diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 9c88030..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,80 +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.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:-");
         }
 
@@ -1452,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);
@@ -1550,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);
@@ -1578,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,
@@ -1732,7 +1763,7 @@
             }
         }
 
-        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+        SQLiteDatabase db = getReadableDatabase();
         Cursor ret = null;
         try {
             // Exclude entries marked deleted
@@ -1787,7 +1818,7 @@
 
         checkPermission();
 
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getWritableDatabase();
         int match = s_urlMatcher.match(url);
         boolean notify = false;
         switch (match)
@@ -1937,7 +1968,7 @@
 
         checkPermission();
 
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getWritableDatabase();
         int match = s_urlMatcher.match(url);
         switch (match)
         {
@@ -2072,7 +2103,7 @@
 
         checkPermission();
 
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getWritableDatabase();
         int match = s_urlMatcher.match(url);
         switch (match)
         {
@@ -2227,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);
@@ -2235,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();
@@ -2257,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;
+        }
+    }
+}
