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