diff options
author | orionlee <orionlee@yahoo.com> | 2019-09-30 13:46:59 -0700 |
---|---|---|
committer | orionlee <orionlee@yahoo.com> | 2019-09-30 13:46:59 -0700 |
commit | d84fc95f0d7b9bee3eb3970c853072f35bb24c55 (patch) | |
tree | 4c7532bb73f36476952478c79efeb7c5ea3346db /app/src/androidTest | |
parent | f3b3d5c4229b909b916807abe7dcb4815810a583 (diff) | |
download | AntennaPod-d84fc95f0d7b9bee3eb3970c853072f35bb24c55.zip |
test for DownloadService, case media download successful.
Diffstat (limited to 'app/src/androidTest')
-rw-r--r-- | app/src/androidTest/java/de/danoeh/antennapod/core/service/download/StubDownloader.java | 52 | ||||
-rw-r--r-- | app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java | 158 |
2 files changed, 210 insertions, 0 deletions
diff --git a/app/src/androidTest/java/de/danoeh/antennapod/core/service/download/StubDownloader.java b/app/src/androidTest/java/de/danoeh/antennapod/core/service/download/StubDownloader.java new file mode 100644 index 000000000..9bb2c58db --- /dev/null +++ b/app/src/androidTest/java/de/danoeh/antennapod/core/service/download/StubDownloader.java @@ -0,0 +1,52 @@ +package de.danoeh.antennapod.core.service.download; + +import android.support.annotation.NonNull; + +import de.danoeh.antennapod.core.util.Consumer; + +public class StubDownloader extends Downloader { + + private final long downloadTime; + + @NonNull + private final Consumer<DownloadStatus> onDownloadComplete; + + public StubDownloader(@NonNull DownloadRequest request, long downloadTime, @NonNull Consumer<DownloadStatus> onDownloadComplete) { + super(request); + this.downloadTime = downloadTime; + this.onDownloadComplete = onDownloadComplete; + } + + @Override + protected void download() { + try { + Thread.sleep(downloadTime); + } catch (Throwable t) { + t.printStackTrace(); + } + onDownloadComplete.accept(result); + } + + @NonNull + @Override + public DownloadRequest getDownloadRequest() { + return super.getDownloadRequest(); + } + + @NonNull + @Override + public DownloadStatus getResult() { + return super.getResult(); + } + + @Override + public boolean isFinished() { + return super.isFinished(); + } + + @Override + public void cancel() { + super.cancel(); + result.setCancelled(); + } +} diff --git a/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java b/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java new file mode 100644 index 000000000..3f309878e --- /dev/null +++ b/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java @@ -0,0 +1,158 @@ +package de.test.antennapod.service.download; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.awaitility.Awaitility; +import org.awaitility.core.ConditionTimeoutException; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import de.danoeh.antennapod.core.event.FeedItemEvent; +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.service.download.DownloadRequest; +import de.danoeh.antennapod.core.service.download.DownloadService; +import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.core.service.download.Downloader; +import de.danoeh.antennapod.core.service.download.StubDownloader; +import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.storage.DownloadRequester; +import de.danoeh.antennapod.core.util.Consumer; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * @see HttpDownloaderTest for the test of actual download (and saving the file) + */ +@RunWith(AndroidJUnit4.class) +public class DownloadServiceTest { + + private CountDownLatch latch = null; + private Feed testFeed = null; + private FeedMedia testMedia11 = null; + + private DownloadService.DownloaderFactory origFactory = null; + + @Before + public void setUp() throws Exception { + origFactory = DownloadService.getDownloaderFactory(); + testFeed = setUpTestFeeds(); + testMedia11 = testFeed.getItemAtIndex(0).getMedia(); + } + + private Feed setUpTestFeeds() throws Exception { + Feed feed = new Feed("url", null, "Test Feed title 1"); + List<FeedItem> items = new ArrayList<>(); + feed.setItems(items); + FeedItem item1 = new FeedItem(0, "Item 1-1", "Item 1-1", "url", new Date(), FeedItem.NEW, feed); + items.add(item1); + FeedMedia media1 = new FeedMedia(0, item1, 123, 1, 1, "audio/mp3", null, "http://example.com/episode.mp3", false, null, 0, 0); + item1.setMedia(media1); + + DBWriter.setFeedItem(item1).get(); + return feed; + } + + + @After + public void tearDown() throws Exception { + DownloadService.setDownloaderFactory(origFactory); + } + + @Test + public void testEventsGeneratedCaseMediaDownloadSuccess() throws Exception { + // create a stub download that returns successful + // + // OPEN: Ideally, I'd like the download time long enough so that multiple in-progress DownloadEvents + // are generated (to simulate typical download), but it'll make download time quite long (1-2 seconds) + // to do so + DownloadService.setDownloaderFactory(new StubDownloaderFactory(50, downloadStatus -> { + downloadStatus.setSuccessful(); + })); + + withFeedItemEventListener(feedItemEventListener -> { + try { + assertEquals(0, feedItemEventListener.getEvents().size()); + assertFalse("The media in test should not yet been downloaded", + DBReader.getFeedMedia(testMedia11.getId()).isDownloaded()); + + DownloadRequester.getInstance().downloadMedia(InstrumentationRegistry.getTargetContext(), + testMedia11); + Awaitility.await() + .atMost(1000, TimeUnit.MILLISECONDS) + .until(() -> feedItemEventListener.getEvents().size() > 0); + assertTrue("After media download has completed, FeedMedia object in db should indicate so.", + DBReader.getFeedMedia(testMedia11.getId()).isDownloaded()); + } catch (ConditionTimeoutException cte) { + fail("The expected FeedItemEvent (for media download complete) has not been posted. " + + cte.getMessage()); + } + }); + } + + /** + * Provides an listener subscribing to {@link FeedItemEvent} that the callers can use + * + * Note: it uses RxJava's version of {@link io.reactivex.functions.Consumer} because it allows exceptions to be thrown. + */ + private static void withFeedItemEventListener(io.reactivex.functions.Consumer<FeedItemEventListener> consumer) throws Exception { + FeedItemEventListener feedItemEventListener = new FeedItemEventListener(); + try { + EventBus.getDefault().register(feedItemEventListener); + consumer.accept(feedItemEventListener); + } finally { + EventBus.getDefault().unregister(feedItemEventListener); + } + } + + private static class FeedItemEventListener { + + private final List<FeedItemEvent> events = new ArrayList<>(); + + @Subscribe + public void onEvent(FeedItemEvent event) { + events.add(event); + } + + List<? extends FeedItemEvent> getEvents() { + return events; + } + } + + private static class StubDownloaderFactory implements DownloadService.DownloaderFactory { + private final long downloadTime; + + @NonNull + private final Consumer<DownloadStatus> onDownloadComplete; + + StubDownloaderFactory(long downloadTime, @NonNull Consumer<DownloadStatus> onDownloadComplete) { + this.downloadTime = downloadTime; + this.onDownloadComplete = onDownloadComplete; + } + + @Nullable + @Override + public Downloader create(@NonNull DownloadRequest request) { + return new StubDownloader(request, downloadTime, onDownloadComplete); + } + } + +} |