1e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard/*
2e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * Copyright (C) 2010 The Android Open Source Project
3e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard *
4e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * Licensed under the Apache License, Version 2.0 (the "License");
5e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * you may not use this file except in compliance with the License.
6e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * You may obtain a copy of the License at
7e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard *
8e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard *      http://www.apache.org/licenses/LICENSE-2.0
9e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard *
10e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * Unless required by applicable law or agreed to in writing, software
11e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * distributed under the License is distributed on an "AS IS" BASIS,
12e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * See the License for the specific language governing permissions and
14e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * limitations under the License.
15e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard */
16e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
17e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardpackage com.android.providers.downloads;
18e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
198ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport static android.app.DownloadManager.STATUS_FAILED;
208ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport static android.app.DownloadManager.STATUS_SUCCESSFUL;
217ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkeyimport static android.text.format.DateUtils.MINUTE_IN_MILLIS;
228ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport static android.text.format.DateUtils.SECOND_IN_MILLIS;
238ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
24a1448628237471a7a2aeb67b560b1502c2bd5ba8Steve Howardimport android.app.DownloadManager;
25e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.database.Cursor;
26e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.net.Uri;
27e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.os.ParcelFileDescriptor;
288ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport android.os.SystemClock;
295d217003acf21aea852975af0dff3b398cea6768Vasu Noriimport android.util.Log;
30e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
31dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkeyimport libcore.io.IoUtils;
32dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkeyimport libcore.io.Streams;
33dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey
34e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport java.io.InputStream;
35e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport java.net.MalformedURLException;
36ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkeyimport java.net.UnknownHostException;
378ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport java.util.concurrent.TimeoutException;
38e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
39e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard/**
40e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * Code common to tests that use the download manager public API.
41e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard */
42ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkeypublic abstract class AbstractPublicApiTest extends AbstractDownloadProviderFunctionalTest {
43e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
44e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    class Download {
45e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        final long mId;
46e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
47e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        private Download(long downloadId) {
48e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            this.mId = downloadId;
49e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
50e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
51e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        public int getStatus() {
52e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            return (int) getLongField(DownloadManager.COLUMN_STATUS);
53e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
54e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
5558eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey        public int getReason() {
5658eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey            return (int) getLongField(DownloadManager.COLUMN_REASON);
5758eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey        }
5858eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey
595d217003acf21aea852975af0dff3b398cea6768Vasu Nori        public int getStatusIfExists() {
605d217003acf21aea852975af0dff3b398cea6768Vasu Nori            Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
615d217003acf21aea852975af0dff3b398cea6768Vasu Nori            try {
625d217003acf21aea852975af0dff3b398cea6768Vasu Nori                if (cursor.getCount() > 0) {
635d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    cursor.moveToFirst();
645d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    return (int) cursor.getLong(cursor.getColumnIndexOrThrow(
655d217003acf21aea852975af0dff3b398cea6768Vasu Nori                            DownloadManager.COLUMN_STATUS));
665d217003acf21aea852975af0dff3b398cea6768Vasu Nori                } else {
675d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    // the row doesn't exist
685d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    return -1;
695d217003acf21aea852975af0dff3b398cea6768Vasu Nori                }
705d217003acf21aea852975af0dff3b398cea6768Vasu Nori            } finally {
715d217003acf21aea852975af0dff3b398cea6768Vasu Nori                cursor.close();
725d217003acf21aea852975af0dff3b398cea6768Vasu Nori            }
735d217003acf21aea852975af0dff3b398cea6768Vasu Nori        }
745d217003acf21aea852975af0dff3b398cea6768Vasu Nori
75e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        String getStringField(String field) {
76e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
77e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            try {
78e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                assertEquals(1, cursor.getCount());
79e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                cursor.moveToFirst();
80e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                return cursor.getString(cursor.getColumnIndexOrThrow(field));
81e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            } finally {
82e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                cursor.close();
83e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            }
84e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
85e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
86e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        long getLongField(String field) {
87e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
88e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            try {
89e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                assertEquals(1, cursor.getCount());
90e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                cursor.moveToFirst();
91e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                return cursor.getLong(cursor.getColumnIndexOrThrow(field));
92e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            } finally {
93e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                cursor.close();
94e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            }
95e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
96e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
97dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey        byte[] getRawContents() throws Exception {
98e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            ParcelFileDescriptor downloadedFile = mManager.openDownloadedFile(mId);
99e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            assertTrue("Invalid file descriptor: " + downloadedFile,
100e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                       downloadedFile.getFileDescriptor().valid());
101dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey            final InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(
10258eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey                    downloadedFile);
103e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            try {
104dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey                return Streams.readFully(is);
105e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            } finally {
106dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey                IoUtils.closeQuietly(is);
107e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            }
108e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
109e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
110dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey        String getContents() throws Exception {
111dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey            return new String(getRawContents());
112dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey        }
113dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey
1148ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey        void runUntilStatus(int status) throws TimeoutException {
1150de55602ec6d350548248feddc68c91b29326effJeff Sharkey            final long startMillis = mSystemFacade.currentTimeMillis();
1168ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey            startService(null);
1170de55602ec6d350548248feddc68c91b29326effJeff Sharkey            waitForStatus(status, startMillis);
1188ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey        }
1198ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
1207ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey        void runUntilStatus(int status, long timeout) throws TimeoutException {
1217ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            final long startMillis = mSystemFacade.currentTimeMillis();
1227ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            startService(null);
1237ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            waitForStatus(status, startMillis, timeout);
1247ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey        }
1257ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey
1260de55602ec6d350548248feddc68c91b29326effJeff Sharkey        void waitForStatus(int expected, long afterMillis) throws TimeoutException {
1277ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            waitForStatus(expected, afterMillis, 15 * SECOND_IN_MILLIS);
1287ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey        }
1297ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey
1307ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey        void waitForStatus(int expected, long afterMillis, long timeout) throws TimeoutException {
1318ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey            int actual = -1;
1328ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
1337ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            final long elapsedTimeout = SystemClock.elapsedRealtime() + timeout;
1347ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            while (SystemClock.elapsedRealtime() < elapsedTimeout) {
1350de55602ec6d350548248feddc68c91b29326effJeff Sharkey                if (getLongField(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP) >= afterMillis) {
1360de55602ec6d350548248feddc68c91b29326effJeff Sharkey                    actual = getStatus();
1370de55602ec6d350548248feddc68c91b29326effJeff Sharkey                    if (actual == STATUS_SUCCESSFUL || actual == STATUS_FAILED) {
1380de55602ec6d350548248feddc68c91b29326effJeff Sharkey                        assertEquals(expected, actual);
1390de55602ec6d350548248feddc68c91b29326effJeff Sharkey                        return;
1400de55602ec6d350548248feddc68c91b29326effJeff Sharkey                    } else if (actual == expected) {
1410de55602ec6d350548248feddc68c91b29326effJeff Sharkey                        return;
1420de55602ec6d350548248feddc68c91b29326effJeff Sharkey                    }
1437ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey
1447ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                    if (timeout > MINUTE_IN_MILLIS) {
1457ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                        final int percent = (int) (100
1467ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                                * getLongField(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)
1477ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                                / getLongField(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
1487ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                        Log.d(LOG_TAG, percent + "% complete");
1497ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                    }
1508ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey                }
1518ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
1527ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                if (timeout > MINUTE_IN_MILLIS) {
1537ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                    SystemClock.sleep(SECOND_IN_MILLIS * 3);
1547ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                } else {
1557ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                    SystemClock.sleep(100);
1567ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                }
1578ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey            }
1588ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
1598ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey            throw new TimeoutException("Expected status " + expected + "; only reached " + actual);
160e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
1615d217003acf21aea852975af0dff3b398cea6768Vasu Nori
1625d217003acf21aea852975af0dff3b398cea6768Vasu Nori        // max time to wait before giving up on the current download operation.
1635d217003acf21aea852975af0dff3b398cea6768Vasu Nori        private static final int MAX_TIME_TO_WAIT_FOR_OPERATION = 5;
1645d217003acf21aea852975af0dff3b398cea6768Vasu Nori        // while waiting for the above time period, sleep this long to yield to the
1655d217003acf21aea852975af0dff3b398cea6768Vasu Nori        // download thread
1665d217003acf21aea852975af0dff3b398cea6768Vasu Nori        private static final int TIME_TO_SLEEP = 1000;
1675d217003acf21aea852975af0dff3b398cea6768Vasu Nori
1685d217003acf21aea852975af0dff3b398cea6768Vasu Nori        // waits until progress_so_far is >= (progress)%
1695d217003acf21aea852975af0dff3b398cea6768Vasu Nori        boolean runUntilProgress(int progress) throws InterruptedException {
1708ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey            startService(null);
1718ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
1725d217003acf21aea852975af0dff3b398cea6768Vasu Nori            int sleepCounter = MAX_TIME_TO_WAIT_FOR_OPERATION * 1000 / TIME_TO_SLEEP;
1735d217003acf21aea852975af0dff3b398cea6768Vasu Nori            int numBytesReceivedSoFar = 0;
1745d217003acf21aea852975af0dff3b398cea6768Vasu Nori            int totalBytes = 0;
1755d217003acf21aea852975af0dff3b398cea6768Vasu Nori            for (int i = 0; i < sleepCounter; i++) {
1765d217003acf21aea852975af0dff3b398cea6768Vasu Nori                Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
1775d217003acf21aea852975af0dff3b398cea6768Vasu Nori                try {
1785d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    assertEquals(1, cursor.getCount());
1795d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    cursor.moveToFirst();
1805d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    numBytesReceivedSoFar = cursor.getInt(
1815d217003acf21aea852975af0dff3b398cea6768Vasu Nori                            cursor.getColumnIndexOrThrow(
1825d217003acf21aea852975af0dff3b398cea6768Vasu Nori                                    DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
1835d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    totalBytes = cursor.getInt(
1845d217003acf21aea852975af0dff3b398cea6768Vasu Nori                            cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
1855d217003acf21aea852975af0dff3b398cea6768Vasu Nori                } finally {
1865d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    cursor.close();
1875d217003acf21aea852975af0dff3b398cea6768Vasu Nori                }
1885d217003acf21aea852975af0dff3b398cea6768Vasu Nori                Log.i(LOG_TAG, "in runUntilProgress, numBytesReceivedSoFar: " +
1895d217003acf21aea852975af0dff3b398cea6768Vasu Nori                        numBytesReceivedSoFar + ", totalBytes: " + totalBytes);
1905d217003acf21aea852975af0dff3b398cea6768Vasu Nori                if (totalBytes == 0) {
1915d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    fail("total_bytes should not be zero");
1925d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    return false;
1935d217003acf21aea852975af0dff3b398cea6768Vasu Nori                } else {
1945d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    if (numBytesReceivedSoFar * 100 / totalBytes >= progress) {
1955d217003acf21aea852975af0dff3b398cea6768Vasu Nori                        // progress_so_far is >= progress%. we are done
1965d217003acf21aea852975af0dff3b398cea6768Vasu Nori                        return true;
1975d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    }
1985d217003acf21aea852975af0dff3b398cea6768Vasu Nori                }
1995d217003acf21aea852975af0dff3b398cea6768Vasu Nori                // download not done yet. sleep a while and try again
2005d217003acf21aea852975af0dff3b398cea6768Vasu Nori                Thread.sleep(TIME_TO_SLEEP);
2015d217003acf21aea852975af0dff3b398cea6768Vasu Nori            }
2025d217003acf21aea852975af0dff3b398cea6768Vasu Nori            Log.i(LOG_TAG, "FAILED in runUntilProgress, numBytesReceivedSoFar: " +
2035d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    numBytesReceivedSoFar + ", totalBytes: " + totalBytes);
2045d217003acf21aea852975af0dff3b398cea6768Vasu Nori            return false; // failed
2055d217003acf21aea852975af0dff3b398cea6768Vasu Nori        }
206e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
207e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
208e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected static final String PACKAGE_NAME = "my.package.name";
209e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected static final String REQUEST_PATH = "/path";
210e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
211e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected DownloadManager mManager;
212e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
213e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    public AbstractPublicApiTest(FakeSystemFacade systemFacade) {
214e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        super(systemFacade);
215e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
216e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
217e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    @Override
218e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected void setUp() throws Exception {
219e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        super.setUp();
220e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        mManager = new DownloadManager(mResolver, PACKAGE_NAME);
221e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
222e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
223ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkey    protected DownloadManager.Request getRequest()
224ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkey            throws MalformedURLException, UnknownHostException {
225e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        return getRequest(getServerUri(REQUEST_PATH));
226e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
227e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
228e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected DownloadManager.Request getRequest(String path) {
229e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        return new DownloadManager.Request(Uri.parse(path));
230e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
231e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
232e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected Download enqueueRequest(DownloadManager.Request request) {
233e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        return new Download(mManager.enqueue(request));
234e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
235e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard}
236