diff options
author | Tom Hennen <TomHennen@users.noreply.github.com> | 2015-10-08 01:52:27 -0400 |
---|---|---|
committer | Tom Hennen <TomHennen@users.noreply.github.com> | 2015-10-08 01:52:27 -0400 |
commit | 95cc133e0acde834a425ca35381aedde27390433 (patch) | |
tree | ed0748a3fad19ca5714c22a1cd8829455e3fd855 /app/src/androidTest/java/de/test | |
parent | 57b8ced16e36f1f3dcf980ddba3ee9c807cf4dc6 (diff) | |
parent | 07bcdb167b7e6d448be514460ec259cba29a5a41 (diff) | |
download | AntennaPod-95cc133e0acde834a425ca35381aedde27390433.zip |
Merge pull request #1241 from TomHennen/cleanup_algorithm
Cleanup algorithm updates
Diffstat (limited to 'app/src/androidTest/java/de/test')
5 files changed, 471 insertions, 347 deletions
diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBCleanupTests.java b/app/src/androidTest/java/de/test/antennapod/storage/DBCleanupTests.java new file mode 100644 index 000000000..7b84c288a --- /dev/null +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBCleanupTests.java @@ -0,0 +1,212 @@ +package de.test.antennapod.storage; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.test.FlakyTest; +import android.test.InstrumentationTestCase; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +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.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.DBTasks; +import de.danoeh.antennapod.core.storage.PodDBAdapter; + +import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; + +/** + * Test class for DBTasks + */ +public class DBCleanupTests extends InstrumentationTestCase { + + private static final String TAG = "DBTasksTest"; + protected static final int EPISODE_CACHE_SIZE = 5; + private final int cleanupAlgorithm; + + protected Context context; + + protected File destFolder; + + public DBCleanupTests() { + this.cleanupAlgorithm = UserPreferences.EPISODE_CLEANUP_DEFAULT; + } + + public DBCleanupTests(int cleanupAlgorithm) { + this.cleanupAlgorithm = cleanupAlgorithm; + } + + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + + assertTrue(PodDBAdapter.deleteDatabase()); + + cleanupDestFolder(destFolder); + assertTrue(destFolder.delete()); + } + + private void cleanupDestFolder(File destFolder) { + for (File f : destFolder.listFiles()) { + assertTrue(f.delete()); + } + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + context = getInstrumentation().getTargetContext(); + destFolder = context.getExternalCacheDir(); + cleanupDestFolder(destFolder); + assertNotNull(destFolder); + assertTrue(destFolder.exists()); + assertTrue(destFolder.canWrite()); + + // create new database + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.close(); + + SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()).edit(); + prefEdit.putString(UserPreferences.PREF_EPISODE_CACHE_SIZE, Integer.toString(EPISODE_CACHE_SIZE)); + prefEdit.putString(UserPreferences.PREF_EPISODE_CLEANUP, Integer.toString(cleanupAlgorithm)); + prefEdit.commit(); + + UserPreferences.init(context); + } + + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupShouldDelete() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List<FeedItem> items = new ArrayList<>(); + feed.setItems(items); + List<File> files = new ArrayList<>(); + populateItems(NUM_ITEMS, feed, items, files, FeedItem.PLAYED, false, false); + + DBTasks.performAutoCleanup(context); + for (int i = 0; i < files.size(); i++) { + if (i < EPISODE_CACHE_SIZE) { + assertTrue(files.get(i).exists()); + } else { + assertFalse(files.get(i).exists()); + } + } + } + + protected void populateItems(final int numItems, Feed feed, List<FeedItem> items, + List<File> files, int itemState, boolean addToQueue, + boolean addToFavorites) throws IOException { + for (int i = 0; i < numItems; i++) { + Date itemDate = new Date(numItems - i); + Date playbackCompletionDate = null; + if (itemState == FeedItem.PLAYED) { + playbackCompletionDate = itemDate; + } + FeedItem item = new FeedItem(0, "title", "id", "link", itemDate, itemState, feed); + + File f = new File(destFolder, "file " + i); + assertTrue(f.createNewFile()); + files.add(f); + item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, playbackCompletionDate, 0)); + items.add(item); + } + + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setCompleteFeed(feed); + if (addToQueue) { + adapter.setQueue(items); + } + if (addToFavorites) { + adapter.setFavorites(items); + } + adapter.close(); + + assertTrue(feed.getId() != 0); + for (FeedItem item : items) { + assertTrue(item.getId() != 0); + assertTrue(item.getMedia().getId() != 0); + } + } + + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupHandleUnplayed() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List<FeedItem> items = new ArrayList<FeedItem>(); + feed.setItems(items); + List<File> files = new ArrayList<File>(); + populateItems(NUM_ITEMS, feed, items, files, FeedItem.UNPLAYED, false, false); + + DBTasks.performAutoCleanup(context); + for (File file : files) { + assertTrue(file.exists()); + } + } + + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List<FeedItem> items = new ArrayList<>(); + feed.setItems(items); + List<File> files = new ArrayList<>(); + populateItems(NUM_ITEMS, feed, items, files, FeedItem.PLAYED, true, false); + + DBTasks.performAutoCleanup(context); + for (File file : files) { + assertTrue(file.exists()); + } + } + + /** + * Reproduces a bug where DBTasks.performAutoCleanup(android.content.Context) would use the ID of the FeedItem in the + * call to DBWriter.deleteFeedMediaOfItem instead of the ID of the FeedMedia. This would cause the wrong item to be deleted. + * @throws IOException + */ + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue_withFeedsWithNoMedia() throws IOException { + // add feed with no enclosures so that item ID != media ID + saveFeedlist(1, 10, false); + + // add candidate for performAutoCleanup + List<Feed> feeds = saveFeedlist(1, 1, true); + FeedMedia m = feeds.get(0).getItems().get(0).getMedia(); + m.setDownloaded(true); + m.setFile_url("file"); + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setMedia(m); + adapter.close(); + + testPerformAutoCleanupShouldNotDeleteBecauseInQueue(); + } + + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupShouldNotDeleteBecauseFavorite() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List<FeedItem> items = new ArrayList<>(); + feed.setItems(items); + List<File> files = new ArrayList<>(); + populateItems(NUM_ITEMS, feed, items, files, FeedItem.PLAYED, false, true); + + DBTasks.performAutoCleanup(context); + for (File file : files) { + assertTrue(file.exists()); + } + } +} diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBNullCleanupAlgorithmTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBNullCleanupAlgorithmTest.java new file mode 100644 index 000000000..38bc0c380 --- /dev/null +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBNullCleanupAlgorithmTest.java @@ -0,0 +1,115 @@ +package de.test.antennapod.storage; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.test.FlakyTest; +import android.test.InstrumentationTestCase; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +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.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.DBTasks; +import de.danoeh.antennapod.core.storage.PodDBAdapter; + +import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; + +/** + * Tests that the APNullCleanupAlgorithm is working correctly. + */ +public class DBNullCleanupAlgorithmTest extends InstrumentationTestCase { + + private static final String TAG = "DBNullCleanupAlgorithmTest"; + private static final int EPISODE_CACHE_SIZE = 5; + + private Context context; + + private File destFolder; + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + + assertTrue(PodDBAdapter.deleteDatabase()); + + cleanupDestFolder(destFolder); + assertTrue(destFolder.delete()); + } + + private void cleanupDestFolder(File destFolder) { + for (File f : destFolder.listFiles()) { + assertTrue(f.delete()); + } + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + context = getInstrumentation().getTargetContext(); + destFolder = context.getExternalCacheDir(); + cleanupDestFolder(destFolder); + assertNotNull(destFolder); + assertTrue(destFolder.exists()); + assertTrue(destFolder.canWrite()); + + // create new database + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.close(); + + SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()).edit(); + prefEdit.putString(UserPreferences.PREF_EPISODE_CACHE_SIZE, Integer.toString(EPISODE_CACHE_SIZE)); + prefEdit.putString(UserPreferences.PREF_EPISODE_CLEANUP, Integer.toString(UserPreferences.EPISODE_CLEANUP_NULL)); + prefEdit.commit(); + + UserPreferences.init(context); + } + + /** + * A test with no items in the queue, but multiple items downloaded. + * The null algorithm should never delete any items, even if they're played and not in the queue. + * @throws IOException + */ + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupShouldNotDelete() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List<FeedItem> items = new ArrayList<>(); + feed.setItems(items); + List<File> files = new ArrayList<>(); + for (int i = 0; i < NUM_ITEMS; i++) { + FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); + + File f = new File(destFolder, "file " + i); + assertTrue(f.createNewFile()); + files.add(f); + item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, + new Date(NUM_ITEMS - i), 0)); + items.add(item); + } + + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.close(); + + assertTrue(feed.getId() != 0); + for (FeedItem item : items) { + assertTrue(item.getId() != 0); + assertTrue(item.getMedia().getId() != 0); + } + DBTasks.performAutoCleanup(context); + for (int i = 0; i < files.size(); i++) { + assertTrue(files.get(i).exists()); + } + } +} diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBQueueCleanupAlgorithmTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBQueueCleanupAlgorithmTest.java new file mode 100644 index 000000000..890897f43 --- /dev/null +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBQueueCleanupAlgorithmTest.java @@ -0,0 +1,50 @@ +package de.test.antennapod.storage; + +import android.test.FlakyTest; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.DBTasks; + +/** + * Tests that the APQueueCleanupAlgorithm is working correctly. + */ +public class DBQueueCleanupAlgorithmTest extends DBCleanupTests { + + private static final String TAG = "DBQueueCleanupAlgorithmTest"; + + public DBQueueCleanupAlgorithmTest() { + super(UserPreferences.EPISODE_CLEANUP_QUEUE); + } + + /** + * For APQueueCleanupAlgorithm we expect even unplayed episodes to be deleted if needed + * if they aren't in the queue + */ + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupHandleUnplayed() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List<FeedItem> items = new ArrayList<>(); + feed.setItems(items); + List<File> files = new ArrayList<>(); + populateItems(NUM_ITEMS, feed, items, files, FeedItem.UNPLAYED, false, false); + + DBTasks.performAutoCleanup(context); + for (int i = 0; i < files.size(); i++) { + if (i < EPISODE_CACHE_SIZE) { + assertTrue(files.get(i).exists()); + } else { + assertFalse(files.get(i).exists()); + } + } + } +} diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java index 024b506d9..1894d6585 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java @@ -29,33 +29,20 @@ import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; public class DBTasksTest extends InstrumentationTestCase { private static final String TAG = "DBTasksTest"; - private static final int EPISODE_CACHE_SIZE = 5; private Context context; - - private File destFolder; @Override protected void tearDown() throws Exception { super.tearDown(); assertTrue(PodDBAdapter.deleteDatabase()); - - for (File f : destFolder.listFiles()) { - assertTrue(f.delete()); - } - assertTrue(destFolder.delete()); - } @Override protected void setUp() throws Exception { super.setUp(); context = getInstrumentation().getTargetContext(); - destFolder = context.getExternalCacheDir(); - assertNotNull(destFolder); - assertTrue(destFolder.exists()); - assertTrue(destFolder.canWrite()); // create new database PodDBAdapter.deleteDatabase(); @@ -63,146 +50,10 @@ public class DBTasksTest extends InstrumentationTestCase { adapter.open(); adapter.close(); - SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()).edit(); - prefEdit.putString(UserPreferences.PREF_EPISODE_CACHE_SIZE, Integer.toString(EPISODE_CACHE_SIZE)); - prefEdit.commit(); - UserPreferences.init(context); } @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldDelete() throws IOException { - final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; - - Feed feed = new Feed("url", new Date(), "title"); - List<FeedItem> items = new ArrayList<>(); - feed.setItems(items); - List<File> files = new ArrayList<>(); - for (int i = 0; i < NUM_ITEMS; i++) { - FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); - - File f = new File(destFolder, "file " + i); - assertTrue(f.createNewFile()); - files.add(f); - item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, new Date(NUM_ITEMS - i), 0)); - items.add(item); - } - - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setCompleteFeed(feed); - adapter.close(); - - assertTrue(feed.getId() != 0); - for (FeedItem item : items) { - assertTrue(item.getId() != 0); - assertTrue(item.getMedia().getId() != 0); - } - DBTasks.performAutoCleanup(context); - for (int i = 0; i < files.size(); i++) { - if (i < EPISODE_CACHE_SIZE) { - assertTrue(files.get(i).exists()); - } else { - assertFalse(files.get(i).exists()); - } - } - } - - @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldNotDeleteBecauseUnread() throws IOException { - final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; - - Feed feed = new Feed("url", new Date(), "title"); - List<FeedItem> items = new ArrayList<FeedItem>(); - feed.setItems(items); - List<File> files = new ArrayList<File>(); - for (int i = 0; i < NUM_ITEMS; i++) { - FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.UNPLAYED, feed); - - File f = new File(destFolder, "file " + i); - assertTrue(f.createNewFile()); - assertTrue(f.exists()); - files.add(f); - item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, new Date(NUM_ITEMS - i), 0)); - items.add(item); - } - - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setCompleteFeed(feed); - adapter.close(); - - assertTrue(feed.getId() != 0); - for (FeedItem item : items) { - assertTrue(item.getId() != 0); - assertTrue(item.getMedia().getId() != 0); - } - DBTasks.performAutoCleanup(context); - for (File file : files) { - assertTrue(file.exists()); - } - } - - @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue() throws IOException { - final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; - - Feed feed = new Feed("url", new Date(), "title"); - List<FeedItem> items = new ArrayList<>(); - feed.setItems(items); - List<File> files = new ArrayList<>(); - for (int i = 0; i < NUM_ITEMS; i++) { - FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); - - File f = new File(destFolder, "file " + i); - assertTrue(f.createNewFile()); - assertTrue(f.exists()); - files.add(f); - item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, new Date(NUM_ITEMS - i), 0)); - items.add(item); - } - - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setCompleteFeed(feed); - adapter.setQueue(items); - adapter.close(); - - assertTrue(feed.getId() != 0); - for (FeedItem item : items) { - assertTrue(item.getId() != 0); - assertTrue(item.getMedia().getId() != 0); - } - DBTasks.performAutoCleanup(context); - for (File file : files) { - assertTrue(file.exists()); - } - } - - /** - * Reproduces a bug where DBTasks.performAutoCleanup(android.content.Context) would use the ID of the FeedItem in the - * call to DBWriter.deleteFeedMediaOfItem instead of the ID of the FeedMedia. This would cause the wrong item to be deleted. - * @throws IOException - */ - @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue_withFeedsWithNoMedia() throws IOException { - // add feed with no enclosures so that item ID != media ID - saveFeedlist(1, 10, false); - - // add candidate for performAutoCleanup - List<Feed> feeds = saveFeedlist(1, 1, true); - FeedMedia m = feeds.get(0).getItems().get(0).getMedia(); - m.setDownloaded(true); - m.setFile_url("file"); - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setMedia(m); - adapter.close(); - - testPerformAutoCleanupShouldNotDeleteBecauseInQueue(); - } - - @FlakyTest(tolerance = 3) public void testUpdateFeedNewFeed() { final int NUM_ITEMS = 10; diff --git a/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java b/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java index a6af6c544..8de4ba3c8 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java @@ -14,10 +14,15 @@ import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; import java.util.List; +import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.PreferenceActivity; import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.APCleanupAlgorithm; +import de.danoeh.antennapod.core.storage.APNullCleanupAlgorithm; +import de.danoeh.antennapod.core.storage.APQueueCleanupAlgorithm; +import de.danoeh.antennapod.core.storage.EpisodeCleanupAlgorithm; public class PreferencesTest extends ActivityInstrumentationTestCase2<PreferenceActivity> { @@ -59,12 +64,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference solo.clickOnText(solo.getString(R.string.pref_set_theme_title)); solo.waitForDialogToOpen(); solo.clickOnText(solo.getString(otherTheme)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.getTheme() != theme; - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> UserPreferences.getTheme() != theme, Timeout.getLargeTimeout())); } public void testSwitchThemeBack() { @@ -78,140 +78,67 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference solo.clickOnText(solo.getString(R.string.pref_set_theme_title)); solo.waitForDialogToOpen(1000); solo.clickOnText(solo.getString(otherTheme)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.getTheme() != theme; - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> UserPreferences.getTheme() != theme, Timeout.getLargeTimeout())); } public void testExpandNotification() { final int priority = UserPreferences.getNotifyPriority(); solo.clickOnText(solo.getString(R.string.pref_expandNotify_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return priority != UserPreferences.getNotifyPriority(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> priority != UserPreferences.getNotifyPriority(), Timeout.getLargeTimeout())); solo.clickOnText(solo.getString(R.string.pref_expandNotify_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return priority == UserPreferences.getNotifyPriority(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> priority == UserPreferences.getNotifyPriority(), Timeout.getLargeTimeout())); } public void testEnablePersistentPlaybackControls() { final boolean persistNotify = UserPreferences.isPersistNotify(); solo.clickOnText(solo.getString(R.string.pref_persistNotify_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return persistNotify != UserPreferences.isPersistNotify(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> persistNotify != UserPreferences.isPersistNotify(), Timeout.getLargeTimeout())); solo.clickOnText(solo.getString(R.string.pref_persistNotify_title)); - solo.waitForCondition(new Condition() { - @Override public boolean isSatisfied() { - return persistNotify == UserPreferences.isPersistNotify(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> persistNotify == UserPreferences.isPersistNotify(), Timeout.getLargeTimeout())); } public void testEnqueueAtFront() { final boolean enqueueAtFront = UserPreferences.enqueueAtFront(); solo.clickOnText(solo.getString(R.string.pref_queueAddToFront_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return enqueueAtFront != UserPreferences.enqueueAtFront(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> enqueueAtFront != UserPreferences.enqueueAtFront(), Timeout.getLargeTimeout())); solo.clickOnText(solo.getString(R.string.pref_queueAddToFront_title)); - solo.waitForCondition(new Condition() { - @Override public boolean isSatisfied() { - return enqueueAtFront == UserPreferences.enqueueAtFront(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> enqueueAtFront == UserPreferences.enqueueAtFront(), Timeout.getLargeTimeout())); } public void testHeadPhonesDisconnect() { final boolean pauseOnHeadsetDisconnect = UserPreferences.isPauseOnHeadsetDisconnect(); solo.clickOnText(solo.getString(R.string.pref_pauseOnHeadsetDisconnect_title)); - solo.waitForCondition(new Condition() { - @Override public boolean isSatisfied() { - return pauseOnHeadsetDisconnect != UserPreferences.isPauseOnHeadsetDisconnect(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> pauseOnHeadsetDisconnect != UserPreferences.isPauseOnHeadsetDisconnect(), Timeout.getLargeTimeout())); solo.clickOnText(solo.getString(R.string.pref_pauseOnHeadsetDisconnect_title)); - solo.waitForCondition(new Condition() { - @Override public boolean isSatisfied() { - return pauseOnHeadsetDisconnect == UserPreferences.isPauseOnHeadsetDisconnect(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> pauseOnHeadsetDisconnect == UserPreferences.isPauseOnHeadsetDisconnect(), Timeout.getLargeTimeout())); } public void testHeadPhonesReconnect() { if(UserPreferences.isPauseOnHeadsetDisconnect() == false) { solo.clickOnText(solo.getString(R.string.pref_pauseOnHeadsetDisconnect_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.isPauseOnHeadsetDisconnect(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> UserPreferences.isPauseOnHeadsetDisconnect(), Timeout.getLargeTimeout())); } final boolean unpauseOnHeadsetReconnect = UserPreferences.isUnpauseOnHeadsetReconnect(); solo.clickOnText(solo.getString(R.string.pref_unpauseOnHeadsetReconnect_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return unpauseOnHeadsetReconnect != UserPreferences.isUnpauseOnHeadsetReconnect(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> unpauseOnHeadsetReconnect != UserPreferences.isUnpauseOnHeadsetReconnect(), Timeout.getLargeTimeout())); solo.clickOnText(solo.getString(R.string.pref_unpauseOnHeadsetReconnect_title)); - solo.waitForCondition(new Condition() { - @Override public boolean isSatisfied() { - return unpauseOnHeadsetReconnect == UserPreferences.isUnpauseOnHeadsetReconnect(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> unpauseOnHeadsetReconnect == UserPreferences.isUnpauseOnHeadsetReconnect(), Timeout.getLargeTimeout())); } public void testContinuousPlayback() { final boolean continuousPlayback = UserPreferences.isFollowQueue(); solo.clickOnText(solo.getString(R.string.pref_followQueue_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return continuousPlayback != UserPreferences.isFollowQueue(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> continuousPlayback != UserPreferences.isFollowQueue(), Timeout.getLargeTimeout())); solo.clickOnText(solo.getString(R.string.pref_followQueue_title)); - solo.waitForCondition(new Condition() { - @Override public boolean isSatisfied() { - return continuousPlayback == UserPreferences.isFollowQueue(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> continuousPlayback == UserPreferences.isFollowQueue(), Timeout.getLargeTimeout())); } public void testAutoDelete() { final boolean autoDelete = UserPreferences.isAutoDelete(); solo.clickOnText(solo.getString(R.string.pref_auto_delete_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return autoDelete != UserPreferences.isAutoDelete(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> autoDelete != UserPreferences.isAutoDelete(), Timeout.getLargeTimeout())); solo.clickOnText(solo.getString(R.string.pref_auto_delete_title)); - solo.waitForCondition(new Condition() { - @Override public boolean isSatisfied() { - return autoDelete == UserPreferences.isAutoDelete(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> autoDelete == UserPreferences.isAutoDelete(), Timeout.getLargeTimeout())); } public void testPlaybackSpeeds() { @@ -225,31 +152,16 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference public void testPauseForInterruptions() { final boolean pauseForFocusLoss = UserPreferences.shouldPauseForFocusLoss(); solo.clickOnText(solo.getString(R.string.pref_pausePlaybackForFocusLoss_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return pauseForFocusLoss != UserPreferences.shouldPauseForFocusLoss(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> pauseForFocusLoss != UserPreferences.shouldPauseForFocusLoss(), Timeout.getLargeTimeout())); solo.clickOnText(solo.getString(R.string.pref_pausePlaybackForFocusLoss_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return pauseForFocusLoss == UserPreferences.shouldPauseForFocusLoss(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> pauseForFocusLoss == UserPreferences.shouldPauseForFocusLoss(), Timeout.getLargeTimeout())); } public void testDisableUpdateInterval() { solo.clickOnText(solo.getString(R.string.pref_autoUpdateIntervallOrTime_sum)); solo.waitForDialogToOpen(); solo.clickOnText(solo.getString(R.string.pref_autoUpdateIntervallOrTime_Disable)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.getUpdateInterval() == 0; - } - }, 1000); + assertTrue(solo.waitForCondition(() -> UserPreferences.getUpdateInterval() == 0, 1000)); } public void testSetUpdateInterval() { @@ -260,30 +172,16 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference String search = "12 " + solo.getString(R.string.pref_update_interval_hours_plural); solo.clickOnText(search); solo.waitForDialogToClose(); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.getUpdateInterval() == 12; - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> UserPreferences.getUpdateInterval() == + TimeUnit.HOURS.toMillis(12), Timeout.getLargeTimeout())); } public void testMobileUpdates() { final boolean mobileUpdates = UserPreferences.isAllowMobileUpdate(); solo.clickOnText(solo.getString(R.string.pref_mobileUpdate_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return mobileUpdates != UserPreferences.isAllowMobileUpdate(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> mobileUpdates != UserPreferences.isAllowMobileUpdate(), Timeout.getLargeTimeout())); solo.clickOnText(solo.getString(R.string.pref_mobileUpdate_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return mobileUpdates == UserPreferences.isAllowMobileUpdate(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> mobileUpdates == UserPreferences.isAllowMobileUpdate(), Timeout.getLargeTimeout())); } public void testSetSequentialDownload() { @@ -292,12 +190,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference solo.clearEditText(0); solo.enterText(0, "1"); solo.clickOnText(solo.getString(android.R.string.ok)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.getParallelDownloads() == 1; - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> UserPreferences.getParallelDownloads() == 1, Timeout.getLargeTimeout())); } public void testSetParallelDownloads() { @@ -306,12 +199,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference solo.clearEditText(0); solo.enterText(0, "10"); solo.clickOnText(solo.getString(android.R.string.ok)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.getParallelDownloads() == 10; - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> UserPreferences.getParallelDownloads() == 10, Timeout.getLargeTimeout())); } public void testSetParallelDownloadsInvalidInput() { @@ -333,12 +221,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference solo.clickOnText(solo.getString(R.string.pref_episode_cache_title)); solo.waitForDialogToOpen(); solo.clickOnText(entry); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.getEpisodeCacheSize() == value; - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> UserPreferences.getEpisodeCacheSize() == value, Timeout.getLargeTimeout())); } public void testSetEpisodeCacheMin() { @@ -350,12 +233,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference solo.waitForDialogToOpen(1000); solo.scrollUp(); solo.clickOnText(minEntry); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.getEpisodeCacheSize() == minValue; - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> UserPreferences.getEpisodeCacheSize() == minValue, Timeout.getLargeTimeout())); } @@ -367,12 +245,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference solo.clickOnText(solo.getString(R.string.pref_episode_cache_title)); solo.waitForDialogToOpen(); solo.clickOnText(maxEntry); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.getEpisodeCacheSize() == maxValue; - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> UserPreferences.getEpisodeCacheSize() == maxValue, Timeout.getLargeTimeout())); } public void testAutomaticDownload() { @@ -380,50 +253,73 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference solo.clickOnText(solo.getString(R.string.pref_automatic_download_title)); solo.waitForText(solo.getString(R.string.pref_automatic_download_title)); solo.clickOnText(solo.getString(R.string.pref_automatic_download_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return automaticDownload != UserPreferences.isEnableAutodownload(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> automaticDownload != UserPreferences.isEnableAutodownload(), Timeout.getLargeTimeout())); if(UserPreferences.isEnableAutodownload() == false) { solo.clickOnText(solo.getString(R.string.pref_automatic_download_title)); } - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return UserPreferences.isEnableAutodownload() == true; - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> UserPreferences.isEnableAutodownload() == true, Timeout.getLargeTimeout())); final boolean enableAutodownloadOnBattery = UserPreferences.isEnableAutodownloadOnBattery(); solo.clickOnText(solo.getString(R.string.pref_automatic_download_on_battery_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return enableAutodownloadOnBattery != UserPreferences.isEnableAutodownloadOnBattery(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> enableAutodownloadOnBattery != UserPreferences.isEnableAutodownloadOnBattery(), Timeout.getLargeTimeout())); solo.clickOnText(solo.getString(R.string.pref_automatic_download_on_battery_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return enableAutodownloadOnBattery == UserPreferences.isEnableAutodownloadOnBattery(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> enableAutodownloadOnBattery == UserPreferences.isEnableAutodownloadOnBattery(), Timeout.getLargeTimeout())); final boolean enableWifiFilter = UserPreferences.isEnableAutodownloadWifiFilter(); solo.clickOnText(solo.getString(R.string.pref_autodl_wifi_filter_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return enableWifiFilter != UserPreferences.isEnableAutodownloadWifiFilter(); - } - }, Timeout.getLargeTimeout()); - solo.clickOnText(solo.getString(R.string.pref_automatic_download_on_battery_title)); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return enableWifiFilter == UserPreferences.isEnableAutodownloadWifiFilter(); - } - }, Timeout.getLargeTimeout()); + assertTrue(solo.waitForCondition(() -> enableWifiFilter != UserPreferences.isEnableAutodownloadWifiFilter(), Timeout.getLargeTimeout())); + solo.clickOnText(solo.getString(R.string.pref_autodl_wifi_filter_title)); + assertTrue(solo.waitForCondition(() -> enableWifiFilter == UserPreferences.isEnableAutodownloadWifiFilter(), Timeout.getLargeTimeout())); + } + + public void testEpisodeCleanupQueueOnly() { + solo.clickOnText(solo.getString(R.string.pref_episode_cleanup_title)); + solo.waitForText(solo.getString(R.string.episode_cleanup_queue_removal)); + solo.clickOnText(solo.getString(R.string.episode_cleanup_queue_removal)); + assertTrue(solo.waitForCondition(() -> { + EpisodeCleanupAlgorithm alg = UserPreferences.getEpisodeCleanupAlgorithm(); + return alg instanceof APQueueCleanupAlgorithm; + }, + Timeout.getLargeTimeout())); + } + + public void testEpisodeCleanupNeverAlg() { + solo.clickOnText(solo.getString(R.string.pref_episode_cleanup_title)); + solo.waitForText(solo.getString(R.string.episode_cleanup_never)); + solo.clickOnText(solo.getString(R.string.episode_cleanup_never)); + assertTrue(solo.waitForCondition(() -> { + EpisodeCleanupAlgorithm alg = UserPreferences.getEpisodeCleanupAlgorithm(); + return alg instanceof APNullCleanupAlgorithm; + }, + Timeout.getLargeTimeout())); } + + public void testEpisodeCleanupClassic() { + solo.clickOnText(solo.getString(R.string.pref_episode_cleanup_title)); + solo.waitForText(solo.getString(R.string.episode_cleanup_after_listening)); + solo.clickOnText(solo.getString(R.string.episode_cleanup_after_listening)); + assertTrue(solo.waitForCondition(() -> { + EpisodeCleanupAlgorithm alg = UserPreferences.getEpisodeCleanupAlgorithm(); + if (alg instanceof APCleanupAlgorithm) { + APCleanupAlgorithm cleanupAlg = (APCleanupAlgorithm)alg; + return cleanupAlg.getNumberOfDaysAfterPlayback() == 0; + } + return false; + }, + Timeout.getLargeTimeout())); + } + + public void testEpisodeCleanupNumDays() { + solo.clickOnText(solo.getString(R.string.pref_episode_cleanup_title)); + solo.waitForText(solo.getString(R.string.episode_cleanup_after_listening)); + solo.clickOnText("5"); + assertTrue(solo.waitForCondition(() -> { + EpisodeCleanupAlgorithm alg = UserPreferences.getEpisodeCleanupAlgorithm(); + if (alg instanceof APCleanupAlgorithm) { + APCleanupAlgorithm cleanupAlg = (APCleanupAlgorithm)alg; + return cleanupAlg.getNumberOfDaysAfterPlayback() == 5; + } + return false; + }, + Timeout.getLargeTimeout())); + } + } |