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