1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17package com.android.providers.telephony; 18 19import android.app.AppOpsManager; 20import android.content.ContentValues; 21import android.content.Context; 22import android.content.pm.PackageManager; 23import android.content.pm.ProviderInfo; 24import android.content.res.Resources; 25import android.database.ContentObserver; 26import android.net.Uri; 27import android.provider.Telephony; 28import android.telephony.TelephonyManager; 29import android.test.mock.MockContentResolver; 30import android.test.mock.MockContext; 31import android.test.suitebuilder.annotation.SmallTest; 32import android.util.Log; 33 34import junit.framework.TestCase; 35 36import org.junit.Test; 37import org.mockito.Mockito; 38 39 40/** 41 * Tests for testing CRUD operations of SmsProvider. 42 * Uses a MockContentResolver to test insert 43 * Uses SmsProviderTestable to set up in-memory database 44 * 45 * Build, install and run the tests by running the commands below: 46 * runtest --path <dir or file> 47 * runtest --path <dir or file> --test-method <testMethodName> 48 * e.g.) 49 * runtest --path tests/src/com/android/providers/telephony/SmsProviderTest.java \ 50 * --test-method testInsertUri 51 */ 52public class SmsProviderTest extends TestCase { 53 private static final String TAG = "TelephonyProviderTest"; 54 55 private MockContextWithProvider mContext; 56 private MockContentResolver mContentResolver; 57 private SmsProviderTestable mSmsProviderTestable; 58 59 private int notifyChangeCount; 60 61 62 /** 63 * This is used to give the SmsProviderTest a mocked context which takes a 64 * SmsProvider and attaches it to the ContentResolver with telephony authority. 65 * The mocked context also gives WRITE_APN_SETTINGS permissions 66 */ 67 private class MockContextWithProvider extends MockContext { 68 private final MockContentResolver mResolver; 69 70 public MockContextWithProvider(SmsProvider smsProvider) { 71 mResolver = new MockContentResolver() { 72 @Override 73 public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork, 74 int userHandle) { 75 notifyChangeCount++; 76 } 77 }; 78 79 // Add authority="sms" to given smsProvider 80 ProviderInfo providerInfo = new ProviderInfo(); 81 providerInfo.authority = "sms"; 82 83 // Add context to given smsProvider 84 smsProvider.attachInfoForTesting(this, providerInfo); 85 Log.d(TAG, "MockContextWithProvider: smsProvider.getContext(): " 86 + smsProvider.getContext()); 87 88 // Add given SmsProvider to mResolver with authority="sms" so that 89 // mResolver can send queries to mSmsProvider 90 mResolver.addProvider("sms", smsProvider); 91 Log.d(TAG, "MockContextWithProvider: Add SmsProvider to mResolver"); 92 } 93 94 @Override 95 public Object getSystemService(String name) { 96 Log.d(TAG, "getSystemService: returning null"); 97 switch (name) { 98 case Context.APP_OPS_SERVICE: 99 return Mockito.mock(AppOpsManager.class); 100 case Context.TELEPHONY_SERVICE: 101 return Mockito.mock(TelephonyManager.class); 102 default: 103 return null; 104 } 105 } 106 107 @Override 108 public Resources getResources() { 109 Log.d(TAG, "getResources: returning null"); 110 return null; 111 } 112 113 @Override 114 public int getUserId() { 115 return 0; 116 } 117 118 @Override 119 public MockContentResolver getContentResolver() { 120 return mResolver; 121 } 122 123 @Override 124 public int checkCallingOrSelfPermission(String permission) { 125 return PackageManager.PERMISSION_GRANTED; 126 } 127 } 128 129 @Override 130 protected void setUp() throws Exception { 131 super.setUp(); 132 mSmsProviderTestable = new SmsProviderTestable(); 133 mContext = new MockContextWithProvider(mSmsProviderTestable); 134 mContentResolver = mContext.getContentResolver(); 135 notifyChangeCount = 0; 136 } 137 138 @Override 139 protected void tearDown() throws Exception { 140 super.tearDown(); 141 mSmsProviderTestable.closeDatabase(); 142 } 143 144 @Test 145 @SmallTest 146 public void testInsertUri() { 147 // insert test contentValues 148 final ContentValues values = new ContentValues(); 149 values.put(Telephony.Sms.SUBSCRIPTION_ID, 1); 150 values.put(Telephony.Sms.ADDRESS, "12345"); 151 values.put(Telephony.Sms.BODY, "test"); 152 values.put(Telephony.Sms.DATE, System.currentTimeMillis()); // milliseconds 153 values.put(Telephony.Sms.SEEN, 1); 154 values.put(Telephony.Sms.READ, 1); 155 values.put(Telephony.Sms.THREAD_ID, 1); 156 157 // test for sms table 158 Log.d(TAG, "testInsertSmsTable Inserting contentValues: " + values); 159 assertEquals(Uri.parse("content://sms/1"), 160 mContentResolver.insert(Uri.parse("content://sms"), values)); 161 assertEquals(Uri.parse("content://sms/2"), 162 mContentResolver.insert(Uri.parse("content://sms"), values)); 163 164 // test for attachments table 165 values.clear(); 166 values.put("sms_id", 1); 167 values.put("content_url", "test"); 168 values.put("offset", 0); 169 Log.d(TAG, "testInsertAttachmentTable Inserting contentValues: " + values); 170 assertEquals(Uri.parse("content://sms/attachments/1"), 171 mContentResolver.insert(Uri.parse("content://sms/attachments"), values)); 172 } 173}