Home | History | Annotate | Download | only in provider
      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 
     17 package android.provider;
     18 
     19 import android.content.ContentResolver;
     20 import android.content.ContentUris;
     21 import android.content.ContentValues;
     22 import android.content.Context;
     23 import android.content.Intent;
     24 import android.content.pm.PackageManager;
     25 import android.content.pm.ResolveInfo;
     26 import android.content.pm.UserInfo;
     27 import android.database.Cursor;
     28 import android.net.Uri;
     29 import android.os.UserHandle;
     30 import android.os.UserManager;
     31 import android.provider.Settings;
     32 import android.test.AndroidTestCase;
     33 import android.test.suitebuilder.annotation.MediumTest;
     34 import android.test.suitebuilder.annotation.SmallTest;
     35 
     36 import java.util.List;
     37 
     38 /** Unit test for SettingsProvider. */
     39 public 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 testSettingsChangeForOtherUser() {
    136         UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
    137         ContentResolver r = getContext().getContentResolver();
    138 
    139         // Make sure there's an owner
    140         assertTrue(findUser(um, UserHandle.USER_OWNER));
    141 
    142         // create a new user to use for testing
    143         UserInfo otherUser = um.createUser("TestUser1", UserInfo.FLAG_GUEST);
    144         assertTrue(otherUser != null);
    145         try {
    146             assertNotSame("Current calling user id should not be the new guest user",
    147                     otherUser.id, UserHandle.getCallingUserId());
    148 
    149             Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "gps");
    150             Settings.Secure.putStringForUser(r,
    151                     Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "network", otherUser.id);
    152 
    153             assertEquals("gps",
    154                     Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
    155             assertEquals("network", Settings.Secure.getStringForUser(
    156                     r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, otherUser.id));
    157 
    158             assertNotSame("Current calling user id should not be the new guest user",
    159                     otherUser.id, UserHandle.getCallingUserId());
    160             Settings.Secure.setLocationProviderEnabledForUser(r, "network", false, otherUser.id);
    161             assertEquals("", Settings.Secure.getStringForUser(
    162                     r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, otherUser.id));
    163 
    164         } finally {
    165             // Tidy up
    166             um.removeUser(otherUser.id);
    167         }
    168     }
    169 
    170     @MediumTest
    171     public void testRowNumberContentUri() {
    172         ContentResolver r = getContext().getContentResolver();
    173 
    174         // The bookmarks table (and everything else) uses standard row number content URIs.
    175         Uri uri = Settings.Bookmarks.add(r, new Intent("TEST"),
    176                 "Test Title", "Test Folder", '*', 123);
    177 
    178         assertTrue(ContentUris.parseId(uri) > 0);
    179 
    180         assertEquals("TEST", Settings.Bookmarks.getIntentForShortcut(r, '*').getAction());
    181 
    182         ContentValues v = new ContentValues();
    183         v.put(Settings.Bookmarks.INTENT, "#Intent;action=TOAST;end");
    184         assertEquals(1, r.update(uri, v, null, null));
    185 
    186         assertEquals("TOAST", Settings.Bookmarks.getIntentForShortcut(r, '*').getAction());
    187 
    188         assertEquals(1, r.delete(uri, null, null));
    189 
    190         assertEquals(null, Settings.Bookmarks.getIntentForShortcut(r, '*'));
    191     }
    192 
    193     @MediumTest
    194     public void testParseProviderList() {
    195         ContentResolver r = getContext().getContentResolver();
    196 
    197         // Make sure we get out what we put in.
    198         Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
    199                 "test1,test2,test3");
    200         assertEquals(Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED),
    201                 "test1,test2,test3");
    202 
    203         // Test adding a value
    204         Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
    205                 "");
    206         Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+test1");
    207         assertEquals("test1",
    208                 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
    209 
    210         // Test adding a second value
    211         Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+test2");
    212         assertEquals("test1,test2",
    213                 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
    214 
    215         // Test adding a third value
    216         Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+test3");
    217         assertEquals("test1,test2,test3",
    218                 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
    219 
    220         // Test deleting the first value in a 3 item list
    221         Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test1");
    222         assertEquals("test2,test3",
    223                 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
    224 
    225         // Test deleting the middle value in a 3 item list
    226         Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
    227                 "test1,test2,test3");
    228         Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test2");
    229         assertEquals("test1,test3",
    230                 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
    231 
    232         // Test deleting the last value in a 3 item list
    233         Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
    234                 "test1,test2,test3");
    235         Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test3");
    236         assertEquals("test1,test2",
    237                 Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
    238      }
    239 
    240     private boolean findUser(UserManager um, int userHandle) {
    241         for (UserInfo user : um.getUsers()) {
    242             if (user.id == userHandle) {
    243                 return true;
    244             }
    245         }
    246         return false;
    247     }
    248 
    249     @MediumTest
    250     public void testPerUserSettings() {
    251         UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
    252         ContentResolver r = getContext().getContentResolver();
    253 
    254         // Make sure there's an owner
    255         assertTrue(findUser(um, UserHandle.USER_OWNER));
    256 
    257         // create a new user to use for testing
    258         UserInfo user = um.createUser("TestUser1", UserInfo.FLAG_GUEST);
    259         assertTrue(user != null);
    260 
    261         try {
    262             // Write some settings for that user as well as the current user
    263             final String TEST_KEY = "test_setting";
    264             final int SELF_VALUE = 40;
    265             final int OTHER_VALUE = 27;
    266 
    267             Settings.System.putInt(r, TEST_KEY, SELF_VALUE);
    268             Settings.System.putIntForUser(r, TEST_KEY, OTHER_VALUE, user.id);
    269 
    270             // Verify that they read back as intended
    271             int myValue = Settings.System.getInt(r, TEST_KEY, 0);
    272             int otherValue = Settings.System.getIntForUser(r, TEST_KEY, 0, user.id);
    273             assertTrue("Running as user " + UserHandle.myUserId()
    274                     + " and reading/writing as user " + user.id
    275                     + ", expected to read " + SELF_VALUE + " but got " + myValue,
    276                     myValue == SELF_VALUE);
    277             assertTrue("Running as user " + UserHandle.myUserId()
    278                     + " and reading/writing as user " + user.id
    279                     + ", expected to read " + OTHER_VALUE + " but got " + otherValue,
    280                     otherValue == OTHER_VALUE);
    281         } finally {
    282             // Tidy up
    283             um.removeUser(user.id);
    284         }
    285     }
    286 
    287      @SmallTest
    288      public void testSettings() {
    289         assertCanBeHandled(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
    290         assertCanBeHandled(new Intent(Settings.ACTION_ADD_ACCOUNT));
    291         assertCanBeHandled(new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS));
    292         assertCanBeHandled(new Intent(Settings.ACTION_APN_SETTINGS));
    293         assertCanBeHandled(new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
    294                 .setData(Uri.parse("package:" + getContext().getPackageName())));
    295         assertCanBeHandled(new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS));
    296         assertCanBeHandled(new Intent(Settings.ACTION_APPLICATION_SETTINGS));
    297         assertCanBeHandled(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
    298         assertCanBeHandled(new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS));
    299         assertCanBeHandled(new Intent(Settings.ACTION_DATE_SETTINGS));
    300         assertCanBeHandled(new Intent(Settings.ACTION_DEVICE_INFO_SETTINGS));
    301         assertCanBeHandled(new Intent(Settings.ACTION_DISPLAY_SETTINGS));
    302         assertCanBeHandled(new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS));
    303         assertCanBeHandled(new Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS));
    304         assertCanBeHandled(new Intent(Settings.ACTION_LOCALE_SETTINGS));
    305         assertCanBeHandled(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
    306         assertCanBeHandled(new Intent(Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS));
    307         assertCanBeHandled(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS));
    308         assertCanBeHandled(new Intent(Settings.ACTION_MEMORY_CARD_SETTINGS));
    309         assertCanBeHandled(new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS));
    310         assertCanBeHandled(new Intent(Settings.ACTION_PRIVACY_SETTINGS));
    311         assertCanBeHandled(new Intent(Settings.ACTION_QUICK_LAUNCH_SETTINGS));
    312         assertCanBeHandled(new Intent(Settings.ACTION_SEARCH_SETTINGS));
    313         assertCanBeHandled(new Intent(Settings.ACTION_SECURITY_SETTINGS));
    314         assertCanBeHandled(new Intent(Settings.ACTION_SETTINGS));
    315         assertCanBeHandled(new Intent(Settings.ACTION_SOUND_SETTINGS));
    316         assertCanBeHandled(new Intent(Settings.ACTION_SYNC_SETTINGS));
    317         assertCanBeHandled(new Intent(Settings.ACTION_SYSTEM_UPDATE_SETTINGS));
    318         assertCanBeHandled(new Intent(Settings.ACTION_USER_DICTIONARY_SETTINGS));
    319         assertCanBeHandled(new Intent(Settings.ACTION_WIFI_IP_SETTINGS));
    320         assertCanBeHandled(new Intent(Settings.ACTION_WIFI_SETTINGS));
    321         assertCanBeHandled(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
    322     }
    323 
    324     private void assertCanBeHandled(final Intent intent) {
    325         PackageManager packageManager = mContext.getPackageManager();
    326         List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent, 0);
    327         assertNotNull(resolveInfoList);
    328         // one or more activity can handle this intent.
    329         assertTrue(resolveInfoList.size() > 0);
    330     }
    331 }
    332