1/* 2 * Copyright (C) 2008 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 android.provider; 18 19import android.content.ContentResolver; 20import android.content.ContentUris; 21import android.content.ContentValues; 22import android.content.Context; 23import android.content.Intent; 24import android.content.pm.PackageManager; 25import android.content.pm.ResolveInfo; 26import android.content.pm.UserInfo; 27import android.database.Cursor; 28import android.net.Uri; 29import android.os.UserHandle; 30import android.os.UserManager; 31import android.provider.Settings; 32import android.test.AndroidTestCase; 33import android.test.suitebuilder.annotation.MediumTest; 34import android.test.suitebuilder.annotation.SmallTest; 35 36import java.util.List; 37 38/** Unit test for SettingsProvider. */ 39public class SettingsProviderTest extends AndroidTestCase { 40 @MediumTest 41 public void testNameValueCache() { 42 ContentResolver r = getContext().getContentResolver(); 43 Settings.Secure.putString(r, "test_service", "Value"); 44 assertEquals("Value", Settings.Secure.getString(r, "test_service")); 45 46 // Make sure the value can be overwritten. 47 Settings.Secure.putString(r, "test_service", "New"); 48 assertEquals("New", Settings.Secure.getString(r, "test_service")); 49 50 // Also that delete works. 51 assertEquals(1, r.delete(Settings.Secure.getUriFor("test_service"), null, null)); 52 assertEquals(null, Settings.Secure.getString(r, "test_service")); 53 54 // Try all the same things in the System table 55 Settings.System.putString(r, "test_setting", "Value"); 56 assertEquals("Value", Settings.System.getString(r, "test_setting")); 57 58 Settings.System.putString(r, "test_setting", "New"); 59 assertEquals("New", Settings.System.getString(r, "test_setting")); 60 61 assertEquals(1, r.delete(Settings.System.getUriFor("test_setting"), null, null)); 62 assertEquals(null, Settings.System.getString(r, "test_setting")); 63 } 64 65 @MediumTest 66 public void testRowNameContentUri() { 67 ContentResolver r = getContext().getContentResolver(); 68 69 assertEquals("content://settings/system/test_setting", 70 Settings.System.getUriFor("test_setting").toString()); 71 assertEquals("content://settings/secure/test_service", 72 Settings.Secure.getUriFor("test_service").toString()); 73 74 // These tables use the row name (not ID) as their content URI. 75 Uri tables[] = { Settings.System.CONTENT_URI, Settings.Secure.CONTENT_URI }; 76 for (Uri table : tables) { 77 ContentValues v = new ContentValues(); 78 v.put(Settings.System.NAME, "test_key"); 79 v.put(Settings.System.VALUE, "Test"); 80 Uri uri = r.insert(table, v); 81 assertEquals(table.toString() + "/test_key", uri.toString()); 82 83 // Query with a specific URI and no WHERE clause succeeds. 84 Cursor c = r.query(uri, null, null, null, null); 85 try { 86 assertTrue(c.moveToNext()); 87 assertEquals("test_key", c.getString(c.getColumnIndex(Settings.System.NAME))); 88 assertEquals("Test", c.getString(c.getColumnIndex(Settings.System.VALUE))); 89 assertFalse(c.moveToNext()); 90 } finally { 91 c.close(); 92 } 93 94 // Query with a specific URI and a WHERE clause fails. 95 try { 96 r.query(uri, null, "1", null, null); 97 fail("UnsupportedOperationException expected"); 98 } catch (UnsupportedOperationException e) { 99 if (!e.toString().contains("WHERE clause")) throw e; 100 } 101 102 // Query with a tablewide URI and a WHERE clause succeeds. 103 c = r.query(table, null, "name='test_key'", null, null); 104 try { 105 assertTrue(c.moveToNext()); 106 assertEquals("test_key", c.getString(c.getColumnIndex(Settings.System.NAME))); 107 assertEquals("Test", c.getString(c.getColumnIndex(Settings.System.VALUE))); 108 assertFalse(c.moveToNext()); 109 } finally { 110 c.close(); 111 } 112 113 v = new ContentValues(); 114 v.put(Settings.System.VALUE, "Toast"); 115 assertEquals(1, r.update(uri, v, null, null)); 116 117 c = r.query(uri, null, null, null, null); 118 try { 119 assertTrue(c.moveToNext()); 120 assertEquals("test_key", c.getString(c.getColumnIndex(Settings.System.NAME))); 121 assertEquals("Toast", c.getString(c.getColumnIndex(Settings.System.VALUE))); 122 assertFalse(c.moveToNext()); 123 } finally { 124 c.close(); 125 } 126 127 assertEquals(1, r.delete(uri, null, null)); 128 } 129 130 assertEquals(null, Settings.System.getString(r, "test_key")); 131 assertEquals(null, Settings.Secure.getString(r, "test_key")); 132 } 133 134 @MediumTest 135 public void testRowNumberContentUri() { 136 ContentResolver r = getContext().getContentResolver(); 137 138 // The bookmarks table (and everything else) uses standard row number content URIs. 139 Uri uri = Settings.Bookmarks.add(r, new Intent("TEST"), 140 "Test Title", "Test Folder", '*', 123); 141 142 assertTrue(ContentUris.parseId(uri) > 0); 143 144 assertEquals("TEST", Settings.Bookmarks.getIntentForShortcut(r, '*').getAction()); 145 146 ContentValues v = new ContentValues(); 147 v.put(Settings.Bookmarks.INTENT, "#Intent;action=TOAST;end"); 148 assertEquals(1, r.update(uri, v, null, null)); 149 150 assertEquals("TOAST", Settings.Bookmarks.getIntentForShortcut(r, '*').getAction()); 151 152 assertEquals(1, r.delete(uri, null, null)); 153 154 assertEquals(null, Settings.Bookmarks.getIntentForShortcut(r, '*')); 155 } 156 157 @MediumTest 158 public void testParseProviderList() { 159 ContentResolver r = getContext().getContentResolver(); 160 161 // Make sure we get out what we put in. 162 Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, 163 "test1,test2,test3"); 164 assertEquals(Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED), 165 "test1,test2,test3"); 166 167 // Test adding a value 168 Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, 169 ""); 170 Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+test1"); 171 assertEquals("test1", 172 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); 173 174 // Test adding a second value 175 Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+test2"); 176 assertEquals("test1,test2", 177 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); 178 179 // Test adding a third value 180 Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+test3"); 181 assertEquals("test1,test2,test3", 182 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); 183 184 // Test deleting the first value in a 3 item list 185 Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test1"); 186 assertEquals("test2,test3", 187 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); 188 189 // Test deleting the middle value in a 3 item list 190 Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, 191 "test1,test2,test3"); 192 Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test2"); 193 assertEquals("test1,test3", 194 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); 195 196 // Test deleting the last value in a 3 item list 197 Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, 198 "test1,test2,test3"); 199 Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test3"); 200 assertEquals("test1,test2", 201 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); 202 } 203 204 private boolean findUser(UserManager um, int userHandle) { 205 for (UserInfo user : um.getUsers()) { 206 if (user.id == userHandle) { 207 return true; 208 } 209 } 210 return false; 211 } 212 213 @MediumTest 214 public void testPerUserSettings() { 215 UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE); 216 ContentResolver r = getContext().getContentResolver(); 217 218 // Make sure there's an owner 219 assertTrue(findUser(um, UserHandle.USER_OWNER)); 220 221 // create a new user to use for testing 222 UserInfo user = um.createUser("TestUser1", UserInfo.FLAG_GUEST); 223 assertTrue(user != null); 224 225 try { 226 // Write some settings for that user as well as the current user 227 final String TEST_KEY = "test_setting"; 228 final int SELF_VALUE = 40; 229 final int OTHER_VALUE = 27; 230 231 Settings.System.putInt(r, TEST_KEY, SELF_VALUE); 232 Settings.System.putIntForUser(r, TEST_KEY, OTHER_VALUE, user.id); 233 234 // Verify that they read back as intended 235 int myValue = Settings.System.getInt(r, TEST_KEY, 0); 236 int otherValue = Settings.System.getIntForUser(r, TEST_KEY, 0, user.id); 237 assertTrue("Running as user " + UserHandle.myUserId() 238 + " and reading/writing as user " + user.id 239 + ", expected to read " + SELF_VALUE + " but got " + myValue, 240 myValue == SELF_VALUE); 241 assertTrue("Running as user " + UserHandle.myUserId() 242 + " and reading/writing as user " + user.id 243 + ", expected to read " + OTHER_VALUE + " but got " + otherValue, 244 otherValue == OTHER_VALUE); 245 } finally { 246 // Tidy up 247 um.removeUser(user.id); 248 } 249 } 250 251 @SmallTest 252 public void testSettings() { 253 assertCanBeHandled(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)); 254 assertCanBeHandled(new Intent(Settings.ACTION_ADD_ACCOUNT)); 255 assertCanBeHandled(new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS)); 256 assertCanBeHandled(new Intent(Settings.ACTION_APN_SETTINGS)); 257 assertCanBeHandled(new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) 258 .setData(Uri.parse("package:" + getContext().getPackageName()))); 259 assertCanBeHandled(new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)); 260 assertCanBeHandled(new Intent(Settings.ACTION_APPLICATION_SETTINGS)); 261 assertCanBeHandled(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS)); 262 assertCanBeHandled(new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS)); 263 assertCanBeHandled(new Intent(Settings.ACTION_DATE_SETTINGS)); 264 assertCanBeHandled(new Intent(Settings.ACTION_DEVICE_INFO_SETTINGS)); 265 assertCanBeHandled(new Intent(Settings.ACTION_DISPLAY_SETTINGS)); 266 assertCanBeHandled(new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS)); 267 assertCanBeHandled(new Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS)); 268 assertCanBeHandled(new Intent(Settings.ACTION_LOCALE_SETTINGS)); 269 assertCanBeHandled(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); 270 assertCanBeHandled(new Intent(Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS)); 271 assertCanBeHandled(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)); 272 assertCanBeHandled(new Intent(Settings.ACTION_MEMORY_CARD_SETTINGS)); 273 assertCanBeHandled(new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS)); 274 assertCanBeHandled(new Intent(Settings.ACTION_PRIVACY_SETTINGS)); 275 assertCanBeHandled(new Intent(Settings.ACTION_QUICK_LAUNCH_SETTINGS)); 276 assertCanBeHandled(new Intent(Settings.ACTION_SEARCH_SETTINGS)); 277 assertCanBeHandled(new Intent(Settings.ACTION_SECURITY_SETTINGS)); 278 assertCanBeHandled(new Intent(Settings.ACTION_SETTINGS)); 279 assertCanBeHandled(new Intent(Settings.ACTION_SOUND_SETTINGS)); 280 assertCanBeHandled(new Intent(Settings.ACTION_SYNC_SETTINGS)); 281 assertCanBeHandled(new Intent(Settings.ACTION_SYSTEM_UPDATE_SETTINGS)); 282 assertCanBeHandled(new Intent(Settings.ACTION_USER_DICTIONARY_SETTINGS)); 283 assertCanBeHandled(new Intent(Settings.ACTION_WIFI_IP_SETTINGS)); 284 assertCanBeHandled(new Intent(Settings.ACTION_WIFI_SETTINGS)); 285 assertCanBeHandled(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); 286 } 287 288 private void assertCanBeHandled(final Intent intent) { 289 PackageManager packageManager = mContext.getPackageManager(); 290 List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent, 0); 291 assertNotNull(resolveInfoList); 292 // one or more activity can handle this intent. 293 assertTrue(resolveInfoList.size() > 0); 294 } 295} 296