diff options
Diffstat (limited to 'tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java')
-rw-r--r-- | tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java | 262 |
1 files changed, 16 insertions, 246 deletions
diff --git a/tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java b/tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java index 8d4655bb..7de90de5 100644 --- a/tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java +++ b/tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java @@ -16,38 +16,19 @@ package com.android.providers.downloads; -import android.content.ComponentName; -import android.content.ContentProvider; -import android.content.ContentResolver; import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; import android.database.Cursor; -import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Environment; import android.provider.Downloads; -import android.test.MoreAsserts; -import android.test.RenamingDelegatingContext; -import android.test.ServiceTestCase; -import android.test.mock.MockContentResolver; import android.test.suitebuilder.annotation.LargeTest; -import android.util.Log; -import tests.http.MockResponse; import tests.http.MockWebServer; import tests.http.RecordedRequest; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.net.MalformedURLException; -import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; /** * This test exercises the entire download manager working together -- it requests downloads through @@ -56,157 +37,7 @@ import java.util.Set; * device to serve downloads. */ @LargeTest -public class DownloadManagerFunctionalTest extends ServiceTestCase<DownloadService> { - private static final String LOG_TAG = "DownloadManagerFunctionalTest"; - - private static final String PROVIDER_AUTHORITY = "downloads"; - private static final int RETRY_DELAY_MILLIS = 61 * 1000; - private static final long REQUEST_TIMEOUT_MILLIS = 10 * 1000; - private static final String FILE_CONTENT = "hello world"; - - private static final int HTTP_OK = 200; - private static final int HTTP_PARTIAL_CONTENT = 206; - private static final int HTTP_NOT_FOUND = 404; - private static final int HTTP_SERVICE_UNAVAILABLE = 503; - - private MockWebServer mServer; - // resolves requests to the DownloadProvider we set up - private MockContentResolver mResolver; - private TestContext mTestContext; - private FakeSystemFacade mSystemFacade; - - /** - * Context passed to the provider and the service. Allows most methods to pass through to the - * real Context (this is a LargeTest), with a few exceptions, including renaming file operations - * to avoid file and DB conflicts (via RenamingDelegatingContext). - */ - private static class TestContext extends RenamingDelegatingContext { - private static final String FILENAME_PREFIX = "test."; - - private Context mRealContext; - private Set<String> mAllowedSystemServices; - private ContentResolver mResolver; - - boolean mHasServiceBeenStarted = false; - FakeIConnectivityManager mFakeIConnectivityManager; - - public TestContext(Context realContext) { - super(realContext, FILENAME_PREFIX); - mRealContext = realContext; - mAllowedSystemServices = new HashSet<String>(Arrays.asList(new String[] { - Context.NOTIFICATION_SERVICE, - Context.POWER_SERVICE, - })); - mFakeIConnectivityManager = new FakeIConnectivityManager(); - } - - public void setResolver(ContentResolver resolver) { - mResolver = resolver; - } - - /** - * Direct DownloadService to our test instance of DownloadProvider. - */ - @Override - public ContentResolver getContentResolver() { - assert mResolver != null; - return mResolver; - } - - /** - * Stub some system services, allow access to others, and block the rest. - */ - @Override - public Object getSystemService(String name) { - if (name.equals(Context.CONNECTIVITY_SERVICE)) { - return new ConnectivityManager(mFakeIConnectivityManager); - } - if (mAllowedSystemServices.contains(name)) { - return mRealContext.getSystemService(name); - } - return super.getSystemService(name); - } - - /** - * Record when DownloadProvider starts DownloadService. - */ - @Override - public ComponentName startService(Intent service) { - if (service.getComponent().getClassName().equals(DownloadService.class.getName())) { - mHasServiceBeenStarted = true; - return service.getComponent(); - } - throw new UnsupportedOperationException("Unexpected service: " + service); - } - } - - public DownloadManagerFunctionalTest() { - super(DownloadService.class); - } - - @Override - protected void setUp() throws Exception { - super.setUp(); - - Context realContext = getContext(); - mTestContext = new TestContext(realContext); - setupProviderAndResolver(); - assert isDatabaseEmpty(); // ensure we're not messing with real data - - mTestContext.setResolver(mResolver); - setContext(mTestContext); - setupService(); - mSystemFacade = new FakeSystemFacade(); - getService().mSystemFacade = mSystemFacade; - - mServer = new MockWebServer(); - mServer.play(); - } - - private void setupProviderAndResolver() { - ContentProvider provider = new DownloadProvider(); - provider.attachInfo(mTestContext, null); - mResolver = new MockContentResolver(); - mResolver.addProvider(PROVIDER_AUTHORITY, provider); - } - - private boolean isDatabaseEmpty() { - Cursor cursor = mResolver.query(Downloads.CONTENT_URI, null, null, null, null); - try { - return cursor.getCount() == 0; - } finally { - cursor.close(); - } - } - - @Override - protected void tearDown() throws Exception { - cleanUpDownloads(); - super.tearDown(); - } - - /** - * Remove any downloaded files and delete any lingering downloads. - */ - private void cleanUpDownloads() { - if (mResolver == null) { - return; - } - String[] columns = new String[] {Downloads._DATA}; - Cursor cursor = mResolver.query(Downloads.CONTENT_URI, columns, null, null, null); - try { - for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { - String filePath = cursor.getString(0); - if (filePath == null) continue; - Log.d(LOG_TAG, "Deleting " + filePath); - new File(filePath).delete(); - } - } finally { - cursor.close(); - } - mResolver.delete(Downloads.CONTENT_URI, null, null); - } - +public class DownloadManagerFunctionalTest extends AbstractDownloadManagerFunctionalTest { public void testBasicRequest() throws Exception { enqueueResponse(HTTP_OK, FILE_CONTENT); @@ -273,7 +104,7 @@ public class DownloadManagerFunctionalTest extends ServiceTestCase<DownloadServi // without connectivity, download immediately pauses mTestContext.mFakeIConnectivityManager.setNetworkState(NetworkInfo.State.DISCONNECTED); startService(null); - waitForDownloadToStop(downloadUri, Downloads.STATUS_RUNNING_PAUSED); + super.waitForDownloadToStop(getStatusReader(downloadUri), Downloads.STATUS_RUNNING_PAUSED); // connecting should start the download mTestContext.mFakeIConnectivityManager.setNetworkState(NetworkInfo.State.CONNECTED); @@ -310,47 +141,6 @@ public class DownloadManagerFunctionalTest extends ServiceTestCase<DownloadServi assertEquals(FILE_CONTENT, getDownloadContents(downloadUri)); } - private void assertStartsWith(String expectedPrefix, String actual) { - String regex = "^" + expectedPrefix + ".*"; - MoreAsserts.assertMatchesRegex(regex, actual); - } - - /** - * Enqueue a response from the MockWebServer. - */ - private MockResponse enqueueResponse(int status, String body) { - MockResponse response = new MockResponse() - .setResponseCode(status) - .setBody(body) - .addHeader("Content-type", "text/plain"); - mServer.enqueue(response); - return response; - } - - private MockResponse enqueueEmptyResponse(int status) { - return enqueueResponse(status, ""); - } - - /** - * Run the service and wait for a request and for the download to reach the given status. - * @return the request received - */ - private RecordedRequest runUntilStatus(Uri downloadUri, int status) throws Exception { - startService(null); - RecordedRequest request = takeRequest(); - waitForDownloadToStop(downloadUri, status); - return request; - } - - /** - * Wait for a request to come to the MockWebServer and return it. - */ - private RecordedRequest takeRequest() throws InterruptedException { - RecordedRequest request = mServer.takeRequestWithTimeout(REQUEST_TIMEOUT_MILLIS); - assertNotNull("Timed out waiting for request", request); - return request; - } - /** * Read a downloaded file from disk. */ @@ -363,31 +153,23 @@ public class DownloadManagerFunctionalTest extends ServiceTestCase<DownloadServi } } - /** - * Wait for a download to given a given status, with a timeout. Fails if the download reaches - * any other final status. - */ - private void waitForDownloadToStop(Uri downloadUri, int expectedStatus) throws Exception { - // TODO(showard): find a better way to accomplish this - long startTimeMillis = System.currentTimeMillis(); - int status = getDownloadStatus(downloadUri); - while (status != expectedStatus) { - if (!Downloads.isStatusInformational(status)) { - fail("Download completed with unexpected status: " + status); - } - if (System.currentTimeMillis() > startTimeMillis + REQUEST_TIMEOUT_MILLIS) { - fail("Download timed out with status " + status); + private RecordedRequest runUntilStatus(Uri downloadUri, int status) throws Exception { + return super.runUntilStatus(getStatusReader(downloadUri), status); + } + + private StatusReader getStatusReader(final Uri downloadUri) { + return new StatusReader() { + public int getStatus() { + return getDownloadStatus(downloadUri); } - Thread.sleep(100); - mServer.checkForExceptions(); - status = getDownloadStatus(downloadUri); - } - long delta = System.currentTimeMillis() - startTimeMillis; - Log.d(LOG_TAG, "Status " + status + " reached after " + delta + "ms"); + public boolean isComplete(int status) { + return !Downloads.isStatusInformational(status); + } + }; } - private int getDownloadStatus(Uri downloadUri) { + protected int getDownloadStatus(Uri downloadUri) { return Integer.valueOf(getDownloadField(downloadUri, Downloads.COLUMN_STATUS)); } @@ -412,7 +194,7 @@ public class DownloadManagerFunctionalTest extends ServiceTestCase<DownloadServi */ private Uri requestDownload(String path) throws MalformedURLException { ContentValues values = new ContentValues(); - values.put(Downloads.COLUMN_URI, mServer.getUrl(path).toString()); + values.put(Downloads.COLUMN_URI, getServerUri(path)); values.put(Downloads.COLUMN_DESTINATION, Downloads.DESTINATION_EXTERNAL); return mResolver.insert(Downloads.CONTENT_URI, values); } @@ -426,16 +208,4 @@ public class DownloadManagerFunctionalTest extends ServiceTestCase<DownloadServi int numChanged = mResolver.update(downloadUri, values, null, null); assertEquals(1, numChanged); } - - private String readStream(InputStream inputStream) throws IOException { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - try { - char[] buffer = new char[1024]; - int length = reader.read(buffer); - assertTrue("Failed to read anything from input stream", length > -1); - return String.valueOf(buffer, 0, length); - } finally { - reader.close(); - } - } } |