summaryrefslogtreecommitdiff
path: root/app/src/androidTest/java/de/test/antennapod/playback
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/androidTest/java/de/test/antennapod/playback')
-rw-r--r--app/src/androidTest/java/de/test/antennapod/playback/PlaybackBuiltinTest.java17
-rw-r--r--app/src/androidTest/java/de/test/antennapod/playback/PlaybackExoplayerTest.java17
-rw-r--r--app/src/androidTest/java/de/test/antennapod/playback/PlaybackSonicTest.java17
-rw-r--r--app/src/androidTest/java/de/test/antennapod/playback/PlaybackTest.java165
4 files changed, 75 insertions, 141 deletions
diff --git a/app/src/androidTest/java/de/test/antennapod/playback/PlaybackBuiltinTest.java b/app/src/androidTest/java/de/test/antennapod/playback/PlaybackBuiltinTest.java
deleted file mode 100644
index a80ee41d7..000000000
--- a/app/src/androidTest/java/de/test/antennapod/playback/PlaybackBuiltinTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package de.test.antennapod.playback;
-
-import androidx.test.filters.LargeTest;
-import de.danoeh.antennapod.core.preferences.UserPreferences;
-import org.junit.Before;
-
-/**
- * Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity.
- */
-@LargeTest
-public class PlaybackBuiltinTest extends PlaybackTest {
- @Before
- public void setUp() throws Exception {
- super.setUp();
- UserPreferences.enableBuiltin();
- }
-}
diff --git a/app/src/androidTest/java/de/test/antennapod/playback/PlaybackExoplayerTest.java b/app/src/androidTest/java/de/test/antennapod/playback/PlaybackExoplayerTest.java
deleted file mode 100644
index 0cf73f069..000000000
--- a/app/src/androidTest/java/de/test/antennapod/playback/PlaybackExoplayerTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package de.test.antennapod.playback;
-
-import androidx.test.filters.LargeTest;
-import de.danoeh.antennapod.core.preferences.UserPreferences;
-import org.junit.Before;
-
-/**
- * Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity.
- */
-@LargeTest
-public class PlaybackExoplayerTest extends PlaybackTest {
- @Before
- public void setUp() throws Exception {
- super.setUp();
- UserPreferences.enableExoplayer();
- }
-}
diff --git a/app/src/androidTest/java/de/test/antennapod/playback/PlaybackSonicTest.java b/app/src/androidTest/java/de/test/antennapod/playback/PlaybackSonicTest.java
deleted file mode 100644
index a0fb74809..000000000
--- a/app/src/androidTest/java/de/test/antennapod/playback/PlaybackSonicTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package de.test.antennapod.playback;
-
-import androidx.test.filters.LargeTest;
-import de.danoeh.antennapod.core.preferences.UserPreferences;
-import org.junit.Before;
-
-/**
- * Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity.
- */
-@LargeTest
-public class PlaybackSonicTest extends PlaybackTest {
- @Before
- public void setUp() throws Exception {
- super.setUp();
- UserPreferences.enableSonic();
- }
-}
diff --git a/app/src/androidTest/java/de/test/antennapod/playback/PlaybackTest.java b/app/src/androidTest/java/de/test/antennapod/playback/PlaybackTest.java
index be2fc432c..cc380813e 100644
--- a/app/src/androidTest/java/de/test/antennapod/playback/PlaybackTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/playback/PlaybackTest.java
@@ -4,55 +4,79 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
+import android.view.KeyEvent;
+import android.view.View;
+import androidx.test.filters.LargeTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.core.feed.FeedItem;
+import de.danoeh.antennapod.core.feed.FeedMedia;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.service.playback.PlayerStatus;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter;
+import de.danoeh.antennapod.core.util.IntentUtils;
+import de.danoeh.antennapod.core.util.LongList;
import de.test.antennapod.EspressoTestUtils;
+import de.test.antennapod.IgnoreOnCi;
import de.test.antennapod.ui.UITestUtils;
import org.awaitility.Awaitility;
+import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition;
+import static androidx.test.espresso.matcher.ViewMatchers.hasMinimumChildCount;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
+import static de.test.antennapod.EspressoTestUtils.clickChildViewWithId;
import static de.test.antennapod.EspressoTestUtils.onDrawerItem;
import static de.test.antennapod.EspressoTestUtils.openNavDrawer;
import static de.test.antennapod.EspressoTestUtils.waitForView;
-import static de.test.antennapod.NthMatcher.first;
-import static de.test.antennapod.NthMatcher.nth;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
/**
* Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity.
*/
-public abstract class PlaybackTest {
-
+@LargeTest
+@IgnoreOnCi
+@RunWith(Parameterized.class)
+public class PlaybackTest {
@Rule
public ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(MainActivity.class, false, false);
+ @Parameterized.Parameter(value = 0)
+ public String playerToUse;
private UITestUtils uiTestUtils;
protected Context context;
+ @Parameterized.Parameters(name = "{0}")
+ public static Collection<Object[]> initParameters() {
+ return Arrays.asList(new Object[][] { { "exoplayer" }, { "builtin" }, { "sonic" } });
+ }
+
@Before
public void setUp() throws Exception {
context = InstrumentationRegistry.getInstrumentation().getTargetContext();
@@ -60,6 +84,9 @@ public abstract class PlaybackTest {
EspressoTestUtils.clearDatabase();
EspressoTestUtils.makeNotFirstRun();
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ prefs.edit().putString(UserPreferences.PREF_MEDIA_PLAYER, playerToUse).apply();
+
uiTestUtils = new UITestUtils(context);
uiTestUtils.setup();
}
@@ -67,10 +94,8 @@ public abstract class PlaybackTest {
@After
public void tearDown() throws Exception {
activityTestRule.finishActivity();
+ EspressoTestUtils.tryKillPlaybackService();
uiTestUtils.tearDown();
- // shut down playback service
- context.sendBroadcast(new Intent(PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE));
- Awaitility.await().until(() -> !PlaybackService.isRunning);
}
@Test
@@ -78,23 +103,9 @@ public abstract class PlaybackTest {
setContinuousPlaybackPreference(false);
uiTestUtils.addLocalFeedData(true);
activityTestRule.launchActivity(new Intent());
- List<FeedItem> queue = DBReader.getQueue();
- final FeedItem first = queue.get(0);
playFromQueue(0);
- Awaitility.await().atMost(5, TimeUnit.SECONDS).until(() -> {
- if (uiTestUtils.getPlaybackController(getActivity()).getStatus()
- != PlayerStatus.PLAYING) {
- return true;
- } else if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
- return uiTestUtils.getCurrentMedia(getActivity()).getId()
- != first.getMedia().getId();
- } else {
- return true;
- }
- });
-
- Thread.sleep(1000);
- assertNotEquals(PlayerStatus.PLAYING, uiTestUtils.getPlaybackController(getActivity()).getStatus());
+ Awaitility.await().atMost(5, TimeUnit.SECONDS).until(
+ () -> uiTestUtils.getPlaybackController(getActivity()).getStatus() == PlayerStatus.INITIALIZED);
}
@Test
@@ -108,22 +119,10 @@ public abstract class PlaybackTest {
final FeedItem second = queue.get(1);
playFromQueue(0);
- Awaitility.await().atMost(2, TimeUnit.SECONDS).until(() -> {
- if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
- return uiTestUtils.getCurrentMedia(getActivity()).getId()
- == first.getMedia().getId();
- } else {
- return false;
- }
- });
- Awaitility.await().atMost(5, TimeUnit.SECONDS).until(() -> {
- if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
- return uiTestUtils.getCurrentMedia(getActivity()).getId()
- == second.getMedia().getId();
- } else {
- return false;
- }
- });
+ Awaitility.await().atMost(2, TimeUnit.SECONDS).until(
+ () -> first.getMedia().equals(uiTestUtils.getCurrentMedia()));
+ Awaitility.await().atMost(6, TimeUnit.SECONDS).until(
+ () -> second.getMedia().equals(uiTestUtils.getCurrentMedia()));
}
@@ -213,33 +212,27 @@ public abstract class PlaybackTest {
}
private void skipEpisode() {
- Intent skipIntent = new Intent(PlaybackService.ACTION_SKIP_CURRENT_EPISODE);
- context.sendBroadcast(skipIntent);
+ IntentUtils.sendLocalBroadcast(context, PlaybackService.ACTION_SKIP_CURRENT_EPISODE);
}
protected void pauseEpisode() {
- Intent pauseIntent = new Intent(PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE);
- context.sendBroadcast(pauseIntent);
+ IntentUtils.sendLocalBroadcast(context, PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE);
}
protected void startLocalPlayback() {
openNavDrawer();
onDrawerItem(withText(R.string.episodes_label)).perform(click());
- onView(isRoot()).perform(waitForView(withId(R.id.emptyViewTitle), 1000));
+ onView(isRoot()).perform(waitForView(withText(R.string.all_episodes_short_label), 1000));
onView(withText(R.string.all_episodes_short_label)).perform(click());
final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(0, 10);
- onView(isRoot()).perform(waitForView(withId(R.id.butSecondaryAction), 1000));
-
- onView(first(withId(R.id.butSecondaryAction))).perform(click());
- long mediaId = episodes.get(0).getMedia().getId();
- Awaitility.await().atMost(1, TimeUnit.SECONDS).until(() -> {
- if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
- return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
- } else {
- return false;
- }
- });
+ Matcher<View> allEpisodesMatcher = allOf(withId(android.R.id.list), isDisplayed(), hasMinimumChildCount(2));
+ onView(isRoot()).perform(waitForView(allEpisodesMatcher, 1000));
+ onView(allEpisodesMatcher).perform(actionOnItemAtPosition(0, clickChildViewWithId(R.id.butSecondaryAction)));
+
+ FeedMedia media = episodes.get(0).getMedia();
+ Awaitility.await().atMost(1, TimeUnit.SECONDS).until(
+ () -> media.equals(uiTestUtils.getCurrentMedia()));
}
/**
@@ -249,16 +242,14 @@ public abstract class PlaybackTest {
protected void playFromQueue(int itemIdx) {
final List<FeedItem> queue = DBReader.getQueue();
- onView(nth(withId(R.id.butSecondaryAction), itemIdx + 1)).perform(click());
- onView(isRoot()).perform(waitForView(withId(R.id.butPlay), 1000));
- long mediaId = queue.get(itemIdx).getMedia().getId();
- Awaitility.await().atMost(1, TimeUnit.SECONDS).until(() -> {
- if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
- return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
- } else {
- return false;
- }
- });
+ Matcher<View> queueMatcher = allOf(withId(R.id.recyclerView), isDisplayed(), hasMinimumChildCount(2));
+ onView(isRoot()).perform(waitForView(queueMatcher, 1000));
+ onView(queueMatcher).perform(actionOnItemAtPosition(itemIdx, clickChildViewWithId(R.id.butSecondaryAction)));
+
+ FeedMedia media = queue.get(itemIdx).getMedia();
+ Awaitility.await().atMost(1, TimeUnit.SECONDS).until(
+ () -> media.equals(uiTestUtils.getCurrentMedia()));
+
}
/**
@@ -272,42 +263,36 @@ public abstract class PlaybackTest {
final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(0, 10);
startLocalPlayback();
- long mediaId = episodes.get(0).getMedia().getId();
- Awaitility.await().atMost(1, TimeUnit.SECONDS).until(() -> {
- if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
- return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
- } else {
- return false;
- }
- });
-
- Awaitility.await().atMost(5, TimeUnit.SECONDS).until(() ->
- uiTestUtils.getCurrentMedia(getActivity()) == null
- || uiTestUtils.getCurrentMedia(getActivity()).getId() != mediaId);
+ FeedMedia media = episodes.get(0).getMedia();
+ Awaitility.await().atMost(1, TimeUnit.SECONDS).until(
+ () -> media.equals(uiTestUtils.getCurrentMedia()));
+
+ Awaitility.await().atMost(5, TimeUnit.SECONDS).until(
+ () -> !media.equals(uiTestUtils.getCurrentMedia()));
startLocalPlayback();
- Awaitility.await().atMost(1, TimeUnit.SECONDS).until(() -> {
- if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
- return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
- } else {
- return false;
- }
- });
+
+ Awaitility.await().atMost(1, TimeUnit.SECONDS).until(
+ () -> media.equals(uiTestUtils.getCurrentMedia()));
}
protected void doTestSmartMarkAsPlayed_Skip_ForEpisode(int itemIdxNegAllowed) throws Exception {
setSmartMarkAsPlayedPreference(60);
// ensure when an episode is skipped, it is removed due to smart as played
setSkipKeepsEpisodePreference(false);
+ uiTestUtils.setMediaFileName("30sec.mp3");
uiTestUtils.addLocalFeedData(true);
+ LongList queue = DBReader.getQueueIDList();
int fiIdx;
if (itemIdxNegAllowed >= 0) {
fiIdx = itemIdxNegAllowed;
} else { // negative index: count from the end, with -1 being the last one, etc.
- fiIdx = DBReader.getQueue().size() + itemIdxNegAllowed;
+ fiIdx = queue.size() + itemIdxNegAllowed;
}
- final FeedItem feedItem = DBReader.getQueue().get(fiIdx);
+ final long feedItemId = queue.get(fiIdx);
+ queue.removeIndex(fiIdx);
+ assertFalse(queue.contains(feedItemId)); // Verify that episode is in queue only once
activityTestRule.launchActivity(new Intent());
playFromQueue(fiIdx);
@@ -316,8 +301,8 @@ public abstract class PlaybackTest {
// assert item no longer in queue (needs to wait till skip is asynchronously processed)
Awaitility.await()
- .atMost(1000, MILLISECONDS)
- .until(() -> !DBReader.getQueue().contains(feedItem));
- assertTrue(DBReader.getFeedItem(feedItem.getId()).isPlayed());
+ .atMost(5000, MILLISECONDS)
+ .until(() -> !DBReader.getQueueIDList().contains(feedItemId));
+ assertTrue(DBReader.getFeedItem(feedItemId).isPlayed());
}
}