1b06b739b078ce4b00600487cfec31659647bf31fSteve Howard/* 2b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * Copyright (C) 2009 The Android Open Source Project 3b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * 4b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * Licensed under the Apache License, Version 2.0 (the "License"); 5b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * you may not use this file except in compliance with the License. 6b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * You may obtain a copy of the License at 7b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * 8b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * http://www.apache.org/licenses/LICENSE-2.0 9b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * 10b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * Unless required by applicable law or agreed to in writing, software 11b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * distributed under the License is distributed on an "AS IS" BASIS, 12b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * See the License for the specific language governing permissions and 14b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * limitations under the License. 15b06b739b078ce4b00600487cfec31659647bf31fSteve Howard */ 16b06b739b078ce4b00600487cfec31659647bf31fSteve Howard 17b06b739b078ce4b00600487cfec31659647bf31fSteve Howardpackage com.android.providers.downloads.public_api_access_tests; 18b06b739b078ce4b00600487cfec31659647bf31fSteve Howard 19a1448628237471a7a2aeb67b560b1502c2bd5ba8Steve Howardimport android.app.DownloadManager; 20b06b739b078ce4b00600487cfec31659647bf31fSteve Howardimport android.content.ContentResolver; 21b06b739b078ce4b00600487cfec31659647bf31fSteve Howardimport android.content.ContentValues; 22e61798da80558450f580ed948d0d469bd6423d8eSteve Howardimport android.net.Uri; 23b06b739b078ce4b00600487cfec31659647bf31fSteve Howardimport android.provider.Downloads; 24b06b739b078ce4b00600487cfec31659647bf31fSteve Howardimport android.test.AndroidTestCase; 25b06b739b078ce4b00600487cfec31659647bf31fSteve Howardimport android.test.suitebuilder.annotation.MediumTest; 26b06b739b078ce4b00600487cfec31659647bf31fSteve Howard 27b06b739b078ce4b00600487cfec31659647bf31fSteve Howard/** 28b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * DownloadProvider allows apps without permission ACCESS_DOWNLOAD_MANAGER to access it -- this is 29b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * how the public API works. But such access is subject to strict constraints on what can be 30b06b739b078ce4b00600487cfec31659647bf31fSteve Howard * inserted. This test suite checks those constraints. 31b06b739b078ce4b00600487cfec31659647bf31fSteve Howard */ 32b06b739b078ce4b00600487cfec31659647bf31fSteve Howard@MediumTest 33b06b739b078ce4b00600487cfec31659647bf31fSteve Howardpublic class PublicApiAccessTest extends AndroidTestCase { 34b06b739b078ce4b00600487cfec31659647bf31fSteve Howard private static final String[] DISALLOWED_COLUMNS = new String[] { 35b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.COLUMN_COOKIE_DATA, 36b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.COLUMN_REFERER, 37b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.COLUMN_USER_AGENT, 38b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.COLUMN_NO_INTEGRITY, 39b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.COLUMN_NOTIFICATION_CLASS, 40b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.COLUMN_NOTIFICATION_EXTRAS, 41b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.COLUMN_OTHER_UID, 42b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.COLUMN_APP_DATA, 43b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.COLUMN_CONTROL, 44b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.COLUMN_STATUS, 45b06b739b078ce4b00600487cfec31659647bf31fSteve Howard }; 46b06b739b078ce4b00600487cfec31659647bf31fSteve Howard 47b06b739b078ce4b00600487cfec31659647bf31fSteve Howard private ContentResolver mContentResolver; 48e61798da80558450f580ed948d0d469bd6423d8eSteve Howard private DownloadManager mManager; 49b06b739b078ce4b00600487cfec31659647bf31fSteve Howard 50b06b739b078ce4b00600487cfec31659647bf31fSteve Howard @Override 51b06b739b078ce4b00600487cfec31659647bf31fSteve Howard protected void setUp() throws Exception { 52b06b739b078ce4b00600487cfec31659647bf31fSteve Howard super.setUp(); 53b06b739b078ce4b00600487cfec31659647bf31fSteve Howard mContentResolver = getContext().getContentResolver(); 54e61798da80558450f580ed948d0d469bd6423d8eSteve Howard mManager = new DownloadManager(mContentResolver, getContext().getPackageName()); 55b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 56b06b739b078ce4b00600487cfec31659647bf31fSteve Howard 57b06b739b078ce4b00600487cfec31659647bf31fSteve Howard @Override 58b06b739b078ce4b00600487cfec31659647bf31fSteve Howard protected void tearDown() throws Exception { 59b06b739b078ce4b00600487cfec31659647bf31fSteve Howard if (mContentResolver != null) { 6004f09085f85d094207d22ae8969102bd48178180Vasu Nori mContentResolver.delete(Downloads.Impl.CONTENT_URI, null, null); 61b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 62b06b739b078ce4b00600487cfec31659647bf31fSteve Howard super.tearDown(); 63b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 64b06b739b078ce4b00600487cfec31659647bf31fSteve Howard 65b06b739b078ce4b00600487cfec31659647bf31fSteve Howard public void testMinimalValidWrite() { 66b06b739b078ce4b00600487cfec31659647bf31fSteve Howard mContentResolver.insert(Downloads.Impl.CONTENT_URI, buildValidValues()); 67b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 689da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard 69b06b739b078ce4b00600487cfec31659647bf31fSteve Howard public void testMaximalValidWrite() { 70b06b739b078ce4b00600487cfec31659647bf31fSteve Howard ContentValues values = buildValidValues(); 71b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_TITLE, "foo"); 72b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_DESCRIPTION, "foo"); 73b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_MIME_TYPE, "foo"); 74b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE, "foo"); 75b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_ALLOWED_NETWORK_TYPES, 0); 76b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_ALLOW_ROAMING, true); 77e61798da80558450f580ed948d0d469bd6423d8eSteve Howard values.put(Downloads.Impl.RequestHeaders.INSERT_KEY_PREFIX + "0", "X-Some-Header: value"); 78b06b739b078ce4b00600487cfec31659647bf31fSteve Howard mContentResolver.insert(Downloads.Impl.CONTENT_URI, values); 79b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 80b06b739b078ce4b00600487cfec31659647bf31fSteve Howard 81b06b739b078ce4b00600487cfec31659647bf31fSteve Howard private ContentValues buildValidValues() { 82b06b739b078ce4b00600487cfec31659647bf31fSteve Howard ContentValues values = new ContentValues(); 83b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_URI, "foo"); 849da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard values.put(Downloads.Impl.COLUMN_DESTINATION, 85b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.DESTINATION_CACHE_PARTITION_PURGEABLE); 869da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard values.put(Downloads.Impl.COLUMN_VISIBILITY, Downloads.Impl.VISIBILITY_VISIBLE); 87b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_IS_PUBLIC_API, true); 88b06b739b078ce4b00600487cfec31659647bf31fSteve Howard return values; 89b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 909da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard 91b06b739b078ce4b00600487cfec31659647bf31fSteve Howard public void testNoPublicApi() { 92b06b739b078ce4b00600487cfec31659647bf31fSteve Howard ContentValues values = buildValidValues(); 93b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.remove(Downloads.Impl.COLUMN_IS_PUBLIC_API); 94b06b739b078ce4b00600487cfec31659647bf31fSteve Howard testInvalidValues(values); 95b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 969da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard 97b06b739b078ce4b00600487cfec31659647bf31fSteve Howard public void testInvalidDestination() { 98b06b739b078ce4b00600487cfec31659647bf31fSteve Howard ContentValues values = buildValidValues(); 99b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_DESTINATION, Downloads.Impl.DESTINATION_EXTERNAL); 100b06b739b078ce4b00600487cfec31659647bf31fSteve Howard testInvalidValues(values); 101b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_DESTINATION, Downloads.Impl.DESTINATION_CACHE_PARTITION); 102b06b739b078ce4b00600487cfec31659647bf31fSteve Howard testInvalidValues(values); 103b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 1049da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard 105b06b739b078ce4b00600487cfec31659647bf31fSteve Howard public void testInvalidVisibility() { 106b06b739b078ce4b00600487cfec31659647bf31fSteve Howard ContentValues values = buildValidValues(); 1079da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard values.put(Downloads.Impl.COLUMN_VISIBILITY, 108b06b739b078ce4b00600487cfec31659647bf31fSteve Howard Downloads.Impl.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 109b06b739b078ce4b00600487cfec31659647bf31fSteve Howard testInvalidValues(values); 1109da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard 1119da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard values.put(Downloads.Impl.COLUMN_VISIBILITY, Downloads.Impl.VISIBILITY_HIDDEN); 1129da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard testInvalidValues(values); 1139da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard 1149da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard values.remove(Downloads.Impl.COLUMN_VISIBILITY); 1159da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard testInvalidValues(values); 116b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 1179da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard 118b06b739b078ce4b00600487cfec31659647bf31fSteve Howard public void testDisallowedColumns() { 119b06b739b078ce4b00600487cfec31659647bf31fSteve Howard for (String column : DISALLOWED_COLUMNS) { 120b06b739b078ce4b00600487cfec31659647bf31fSteve Howard ContentValues values = buildValidValues(); 121b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(column, 1); 122b06b739b078ce4b00600487cfec31659647bf31fSteve Howard testInvalidValues(values); 123b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 124b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 1259da9df3d6e84a3c4b04dd22d277e0e6d8f7f1ccbSteve Howard 126b06b739b078ce4b00600487cfec31659647bf31fSteve Howard public void testFileUriWithoutExternalPermission() { 127b06b739b078ce4b00600487cfec31659647bf31fSteve Howard ContentValues values = buildValidValues(); 128b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_DESTINATION, Downloads.Impl.DESTINATION_FILE_URI); 129b06b739b078ce4b00600487cfec31659647bf31fSteve Howard values.put(Downloads.Impl.COLUMN_FILE_NAME_HINT, "file:///sdcard/foo"); 130b06b739b078ce4b00600487cfec31659647bf31fSteve Howard testInvalidValues(values); 131b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 132b06b739b078ce4b00600487cfec31659647bf31fSteve Howard 133b06b739b078ce4b00600487cfec31659647bf31fSteve Howard private void testInvalidValues(ContentValues values) { 134b06b739b078ce4b00600487cfec31659647bf31fSteve Howard try { 135b06b739b078ce4b00600487cfec31659647bf31fSteve Howard mContentResolver.insert(Downloads.Impl.CONTENT_URI, values); 136b06b739b078ce4b00600487cfec31659647bf31fSteve Howard fail("Didn't get SecurityException as expected"); 137b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } catch (SecurityException exc) { 138b06b739b078ce4b00600487cfec31659647bf31fSteve Howard // expected 139b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 140b06b739b078ce4b00600487cfec31659647bf31fSteve Howard } 141e61798da80558450f580ed948d0d469bd6423d8eSteve Howard 142e61798da80558450f580ed948d0d469bd6423d8eSteve Howard public void testDownloadManagerRequest() { 143e61798da80558450f580ed948d0d469bd6423d8eSteve Howard // first try a minimal request 144e61798da80558450f580ed948d0d469bd6423d8eSteve Howard DownloadManager.Request request = new DownloadManager.Request(Uri.parse("http://localhost/path")); 145e61798da80558450f580ed948d0d469bd6423d8eSteve Howard mManager.enqueue(request); 146e61798da80558450f580ed948d0d469bd6423d8eSteve Howard 147e61798da80558450f580ed948d0d469bd6423d8eSteve Howard // now set everything we can, save for external destintion (for which we lack permission) 148e61798da80558450f580ed948d0d469bd6423d8eSteve Howard request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI); 149e61798da80558450f580ed948d0d469bd6423d8eSteve Howard request.setAllowedOverRoaming(false); 150e61798da80558450f580ed948d0d469bd6423d8eSteve Howard request.setTitle("test"); 151e61798da80558450f580ed948d0d469bd6423d8eSteve Howard request.setDescription("test"); 152ebb555c0687061993dd6a22d15f6aab2437ee8c5Steve Howard request.setMimeType("text/html"); 153ebb555c0687061993dd6a22d15f6aab2437ee8c5Steve Howard request.addRequestHeader("X-Some-Header", "value"); 154e61798da80558450f580ed948d0d469bd6423d8eSteve Howard mManager.enqueue(request); 155e61798da80558450f580ed948d0d469bd6423d8eSteve Howard } 156b06b739b078ce4b00600487cfec31659647bf31fSteve Howard} 157