diff options
Diffstat (limited to 'tests/src')
7 files changed, 149 insertions, 78 deletions
diff --git a/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java b/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java index 28c5dc7d..0330fd38 100644 --- a/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java +++ b/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java @@ -17,12 +17,15 @@ package com.android.providers.downloads; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import android.app.DownloadManager; import android.app.NotificationManager; -import android.content.ComponentName; +import android.app.job.JobParameters; +import android.app.job.JobScheduler; import android.content.ContentResolver; import android.content.Context; -import android.content.Intent; +import android.content.pm.ProviderInfo; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; @@ -47,7 +50,7 @@ import java.net.MalformedURLException; import java.net.UnknownHostException; public abstract class AbstractDownloadProviderFunctionalTest extends - ServiceTestCase<DownloadService> { + ServiceTestCase<DownloadJobService> { protected static final String LOG_TAG = "DownloadProviderFunctionalTest"; private static final String PROVIDER_AUTHORITY = "downloads"; @@ -99,13 +102,15 @@ public abstract class AbstractDownloadProviderFunctionalTest extends private final ContentResolver mResolver; private final NotificationManager mNotifManager; - - boolean mHasServiceBeenStarted = false; + private final DownloadManager mDownloadManager; + private final JobScheduler mJobScheduler; public TestContext(Context realContext) { super(realContext, FILENAME_PREFIX); mResolver = new MockContentResolverWithNotify(this); mNotifManager = mock(NotificationManager.class); + mDownloadManager = mock(DownloadManager.class); + mJobScheduler = mock(JobScheduler.class); } /** @@ -123,26 +128,18 @@ public abstract class AbstractDownloadProviderFunctionalTest extends public Object getSystemService(String name) { if (Context.NOTIFICATION_SERVICE.equals(name)) { return mNotifManager; + } else if (Context.DOWNLOAD_SERVICE.equals(name)) { + return mDownloadManager; + } else if (Context.JOB_SCHEDULER_SERVICE.equals(name)) { + return mJobScheduler; } 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 AbstractDownloadProviderFunctionalTest(FakeSystemFacade systemFacade) { - super(DownloadService.class); + super(DownloadJobService.class); mSystemFacade = systemFacade; } @@ -162,13 +159,16 @@ public abstract class AbstractDownloadProviderFunctionalTest extends final DownloadProvider provider = new DownloadProvider(); provider.mSystemFacade = mSystemFacade; - provider.attachInfo(mTestContext, null); + + ProviderInfo info = new ProviderInfo(); + info.authority = "downloads"; + provider.attachInfo(mTestContext, info); mResolver.addProvider(PROVIDER_AUTHORITY, provider); setContext(mTestContext); setupService(); - getService().mSystemFacade = mSystemFacade; + Helpers.setSystemFacade(mSystemFacade); mSystemFacade.setUp(); assertTrue(isDatabaseEmpty()); // ensure we're not messing with real data @@ -184,6 +184,12 @@ public abstract class AbstractDownloadProviderFunctionalTest extends super.tearDown(); } + protected void startDownload(long id) { + final JobParameters params = mock(JobParameters.class); + when(params.getJobId()).thenReturn((int) id); + getService().onStartJob(params); + } + private boolean isDatabaseEmpty() { Cursor cursor = mResolver.query(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, null, null, null, null); diff --git a/tests/src/com/android/providers/downloads/AbstractPublicApiTest.java b/tests/src/com/android/providers/downloads/AbstractPublicApiTest.java index 2846c7af..3a585b47 100644 --- a/tests/src/com/android/providers/downloads/AbstractPublicApiTest.java +++ b/tests/src/com/android/providers/downloads/AbstractPublicApiTest.java @@ -22,6 +22,8 @@ import static android.text.format.DateUtils.MINUTE_IN_MILLIS; import static android.text.format.DateUtils.SECOND_IN_MILLIS; import android.app.DownloadManager; +import android.content.ContentResolver; +import android.content.ContextWrapper; import android.database.Cursor; import android.net.Uri; import android.os.ParcelFileDescriptor; @@ -113,13 +115,13 @@ public abstract class AbstractPublicApiTest extends AbstractDownloadProviderFunc void runUntilStatus(int status) throws TimeoutException { final long startMillis = mSystemFacade.currentTimeMillis(); - startService(null); + startDownload(mId); waitForStatus(status, startMillis); } void runUntilStatus(int status, long timeout) throws TimeoutException { final long startMillis = mSystemFacade.currentTimeMillis(); - startService(null); + startDownload(mId); waitForStatus(status, startMillis, timeout); } @@ -167,7 +169,7 @@ public abstract class AbstractPublicApiTest extends AbstractDownloadProviderFunc // waits until progress_so_far is >= (progress)% boolean runUntilProgress(int progress) throws InterruptedException { - startService(null); + startDownload(mId); int sleepCounter = MAX_TIME_TO_WAIT_FOR_OPERATION * 1000 / TIME_TO_SLEEP; int numBytesReceivedSoFar = 0; @@ -217,7 +219,18 @@ public abstract class AbstractPublicApiTest extends AbstractDownloadProviderFunc @Override protected void setUp() throws Exception { super.setUp(); - mManager = new DownloadManager(mResolver, PACKAGE_NAME); + mManager = new DownloadManager(new ContextWrapper(mContext) { + @Override + public ContentResolver getContentResolver() { + return mResolver; + } + + @Override + public String getPackageName() { + return PACKAGE_NAME; + } + }); + mManager.setAccessFilename(true); } protected DownloadManager.Request getRequest() diff --git a/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java b/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java index 41dff672..9a4e6444 100644 --- a/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java +++ b/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java @@ -17,8 +17,10 @@ package com.android.providers.downloads; import static android.text.format.DateUtils.SECOND_IN_MILLIS; + import static java.net.HttpURLConnection.HTTP_OK; +import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.ConnectivityManager; @@ -56,7 +58,6 @@ public class DownloadProviderFunctionalTest extends AbstractDownloadProviderFunc String path = "/download_manager_test_path"; Uri downloadUri = requestDownload(path); assertEquals(Downloads.Impl.STATUS_PENDING, getDownloadStatus(downloadUri)); - assertTrue(mTestContext.mHasServiceBeenStarted); runUntilStatus(downloadUri, Downloads.Impl.STATUS_SUCCESS); RecordedRequest request = takeRequest(); @@ -108,13 +109,11 @@ public class DownloadProviderFunctionalTest extends AbstractDownloadProviderFunc // Assert that HTTP request succeeds when cleartext traffic is permitted mSystemFacade.mCleartextTrafficPermitted = true; Uri downloadUri = requestDownload("/path"); - assertEquals("http", downloadUri.getScheme()); runUntilStatus(downloadUri, Downloads.Impl.STATUS_SUCCESS); // Assert that HTTP request fails when cleartext traffic is not permitted mSystemFacade.mCleartextTrafficPermitted = false; downloadUri = requestDownload("/path"); - assertEquals("http", downloadUri.getScheme()); runUntilStatus(downloadUri, Downloads.Impl.STATUS_BAD_REQUEST); } @@ -131,8 +130,8 @@ public class DownloadProviderFunctionalTest extends AbstractDownloadProviderFunc } private void runUntilStatus(Uri downloadUri, int expected) throws Exception { - startService(null); - + startDownload(ContentUris.parseId(downloadUri)); + int actual = -1; final long timeout = SystemClock.elapsedRealtime() + (15 * SECOND_IN_MILLIS); @@ -149,7 +148,7 @@ public class DownloadProviderFunctionalTest extends AbstractDownloadProviderFunc } protected int getDownloadStatus(Uri downloadUri) { - return Integer.valueOf(getDownloadField(downloadUri, Downloads.Impl.COLUMN_STATUS)); + return Integer.parseInt(getDownloadField(downloadUri, Downloads.Impl.COLUMN_STATUS)); } private String getDownloadFilename(Uri downloadUri) { diff --git a/tests/src/com/android/providers/downloads/FakeSystemFacade.java b/tests/src/com/android/providers/downloads/FakeSystemFacade.java index 7581e6fa..b6b800a2 100644 --- a/tests/src/com/android/providers/downloads/FakeSystemFacade.java +++ b/tests/src/com/android/providers/downloads/FakeSystemFacade.java @@ -1,33 +1,54 @@ package com.android.providers.downloads; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager.NameNotFoundException; import android.net.ConnectivityManager; +import android.net.Network; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; +import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.List; +import javax.net.ssl.SSLContext; + public class FakeSystemFacade implements SystemFacade { long mTimeMillis = 0; Integer mActiveNetworkType = ConnectivityManager.TYPE_WIFI; boolean mIsRoaming = false; boolean mIsMetered = false; - Long mMaxBytesOverMobile = null; - Long mRecommendedMaxBytesOverMobile = null; + long mMaxBytesOverMobile = Long.MAX_VALUE; + long mRecommendedMaxBytesOverMobile = Long.MAX_VALUE; List<Intent> mBroadcastsSent = new ArrayList<Intent>(); boolean mCleartextTrafficPermitted = true; private boolean mReturnActualTime = false; + private SSLContext mSSLContext = null; public void setUp() { mTimeMillis = 0; mActiveNetworkType = ConnectivityManager.TYPE_WIFI; mIsRoaming = false; mIsMetered = false; - mMaxBytesOverMobile = null; - mRecommendedMaxBytesOverMobile = null; + mMaxBytesOverMobile = Long.MAX_VALUE; + mRecommendedMaxBytesOverMobile = Long.MAX_VALUE; mBroadcastsSent.clear(); mReturnActualTime = false; + try { + mSSLContext = SSLContext.getDefault(); + } catch (GeneralSecurityException e) { + throw new RuntimeException(e); + } } void incrementTimeMillis(long delta) { @@ -43,33 +64,45 @@ public class FakeSystemFacade implements SystemFacade { } @Override - public NetworkInfo getActiveNetworkInfo(int uid) { + public Network getActiveNetwork(int uid, boolean ignoreBlocked) { if (mActiveNetworkType == null) { return null; } else { - final NetworkInfo info = new NetworkInfo(mActiveNetworkType, 0, null, null); - info.setDetailedState(DetailedState.CONNECTED, null, null); - return info; + final Network network = mock(Network.class); + try { + when(network.openConnection(any())).then(new Answer<URLConnection>() { + @Override + public URLConnection answer(InvocationOnMock invocation) throws Throwable { + final URL url = (URL) invocation.getArguments()[0]; + return url.openConnection(); + } + }); + } catch (IOException ignored) { + } + return network; } } @Override - public boolean isActiveNetworkMetered() { - return mIsMetered; - } - - @Override - public boolean isNetworkRoaming() { - return mIsRoaming; + public NetworkInfo getNetworkInfo(Network network, int uid, boolean ignoreBlocked) { + if (mActiveNetworkType == null) { + return null; + } else { + final NetworkInfo info = new NetworkInfo(mActiveNetworkType, 0, null, null); + info.setDetailedState(DetailedState.CONNECTED, null, null); + info.setRoaming(mIsRoaming); + info.setMetered(mIsMetered); + return info; + } } @Override - public Long getMaxBytesOverMobile() { + public long getMaxBytesOverMobile() { return mMaxBytesOverMobile; } @Override - public Long getRecommendedMaxBytesOverMobile() { + public long getRecommendedMaxBytesOverMobile() { return mRecommendedMaxBytesOverMobile; } @@ -88,6 +121,15 @@ public class FakeSystemFacade implements SystemFacade { return mCleartextTrafficPermitted; } + @Override + public SSLContext getSSLContextForPackage(Context context, String pckg) { + return mSSLContext; + } + + public void setSSLContext(SSLContext context) { + mSSLContext = context; + } + public void setReturnActualTime(boolean flag) { mReturnActualTime = flag; } diff --git a/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java b/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java index d1048b02..97bc4a22 100644 --- a/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java +++ b/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java @@ -20,12 +20,7 @@ import static android.app.DownloadManager.STATUS_FAILED; import static android.app.DownloadManager.STATUS_PAUSED; import static android.net.TrafficStats.GB_IN_BYTES; import static android.text.format.DateUtils.SECOND_IN_MILLIS; -import static java.net.HttpURLConnection.HTTP_MOVED_TEMP; -import static java.net.HttpURLConnection.HTTP_NOT_FOUND; -import static java.net.HttpURLConnection.HTTP_OK; -import static java.net.HttpURLConnection.HTTP_PARTIAL; -import static java.net.HttpURLConnection.HTTP_PRECON_FAILED; -import static java.net.HttpURLConnection.HTTP_UNAVAILABLE; + import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.isA; @@ -34,10 +29,16 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static java.net.HttpURLConnection.HTTP_MOVED_TEMP; +import static java.net.HttpURLConnection.HTTP_NOT_FOUND; +import static java.net.HttpURLConnection.HTTP_OK; +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.DownloadManager; import android.app.Notification; import android.app.NotificationManager; -import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.ConnectivityManager; @@ -49,12 +50,12 @@ import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.Suppress; import android.text.format.DateUtils; +import libcore.io.IoUtils; + import com.google.mockwebserver.MockResponse; import com.google.mockwebserver.RecordedRequest; import com.google.mockwebserver.SocketPolicy; -import libcore.io.IoUtils; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -71,6 +72,7 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { protected File mTestDirectory; private NotificationManager mNotifManager; + private DownloadManager mDownloadManager; public PublicApiFunctionalTest() { super(new FakeSystemFacade()); @@ -80,8 +82,8 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { protected void setUp() throws Exception { super.setUp(); - mNotifManager = (NotificationManager) getContext() - .getSystemService(Context.NOTIFICATION_SERVICE); + mNotifManager = getContext().getSystemService(NotificationManager.class); + mDownloadManager = getContext().getSystemService(DownloadManager.class); mTestDirectory = new File(Environment.getExternalStorageDirectory() + File.separator + "download_manager_functional_test"); @@ -393,10 +395,12 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { mSystemFacade.mMaxBytesOverMobile = (long) FILE_CONTENT.length() - 1; mSystemFacade.mActiveNetworkType = ConnectivityManager.TYPE_MOBILE; + mSystemFacade.mIsMetered = true; Download download = enqueueRequest(getRequest()); download.runUntilStatus(DownloadManager.STATUS_PAUSED); mSystemFacade.mActiveNetworkType = ConnectivityManager.TYPE_WIFI; + mSystemFacade.mIsMetered = false; // first response was read, but aborted after the DL manager processed the Content-Length // header, so we need to enqueue a second one download.runUntilStatus(DownloadManager.STATUS_SUCCESSFUL); @@ -539,7 +543,7 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { Download download = enqueueRequest(getRequest()); DownloadReceiver receiver = new DownloadReceiver(); - receiver.mSystemFacade = mSystemFacade; + Helpers.setSystemFacade(mSystemFacade); Intent intent = new Intent(Constants.ACTION_LIST); intent.setData(Uri.parse(Downloads.Impl.CONTENT_URI + "/" + download.mId)); intent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, @@ -552,6 +556,23 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { assertEquals(PACKAGE_NAME, broadcast.getPackage()); } + public void testNotificationCancelDownloadClicked() throws Exception { + Download download = enqueueRequest(getRequest()); + + DownloadReceiver receiver = new DownloadReceiver(); + Helpers.setSystemFacade(mSystemFacade); + Intent intent = new Intent(Constants.ACTION_CANCEL); + intent.setData(Uri.parse(Downloads.Impl.CONTENT_URI + "/" + download.mId)); + + long[] downloadIds = {download.mId}; + intent.putExtra(DownloadReceiver.EXTRA_CANCELED_DOWNLOAD_IDS, downloadIds); + intent.putExtra(DownloadReceiver.EXTRA_CANCELED_DOWNLOAD_NOTIFICATION_TAG, "tag"); + receiver.onReceive(mContext, intent); + + verify(mNotifManager, times(1)).cancel("tag", 0); + verify(mDownloadManager, times(1)).remove(downloadIds); + } + public void testBasicConnectivityChanges() throws Exception { enqueueResponse(buildResponse(HTTP_OK, FILE_CONTENT)); @@ -570,6 +591,7 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { enqueueResponse(buildEmptyResponse(HTTP_OK)); mSystemFacade.mActiveNetworkType = ConnectivityManager.TYPE_MOBILE; + mSystemFacade.mIsMetered = true; // by default, use any connection Download download = enqueueRequest(getRequest()); @@ -581,6 +603,7 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { download.runUntilStatus(DownloadManager.STATUS_PAUSED); // ...then enable wifi mSystemFacade.mActiveNetworkType = ConnectivityManager.TYPE_WIFI; + mSystemFacade.mIsMetered = false; download.runUntilStatus(DownloadManager.STATUS_SUCCESSFUL); } @@ -610,6 +633,7 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { assertTrue(mResolver.mNotifyWasCalled); } + @Suppress public void testNotificationNever() throws Exception { enqueueResponse(buildEmptyResponse(HTTP_OK)); @@ -617,10 +641,11 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { getRequest().setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN)); download.runUntilStatus(DownloadManager.STATUS_SUCCESSFUL); - verify(mNotifManager, times(1)).cancelAll(); + // TODO: verify different notif types with tags verify(mNotifManager, never()).notify(anyString(), anyInt(), isA(Notification.class)); } + @Suppress public void testNotificationVisible() throws Exception { enqueueResponse(buildEmptyResponse(HTTP_OK)); @@ -629,10 +654,10 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { download.runUntilStatus(DownloadManager.STATUS_SUCCESSFUL); // TODO: verify different notif types with tags - verify(mNotifManager, times(1)).cancelAll(); verify(mNotifManager, atLeastOnce()).notify(anyString(), anyInt(), isA(Notification.class)); } + @Suppress public void testNotificationVisibleComplete() throws Exception { enqueueResponse(buildEmptyResponse(HTTP_OK)); @@ -641,7 +666,6 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { download.runUntilStatus(DownloadManager.STATUS_SUCCESSFUL); // TODO: verify different notif types with tags - verify(mNotifManager, times(1)).cancelAll(); verify(mNotifManager, atLeastOnce()).notify(anyString(), anyInt(), isA(Notification.class)); } diff --git a/tests/src/com/android/providers/downloads/StorageTest.java b/tests/src/com/android/providers/downloads/StorageTest.java index 8ba3cbce..95bd3676 100644 --- a/tests/src/com/android/providers/downloads/StorageTest.java +++ b/tests/src/com/android/providers/downloads/StorageTest.java @@ -32,6 +32,7 @@ import android.system.ErrnoException; import android.system.Os; import android.system.StructStatVfs; import android.test.MoreAsserts; +import android.test.suitebuilder.annotation.MediumTest; import android.util.Log; import com.android.providers.downloads.StorageUtils.ObserverLatch; @@ -47,6 +48,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.concurrent.TimeUnit; +@MediumTest public class StorageTest extends AbstractPublicApiTest { private static final String TAG = "StorageTest"; diff --git a/tests/src/com/android/providers/downloads/ThreadingTest.java b/tests/src/com/android/providers/downloads/ThreadingTest.java index 1e501444..dda4db5e 100644 --- a/tests/src/com/android/providers/downloads/ThreadingTest.java +++ b/tests/src/com/android/providers/downloads/ThreadingTest.java @@ -46,19 +46,6 @@ public class ThreadingTest extends AbstractPublicApiTest { super.tearDown(); } - /** - * Test for race conditions when the service is flooded with startService() calls while running - * a download. - */ - public void testFloodServiceWithStarts() throws Exception { - enqueueResponse(buildResponse(HTTP_OK, FILE_CONTENT)); - Download download = enqueueRequest(getRequest()); - while (download.getStatus() != DownloadManager.STATUS_SUCCESSFUL) { - startService(null); - Thread.sleep(10); - } - } - public void testFilenameRace() throws Exception { final List<Pair<Download, String>> downloads = Lists.newArrayList(); final HashSet<String> expectedBodies = Sets.newHashSet(); @@ -73,12 +60,10 @@ public class ThreadingTest extends AbstractPublicApiTest { final Download d = enqueueRequest(getRequest()); downloads.add(Pair.create(d, body)); expectedBodies.add(body); + startDownload(d.mId); } - // Kick off downloads in parallel final long startMillis = mSystemFacade.currentTimeMillis(); - startService(null); - for (Pair<Download,String> d : downloads) { d.first.waitForStatus(DownloadManager.STATUS_SUCCESSFUL, startMillis); } |