Import translations. DO NOT MERGE
[android/platform/packages/providers/DownloadProvider.git] / tests / src / com / android / providers / downloads / DownloadProviderFunctionalTest.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 android.util.Log;
27
28 import com.google.mockwebserver.MockWebServer;
29 import com.google.mockwebserver.RecordedRequest;
30
31 import java.io.InputStream;
32 import java.net.MalformedURLException;
33 import java.net.UnknownHostException;
34
35 /**
36  * This test exercises the entire download manager working together -- it requests downloads through
37  * the {@link DownloadProvider}, just like a normal client would, and runs the
38  * {@link DownloadService} with start intents.  It sets up a {@link MockWebServer} running on the
39  * device to serve downloads.
40  */
41 @LargeTest
42 public class DownloadProviderFunctionalTest extends AbstractDownloadProviderFunctionalTest {
43     private static final String TAG = "DownloadManagerFunctionalTest";
44
45     public DownloadProviderFunctionalTest() {
46         super(new FakeSystemFacade());
47     }
48
49     public void testDownloadTextFile() throws Exception {
50         enqueueResponse(buildResponse(HTTP_OK, FILE_CONTENT));
51
52         String path = "/download_manager_test_path";
53         Uri downloadUri = requestDownload(path);
54         assertEquals(Downloads.Impl.STATUS_PENDING, getDownloadStatus(downloadUri));
55         assertTrue(mTestContext.mHasServiceBeenStarted);
56
57         runUntilStatus(downloadUri, Downloads.Impl.STATUS_SUCCESS);
58         RecordedRequest request = takeRequest();
59         assertEquals("GET", request.getMethod());
60         assertEquals(path, request.getPath());
61         assertEquals(FILE_CONTENT, getDownloadContents(downloadUri));
62         assertStartsWith(Environment.getExternalStorageDirectory().getPath(),
63                          getDownloadFilename(downloadUri));
64     }
65
66     public void testDownloadToCache() throws Exception {
67         enqueueResponse(buildResponse(HTTP_OK, FILE_CONTENT));
68
69         Uri downloadUri = requestDownload("/path");
70         updateDownload(downloadUri, Downloads.Impl.COLUMN_DESTINATION,
71                        Integer.toString(Downloads.Impl.DESTINATION_CACHE_PARTITION));
72         runUntilStatus(downloadUri, Downloads.Impl.STATUS_SUCCESS);
73         assertEquals(FILE_CONTENT, getDownloadContents(downloadUri));
74         assertStartsWith(getContext().getCacheDir().getAbsolutePath(),
75                          getDownloadFilename(downloadUri));
76     }
77
78     public void testRoaming() throws Exception {
79         enqueueResponse(buildResponse(HTTP_OK, FILE_CONTENT));
80         enqueueResponse(buildResponse(HTTP_OK, FILE_CONTENT));
81
82         mSystemFacade.mActiveNetworkType = ConnectivityManager.TYPE_MOBILE;
83         mSystemFacade.mIsRoaming = true;
84
85         // for a normal download, roaming is fine
86         Uri downloadUri = requestDownload("/path");
87         runUntilStatus(downloadUri, Downloads.Impl.STATUS_SUCCESS);
88
89         // when roaming is disallowed, the download should pause...
90         downloadUri = requestDownload("/path");
91         updateDownload(downloadUri, Downloads.Impl.COLUMN_DESTINATION,
92                        Integer.toString(Downloads.Impl.DESTINATION_CACHE_PARTITION_NOROAMING));
93         runUntilStatus(downloadUri, Downloads.Impl.STATUS_WAITING_FOR_NETWORK);
94
95         // ...and pick up when we're off roaming
96         mSystemFacade.mIsRoaming = false;
97         runUntilStatus(downloadUri, Downloads.Impl.STATUS_SUCCESS);
98     }
99
100     /**
101      * Read a downloaded file from disk.
102      */
103     private String getDownloadContents(Uri downloadUri) throws Exception {
104         InputStream inputStream = mResolver.openInputStream(downloadUri);
105         try {
106             return readStream(inputStream);
107         } finally {
108             inputStream.close();
109         }
110     }
111
112     private void runUntilStatus(Uri downloadUri, int status) throws Exception {
113         runService();
114         boolean done = false;
115         while (!done) {
116             int rslt = getDownloadStatus(downloadUri);
117             if (rslt == Downloads.Impl.STATUS_RUNNING || rslt == Downloads.Impl.STATUS_PENDING) {
118                 Log.i(TAG, "status is: " + rslt + ", for: " + downloadUri);
119                 DownloadHandler.getInstance().WaitUntilDownloadsTerminate();
120                 Thread.sleep(100);
121             } else {
122                 done = true;
123             }
124         }
125         assertEquals(status, getDownloadStatus(downloadUri));
126     }
127
128     protected int getDownloadStatus(Uri downloadUri) {
129         return Integer.valueOf(getDownloadField(downloadUri, Downloads.Impl.COLUMN_STATUS));
130     }
131
132     private String getDownloadFilename(Uri downloadUri) {
133         return getDownloadField(downloadUri, Downloads.Impl._DATA);
134     }
135
136     private String getDownloadField(Uri downloadUri, String column) {
137         final String[] columns = new String[] {column};
138         Cursor cursor = mResolver.query(downloadUri, columns, null, null, null);
139         try {
140             assertEquals(1, cursor.getCount());
141             cursor.moveToFirst();
142             return cursor.getString(0);
143         } finally {
144             cursor.close();
145         }
146     }
147
148     /**
149      * Request a download from the Download Manager.
150      */
151     private Uri requestDownload(String path) throws MalformedURLException, UnknownHostException {
152         ContentValues values = new ContentValues();
153         values.put(Downloads.Impl.COLUMN_URI, getServerUri(path));
154         values.put(Downloads.Impl.COLUMN_DESTINATION, Downloads.Impl.DESTINATION_EXTERNAL);
155         return mResolver.insert(Downloads.Impl.CONTENT_URI, values);
156     }
157
158     /**
159      * Update one field of a download in the provider.
160      */
161     private void updateDownload(Uri downloadUri, String column, String value) {
162         ContentValues values = new ContentValues();
163         values.put(column, value);
164         int numChanged = mResolver.update(downloadUri, values, null, null);
165         assertEquals(1, numChanged);
166     }
167 }