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 1831fd85f39b554e09b2e6c1c2ccf5c186859880faSteve Howardimport android.app.DownloadManager; 1931fd85f39b554e09b2e6c1c2ccf5c186859880faSteve Howardimport android.app.DownloadManager.Request; 2040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.database.Cursor; 2140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.net.Uri; 2240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.os.Environment; 2340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.os.ParcelFileDescriptor; 2440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport android.util.Log; 2540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 2640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.DataInputStream; 2740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.DataOutputStream; 2840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.File; 2940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.FileInputStream; 3040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenimport java.io.FileOutputStream; 31df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyenimport java.util.HashSet; 3240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 3340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen/** 3440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Class to test downloading files from a real (not mock) external server. 3540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 3640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyenpublic class DownloadManagerTestApp extends DownloadManagerBaseTest { 3740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected static String DOWNLOAD_STARTED_FLAG = "DMTEST_DOWNLOAD_STARTED"; 3840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected static String LOG_TAG = 3940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen "com.android.frameworks.downloadmanagertests.DownloadManagerTestApp"; 4040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 41b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine protected static final String DOWNLOAD_FILENAME = "External93mb.apk"; 42b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine protected static final long DOWNLOAD_FILESIZE = 95251708; 43962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine // Wait until download manager actually start downloading something 44962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine // Will wait for 1 MB to be downloaded. 45962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine private static final long EXPECTED_PROGRESS = 1024 * 1024; 4640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 47df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen private static final String FILE_CONCURRENT_DOWNLOAD_FILE_PREFIX = "file"; 48df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen private static final String FILE_CONCURRENT_DOWNLOAD_FILE_EXTENSION = ".bin"; 49df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen protected static long CONCURRENT_DOWNLOAD_FILESIZE = 1000000; 50df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 5140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Values to be obtained from TestRunner 5240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen private String externalDownloadUriValue = null; 53df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen private String externalLargeDownloadUriValue = null; 5440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 5540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 5640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * {@inheritDoc } 5740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 5840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen @Override 5940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void setUp() throws Exception { 6040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen super.setUp(); 6140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen DownloadManagerTestRunner mRunner = (DownloadManagerTestRunner)getInstrumentation(); 62df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen externalDownloadUriValue = normalizeUri(mRunner.externalDownloadUriValue); 6330478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertNotNull("download url is null", externalDownloadUriValue); 6440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 65df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen externalLargeDownloadUriValue = normalizeUri(mRunner.externalDownloadUriValue); 6630478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertNotNull("large download url is null", externalLargeDownloadUriValue); 67df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen } 68df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 69df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen /** 70df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * Normalizes a uri to ensure it ends with a "/" 71df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * 72df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * @param uri The uri to normalize (or null) 73df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * @return The normalized uri, or null if null was passed in 74df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen */ 75df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen public String normalizeUri(String uri) { 76df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen if (uri != null && !uri.endsWith("/")) { 77df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen uri += "/"; 7840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 79df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen return uri; 8040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 8140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 8240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 8340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Gets the external URL of the file to download 8440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 8540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @return the Uri of the external file to download 8640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 8740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen private Uri getExternalFileUri(String file) { 8840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen return Uri.parse(externalDownloadUriValue + file); 8940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 9040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 9140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 9240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Gets the path to the file that flags that a download has started. The file contains the 9340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * DownloadManager id of the download being trackted between reboot sessions. 9440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 9540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @return The path of the file tracking that a download has started 9640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws InterruptedException if interrupted 9740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if timed out while waiting for SD card to mount 9840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 9940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected String getDownloadStartedFilePath() { 10040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String path = Environment.getExternalStorageDirectory().getPath(); 10140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen return path + File.separatorChar + DOWNLOAD_STARTED_FLAG; 10240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 10340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 10440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 10540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Common setup steps for downloads. 10640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 10740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Note that these are not included in setUp, so that individual tests can control their own 10840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * state between reboots, etc. 10940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 11040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen protected void doCommonDownloadSetup() throws Exception { 11140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 11240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(false); 11340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForExternalStoreMount(); 11440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 11540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 11640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 11740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 11840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Initiates a download. 11940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 12040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Queues up a download to the download manager, and saves the DownloadManager's assigned 12140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * download ID for this download to a file. 12240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 12340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 12440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 12540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void initiateDownload() throws Exception { 126b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine String filename = DOWNLOAD_FILENAME; 12740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mContext.deleteFile(DOWNLOAD_STARTED_FLAG); 12840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen FileOutputStream fileOutput = mContext.openFileOutput(DOWNLOAD_STARTED_FLAG, 0); 12940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen DataOutputStream outputFile = null; 13040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen doCommonDownloadSetup(); 13140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 13240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 13340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 13440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 13540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Make sure there are no pending downloads currently going on 13640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 13740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 13840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri remoteUri = getExternalFileUri(filename); 13940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Request request = new Request(remoteUri); 14040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 14140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = mDownloadManager.enqueue(request); 14240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadToStart(dlRequest); 14330478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertTrue("request id is -1 from download manager", dlRequest != -1); 14440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 14540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Store ID of download for later retrieval 14640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen outputFile = new DataOutputStream(fileOutput); 14740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen outputFile.writeLong(dlRequest); 14840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 14940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (outputFile != null) { 15040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen outputFile.flush(); 15140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen outputFile.close(); 15240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 15340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 15440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 15540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 15640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 15740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Waits for a previously-initiated download and verifies it has completed successfully. 15840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 15940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 16040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 16140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void verifyFileDownloadSucceeded() throws Exception { 162b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine String filename = DOWNLOAD_FILENAME; 163b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine long filesize = DOWNLOAD_FILESIZE; 16440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 16540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen boolean rebootMarkerValid = false; 16640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen DataInputStream dataInputFile = null; 16740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 16840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 16940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(false); 17040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 17140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 17240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen FileInputStream inFile = mContext.openFileInput(DOWNLOAD_STARTED_FLAG); 17340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dataInputFile = new DataInputStream(inFile); 17440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = dataInputFile.readLong(); 17540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } catch (Exception e) { 17640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // The file was't valid so we just leave the flag false 17740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Unable to determine initial download id."); 17840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen throw e; 17940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 18040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (dataInputFile != null) { 18140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dataInputFile.close(); 18240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 18340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mContext.deleteFile(DOWNLOAD_STARTED_FLAG); 18440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 18540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 18630478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertTrue("request id is -1 from download manager", dlRequest != -1); 18740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Cursor cursor = getCursor(dlRequest); 18840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen ParcelFileDescriptor pfd = null; 18940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 19040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen assertTrue("Unable to query last initiated download!", cursor.moveToFirst()); 19140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 19240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS); 19340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen int status = cursor.getInt(columnIndex); 19440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen int currentWaitTime = 0; 19540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 19630478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertTrue("download not finished", waitForDownload(dlRequest, 15 * 60 * 1000)); 19740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 19840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Verifying download information..."); 19940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Verify specific info about the file (size, name, etc)... 20040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen pfd = mDownloadManager.openDownloadedFile(dlRequest); 20140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen verifyFileSize(pfd, filesize); 20240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } catch (Exception e) { 20340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "error: " + e.toString()); 20440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen throw e; 20540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 20640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Clean up... 20740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen cursor.close(); 20840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mDownloadManager.remove(dlRequest); 20940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (pfd != null) { 21040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen pfd.close(); 21140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 21240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 21340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 21440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 21540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 21640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Tests downloading a large file over WiFi (~10 Mb). 21740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 21840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 21940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 22040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void runLargeDownloadOverWiFi() throws Exception { 221b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine String filename = DOWNLOAD_FILENAME; 222b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine long filesize = DOWNLOAD_FILESIZE; 22340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 22440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen doCommonDownloadSetup(); 22540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 22640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Make sure there are no pending downloads currently going on 22740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 22840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 22940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri remoteUri = getExternalFileUri(filename); 23040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Request request = new Request(remoteUri); 231b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey request.setMimeType("application/vnd.android.package-archive"); 23240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 23340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = mDownloadManager.enqueue(request); 23440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 23540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Rather large file, so wait up to 15 mins... 23630478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertTrue("download not finished", waitForDownload(dlRequest, 15 * 60 * 1000)); 23740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 23840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Cursor cursor = getCursor(dlRequest); 23940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen ParcelFileDescriptor pfd = null; 24040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 24140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Verifying download information..."); 24240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Verify specific info about the file (size, name, etc)... 24340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen pfd = mDownloadManager.openDownloadedFile(dlRequest); 24440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen verifyFileSize(pfd, filesize); 24540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 24640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (pfd != null) { 24740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen pfd.close(); 24840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 24940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mDownloadManager.remove(dlRequest); 25040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen cursor.close(); 25140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 25240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 25340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 25440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 25540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Tests that downloads resume when switching back and forth from having connectivity to 25640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * having no connectivity using both WiFi and airplane mode. 25740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 25840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Note: Device has no mobile access when running this test. 25940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 26040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 26140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 26240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void runDownloadMultipleSwitching() throws Exception { 263b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine String filename = DOWNLOAD_FILENAME; 264b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine long filesize = DOWNLOAD_FILESIZE; 26540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen doCommonDownloadSetup(); 26640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 26740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String localDownloadDirectory = Environment.getExternalStorageDirectory().getPath(); 26840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen File downloadedFile = new File(localDownloadDirectory, filename); 26940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 27040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 27140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 27240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 27340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 27440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Make sure there are no pending downloads currently going on 27540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 27640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 27740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri remoteUri = getExternalFileUri(filename); 27840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Request request = new Request(remoteUri); 27940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 28040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Local destination of downloaded file 28140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri localUri = Uri.fromFile(downloadedFile); 28240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "setting localUri to: " + localUri.getPath()); 28340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setDestinationUri(localUri); 28440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 28540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setAllowedNetworkTypes(Request.NETWORK_MOBILE | Request.NETWORK_WIFI); 28640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 28740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = mDownloadManager.enqueue(request); 28840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadToStart(dlRequest); 28940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // make sure we're starting to download some data... 290962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine waitToReceiveData(dlRequest, EXPECTED_PROGRESS); 29140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 29240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 29340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(false); 29440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 29540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 29640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on airplane mode..."); 29740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(true); 298962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine Thread.sleep(5 * 1000); // wait 5 secs 29940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 30040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 30140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 302962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine Thread.sleep(5 * 1000); // wait 5 secs 303962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine waitToReceiveData(dlRequest, EXPECTED_PROGRESS); 30440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 30540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download enable 30640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off airplane mode..."); 30740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(false); 30840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(5 * 1000); // wait 5 seconds 309962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine waitToReceiveData(dlRequest, EXPECTED_PROGRESS); 31040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 31140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 31240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off WiFi..."); 31340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(false); 314962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine Thread.sleep(5 * 1000); // wait 5 secs 31540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 31640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // finally, turn WiFi back on and finish up the download 31740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on WiFi..."); 31840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 319962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine Log.i(LOG_TAG, "Waiting up to 10 minutes for download to complete..."); 32030478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertTrue("download not finished", waitForDownload(dlRequest, 10 * 60 * 1000)); 32140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen ParcelFileDescriptor pfd = mDownloadManager.openDownloadedFile(dlRequest); 32240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen verifyFileSize(pfd, filesize); 32340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 32440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Cleaning up files..."); 32540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (dlRequest != -1) { 32640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mDownloadManager.remove(dlRequest); 32740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 32840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 32940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 33040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 33140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 33240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 33340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Tests that downloads resume when switching on/off WiFi at various intervals. 33440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 33540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Note: Device has no mobile access when running this test. 33640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 33740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 33840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 33940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void runDownloadMultipleWiFiEnableDisable() throws Exception { 340b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine String filename = DOWNLOAD_FILENAME; 341b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine long filesize = DOWNLOAD_FILESIZE; 34240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen doCommonDownloadSetup(); 34340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 34440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String localDownloadDirectory = Environment.getExternalStorageDirectory().getPath(); 34540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen File downloadedFile = new File(localDownloadDirectory, filename); 34640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 34740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 34840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 34940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 35040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Make sure there are no pending downloads currently going on 35140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 35240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 35340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri remoteUri = getExternalFileUri(filename); 35440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Request request = new Request(remoteUri); 35540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 35640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Local destination of downloaded file 35740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri localUri = Uri.fromFile(downloadedFile); 35840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "setting localUri to: " + localUri.getPath()); 35940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setDestinationUri(localUri); 36040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 36140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setAllowedNetworkTypes(Request.NETWORK_WIFI); 36240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 36340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = mDownloadManager.enqueue(request); 36440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadToStart(dlRequest); 36540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // are we making any progress? 366962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine waitToReceiveData(dlRequest, EXPECTED_PROGRESS); 36740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 36840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 36940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off WiFi..."); 37040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(false); 37140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(40 * 1000); // wait 40 seconds 37240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 37340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // enable download... 37440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on WiFi again..."); 37540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 376962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine waitToReceiveData(dlRequest, EXPECTED_PROGRESS); 37740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 37840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 37940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off WiFi..."); 38040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(false); 38140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(20 * 1000); // wait 20 seconds 38240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 38340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // enable download... 38440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on WiFi again..."); 38540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setWiFiStateOn(true); 38640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 387962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine Log.i(LOG_TAG, "Waiting up to 10 minutes for download to complete..."); 38830478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertTrue("download not finished", waitForDownload(dlRequest, 10 * 60 * 1000)); 38940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen ParcelFileDescriptor pfd = mDownloadManager.openDownloadedFile(dlRequest); 39040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen verifyFileSize(pfd, filesize); 39140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 39240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Cleaning up files..."); 39340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (dlRequest != -1) { 39440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mDownloadManager.remove(dlRequest); 39540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 39640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 39740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 39840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 39940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 40040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen /** 40140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Tests that downloads resume when switching on/off Airplane mode numerous times at 40240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * various intervals. 40340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 40440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * Note: Device has no mobile access when running this test. 40540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * 40640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen * @throws Exception if unsuccessful 40740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen */ 40840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen public void runDownloadMultipleAirplaneModeEnableDisable() throws Exception { 409b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine String filename = DOWNLOAD_FILENAME; 410b15c0e512c98434b81647cf3cd4620e84dc9ab61Maxim Siniavine long filesize = DOWNLOAD_FILESIZE; 41140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // make sure WiFi is enabled, and airplane mode is not on 41240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen doCommonDownloadSetup(); 41340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 41440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen String localDownloadDirectory = Environment.getExternalStorageDirectory().getPath(); 41540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen File downloadedFile = new File(localDownloadDirectory, filename); 41640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen long dlRequest = -1; 41740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen try { 41840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 41940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 42040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Make sure there are no pending downloads currently going on 42140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen removeAllCurrentDownloads(); 42240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 42340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri remoteUri = getExternalFileUri(filename); 42440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Request request = new Request(remoteUri); 42540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 42640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Local destination of downloaded file 42740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Uri localUri = Uri.fromFile(downloadedFile); 42840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "setting localUri to: " + localUri.getPath()); 42940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setDestinationUri(localUri); 43040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 43140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen request.setAllowedNetworkTypes(Request.NETWORK_WIFI); 43240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 43340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen dlRequest = mDownloadManager.enqueue(request); 43440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen waitForDownloadToStart(dlRequest); 43540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // are we making any progress? 436962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine waitToReceiveData(dlRequest, EXPECTED_PROGRESS); 43740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 43840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download disable 43940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on Airplane mode..."); 44040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(true); 44140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(60 * 1000); // wait 1 minute 44240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 44340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // download enable 44440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off Airplane mode..."); 44540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(false); 44640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // make sure we're starting to download some data... 447962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine waitToReceiveData(dlRequest, EXPECTED_PROGRESS); 44840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 44940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // reenable the connection to start up the download again 45040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning on Airplane mode again..."); 45140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(true); 45240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Thread.sleep(20 * 1000); // wait 20 seconds 45340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 45440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen // Finish up the download... 45540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Turning off Airplane mode again..."); 45640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen setAirplaneModeOn(false); 45740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen 458962e12883b6a07ff5b33bd9d269869e4da50b799Maxim Siniavine Log.i(LOG_TAG, "Waiting up to 10 minutes for donwload to complete..."); 45930478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertTrue("download not finished", waitForDownload(dlRequest, 10 * 60 * 1000)); // wait up to 10 mins 46040ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen ParcelFileDescriptor pfd = mDownloadManager.openDownloadedFile(dlRequest); 46140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen verifyFileSize(pfd, filesize); 46240ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } finally { 46340ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen Log.i(LOG_TAG, "Cleaning up files..."); 46440ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen if (dlRequest != -1) { 46540ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen mDownloadManager.remove(dlRequest); 46640ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 46740ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen downloadedFile.delete(); 46840ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 46940ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen } 470df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 471df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen /** 472df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * Tests 15 concurrent downloads of 1,000,000-byte files. 473df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * 474df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen * @throws Exception if test failed 475df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen */ 476df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen public void runDownloadMultipleSimultaneously() throws Exception { 477df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen final int TOTAL_DOWNLOADS = 15; 478df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen HashSet<Long> downloadIds = new HashSet<Long>(TOTAL_DOWNLOADS); 479df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 480df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen // Make sure there are no pending downloads currently going on 481df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen removeAllCurrentDownloads(); 482df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 483df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen try { 484df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen for (int i = 0; i < TOTAL_DOWNLOADS; ++i) { 485df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen long dlRequest = -1; 486df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen String filename = FILE_CONCURRENT_DOWNLOAD_FILE_PREFIX + i 487df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen + FILE_CONCURRENT_DOWNLOAD_FILE_EXTENSION; 488df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen Uri remoteUri = getExternalFileUri(filename); 489df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen Request request = new Request(remoteUri); 490df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen request.setTitle(filename); 491df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen dlRequest = mDownloadManager.enqueue(request); 49230478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertTrue("request id is -1 from download manager", dlRequest != -1); 493df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen downloadIds.add(dlRequest); 494df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen } 495df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen 49630478148bda4667f9ab9a9cd83f90d6c2fb017ffGuang Zhu assertTrue("download not finished", waitForMultipleDownloads(downloadIds, 15 * 60 * 2000)); // wait 15 mins max 497df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen } finally { 498df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen removeAllCurrentDownloads(); 499df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen } 500df7a865bbf45b57c60d294d5ac721e67e69a2dd6Neal Nguyen } 50140ef0f49ea9fa7c39eb0018fdb4df4b73a11a77dNeal Nguyen} 502