/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net; import android.content.pm.PackageManagerHostTestUtils; import com.android.ddmlib.Log; import com.android.hosttest.DeviceTestCase; import com.android.hosttest.DeviceTestSuite; import java.io.File; import java.util.Hashtable; import junit.framework.Test; /** * Host-based tests of the DownloadManager API. (Uses a device-based app to actually invoke the * various tests.) */ public class DownloadManagerHostTests extends DeviceTestCase { protected PackageManagerHostTestUtils mPMUtils = null; private static final String LOG_TAG = "android.net.DownloadManagerHostTests"; private static final String FILE_DOWNLOAD_APK = "DownloadManagerTestApp.apk"; private static final String FILE_DOWNLOAD_PKG = "com.android.frameworks.downloadmanagertests"; private static final String FILE_DOWNLOAD_CLASS = "com.android.frameworks.downloadmanagertests.DownloadManagerTestApp"; private static final String DOWNLOAD_TEST_RUNNER_NAME = "com.android.frameworks.downloadmanagertests.DownloadManagerTestRunner"; // Extra parameters to pass to the TestRunner private static final String EXTERNAL_DOWNLOAD_URI_KEY = "external_download_uri"; // Note: External environment variable ANDROID_TEST_EXTERNAL_URI must be set to point to the // external URI under which the files downloaded by the tests can be found. Note that the Uri // must be accessible by the device during a test run. Correspondingly, // ANDROID_TEST_EXTERNAL_LARGE_URI should point to the external URI of the folder containing // large files. private static String externalDownloadUriValue = null; Hashtable<String, String> mExtraParams = null; public static Test suite() { return new DeviceTestSuite(DownloadManagerHostTests.class); } @Override protected void setUp() throws Exception { super.setUp(); // ensure apk path has been set before test is run assertNotNull(getTestAppPath()); mPMUtils = new PackageManagerHostTestUtils(getDevice()); externalDownloadUriValue = System.getenv("ANDROID_TEST_EXTERNAL_URI"); assertNotNull(externalDownloadUriValue); mExtraParams = getExtraParams(); } /** * Helper function to get extra params that can be used to pass into the helper app. */ protected Hashtable<String, String> getExtraParams() { Hashtable<String, String> extraParams = new Hashtable<String, String>(); extraParams.put(EXTERNAL_DOWNLOAD_URI_KEY, externalDownloadUriValue); return extraParams; } /** * Tests that a large download over WiFi * @throws Exception if the test failed at any point */ public void testLargeDownloadOverWiFi() throws Exception { mPMUtils.installAppAndVerifyExistsOnDevice(String.format("%s%s%s", getTestAppPath(), File.separator, FILE_DOWNLOAD_APK), FILE_DOWNLOAD_PKG, true); boolean testPassed = mPMUtils.runDeviceTestsDidAllTestsPass(FILE_DOWNLOAD_PKG, FILE_DOWNLOAD_CLASS, "runLargeDownloadOverWiFi", DOWNLOAD_TEST_RUNNER_NAME, mExtraParams); assertTrue("Failed to install large file over WiFi in < 10 minutes!", testPassed); } /** * Spawns a device-based function to initiate a download on the device, reboots the device, * then waits and verifies the download succeeded. * * @throws Exception if the test failed at any point */ public void testDownloadManagerSingleReboot() throws Exception { mPMUtils.installAppAndVerifyExistsOnDevice(String.format("%s%s%s", getTestAppPath(), File.separator, FILE_DOWNLOAD_APK), FILE_DOWNLOAD_PKG, true); boolean testPassed = mPMUtils.runDeviceTestsDidAllTestsPass(FILE_DOWNLOAD_PKG, FILE_DOWNLOAD_CLASS, "initiateDownload", DOWNLOAD_TEST_RUNNER_NAME, mExtraParams); assertTrue("Failed to initiate download properly!", testPassed); mPMUtils.rebootDevice(); testPassed = mPMUtils.runDeviceTestsDidAllTestsPass(FILE_DOWNLOAD_PKG, FILE_DOWNLOAD_CLASS, "verifyFileDownloadSucceeded", DOWNLOAD_TEST_RUNNER_NAME, mExtraParams); assertTrue("Failed to verify initiated download completed properyly!", testPassed); } /** * Spawns a device-based function to initiate a download on the device, reboots the device three * times (using different intervals), then waits and verifies the download succeeded. * * @throws Exception if the test failed at any point */ public void testDownloadManagerMultipleReboots() throws Exception { mPMUtils.installAppAndVerifyExistsOnDevice(String.format("%s%s%s", getTestAppPath(), File.separator, FILE_DOWNLOAD_APK), FILE_DOWNLOAD_PKG, true); boolean testPassed = mPMUtils.runDeviceTestsDidAllTestsPass(FILE_DOWNLOAD_PKG, FILE_DOWNLOAD_CLASS, "initiateDownload", DOWNLOAD_TEST_RUNNER_NAME, mExtraParams); assertTrue("Failed to initiate download properly!", testPassed); Thread.sleep(5000); // Do 3 random reboots - after 13, 9, and 19 seconds Log.i(LOG_TAG, "First reboot..."); mPMUtils.rebootDevice(); Thread.sleep(13000); Log.i(LOG_TAG, "Second reboot..."); mPMUtils.rebootDevice(); Thread.sleep(9000); Log.i(LOG_TAG, "Third reboot..."); mPMUtils.rebootDevice(); Thread.sleep(19000); testPassed = mPMUtils.runDeviceTestsDidAllTestsPass(FILE_DOWNLOAD_PKG, FILE_DOWNLOAD_CLASS, "verifyFileDownloadSucceeded", DOWNLOAD_TEST_RUNNER_NAME, mExtraParams); assertTrue("Failed to verify initiated download completed properyly!", testPassed); } /** * Spawns a device-based function to test download while WiFi is enabled/disabled multiple times * during the download. * * @throws Exception if the test failed at any point */ public void testDownloadMultipleWiFiEnableDisable() throws Exception { mPMUtils.installAppAndVerifyExistsOnDevice(String.format("%s%s%s", getTestAppPath(), File.separator, FILE_DOWNLOAD_APK), FILE_DOWNLOAD_PKG, true); boolean testPassed = mPMUtils.runDeviceTestsDidAllTestsPass(FILE_DOWNLOAD_PKG, FILE_DOWNLOAD_CLASS, "runDownloadMultipleWiFiEnableDisable", DOWNLOAD_TEST_RUNNER_NAME, mExtraParams); assertTrue(testPassed); } /** * Spawns a device-based function to test switching on/off both airplane mode and WiFi * * @throws Exception if the test failed at any point */ public void testDownloadMultipleSwitching() throws Exception { mPMUtils.installAppAndVerifyExistsOnDevice(String.format("%s%s%s", getTestAppPath(), File.separator, FILE_DOWNLOAD_APK), FILE_DOWNLOAD_PKG, true); boolean testPassed = mPMUtils.runDeviceTestsDidAllTestsPass(FILE_DOWNLOAD_PKG, FILE_DOWNLOAD_CLASS, "runDownloadMultipleSwitching", DOWNLOAD_TEST_RUNNER_NAME, mExtraParams); assertTrue(testPassed); } /** * Spawns a device-based function to test switching on/off airplane mode multiple times * * @throws Exception if the test failed at any point */ public void testDownloadMultipleAirplaneModeEnableDisable() throws Exception { mPMUtils.installAppAndVerifyExistsOnDevice(String.format("%s%s%s", getTestAppPath(), File.separator, FILE_DOWNLOAD_APK), FILE_DOWNLOAD_PKG, true); boolean testPassed = mPMUtils.runDeviceTestsDidAllTestsPass(FILE_DOWNLOAD_PKG, FILE_DOWNLOAD_CLASS, "runDownloadMultipleAirplaneModeEnableDisable", DOWNLOAD_TEST_RUNNER_NAME, mExtraParams); assertTrue(testPassed); } /** * Spawns a device-based function to test 15 concurrent downloads of 5,000,000-byte files * * @throws Exception if the test failed at any point */ public void testDownloadMultipleSimultaneously() throws Exception { mPMUtils.installAppAndVerifyExistsOnDevice(String.format("%s%s%s", getTestAppPath(), File.separator, FILE_DOWNLOAD_APK), FILE_DOWNLOAD_PKG, true); boolean testPassed = mPMUtils.runDeviceTestsDidAllTestsPass(FILE_DOWNLOAD_PKG, FILE_DOWNLOAD_CLASS, "runDownloadMultipleSimultaneously", DOWNLOAD_TEST_RUNNER_NAME, mExtraParams); assertTrue(testPassed); } }