140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen/*
240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Copyright (C) 2010 The Android Open Source Project
340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen *
440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Licensed under the Apache License, Version 2.0 (the "License");
540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * you may not use this file except in compliance with the License.
640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * You may obtain a copy of the License at
740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen *
840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen *      http://www.apache.org/licenses/LICENSE-2.0
940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen *
1040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Unless required by applicable law or agreed to in writing, software
1140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * distributed under the License is distributed on an "AS IS" BASIS,
1240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * See the License for the specific language governing permissions and
1440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * limitations under the License.
1540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */
1640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
1731fd85f39b554e09b2e6c1c2ccf5c186859880faSteve Howardpackage android.app;
1840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
1931fd85f39b554e09b2e6c1c2ccf5c186859880faSteve Howardimport android.app.DownloadManager.Query;
2031fd85f39b554e09b2e6c1c2ccf5c186859880faSteve Howardimport android.app.DownloadManager.Request;
2140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.database.Cursor;
2231fd85f39b554e09b2e6c1c2ccf5c186859880faSteve Howardimport android.net.Uri;
2340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.os.Environment;
2440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.os.ParcelFileDescriptor;
2540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.test.suitebuilder.annotation.LargeTest;
2640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
27b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkeyimport com.google.mockwebserver.MockResponse;
28b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey
2940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.File;
30df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyenimport java.util.Iterator;
31df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyenimport java.util.Set;
3240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
3340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen/**
3440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Integration tests of the DownloadManager API.
3540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */
3682e891b3259350a92b55969a6380ca1240ee0829Vasu Noripublic class DownloadManagerFunctionalTest extends DownloadManagerBaseTest {
3782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    private static final String TAG = "DownloadManagerFunctionalTest";
38df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen    private final static String CACHE_DIR =
39df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen            Environment.getDownloadCacheDirectory().getAbsolutePath();
4082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    private final static String PROHIBITED_DIRECTORY =
4182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            Environment.getRootDirectory().getAbsolutePath();
4240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
4340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
4440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     * {@inheritDoc}
4540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     */
4640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    @Override
4740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    public void setUp() throws Exception {
4840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        super.setUp();
4940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        setWiFiStateOn(true);
5040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        removeAllCurrentDownloads();
5140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    }
5240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
5340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
5440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     * {@inheritDoc}
5540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     */
5640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    @Override
5740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    public void tearDown() throws Exception {
5840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        super.tearDown();
5940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        setWiFiStateOn(true);
60df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen        removeAllCurrentDownloads();
6140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
6240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        if (mReceiver != null) {
6340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            mContext.unregisterReceiver(mReceiver);
6440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            mReceiver = null;
6540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        }
6640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    }
6740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
6840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
69df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen     * Verifies a particular error code was received from a download
70df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen     *
71df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen     * @param uri The uri to enqueue to the DownloadManager
72df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen     * @param error The error code expected
7382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @throws Exception if the test fails
74df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen     */
75df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen    public void doErrorTest(Uri uri, int error) throws Exception {
76df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen        Request request = new Request(uri);
77df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen        request.setTitle(DEFAULT_FILENAME);
78df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen
79df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen        long dlRequest = mDownloadManager.enqueue(request);
80df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen        waitForDownloadOrTimeout(dlRequest);
81df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen
82df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen        Cursor cursor = getCursor(dlRequest);
83df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen        try {
843e8c1d3a467bab889de7f92379be1f43d9c2d81eSteve Howard            verifyInt(cursor, DownloadManager.COLUMN_REASON, error);
85df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen        } finally {
86df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen            cursor.close();
87df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen        }
8840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    }
8940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
9040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
9140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     * Test a basic download of a binary file 500k in size.
9240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     */
9340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    @LargeTest
9482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public void testBinaryDownloadToSystemCache() throws Exception {
9582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int fileSize = 1024;
9640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        byte[] blobData = generateData(fileSize, DataType.BINARY);
9740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
9882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        long dlRequest = doBasicDownload(blobData, DOWNLOAD_TO_SYSTEM_CACHE);
9982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        verifyDownload(dlRequest, blobData);
10082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        mDownloadManager.remove(dlRequest);
10140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    }
10240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
10340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
10440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     * Tests the basic downloading of a text file 300000 bytes in size.
10540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     */
10640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    @LargeTest
10782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public void testTextDownloadToSystemCache() throws Exception {
10882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int fileSize = 1024;
10940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        byte[] blobData = generateData(fileSize, DataType.TEXT);
11040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
11182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        long dlRequest = doBasicDownload(blobData, DOWNLOAD_TO_SYSTEM_CACHE);
11282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        verifyDownload(dlRequest, blobData);
11382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        mDownloadManager.remove(dlRequest);
11440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    }
11582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
11640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
11782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to verify a standard single-file download from the mock server, and clean up after
11882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * verification
11982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
12082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Note that this also calls the Download manager's remove, which cleans up the file from cache.
12182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
12282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param requestId The id of the download to remove
12382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param fileData The data to verify the file contains
12440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     */
12582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    private void verifyDownload(long requestId, byte[] fileData)
12682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            throws Exception {
12782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int fileSize = fileData.length;
12882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        ParcelFileDescriptor pfd = mDownloadManager.openDownloadedFile(requestId);
12982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Cursor cursor = mDownloadManager.query(new Query().setFilterById(requestId));
13082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        try {
13182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            assertEquals(1, cursor.getCount());
13282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            assertTrue(cursor.moveToFirst());
13340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
13482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            verifyFileSize(pfd, fileSize);
13582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            verifyFileContents(pfd, fileData);
13682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            int colIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
13782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            String fileName = cursor.getString(colIndex);
13882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            assertTrue(fileName.startsWith(CACHE_DIR));
13940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        } finally {
14082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            pfd.close();
14140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            cursor.close();
14240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        }
14340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    }
14440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
14540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
14640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     * Tests trying to download to SD card when the file with same name already exists.
14740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     */
14840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    @LargeTest
14940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    public void testDownloadToExternal_fileExists() throws Exception {
15040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        File existentFile = createFileOnSD(null, 1, DataType.TEXT, null);
15140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        byte[] blobData = generateData(DEFAULT_FILE_SIZE, DataType.TEXT);
15240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
15340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        // Prepare the mock server with a standard response
154b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        enqueueResponse(buildResponse(HTTP_OK, blobData));
15540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
15640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        try {
15740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Uri uri = getServerUri(DEFAULT_FILENAME);
15840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Request request = new Request(uri);
15940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
16040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Uri localUri = Uri.fromFile(existentFile);
16140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            request.setDestinationUri(localUri);
16240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
16340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            long dlRequest = mDownloadManager.enqueue(request);
16440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
16540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            // wait for the download to complete
16640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            waitForDownloadOrTimeout(dlRequest);
16740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Cursor cursor = getCursor(dlRequest);
16840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
16940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            try {
17082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                verifyInt(cursor, DownloadManager.COLUMN_STATUS, DownloadManager.STATUS_SUCCESSFUL);
17140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            } finally {
17240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen                cursor.close();
17340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            }
17440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        } finally {
17540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            existentFile.delete();
17640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        }
17740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    }
17840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
17940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
18040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     * Tests trying to download a file to SD card.
18140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     */
18240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    @LargeTest
18340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    public void testDownloadToExternal() throws Exception {
18440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        String localDownloadDirectory = Environment.getExternalStorageDirectory().getPath();
18540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        File downloadedFile = new File(localDownloadDirectory, DEFAULT_FILENAME);
18640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        // make sure the file doesn't already exist in the directory
18740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        downloadedFile.delete();
18840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
18940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        try {
19040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            byte[] blobData = generateData(DEFAULT_FILE_SIZE, DataType.TEXT);
19140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
19240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            // Prepare the mock server with a standard response
193b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey            enqueueResponse(buildResponse(HTTP_OK, blobData));
19440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
19540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Uri uri = getServerUri(DEFAULT_FILENAME);
19640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Request request = new Request(uri);
19740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
19840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Uri localUri = Uri.fromFile(downloadedFile);
19940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            request.setDestinationUri(localUri);
20040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
20140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            long dlRequest = mDownloadManager.enqueue(request);
20240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
20340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            // wait for the download to complete
20440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            waitForDownloadOrTimeout(dlRequest);
20540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
20640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            verifyAndCleanupSingleFileDownload(dlRequest, blobData);
20740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
20840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            assertEquals(1, mReceiver.numDownloadsCompleted());
20940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        } finally {
21040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            downloadedFile.delete();
21140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        }
21240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    }
21340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
21440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
21540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     * Tests trying to download a file to the system partition.
21640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     */
21740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    @LargeTest
21840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    public void testDownloadToProhibitedDirectory() throws Exception {
21940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        File downloadedFile = new File(PROHIBITED_DIRECTORY, DEFAULT_FILENAME);
22040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        try {
22140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            byte[] blobData = generateData(DEFAULT_FILE_SIZE, DataType.TEXT);
22240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
22340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            // Prepare the mock server with a standard response
224b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey            enqueueResponse(buildResponse(HTTP_OK, blobData));
22540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
22640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Uri uri = getServerUri(DEFAULT_FILENAME);
22740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Request request = new Request(uri);
22840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
22940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Uri localUri = Uri.fromFile(downloadedFile);
23040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            request.setDestinationUri(localUri);
23140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
23240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            try {
23340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen                mDownloadManager.enqueue(request);
23440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen                fail("Failed to throw SecurityException when trying to write to /system.");
23540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            } catch (SecurityException s) {
23640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen                assertFalse(downloadedFile.exists());
23740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            }
23840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        } finally {
23940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            // Just in case file somehow got created, make sure to delete it
24040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            downloadedFile.delete();
24140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        }
24240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    }
24340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
24440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
24582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Tests that we get the correct download ID from the download notification.
24682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
24782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    @LargeTest
24882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public void testGetDownloadIdOnNotification() throws Exception {
24982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        byte[] blobData = generateData(3000, DataType.TEXT);  // file size = 3000 bytes
25082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
251b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        enqueueResponse(buildResponse(HTTP_OK, blobData));
25282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        long dlRequest = doCommonStandardEnqueue();
25382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        waitForDownloadOrTimeout(dlRequest);
25482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
25582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Set<Long> ids = mReceiver.getDownloadIds();
25682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        assertEquals(1, ids.size());
25782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Iterator<Long> it = ids.iterator();
25882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        assertEquals("Download ID received from notification does not match initial id!",
25982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                dlRequest, it.next().longValue());
26082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
26182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
26282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
26382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Tests the download failure error after too many redirects (>5).
26482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
26582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    @LargeTest
26682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public void testErrorTooManyRedirects() throws Exception {
26782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Uri uri = getServerUri(DEFAULT_FILENAME);
26882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
26982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        // force 6 redirects
27082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        for (int i = 0; i < 6; ++i) {
271b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey            final MockResponse resp = buildResponse(HTTP_REDIRECT);
272b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey            resp.setHeader("Location", uri.toString());
273b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey            enqueueResponse(resp);
27482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
27582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        doErrorTest(uri, DownloadManager.ERROR_TOO_MANY_REDIRECTS);
27682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
27782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
27882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
27982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Tests the download failure error from an unhandled HTTP status code
28082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
28182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    @LargeTest
28282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public void testErrorUnhandledHttpCode() throws Exception {
28382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Uri uri = getServerUri(DEFAULT_FILENAME);
284b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        enqueueResponse(buildResponse(HTTP_PARTIAL_CONTENT));
28582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
28682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        doErrorTest(uri, DownloadManager.ERROR_UNHANDLED_HTTP_CODE);
28782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
28882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
28982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
29082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Tests the download failure error from an unhandled HTTP status code
29182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
29282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    @LargeTest
29382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public void testErrorHttpDataError_invalidRedirect() throws Exception {
29482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Uri uri = getServerUri(DEFAULT_FILENAME);
295b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        final MockResponse resp = buildResponse(HTTP_REDIRECT);
296b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        resp.setHeader("Location", "://blah.blah.blah.com");
297b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        enqueueResponse(resp);
29882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
29982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        doErrorTest(uri, DownloadManager.ERROR_HTTP_DATA_ERROR);
30082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
30182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
30282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
30382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Tests that we can remove a download from the download manager.
30482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
30582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    @LargeTest
30682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public void testRemoveDownload() throws Exception {
30782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int fileSize = 1024;
30882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        byte[] blobData = generateData(fileSize, DataType.BINARY);
30982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
31082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        long dlRequest = doBasicDownload(blobData, DOWNLOAD_TO_DOWNLOAD_CACHE_DIR);
31182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Cursor cursor = mDownloadManager.query(new Query().setFilterById(dlRequest));
31282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        try {
31382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            assertEquals("The count of downloads with this ID is not 1!", 1, cursor.getCount());
31482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            mDownloadManager.remove(dlRequest);
31582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            cursor.requery();
31682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            assertEquals("The count of downloads with this ID is not 0!", 0, cursor.getCount());
31782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        } finally {
31882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            cursor.close();
31982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
32082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
32182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
32282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
32382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Tests that we can set the title of a download.
32482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
32582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    @LargeTest
32682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public void testSetTitle() throws Exception {
32782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int fileSize = 1024;
32882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        byte[] blobData = generateData(fileSize, DataType.BINARY);
329b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        enqueueResponse(buildResponse(HTTP_OK, blobData));
33082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
33182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        // An arbitrary unicode string title
33282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        final String title = "\u00a5123;\"\u0152\u017d \u054b \u0a07 \ucce0 \u6820\u03a8\u5c34" +
33382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                "\uf4ad\u0da9\uc0c5\uc1a8 \uf4c5 \uf4aa\u0023\'";
33482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
33582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Uri uri = getServerUri(DEFAULT_FILENAME);
33682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Request request = new Request(uri);
33782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        request.setTitle(title);
33882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
33982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        long dlRequest = mDownloadManager.enqueue(request);
34082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        waitForDownloadOrTimeout(dlRequest);
34182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
34282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Cursor cursor = getCursor(dlRequest);
34382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        try {
34482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            verifyString(cursor, DownloadManager.COLUMN_TITLE, title);
34582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        } finally {
34682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            cursor.close();
34782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
34882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
34982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
35082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
35140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     * Tests that a download set for Wifi does not progress while Wifi is disabled, but resumes
35240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     * once Wifi is re-enabled.
35340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen     */
35440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    @LargeTest
35540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    public void testDownloadNoWifi() throws Exception {
35640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        long timeout = 60 * 1000; // wait only 60 seconds before giving up
35782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int fileSize = 1024;  // 140k
35840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        byte[] blobData = generateData(fileSize, DataType.TEXT);
35940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
36040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        setWiFiStateOn(false);
361b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        enqueueResponse(buildResponse(HTTP_OK, blobData));
36240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
36340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        try {
36440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Uri uri = getServerUri(DEFAULT_FILENAME);
36540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            Request request = new Request(uri);
36640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            request.setAllowedNetworkTypes(Request.NETWORK_WIFI);
36740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
36840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            long dlRequest = mDownloadManager.enqueue(request);
36940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
37040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            // wait for the download to complete
37140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            boolean success = waitForDownloadOrTimeoutNoThrow(dlRequest,
37240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen                    WAIT_FOR_DOWNLOAD_POLL_TIME, timeout);
37340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            assertFalse("Download proceeded without Wifi connection!", success);
37440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
37540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            setWiFiStateOn(true);
37640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            waitForDownloadOrTimeout(dlRequest);
37740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
37840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            assertEquals(1, mReceiver.numDownloadsCompleted());
37940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        } finally {
38040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen            setWiFiStateOn(true);
38140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen        }
38240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    }
38340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen
38440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen    /**
38582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Tests that we get an error code when the server drops the connection during a download.
38682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
38782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    @LargeTest
38882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public void testServerDropConnection_body() throws Exception {
38982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        byte[] blobData = generateData(25000, DataType.TEXT);  // file size = 25000 bytes
39082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
391b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        final MockResponse resp = buildResponse(HTTP_OK, blobData);
392b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        resp.setHeader("Content-Length", "50000");
393b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey        enqueueResponse(resp);
394b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey
39582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        long dlRequest = doCommonStandardEnqueue();
39682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        waitForDownloadOrTimeout(dlRequest);
39782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
39882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Cursor cursor = getCursor(dlRequest);
39982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        try {
40082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            verifyInt(cursor, DownloadManager.COLUMN_STATUS, DownloadManager.STATUS_FAILED);
40182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            verifyInt(cursor, DownloadManager.COLUMN_REASON,
40282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    DownloadManager.ERROR_CANNOT_RESUME);
40382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        } finally {
40482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            cursor.close();
40582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
40682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        // Even tho the server drops the connection, we should still get a completed notification
40782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        assertEquals(1, mReceiver.numDownloadsCompleted());
40882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
40940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen}
410