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;
254f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkeyimport android.content.ContentResolver;
264f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkeyimport android.content.ContextWrapper;
27e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.database.Cursor;
28e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.net.Uri;
29e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.os.ParcelFileDescriptor;
308ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport android.os.SystemClock;
315d217003acf21aea852975af0dff3b398cea6768Vasu Noriimport android.util.Log;
32e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
33dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkeyimport libcore.io.IoUtils;
34dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkeyimport libcore.io.Streams;
35dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey
36e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport java.io.InputStream;
37e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport java.net.MalformedURLException;
38ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkeyimport java.net.UnknownHostException;
398ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport java.util.concurrent.TimeoutException;
40e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
41e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard/**
42e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * Code common to tests that use the download manager public API.
43e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard */
44ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkeypublic abstract class AbstractPublicApiTest extends AbstractDownloadProviderFunctionalTest {
45e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
46e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    class Download {
47e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        final long mId;
48e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
49e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        private Download(long downloadId) {
50e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            this.mId = downloadId;
51e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
52e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
53e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        public int getStatus() {
54e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            return (int) getLongField(DownloadManager.COLUMN_STATUS);
55e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
56e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
5758eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey        public int getReason() {
5858eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey            return (int) getLongField(DownloadManager.COLUMN_REASON);
5958eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey        }
6058eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey
615d217003acf21aea852975af0dff3b398cea6768Vasu Nori        public int getStatusIfExists() {
625d217003acf21aea852975af0dff3b398cea6768Vasu Nori            Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
635d217003acf21aea852975af0dff3b398cea6768Vasu Nori            try {
645d217003acf21aea852975af0dff3b398cea6768Vasu Nori                if (cursor.getCount() > 0) {
655d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    cursor.moveToFirst();
665d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    return (int) cursor.getLong(cursor.getColumnIndexOrThrow(
675d217003acf21aea852975af0dff3b398cea6768Vasu Nori                            DownloadManager.COLUMN_STATUS));
685d217003acf21aea852975af0dff3b398cea6768Vasu Nori                } else {
695d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    // the row doesn't exist
705d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    return -1;
715d217003acf21aea852975af0dff3b398cea6768Vasu Nori                }
725d217003acf21aea852975af0dff3b398cea6768Vasu Nori            } finally {
735d217003acf21aea852975af0dff3b398cea6768Vasu Nori                cursor.close();
745d217003acf21aea852975af0dff3b398cea6768Vasu Nori            }
755d217003acf21aea852975af0dff3b398cea6768Vasu Nori        }
765d217003acf21aea852975af0dff3b398cea6768Vasu Nori
77e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        String getStringField(String field) {
78e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
79e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            try {
80e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                assertEquals(1, cursor.getCount());
81e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                cursor.moveToFirst();
82e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                return cursor.getString(cursor.getColumnIndexOrThrow(field));
83e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            } finally {
84e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                cursor.close();
85e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            }
86e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
87e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
88e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        long getLongField(String field) {
89e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
90e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            try {
91e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                assertEquals(1, cursor.getCount());
92e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                cursor.moveToFirst();
93e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                return cursor.getLong(cursor.getColumnIndexOrThrow(field));
94e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            } finally {
95e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                cursor.close();
96e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            }
97e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
98e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
99dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey        byte[] getRawContents() throws Exception {
100e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            ParcelFileDescriptor downloadedFile = mManager.openDownloadedFile(mId);
101e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            assertTrue("Invalid file descriptor: " + downloadedFile,
102e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard                       downloadedFile.getFileDescriptor().valid());
103dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey            final InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(
10458eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey                    downloadedFile);
105e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            try {
106dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey                return Streams.readFully(is);
107e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            } finally {
108dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey                IoUtils.closeQuietly(is);
109e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard            }
110e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
111e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
112dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey        String getContents() throws Exception {
113dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey            return new String(getRawContents());
114dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey        }
115dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey
1168ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey        void runUntilStatus(int status) throws TimeoutException {
1170de55602ec6d350548248feddc68c91b29326effJeff Sharkey            final long startMillis = mSystemFacade.currentTimeMillis();
1183a5f5eafb34eaa4963c801882148e8f61514a61bJeff Sharkey            startDownload(mId);
1190de55602ec6d350548248feddc68c91b29326effJeff Sharkey            waitForStatus(status, startMillis);
1208ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey        }
1218ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
1227ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey        void runUntilStatus(int status, long timeout) throws TimeoutException {
1237ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            final long startMillis = mSystemFacade.currentTimeMillis();
1243a5f5eafb34eaa4963c801882148e8f61514a61bJeff Sharkey            startDownload(mId);
1257ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            waitForStatus(status, startMillis, timeout);
1267ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey        }
1277ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey
1280de55602ec6d350548248feddc68c91b29326effJeff Sharkey        void waitForStatus(int expected, long afterMillis) throws TimeoutException {
1297ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            waitForStatus(expected, afterMillis, 15 * SECOND_IN_MILLIS);
1307ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey        }
1317ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey
1327ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey        void waitForStatus(int expected, long afterMillis, long timeout) throws TimeoutException {
1338ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey            int actual = -1;
1348ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
1357ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            final long elapsedTimeout = SystemClock.elapsedRealtime() + timeout;
1367ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey            while (SystemClock.elapsedRealtime() < elapsedTimeout) {
1370de55602ec6d350548248feddc68c91b29326effJeff Sharkey                if (getLongField(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP) >= afterMillis) {
1380de55602ec6d350548248feddc68c91b29326effJeff Sharkey                    actual = getStatus();
1390de55602ec6d350548248feddc68c91b29326effJeff Sharkey                    if (actual == STATUS_SUCCESSFUL || actual == STATUS_FAILED) {
1400de55602ec6d350548248feddc68c91b29326effJeff Sharkey                        assertEquals(expected, actual);
1410de55602ec6d350548248feddc68c91b29326effJeff Sharkey                        return;
1420de55602ec6d350548248feddc68c91b29326effJeff Sharkey                    } else if (actual == expected) {
1430de55602ec6d350548248feddc68c91b29326effJeff Sharkey                        return;
1440de55602ec6d350548248feddc68c91b29326effJeff Sharkey                    }
1457ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey
1467ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                    if (timeout > MINUTE_IN_MILLIS) {
1477ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                        final int percent = (int) (100
1487ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                                * getLongField(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)
1497ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                                / getLongField(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
1507ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                        Log.d(LOG_TAG, percent + "% complete");
1517ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                    }
1528ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey                }
1538ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
1547ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                if (timeout > MINUTE_IN_MILLIS) {
1557ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                    SystemClock.sleep(SECOND_IN_MILLIS * 3);
1567ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                } else {
1577ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                    SystemClock.sleep(100);
1587ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey                }
1598ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey            }
1608ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
1618ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey            throw new TimeoutException("Expected status " + expected + "; only reached " + actual);
162e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        }
1635d217003acf21aea852975af0dff3b398cea6768Vasu Nori
1645d217003acf21aea852975af0dff3b398cea6768Vasu Nori        // max time to wait before giving up on the current download operation.
1655d217003acf21aea852975af0dff3b398cea6768Vasu Nori        private static final int MAX_TIME_TO_WAIT_FOR_OPERATION = 5;
1665d217003acf21aea852975af0dff3b398cea6768Vasu Nori        // while waiting for the above time period, sleep this long to yield to the
1675d217003acf21aea852975af0dff3b398cea6768Vasu Nori        // download thread
1685d217003acf21aea852975af0dff3b398cea6768Vasu Nori        private static final int TIME_TO_SLEEP = 1000;
1695d217003acf21aea852975af0dff3b398cea6768Vasu Nori
1705d217003acf21aea852975af0dff3b398cea6768Vasu Nori        // waits until progress_so_far is >= (progress)%
1715d217003acf21aea852975af0dff3b398cea6768Vasu Nori        boolean runUntilProgress(int progress) throws InterruptedException {
1723a5f5eafb34eaa4963c801882148e8f61514a61bJeff Sharkey            startDownload(mId);
1738ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey
1745d217003acf21aea852975af0dff3b398cea6768Vasu Nori            int sleepCounter = MAX_TIME_TO_WAIT_FOR_OPERATION * 1000 / TIME_TO_SLEEP;
1755d217003acf21aea852975af0dff3b398cea6768Vasu Nori            int numBytesReceivedSoFar = 0;
1765d217003acf21aea852975af0dff3b398cea6768Vasu Nori            int totalBytes = 0;
1775d217003acf21aea852975af0dff3b398cea6768Vasu Nori            for (int i = 0; i < sleepCounter; i++) {
1785d217003acf21aea852975af0dff3b398cea6768Vasu Nori                Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
1795d217003acf21aea852975af0dff3b398cea6768Vasu Nori                try {
1805d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    assertEquals(1, cursor.getCount());
1815d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    cursor.moveToFirst();
1825d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    numBytesReceivedSoFar = cursor.getInt(
1835d217003acf21aea852975af0dff3b398cea6768Vasu Nori                            cursor.getColumnIndexOrThrow(
1845d217003acf21aea852975af0dff3b398cea6768Vasu Nori                                    DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
1855d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    totalBytes = cursor.getInt(
1865d217003acf21aea852975af0dff3b398cea6768Vasu Nori                            cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
1875d217003acf21aea852975af0dff3b398cea6768Vasu Nori                } finally {
1885d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    cursor.close();
1895d217003acf21aea852975af0dff3b398cea6768Vasu Nori                }
1905d217003acf21aea852975af0dff3b398cea6768Vasu Nori                Log.i(LOG_TAG, "in runUntilProgress, numBytesReceivedSoFar: " +
1915d217003acf21aea852975af0dff3b398cea6768Vasu Nori                        numBytesReceivedSoFar + ", totalBytes: " + totalBytes);
1925d217003acf21aea852975af0dff3b398cea6768Vasu Nori                if (totalBytes == 0) {
1935d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    fail("total_bytes should not be zero");
1945d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    return false;
1955d217003acf21aea852975af0dff3b398cea6768Vasu Nori                } else {
1965d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    if (numBytesReceivedSoFar * 100 / totalBytes >= progress) {
1975d217003acf21aea852975af0dff3b398cea6768Vasu Nori                        // progress_so_far is >= progress%. we are done
1985d217003acf21aea852975af0dff3b398cea6768Vasu Nori                        return true;
1995d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    }
2005d217003acf21aea852975af0dff3b398cea6768Vasu Nori                }
2015d217003acf21aea852975af0dff3b398cea6768Vasu Nori                // download not done yet. sleep a while and try again
2025d217003acf21aea852975af0dff3b398cea6768Vasu Nori                Thread.sleep(TIME_TO_SLEEP);
2035d217003acf21aea852975af0dff3b398cea6768Vasu Nori            }
2045d217003acf21aea852975af0dff3b398cea6768Vasu Nori            Log.i(LOG_TAG, "FAILED in runUntilProgress, numBytesReceivedSoFar: " +
2055d217003acf21aea852975af0dff3b398cea6768Vasu Nori                    numBytesReceivedSoFar + ", totalBytes: " + totalBytes);
2065d217003acf21aea852975af0dff3b398cea6768Vasu Nori            return false; // failed
2075d217003acf21aea852975af0dff3b398cea6768Vasu Nori        }
208e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
209e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
210e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected static final String PACKAGE_NAME = "my.package.name";
211e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected static final String REQUEST_PATH = "/path";
212e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
213e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected DownloadManager mManager;
214e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
215e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    public AbstractPublicApiTest(FakeSystemFacade systemFacade) {
216e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        super(systemFacade);
217e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
218e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
219e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    @Override
220e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected void setUp() throws Exception {
221e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        super.setUp();
2224f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey        mManager = new DownloadManager(new ContextWrapper(mContext) {
2234f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey            @Override
2244f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey            public ContentResolver getContentResolver() {
2254f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey                return mResolver;
2264f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey            }
2274f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey
2284f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey            @Override
2294f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey            public String getPackageName() {
2304f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey                return PACKAGE_NAME;
2314f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey            }
2324f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey        });
2333a5f5eafb34eaa4963c801882148e8f61514a61bJeff Sharkey        mManager.setAccessFilename(true);
234e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
235e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
236ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkey    protected DownloadManager.Request getRequest()
237ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkey            throws MalformedURLException, UnknownHostException {
238e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        return getRequest(getServerUri(REQUEST_PATH));
239e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
240e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
241e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected DownloadManager.Request getRequest(String path) {
242e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        return new DownloadManager.Request(Uri.parse(path));
243e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
244e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
245e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    protected Download enqueueRequest(DownloadManager.Request request) {
246e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        return new Download(mManager.enqueue(request));
247e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
248e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard}
249