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