diff --git a/mockitoAgent.gradle b/mockitoAgent.gradle new file mode 100644 index 000000000..3d3c91313 --- /dev/null +++ b/mockitoAgent.gradle @@ -0,0 +1,13 @@ +configurations { + mockitoAgent +} + +dependencies { + mockitoAgent("org.mockito:mockito-core:$mockitoVersion") { + transitive = false + } +} + +tasks.withType(Test).configureEach { + jvmArgs "-javaagent:${configurations.mockitoAgent.singleFile}" +} diff --git a/model/build.gradle b/model/build.gradle index 14b79c6ae..0f64756a2 100644 --- a/model/build.gradle +++ b/model/build.gradle @@ -2,6 +2,7 @@ plugins { id("com.android.library") } apply from: "../common.gradle" +apply from: "../mockitoAgent.gradle" android { namespace "de.danoeh.antennapod.model" diff --git a/net/download/service/build.gradle b/net/download/service/build.gradle index d957e6112..713f45c36 100644 --- a/net/download/service/build.gradle +++ b/net/download/service/build.gradle @@ -4,6 +4,7 @@ plugins { } apply from: "../../../common.gradle" apply from: "../../../playFlavor.gradle" +apply from: "../../../mockitoAgent.gradle" android { namespace "de.danoeh.antennapod.net.download.service" diff --git a/playback/service/build.gradle b/playback/service/build.gradle index 6d71dd525..bbd645213 100644 --- a/playback/service/build.gradle +++ b/playback/service/build.gradle @@ -3,6 +3,7 @@ plugins { } apply from: "../../common.gradle" apply from: "../../playFlavor.gradle" +apply from: "../../mockitoAgent.gradle" android { namespace "de.danoeh.antennapod.playback.service" @@ -48,4 +49,6 @@ dependencies { testImplementation "junit:junit:$junitVersion" testImplementation "org.mockito:mockito-core:$mockitoVersion" + testImplementation "androidx.test:core:$testCoreVersion" + testImplementation "org.robolectric:robolectric:$robolectricVersion" } diff --git a/playback/service/src/test/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallbackTest.java b/playback/service/src/test/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallbackTest.java new file mode 100644 index 000000000..7d907c464 --- /dev/null +++ b/playback/service/src/test/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallbackTest.java @@ -0,0 +1,88 @@ +package de.danoeh.antennapod.playback.service.internal; + +import android.content.Context; +import androidx.media3.common.C; +import androidx.media3.common.MediaItem; +import androidx.media3.session.MediaSession; +import de.danoeh.antennapod.model.feed.Feed; +import de.danoeh.antennapod.model.feed.FeedItem; +import de.danoeh.antennapod.model.feed.FeedMedia; +import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueue; +import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueStub; +import de.danoeh.antennapod.playback.base.MediaItemAdapter; +import de.danoeh.antennapod.storage.database.FeedDatabaseWriter; +import de.danoeh.antennapod.storage.database.PodDBAdapter; +import de.danoeh.antennapod.storage.preferences.PlaybackPreferences; +import de.danoeh.antennapod.storage.preferences.UserPreferences; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +@RunWith(RobolectricTestRunner.class) +public class MediaLibrarySessionCallbackTest { + private static final String EPISODE_TITLE = "Episode Title"; + private Context context; + private MediaLibrarySessionCallback callback; + private final MediaSession session = mock(MediaSession.class); + private final MediaSession.ControllerInfo controllerInfo = mock(MediaSession.ControllerInfo.class); + + @Before + public void setUp() { + context = RuntimeEnvironment.getApplication(); + UserPreferences.init(context); + PlaybackPreferences.init(context); + PodDBAdapter.init(context); + PodDBAdapter.deleteDatabase(); + SynchronizationQueue.setInstance(new SynchronizationQueueStub()); + callback = new MediaLibrarySessionCallback(context); + } + + @After + public void tearDown() { + PodDBAdapter.tearDownTests(); + } + + @Test + public void onSetMediaItemsStub() throws Exception { + long mediaId = seedEpisode().getId(); + MediaItem browseItem = MediaItemAdapter.fromMediaIdStub(mediaId); + MediaSession.MediaItemsWithStartPosition result = callback.onSetMediaItems( + session, controllerInfo, Collections.singletonList(browseItem), C.INDEX_UNSET, C.TIME_UNSET) + .get(5, TimeUnit.SECONDS); + assertEquals(1, result.mediaItems.size()); + assertEquals(String.valueOf(mediaId), result.mediaItems.get(0).mediaId); + assertEquals(EPISODE_TITLE, result.mediaItems.get(0).mediaMetadata.title); + } + + @Test + public void onPlaybackResumption() throws Exception { + FeedMedia media = seedEpisode(); + PlaybackPreferences.writeMediaPlaying(media); + MediaSession.MediaItemsWithStartPosition result = callback.onPlaybackResumption(session, controllerInfo) + .get(5, TimeUnit.SECONDS); + assertEquals(1, result.mediaItems.size()); + assertEquals(String.valueOf(media.getId()), result.mediaItems.get(0).mediaId); + } + + private FeedMedia seedEpisode() { + Feed feed = new Feed("url", null, null); + feed.setItems(new ArrayList<>()); + FeedItem item = new FeedItem(); + item.setItemIdentifier("id"); + item.setTitle(EPISODE_TITLE); + item.setMedia(new FeedMedia(item, "http://example.com", 2, "mime")); + item.setFeed(feed); + feed.getItems().add(item); + return FeedDatabaseWriter.updateFeed(context, feed, false).getItems().get(0).getMedia(); + } +}