DownloadManagerTestApp.java revision df7a865bbf45b57c60d294d5ac721e67e69a2dd6
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 Nguyenpackage com.android.frameworks.downloadmanagertests; 1740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 1840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.content.Context; 1940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.content.Intent; 2040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.database.Cursor; 2140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.net.DownloadManager; 2240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.net.DownloadManager.Query; 2340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.net.DownloadManager.Request; 2440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.net.DownloadManagerBaseTest; 2540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.net.Uri; 2640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.os.Environment; 2740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.os.ParcelFileDescriptor; 2840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.provider.Settings; 2940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.test.suitebuilder.annotation.LargeTest; 3040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.util.Log; 3140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 3240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.DataInputStream; 3340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.DataOutputStream; 3440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.File; 3540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.FileInputStream; 3640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.FileOutputStream; 3740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.FileWriter; 38df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyenimport java.util.HashSet; 3940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 4040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport coretestutils.http.MockResponse; 4140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport coretestutils.http.MockWebServer; 4240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport coretestutils.http.RecordedRequest; 4340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 4440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen/** 4540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Class to test downloading files from a real (not mock) external server. 4640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 4740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenpublic class DownloadManagerTestApp extends DownloadManagerBaseTest { 4840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected static String DOWNLOAD_STARTED_FLAG = "DMTEST_DOWNLOAD_STARTED"; 4940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected static String LOG_TAG = 5040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen "com.android.frameworks.downloadmanagertests.DownloadManagerTestApp"; 5140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 5240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected static String DOWNLOAD_500K_FILENAME = "External541kb.apk"; 5340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected static long DOWNLOAD_500K_FILESIZE = 570927; 5440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected static String DOWNLOAD_1MB_FILENAME = "External1mb.apk"; 5540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected static long DOWNLOAD_1MB_FILESIZE = 1041262; 5640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected static String DOWNLOAD_10MB_FILENAME = "External10mb.apk"; 5740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected static long DOWNLOAD_10MB_FILESIZE = 10258741; 5840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 59df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen private static final String FILE_CONCURRENT_DOWNLOAD_FILE_PREFIX = "file"; 60df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen private static final String FILE_CONCURRENT_DOWNLOAD_FILE_EXTENSION = ".bin"; 61df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen protected static long CONCURRENT_DOWNLOAD_FILESIZE = 1000000; 62df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 6340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Values to be obtained from TestRunner 6440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen private String externalDownloadUriValue = null; 65df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen private String externalLargeDownloadUriValue = null; 6640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 6740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 6840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * {@inheritDoc } 6940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 7040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen @Override 7140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void setUp() throws Exception { 7240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen super.setUp(); 7340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen DownloadManagerTestRunner mRunner = (DownloadManagerTestRunner)getInstrumentation(); 74df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen externalDownloadUriValue = normalizeUri(mRunner.externalDownloadUriValue); 7540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen assertNotNull(externalDownloadUriValue); 7640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 77df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen externalLargeDownloadUriValue = normalizeUri(mRunner.externalDownloadUriValue); 78df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen assertNotNull(externalLargeDownloadUriValue); 79df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen } 80df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 81df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen /** 82df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * Normalizes a uri to ensure it ends with a "/" 83df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * 84df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * @param uri The uri to normalize (or null) 85df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * @return The normalized uri, or null if null was passed in 86df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen */ 87df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen public String normalizeUri(String uri) { 88df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen if (uri != null && !uri.endsWith("/")) { 89df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen uri += "/"; 9040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 91df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen return uri; 9240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 9340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 9440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 9540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Gets the external URL of the file to download 9640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 9740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @return the Uri of the external file to download 9840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 9940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen private Uri getExternalFileUri(String file) { 10040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen return Uri.parse(externalDownloadUriValue + file); 10140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 10240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 10340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 10440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Gets the path to the file that flags that a download has started. The file contains the 10540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * DownloadManager id of the download being trackted between reboot sessions. 10640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 10740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @return The path of the file tracking that a download has started 10840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws InterruptedException if interrupted 10940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if timed out while waiting for SD card to mount 11040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 11140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected String getDownloadStartedFilePath() { 11240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String path = Environment.getExternalStorageDirectory().getPath(); 11340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen return path + File.separatorChar + DOWNLOAD_STARTED_FLAG; 11440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 11540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 11640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 11740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Common setup steps for downloads. 11840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 11940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Note that these are not included in setUp, so that individual tests can control their own 12040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * state between reboots, etc. 12140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 12240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected void doCommonDownloadSetup() throws Exception { 12340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 12440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(false); 12540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForExternalStoreMount(); 12640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 12740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 12840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 12940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 13040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Initiates a download. 13140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 13240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Queues up a download to the download manager, and saves the DownloadManager's assigned 13340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * download ID for this download to a file. 13440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 13540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 13640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 13740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void initiateDownload() throws Exception { 13840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String filename = DOWNLOAD_1MB_FILENAME; 13940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mContext.deleteFile(DOWNLOAD_STARTED_FLAG); 14040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen FileOutputStream fileOutput = mContext.openFileOutput(DOWNLOAD_STARTED_FLAG, 0); 14140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen DataOutputStream outputFile = null; 14240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen doCommonDownloadSetup(); 14340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 14440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 14540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 14640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 14740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Make sure there are no pending downloads currently going on 14840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 14940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 15040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri remoteUri = getExternalFileUri(filename); 15140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Request request = new Request(remoteUri); 15240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 15340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = mDownloadManager.enqueue(request); 15440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadToStart(dlRequest); 15540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen assertTrue(dlRequest != -1); 15640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 15740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Store ID of download for later retrieval 15840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen outputFile = new DataOutputStream(fileOutput); 15940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen outputFile.writeLong(dlRequest); 16040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 16140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (outputFile != null) { 16240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen outputFile.flush(); 16340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen outputFile.close(); 16440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 16540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 16640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 16740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 16840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 16940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Waits for a previously-initiated download and verifies it has completed successfully. 17040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 17140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 17240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 17340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void verifyFileDownloadSucceeded() throws Exception { 17440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String filename = DOWNLOAD_1MB_FILENAME; 17540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long filesize = DOWNLOAD_1MB_FILESIZE; 17640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 17740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen boolean rebootMarkerValid = false; 17840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen DataInputStream dataInputFile = null; 17940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 18040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 18140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(false); 18240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 18340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 18440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen FileInputStream inFile = mContext.openFileInput(DOWNLOAD_STARTED_FLAG); 18540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dataInputFile = new DataInputStream(inFile); 18640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = dataInputFile.readLong(); 18740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } catch (Exception e) { 18840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // The file was't valid so we just leave the flag false 18940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Unable to determine initial download id."); 19040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen throw e; 19140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 19240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (dataInputFile != null) { 19340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dataInputFile.close(); 19440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 19540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mContext.deleteFile(DOWNLOAD_STARTED_FLAG); 19640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 19740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 19840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen assertTrue(dlRequest != -1); 19940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Cursor cursor = getCursor(dlRequest); 20040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen ParcelFileDescriptor pfd = null; 20140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 20240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen assertTrue("Unable to query last initiated download!", cursor.moveToFirst()); 20340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 20440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS); 20540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen int status = cursor.getInt(columnIndex); 20640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen int currentWaitTime = 0; 20740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 20840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Wait until the download finishes 20940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadOrTimeout(dlRequest); 21040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 21140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Verifying download information..."); 21240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Verify specific info about the file (size, name, etc)... 21340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen pfd = mDownloadManager.openDownloadedFile(dlRequest); 21440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen verifyFileSize(pfd, filesize); 21540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } catch (Exception e) { 21640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "error: " + e.toString()); 21740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen throw e; 21840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 21940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Clean up... 22040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen cursor.close(); 22140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mDownloadManager.remove(dlRequest); 22240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (pfd != null) { 22340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen pfd.close(); 22440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 22540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 22640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 22740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 22840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 22940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Tests downloading a large file over WiFi (~10 Mb). 23040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 23140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 23240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 23340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void runLargeDownloadOverWiFi() throws Exception { 23440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String filename = DOWNLOAD_10MB_FILENAME; 23540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long filesize = DOWNLOAD_10MB_FILESIZE; 23640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 23740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen doCommonDownloadSetup(); 23840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 23940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Make sure there are no pending downloads currently going on 24040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 24140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 24240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri remoteUri = getExternalFileUri(filename); 24340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Request request = new Request(remoteUri); 24440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setMediaType(getMimeMapping(DownloadFileType.APK)); 24540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 24640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = mDownloadManager.enqueue(request); 24740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 24840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Rather large file, so wait up to 15 mins... 24940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadOrTimeout(dlRequest, WAIT_FOR_DOWNLOAD_POLL_TIME, 15 * 60 * 1000); 25040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 25140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Cursor cursor = getCursor(dlRequest); 25240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen ParcelFileDescriptor pfd = null; 25340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 25440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Verifying download information..."); 25540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Verify specific info about the file (size, name, etc)... 25640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen pfd = mDownloadManager.openDownloadedFile(dlRequest); 25740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen verifyFileSize(pfd, filesize); 25840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 25940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (pfd != null) { 26040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen pfd.close(); 26140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 26240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mDownloadManager.remove(dlRequest); 26340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen cursor.close(); 26440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 26540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 26640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 26740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 26840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Tests that downloads resume when switching back and forth from having connectivity to 26940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * having no connectivity using both WiFi and airplane mode. 27040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 27140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Note: Device has no mobile access when running this test. 27240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 27340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 27440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 27540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void runDownloadMultipleSwitching() throws Exception { 27640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String filename = DOWNLOAD_500K_FILENAME; 27740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long filesize = DOWNLOAD_500K_FILESIZE; 27840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen doCommonDownloadSetup(); 27940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 28040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String localDownloadDirectory = Environment.getExternalStorageDirectory().getPath(); 28140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen File downloadedFile = new File(localDownloadDirectory, filename); 28240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 28340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 28440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 28540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 28640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 28740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Make sure there are no pending downloads currently going on 28840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 28940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 29040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri remoteUri = getExternalFileUri(filename); 29140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Request request = new Request(remoteUri); 29240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 29340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Local destination of downloaded file 29440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri localUri = Uri.fromFile(downloadedFile); 29540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "setting localUri to: " + localUri.getPath()); 29640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setDestinationUri(localUri); 29740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 29840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setAllowedNetworkTypes(Request.NETWORK_MOBILE | Request.NETWORK_WIFI); 29940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 30040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = mDownloadManager.enqueue(request); 30140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadToStart(dlRequest); 30240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // make sure we're starting to download some data... 30340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForFileToGrow(downloadedFile); 30440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 30540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 30640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(false); 30740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 30840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 30940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on airplane mode..."); 31040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(true); 31140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(30 * 1000); // wait 30 secs 31240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 31340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 31440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 31540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(30 * 1000); // wait 30 secs 31640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 31740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download enable 31840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off airplane mode..."); 31940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(false); 32040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(5 * 1000); // wait 5 seconds 32140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 32240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 32340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off WiFi..."); 32440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(false); 32540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(30 * 1000); // wait 30 secs 32640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 32740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // finally, turn WiFi back on and finish up the download 32840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on WiFi..."); 32940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 33040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Waiting up to 3 minutes for download to complete..."); 33140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadsOrTimeout(dlRequest, 3 * 60 * 1000); 33240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen ParcelFileDescriptor pfd = mDownloadManager.openDownloadedFile(dlRequest); 33340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen verifyFileSize(pfd, filesize); 33440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 33540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Cleaning up files..."); 33640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (dlRequest != -1) { 33740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mDownloadManager.remove(dlRequest); 33840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 33940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 34040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 34140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 34240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 34340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 34440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Tests that downloads resume when switching on/off WiFi at various intervals. 34540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 34640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Note: Device has no mobile access when running this test. 34740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 34840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 34940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 35040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void runDownloadMultipleWiFiEnableDisable() throws Exception { 35140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String filename = DOWNLOAD_500K_FILENAME; 35240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long filesize = DOWNLOAD_500K_FILESIZE; 35340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen doCommonDownloadSetup(); 35440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 35540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String localDownloadDirectory = Environment.getExternalStorageDirectory().getPath(); 35640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen File downloadedFile = new File(localDownloadDirectory, filename); 35740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 35840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 35940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 36040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 36140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Make sure there are no pending downloads currently going on 36240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 36340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 36440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri remoteUri = getExternalFileUri(filename); 36540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Request request = new Request(remoteUri); 36640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 36740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Local destination of downloaded file 36840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri localUri = Uri.fromFile(downloadedFile); 36940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "setting localUri to: " + localUri.getPath()); 37040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setDestinationUri(localUri); 37140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 37240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setAllowedNetworkTypes(Request.NETWORK_WIFI); 37340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 37440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = mDownloadManager.enqueue(request); 37540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadToStart(dlRequest); 37640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // are we making any progress? 37740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForFileToGrow(downloadedFile); 37840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 37940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 38040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off WiFi..."); 38140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(false); 38240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(40 * 1000); // wait 40 seconds 38340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 38440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // enable download... 38540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on WiFi again..."); 38640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 38740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForFileToGrow(downloadedFile); 38840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 38940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 39040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off WiFi..."); 39140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(false); 39240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(20 * 1000); // wait 20 seconds 39340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 39440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // enable download... 39540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on WiFi again..."); 39640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 39740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 39840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Waiting up to 3 minutes for download to complete..."); 39940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadsOrTimeout(dlRequest, 3 * 60 * 1000); 40040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen ParcelFileDescriptor pfd = mDownloadManager.openDownloadedFile(dlRequest); 40140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen verifyFileSize(pfd, filesize); 40240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 40340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Cleaning up files..."); 40440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (dlRequest != -1) { 40540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mDownloadManager.remove(dlRequest); 40640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 40740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 40840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 40940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 41040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 41140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 41240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Tests that downloads resume when switching on/off Airplane mode numerous times at 41340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * various intervals. 41440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 41540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Note: Device has no mobile access when running this test. 41640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 41740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 41840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 41940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void runDownloadMultipleAirplaneModeEnableDisable() throws Exception { 42040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String filename = DOWNLOAD_500K_FILENAME; 42140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long filesize = DOWNLOAD_500K_FILESIZE; 42240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // make sure WiFi is enabled, and airplane mode is not on 42340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen doCommonDownloadSetup(); 42440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 42540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String localDownloadDirectory = Environment.getExternalStorageDirectory().getPath(); 42640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen File downloadedFile = new File(localDownloadDirectory, filename); 42740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 42840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 42940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 43040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 43140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Make sure there are no pending downloads currently going on 43240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 43340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 43440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri remoteUri = getExternalFileUri(filename); 43540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Request request = new Request(remoteUri); 43640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 43740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Local destination of downloaded file 43840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri localUri = Uri.fromFile(downloadedFile); 43940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "setting localUri to: " + localUri.getPath()); 44040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setDestinationUri(localUri); 44140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 44240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setAllowedNetworkTypes(Request.NETWORK_WIFI); 44340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 44440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = mDownloadManager.enqueue(request); 44540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadToStart(dlRequest); 44640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // are we making any progress? 44740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForFileToGrow(downloadedFile); 44840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 44940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 45040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on Airplane mode..."); 45140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(true); 45240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(60 * 1000); // wait 1 minute 45340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 45440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download enable 45540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off Airplane mode..."); 45640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(false); 45740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // make sure we're starting to download some data... 45840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForFileToGrow(downloadedFile); 45940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 46040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // reenable the connection to start up the download again 46140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on Airplane mode again..."); 46240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(true); 46340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(20 * 1000); // wait 20 seconds 46440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 46540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Finish up the download... 46640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off Airplane mode again..."); 46740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(false); 46840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 46940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Waiting up to 3 minutes for donwload to complete..."); 47040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadsOrTimeout(dlRequest, 180 * 1000); // wait up to 3 mins before timeout 47140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen ParcelFileDescriptor pfd = mDownloadManager.openDownloadedFile(dlRequest); 47240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen verifyFileSize(pfd, filesize); 47340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 47440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Cleaning up files..."); 47540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (dlRequest != -1) { 47640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mDownloadManager.remove(dlRequest); 47740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 47840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 47940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 48040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 481df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 482df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen /** 483df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * Tests 15 concurrent downloads of 1,000,000-byte files. 484df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * 485df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * @throws Exception if test failed 486df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen */ 487df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen public void runDownloadMultipleSimultaneously() throws Exception { 488df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen final int TOTAL_DOWNLOADS = 15; 489df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen HashSet<Long> downloadIds = new HashSet<Long>(TOTAL_DOWNLOADS); 490df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen MultipleDownloadsCompletedReceiver receiver = registerNewMultipleDownloadsReceiver(); 491df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 492df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen // Make sure there are no pending downloads currently going on 493df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen removeAllCurrentDownloads(); 494df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 495df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen try { 496df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen for (int i = 0; i < TOTAL_DOWNLOADS; ++i) { 497df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen long dlRequest = -1; 498df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen String filename = FILE_CONCURRENT_DOWNLOAD_FILE_PREFIX + i 499df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen + FILE_CONCURRENT_DOWNLOAD_FILE_EXTENSION; 500df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen Uri remoteUri = getExternalFileUri(filename); 501df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen Request request = new Request(remoteUri); 502df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen request.setTitle(filename); 503df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen dlRequest = mDownloadManager.enqueue(request); 504df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen assertTrue(dlRequest != -1); 505df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen downloadIds.add(dlRequest); 506df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen } 507df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 508df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen waitForDownloadsOrTimeout(DEFAULT_WAIT_POLL_TIME, 15 * 60 * 2000); // wait 15 mins max 509df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen assertEquals(TOTAL_DOWNLOADS, receiver.numDownloadsCompleted()); 510df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen } finally { 511df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen removeAllCurrentDownloads(); 512df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen } 513df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen } 51440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen} 515