diff options
Diffstat (limited to 'tests/src/com')
7 files changed, 110 insertions, 8 deletions
diff --git a/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java b/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java index 13d2c36e..6acdfed5 100644 --- a/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java +++ b/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java @@ -24,15 +24,23 @@ import android.app.NotificationManager; import android.app.job.JobParameters; import android.app.job.JobScheduler; import android.content.ContentResolver; +import android.content.ContentValues; import android.content.Context; import android.content.pm.ProviderInfo; import android.database.ContentObserver; import android.database.Cursor; +import android.database.DatabaseUtils; +import android.database.MatrixCursor; import android.net.Uri; +import android.os.Binder; +import android.os.Bundle; +import android.os.IBinder; import android.provider.Downloads; +import android.provider.MediaStore; import android.test.MoreAsserts; import android.test.RenamingDelegatingContext; import android.test.ServiceTestCase; +import android.test.mock.MockContentProvider; import android.test.mock.MockContentResolver; import android.util.Log; @@ -92,6 +100,40 @@ public abstract class AbstractDownloadProviderFunctionalTest extends } } + static class MockMediaProvider extends MockContentProvider { + private static final Uri TEST_URI = Uri.parse("content://media/external/11111111"); + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + return TEST_URI; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + return new MatrixCursor(new String[0], 0); + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + return 1; + } + + @Override + public Bundle call(String method, String request, Bundle args) { + return new Bundle(); + } + + @Override + public IBinder getIContentProviderBinder() { + return new Binder(); + } + } + /** * 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 @@ -165,6 +207,7 @@ public abstract class AbstractDownloadProviderFunctionalTest extends provider.attachInfo(mTestContext, info); mResolver.addProvider(PROVIDER_AUTHORITY, provider); + mResolver.addProvider(MediaStore.AUTHORITY, new MockMediaProvider()); setContext(mTestContext); setupService(); diff --git a/tests/src/com/android/providers/downloads/AbstractPublicApiTest.java b/tests/src/com/android/providers/downloads/AbstractPublicApiTest.java index 3a585b47..bb89b6f6 100644 --- a/tests/src/com/android/providers/downloads/AbstractPublicApiTest.java +++ b/tests/src/com/android/providers/downloads/AbstractPublicApiTest.java @@ -26,6 +26,7 @@ import android.content.ContentResolver; import android.content.ContextWrapper; import android.database.Cursor; import android.net.Uri; +import android.os.Environment; import android.os.ParcelFileDescriptor; import android.os.SystemClock; import android.util.Log; @@ -238,6 +239,13 @@ public abstract class AbstractPublicApiTest extends AbstractDownloadProviderFunc return getRequest(getServerUri(REQUEST_PATH)); } + protected DownloadManager.Request getRequestWithDestinationDownloadsDir() + throws MalformedURLException, UnknownHostException { + final DownloadManager.Request request = getRequest(); + request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "testfile.txt"); + return request; + } + protected DownloadManager.Request getRequest(String path) { return new DownloadManager.Request(Uri.parse(path)); } diff --git a/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java b/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java index 9a4e6444..07d18a1a 100644 --- a/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java +++ b/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java @@ -76,7 +76,7 @@ public class DownloadProviderFunctionalTest extends AbstractDownloadProviderFunc Integer.toString(Downloads.Impl.DESTINATION_CACHE_PARTITION)); runUntilStatus(downloadUri, Downloads.Impl.STATUS_SUCCESS); assertEquals(FILE_CONTENT, getDownloadContents(downloadUri)); - assertStartsWith(getContext().getCacheDir().getAbsolutePath(), + assertStartsWith(getContext().getCacheDir().getCanonicalPath(), getDownloadFilename(downloadUri)); } diff --git a/tests/src/com/android/providers/downloads/FakeInputStream.java b/tests/src/com/android/providers/downloads/FakeInputStream.java index 179ae6e9..3f68e310 100644 --- a/tests/src/com/android/providers/downloads/FakeInputStream.java +++ b/tests/src/com/android/providers/downloads/FakeInputStream.java @@ -16,8 +16,9 @@ package com.android.providers.downloads; +import libcore.util.ArrayUtils; + import java.io.InputStream; -import java.util.Arrays; /** * Provides fake data for large transfers. @@ -42,7 +43,7 @@ public class FakeInputStream extends InputStream { @Override public int read(byte[] buffer, int offset, int length) { - Arrays.checkOffsetAndCount(buffer.length, offset, length); + ArrayUtils.throwsIfOutOfBounds(buffer.length, offset, length); if (length > mRemaining) { length = (int) mRemaining; diff --git a/tests/src/com/android/providers/downloads/FakeSystemFacade.java b/tests/src/com/android/providers/downloads/FakeSystemFacade.java index f381bd8a..d11e0ac4 100644 --- a/tests/src/com/android/providers/downloads/FakeSystemFacade.java +++ b/tests/src/com/android/providers/downloads/FakeSystemFacade.java @@ -16,6 +16,7 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; +import android.os.Bundle; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -37,6 +38,7 @@ public class FakeSystemFacade implements SystemFacade { long mMaxBytesOverMobile = Long.MAX_VALUE; long mRecommendedMaxBytesOverMobile = Long.MAX_VALUE; List<Intent> mBroadcastsSent = new ArrayList<Intent>(); + Bundle mLastBroadcastOptions; boolean mCleartextTrafficPermitted = true; private boolean mReturnActualTime = false; private SSLContext mSSLContext = null; @@ -49,6 +51,7 @@ public class FakeSystemFacade implements SystemFacade { mMaxBytesOverMobile = Long.MAX_VALUE; mRecommendedMaxBytesOverMobile = Long.MAX_VALUE; mBroadcastsSent.clear(); + mLastBroadcastOptions = null; mReturnActualTime = false; try { mSSLContext = SSLContext.getDefault(); @@ -125,6 +128,13 @@ public class FakeSystemFacade implements SystemFacade { @Override public void sendBroadcast(Intent intent) { mBroadcastsSent.add(intent); + mLastBroadcastOptions = null; + } + + @Override + public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) { + mBroadcastsSent.add(intent); + mLastBroadcastOptions = options; } @Override diff --git a/tests/src/com/android/providers/downloads/HelpersTest.java b/tests/src/com/android/providers/downloads/HelpersTest.java index 121b7cda..65c5d368 100644 --- a/tests/src/com/android/providers/downloads/HelpersTest.java +++ b/tests/src/com/android/providers/downloads/HelpersTest.java @@ -85,4 +85,36 @@ public class HelpersTest extends AndroidTestCase { null, "video/mp4", Downloads.Impl.DESTINATION_CACHE_PARTITION); assertEquals(expected.getAbsolutePath(), actual); } + + public void testIsFileInExternalAndroidDirs() throws Exception { + assertTrue(Helpers.isFileInExternalAndroidDirs( + "/storage/emulated/0/Android/data/com.example")); + assertTrue(Helpers.isFileInExternalAndroidDirs( + "/storage/emulated/0/Android/data/com.example/colors.txt")); + assertTrue(Helpers.isFileInExternalAndroidDirs( + "/storage/emulated/0/Android/media/com.example/file.mp4")); + assertTrue(Helpers.isFileInExternalAndroidDirs( + "/storage/AAAA-FFFF/Android/media/com.example/file.mp4")); + assertFalse(Helpers.isFileInExternalAndroidDirs( + "/storage/emulated/0/Download/foo.pdf")); + assertFalse(Helpers.isFileInExternalAndroidDirs( + "/storage/emulated/0/Download/dir/bar.html")); + assertFalse(Helpers.isFileInExternalAndroidDirs( + "/storage/AAAA-FFFF/Download/dir/bar.html")); + } + + public void testIsFilenameValidinKnownPublicDir() throws Exception { + assertTrue(Helpers.isFilenameValidInKnownPublicDir( + "/storage/emulated/0/Download/dir/file.txt")); + assertTrue(Helpers.isFilenameValidInKnownPublicDir( + "/storage/emulated/0/Music/foo.mp4")); + assertTrue(Helpers.isFilenameValidInKnownPublicDir( + "/storage/emulated/0/DCIM/vacation/bar.jpg")); + assertFalse(Helpers.isFilenameValidInKnownPublicDir( + "/storage/emulated/0/Testing/foo.mp4")); + assertFalse(Helpers.isFilenameValidInKnownPublicDir( + "/storage/emulated/0/Misc/Download/bar.jpg")); + assertFalse(Helpers.isFilenameValidInKnownPublicDir( + "/storage/emulated/0/Android/data/com.example/bar.jpg")); + } } diff --git a/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java b/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java index 97bc4a22..0652f245 100644 --- a/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java +++ b/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java @@ -36,6 +36,7 @@ import static java.net.HttpURLConnection.HTTP_PARTIAL; import static java.net.HttpURLConnection.HTTP_PRECON_FAILED; import static java.net.HttpURLConnection.HTTP_UNAVAILABLE; +import android.app.BroadcastOptions; import android.app.DownloadManager; import android.app.Notification; import android.app.NotificationManager; @@ -43,6 +44,7 @@ import android.content.Intent; import android.database.Cursor; import android.net.ConnectivityManager; import android.net.Uri; +import android.os.Bundle; import android.os.Environment; import android.os.SystemClock; import android.provider.Downloads; @@ -85,8 +87,9 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { mNotifManager = getContext().getSystemService(NotificationManager.class); mDownloadManager = getContext().getSystemService(DownloadManager.class); - mTestDirectory = new File(Environment.getExternalStorageDirectory() + File.separator - + "download_manager_functional_test"); + mTestDirectory = new File(Environment.getExternalStoragePublicDirectory( + Environment.DIRECTORY_DOWNLOADS) + + File.separator + "download_manager_functional_test"); if (mTestDirectory.exists()) { IoUtils.deleteContents(mTestDirectory); } else { @@ -249,15 +252,15 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { enqueueResponse(buildEmptyResponse(HTTP_OK)); enqueueResponse(buildEmptyResponse(HTTP_NOT_FOUND)); - Download download1 = enqueueRequest(getRequest()); + Download download1 = enqueueRequest(getRequestWithDestinationDownloadsDir()); download1.runUntilStatus(DownloadManager.STATUS_SUCCESSFUL); mSystemFacade.incrementTimeMillis(1); // ensure downloads are correctly ordered by time - Download download2 = enqueueRequest(getRequest()); + Download download2 = enqueueRequest(getRequestWithDestinationDownloadsDir()); download2.runUntilStatus(DownloadManager.STATUS_FAILED); mSystemFacade.incrementTimeMillis(1); - Download download3 = enqueueRequest(getRequest()); + Download download3 = enqueueRequest(getRequestWithDestinationDownloadsDir()); Cursor cursor = mManager.query(new DownloadManager.Query()); checkAndCloseCursor(cursor, download3, download2, download1); @@ -554,6 +557,11 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { Intent broadcast = mSystemFacade.mBroadcastsSent.get(0); assertEquals(DownloadManager.ACTION_NOTIFICATION_CLICKED, broadcast.getAction()); assertEquals(PACKAGE_NAME, broadcast.getPackage()); + + Bundle bOptions = mSystemFacade.mLastBroadcastOptions; + assertNotNull(bOptions); + BroadcastOptions brOptions = new BroadcastOptions(bOptions); + assertTrue(brOptions.allowsBackgroundActivityStarts()); } public void testNotificationCancelDownloadClicked() throws Exception { |