350c63d4c9f018bb126e30bda04a4e5b9e11f0be
[android/platform/packages/providers/DownloadProvider.git] / tests / src / com / android / providers / downloads / DownloadManagerFunctionalTest.java
1 /*
2  * Copyright (C) 2010 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 com.android.providers.downloads;
18
19 import android.content.ContentValues;
20 import android.database.Cursor;
21 import android.net.ConnectivityManager;
22 import android.net.Uri;
23 import android.os.Environment;
24 import android.provider.Downloads;
25 import android.test.suitebuilder.annotation.LargeTest;
26 import tests.http.MockWebServer;
27 import tests.http.RecordedRequest;
28
29 import java.io.InputStream;
30 import java.net.MalformedURLException;
31
32 /**
33  * This test exercises the entire download manager working together -- it requests downloads through
34  * the {@link DownloadProvider}, just like a normal client would, and runs the
35  * {@link DownloadService} with start intents.  It sets up a {@link MockWebServer} running on the
36  * device to serve downloads.
37  */
38 @LargeTest
39 public class DownloadManagerFunctionalTest extends AbstractDownloadManagerFunctionalTest {
40     public DownloadManagerFunctionalTest() {
41         super(new FakeSystemFacade());
42     }
43
44     public void testBasicRequest() throws Exception {
45         enqueueResponse(HTTP_OK, FILE_CONTENT);
46
47         String path = "/download_manager_test_path";
48         Uri downloadUri = requestDownload(path);
49         assertEquals(Downloads.STATUS_PENDING, getDownloadStatus(downloadUri));
50         assertTrue(mTestContext.mHasServiceBeenStarted);
51
52         runUntilStatus(downloadUri, Downloads.STATUS_SUCCESS);
53         RecordedRequest request = takeRequest();
54         assertEquals("GET", request.getMethod());
55         assertEquals(path, request.getPath());
56         assertEquals(FILE_CONTENT, getDownloadContents(downloadUri));
57         assertStartsWith(Environment.getExternalStorageDirectory().getPath(),
58                          getDownloadFilename(downloadUri));
59     }
60
61     public void testDownloadToCache() throws Exception {
62         enqueueResponse(HTTP_OK, FILE_CONTENT);
63         Uri downloadUri = requestDownload("/path");
64         updateDownload(downloadUri, Downloads.COLUMN_DESTINATION,
65                        Integer.toString(Downloads.DESTINATION_CACHE_PARTITION));
66         runUntilStatus(downloadUri, Downloads.STATUS_SUCCESS);
67         assertEquals(FILE_CONTENT, getDownloadContents(downloadUri));
68         assertStartsWith(Environment.getDownloadCacheDirectory().getPath(),
69                          getDownloadFilename(downloadUri));
70     }
71
72     public void testRoaming() throws Exception {
73         mSystemFacade.mActiveNetworkType = ConnectivityManager.TYPE_MOBILE;
74         mSystemFacade.mIsRoaming = true;
75
76         // for a normal download, roaming is fine
77         enqueueResponse(HTTP_OK, FILE_CONTENT);
78         Uri downloadUri = requestDownload("/path");
79         runUntilStatus(downloadUri, Downloads.STATUS_SUCCESS);
80
81         // when roaming is disallowed, the download should pause...
82         downloadUri = requestDownload("/path");
83         updateDownload(downloadUri, Downloads.COLUMN_DESTINATION,
84                        Integer.toString(Downloads.DESTINATION_CACHE_PARTITION_NOROAMING));
85         runUntilStatus(downloadUri, Downloads.STATUS_RUNNING_PAUSED);
86
87         // ...and pick up when we're off roaming
88         enqueueResponse(HTTP_OK, FILE_CONTENT);
89         mSystemFacade.mIsRoaming = false;
90         runUntilStatus(downloadUri, Downloads.STATUS_SUCCESS);
91     }
92
93     /**
94      * Read a downloaded file from disk.
95      */
96     private String getDownloadContents(Uri downloadUri) throws Exception {
97         InputStream inputStream = mResolver.openInputStream(downloadUri);
98         try {
99             return readStream(inputStream);
100         } finally {
101             inputStream.close();
102         }
103     }
104
105     private void runUntilStatus(Uri downloadUri, int status) throws Exception {
106         runService();
107         assertEquals(status, getDownloadStatus(downloadUri));
108     }
109
110     protected int getDownloadStatus(Uri downloadUri) {
111         return Integer.valueOf(getDownloadField(downloadUri, Downloads.COLUMN_STATUS));
112     }
113
114     private String getDownloadFilename(Uri downloadUri) {
115         return getDownloadField(downloadUri, Downloads._DATA);
116     }
117
118     private String getDownloadField(Uri downloadUri, String column) {
119         final String[] columns = new String[] {column};
120         Cursor cursor = mResolver.query(downloadUri, columns, null, null, null);
121         try {
122             assertEquals(1, cursor.getCount());
123             cursor.moveToFirst();
124             return cursor.getString(0);
125         } finally {
126             cursor.close();
127         }
128     }
129
130     /**
131      * Request a download from the Download Manager.
132      */
133     private Uri requestDownload(String path) throws MalformedURLException {
134         ContentValues values = new ContentValues();
135         values.put(Downloads.COLUMN_URI, getServerUri(path));
136         values.put(Downloads.COLUMN_DESTINATION, Downloads.DESTINATION_EXTERNAL);
137         return mResolver.insert(Downloads.CONTENT_URI, values);
138     }
139
140     /**
141      * Update one field of a download in the provider.
142      */
143     private void updateDownload(Uri downloadUri, String column, String value) {
144         ContentValues values = new ContentValues();
145         values.put(column, value);
146         int numChanged = mResolver.update(downloadUri, values, null, null);
147         assertEquals(1, numChanged);
148     }
149 }