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