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