diff options
Diffstat (limited to 'app/src/androidTest/java/de')
11 files changed, 721 insertions, 113 deletions
diff --git a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java index 81d684595..d74128c2f 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java @@ -2,12 +2,6 @@ package de.test.antennapod.service.playback; import android.content.Context; import android.test.InstrumentationTestCase; -import de.danoeh.antennapod.core.feed.EventDistributor; -import de.danoeh.antennapod.core.feed.Feed; -import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.service.playback.PlaybackServiceTaskManager; -import de.danoeh.antennapod.core.storage.PodDBAdapter; -import de.danoeh.antennapod.core.util.playback.Playable; import java.util.ArrayList; import java.util.Date; @@ -15,6 +9,15 @@ import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import de.danoeh.antennapod.core.feed.EventDistributor; +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.QueueEvent; +import de.danoeh.antennapod.core.service.playback.PlaybackServiceTaskManager; +import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.core.util.playback.Playable; +import de.greenrobot.event.EventBus; + /** * Test class for PlaybackServiceTaskManager */ @@ -94,7 +97,7 @@ public class PlaybackServiceTaskManagerTest extends InstrumentationTestCase { }; EventDistributor.getInstance().register(queueListener); List<FeedItem> queue = writeTestQueue("a"); - EventDistributor.getInstance().sendQueueUpdateBroadcast(); + EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.ADDED_ITEMS, queue)); countDownLatch.await(5000, TimeUnit.MILLISECONDS); assertNotNull(queue); diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBReaderTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBReaderTest.java index 1f6a907d4..95d2ce58a 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBReaderTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBReaderTest.java @@ -14,6 +14,7 @@ import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.FeedItemStatistics; import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.flattr.FlattrStatus; import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; @@ -44,7 +45,7 @@ public class DBReaderTest extends InstrumentationTestCase { private void expiredFeedListTestHelper(long lastUpdate, long expirationTime, boolean shouldReturn) { final Context context = getInstrumentation().getTargetContext(); Feed feed = new Feed(0, new Date(lastUpdate), "feed", "link", "descr", null, - null, null, null, "feed", null, null, "url", false, new FlattrStatus(), false, null); + null, null, null, "feed", null, null, "url", false, new FlattrStatus(), false, null, null, false); feed.setItems(new ArrayList<FeedItem>()); PodDBAdapter adapter = new PodDBAdapter(context); adapter.open(); @@ -194,7 +195,7 @@ public class DBReaderTest extends InstrumentationTestCase { final Context context = getInstrumentation().getTargetContext(); final int numItems = 10; List<FeedItem> queue = saveQueue(numItems); - List<Long> ids = DBReader.getQueueIDList(context); + LongList ids = DBReader.getQueueIDList(context); assertNotNull(ids); assertTrue(queue.size() == ids.size()); for (int i = 0; i < queue.size(); i++) { @@ -300,7 +301,7 @@ public class DBReaderTest extends InstrumentationTestCase { } } - public void testGetUnreadItemIds() { + public void testGetNewItemIds() { final Context context = getInstrumentation().getTargetContext(); final int numItems = 10; @@ -309,10 +310,11 @@ public class DBReaderTest extends InstrumentationTestCase { for (int i = 0; i < unread.size(); i++) { unreadIds[i] = unread.get(i).getId(); } - long[] unreadSaved = DBReader.getUnreadItemIds(context); + LongList unreadSaved = DBReader.getNewItemIds(context); assertNotNull(unreadSaved); - assertTrue(unread.size() == unreadSaved.length); - for (long savedId : unreadSaved) { + assertTrue(unread.size() == unreadSaved.size()); + for(int i=0; i < unreadSaved.size(); i++) { + long savedId = unreadSaved.get(i); boolean found = false; for (long id : unreadIds) { if (id == savedId) { @@ -374,7 +376,7 @@ public class DBReaderTest extends InstrumentationTestCase { List<Feed> feeds = DBTestUtils.saveFeedlist(context, NUM_FEEDS, NUM_ITEMS, true); DBReader.NavDrawerData navDrawerData = DBReader.getNavDrawerData(context); assertEquals(NUM_FEEDS, navDrawerData.feeds.size()); - assertEquals(0, navDrawerData.numUnreadItems); + assertEquals(0, navDrawerData.numNewItems); assertEquals(0, navDrawerData.queueSize); } @@ -403,7 +405,7 @@ public class DBReaderTest extends InstrumentationTestCase { DBReader.NavDrawerData navDrawerData = DBReader.getNavDrawerData(context); assertEquals(NUM_FEEDS, navDrawerData.feeds.size()); - assertEquals(NUM_UNREAD, navDrawerData.numUnreadItems); + assertEquals(NUM_UNREAD, navDrawerData.numNewItems); assertEquals(NUM_QUEUE, navDrawerData.queueSize); } 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 e28a7918f..16f50cf28 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java @@ -3,7 +3,16 @@ 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.Collections; +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; @@ -13,28 +22,23 @@ import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.flattr.FlattrStatus; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; - -import static de.test.antennapod.storage.DBTestUtils.*; +import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; /** * Test class for DBTasks */ public class DBTasksTest extends InstrumentationTestCase { - private static final String TEST_FOLDER = "testDBTasks"; + + 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(); - final Context context = getInstrumentation().getTargetContext(); assertTrue(PodDBAdapter.deleteDatabase(context)); for (File f : destFolder.listFiles()) { @@ -47,23 +51,24 @@ public class DBTasksTest extends InstrumentationTestCase { @Override protected void setUp() throws Exception { super.setUp(); - destFolder = getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); + context = getInstrumentation().getTargetContext(); + destFolder = context.getExternalCacheDir(); assertNotNull(destFolder); assertTrue(destFolder.exists()); assertTrue(destFolder.canWrite()); - final Context context = getInstrumentation().getTargetContext(); context.deleteDatabase(PodDBAdapter.DATABASE_NAME); // make sure database is created PodDBAdapter adapter = new PodDBAdapter(context); adapter.open(); adapter.close(); - SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(getInstrumentation().getTargetContext().getApplicationContext()).edit(); + SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()).edit(); prefEdit.putString(UserPreferences.PREF_EPISODE_CACHE_SIZE, Integer.toString(EPISODE_CACHE_SIZE)); prefEdit.commit(); } + @FlakyTest(tolerance = 3) public void testPerformAutoCleanupShouldDelete() throws IOException { final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; @@ -81,7 +86,7 @@ public class DBTasksTest extends InstrumentationTestCase { items.add(item); } - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); + PodDBAdapter adapter = new PodDBAdapter(context); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -91,7 +96,7 @@ public class DBTasksTest extends InstrumentationTestCase { assertTrue(item.getId() != 0); assertTrue(item.getMedia().getId() != 0); } - DBTasks.performAutoCleanup(getInstrumentation().getTargetContext()); + DBTasks.performAutoCleanup(context); for (int i = 0; i < files.size(); i++) { if (i < EPISODE_CACHE_SIZE) { assertTrue(files.get(i).exists()); @@ -101,6 +106,7 @@ public class DBTasksTest extends InstrumentationTestCase { } } + @FlakyTest(tolerance = 3) public void testPerformAutoCleanupShouldNotDeleteBecauseUnread() throws IOException { final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; @@ -119,7 +125,7 @@ public class DBTasksTest extends InstrumentationTestCase { items.add(item); } - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); + PodDBAdapter adapter = new PodDBAdapter(context); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -129,12 +135,13 @@ public class DBTasksTest extends InstrumentationTestCase { assertTrue(item.getId() != 0); assertTrue(item.getMedia().getId() != 0); } - DBTasks.performAutoCleanup(getInstrumentation().getTargetContext()); + 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; @@ -153,7 +160,7 @@ public class DBTasksTest extends InstrumentationTestCase { items.add(item); } - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); + PodDBAdapter adapter = new PodDBAdapter(context); adapter.open(); adapter.setCompleteFeed(feed); adapter.setQueue(items); @@ -164,7 +171,7 @@ public class DBTasksTest extends InstrumentationTestCase { assertTrue(item.getId() != 0); assertTrue(item.getMedia().getId() != 0); } - DBTasks.performAutoCleanup(getInstrumentation().getTargetContext()); + DBTasks.performAutoCleanup(context); for (File file : files) { assertTrue(file.exists()); } @@ -175,13 +182,13 @@ public class DBTasksTest extends InstrumentationTestCase { * 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 { - final Context context = getInstrumentation().getTargetContext(); // add feed with no enclosures so that item ID != media ID saveFeedlist(context, 1, 10, false); // add candidate for performAutoCleanup - List<Feed> feeds = saveFeedlist(getInstrumentation().getTargetContext(), 1, 1, true); + List<Feed> feeds = saveFeedlist(context, 1, 1, true); FeedMedia m = feeds.get(0).getItems().get(0).getMedia(); m.setDownloaded(true); m.setFile_url("file"); @@ -193,8 +200,8 @@ public class DBTasksTest extends InstrumentationTestCase { testPerformAutoCleanupShouldNotDeleteBecauseInQueue(); } + @FlakyTest(tolerance = 3) public void testUpdateFeedNewFeed() { - final Context context = getInstrumentation().getTargetContext(); final int NUM_ITEMS = 10; Feed feed = new Feed("url", new Date(), "title"); @@ -214,7 +221,6 @@ public class DBTasksTest extends InstrumentationTestCase { /** Two feeds with the same title, but different download URLs should be treated as different feeds. */ public void testUpdateFeedSameTitle() { - final Context context = getInstrumentation().getTargetContext(); Feed feed1 = new Feed("url1", new Date(), "title"); Feed feed2 = new Feed("url2", new Date(), "title"); @@ -229,7 +235,6 @@ public class DBTasksTest extends InstrumentationTestCase { } public void testUpdateFeedUpdatedFeed() { - final Context context = getInstrumentation().getTargetContext(); final int NUM_ITEMS_OLD = 10; final int NUM_ITEMS_NEW = 10; @@ -269,6 +274,7 @@ public class DBTasksTest extends InstrumentationTestCase { updatedFeedTest(feedFromDB, feedID, itemIDs, NUM_ITEMS_OLD, NUM_ITEMS_NEW); } + @FlakyTest(tolerance = 3) private void updatedFeedTest(final Feed newFeed, long feedID, List<Long> itemIDs, final int NUM_ITEMS_OLD, final int NUM_ITEMS_NEW) { assertTrue(newFeed.getId() == feedID); assertTrue(newFeed.getItems().size() == NUM_ITEMS_NEW + NUM_ITEMS_OLD); @@ -292,11 +298,11 @@ public class DBTasksTest extends InstrumentationTestCase { } } + @FlakyTest(tolerance = 3) private void expiredFeedListTestHelper(long lastUpdate, long expirationTime, boolean shouldReturn) { - final Context context = getInstrumentation().getTargetContext(); UserPreferences.setUpdateInterval(context, expirationTime); Feed feed = new Feed(0, new Date(lastUpdate), "feed", "link", "descr", null, - null, null, null, "feed", null, null, "url", false, new FlattrStatus(), false, null); + null, null, null, "feed", null, null, "url", false, new FlattrStatus(), false, null, null, false); feed.setItems(new ArrayList<FeedItem>()); PodDBAdapter adapter = new PodDBAdapter(context); adapter.open(); @@ -314,11 +320,13 @@ public class DBTasksTest extends InstrumentationTestCase { } } + @FlakyTest(tolerance = 3) public void testGetExpiredFeedsTestShouldReturn() { final long expirationTime = 1000 * 60 * 60; expiredFeedListTestHelper(System.currentTimeMillis() - expirationTime - 1, expirationTime, true); } + @FlakyTest(tolerance = 3) public void testGetExpiredFeedsTestShouldNotReturn() { final long expirationTime = 1000 * 60 * 60; expiredFeedListTestHelper(System.currentTimeMillis() - expirationTime / 2, expirationTime, false); diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java b/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java index 17c926cc2..4f33cd798 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java @@ -47,7 +47,7 @@ public class DBTestUtils { adapter.open(); for (int i = 0; i < numFeeds; i++) { Feed f = new Feed(0, new Date(), "feed " + i, "link" + i, "descr", null, null, - null, null, "id" + i, null, null, "url" + i, false, new FlattrStatus(), false, null); + null, null, "id" + i, null, null, "url" + i, false, new FlattrStatus(), false, null, null, false); f.setItems(new ArrayList<FeedItem>()); for (int j = 0; j < numItems; j++) { FeedItem item = new FeedItem(0, "item " + j, "id" + j, "link" + j, new Date(), diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java index ec8e19e22..f3b0c9165 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java @@ -5,16 +5,6 @@ import android.database.Cursor; import android.test.InstrumentationTestCase; import android.util.Log; -import de.danoeh.antennapod.core.feed.Chapter; -import de.danoeh.antennapod.core.feed.Feed; -import de.danoeh.antennapod.core.feed.FeedImage; -import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.feed.SimpleChapter; -import de.danoeh.antennapod.core.storage.DBReader; -import de.danoeh.antennapod.core.storage.DBWriter; -import de.danoeh.antennapod.core.storage.PodDBAdapter; - import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -25,6 +15,16 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import de.danoeh.antennapod.core.feed.Chapter; +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedImage; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.SimpleChapter; +import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.storage.PodDBAdapter; + /** * Test class for DBWriter */ @@ -674,13 +674,13 @@ public class DBWriterTest extends InstrumentationTestCase { assertTrue(item.getId() != 0); } for (int removeIndex = 0; removeIndex < NUM_ITEMS; removeIndex++) { - final long id = feed.getItems().get(removeIndex).getId(); + final FeedItem item = feed.getItems().get(removeIndex); adapter = new PodDBAdapter(context); adapter.open(); adapter.setQueue(feed.getItems()); adapter.close(); - DBWriter.removeQueueItem(context, id, false).get(TIMEOUT, TimeUnit.SECONDS); + DBWriter.removeQueueItem(context, item, false).get(TIMEOUT, TimeUnit.SECONDS); adapter = new PodDBAdapter(context); adapter.open(); Cursor queue = adapter.getQueueIDCursor(); @@ -688,10 +688,10 @@ public class DBWriterTest extends InstrumentationTestCase { for (int i = 0; i < queue.getCount(); i++) { assertTrue(queue.moveToPosition(i)); final long queueID = queue.getLong(0); - assertTrue(queueID != id); // removed item is no longer in queue + assertTrue(queueID != item.getId()); // removed item is no longer in queue boolean idFound = false; - for (FeedItem item : feed.getItems()) { // items that were not removed are still in the queue - idFound = idFound | (item.getId() == queueID); + for (FeedItem other : feed.getItems()) { // items that were not removed are still in the queue + idFound = idFound | (other.getId() == queueID); } assertTrue(idFound); } diff --git a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java index bbcc4ce5c..0326174e3 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java @@ -3,15 +3,26 @@ package de.test.antennapod.ui; import android.content.Context; import android.content.SharedPreferences; import android.test.ActivityInstrumentationTestCase2; +import android.test.FlakyTest; import android.widget.ListView; import com.robotium.solo.Solo; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.DefaultOnlineFeedViewActivity; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.fragment.AllEpisodesFragment; +import de.danoeh.antennapod.fragment.DownloadsFragment; +import de.danoeh.antennapod.fragment.NewEpisodesFragment; +import de.danoeh.antennapod.fragment.PlaybackHistoryFragment; +import de.danoeh.antennapod.fragment.QueueFragment; import de.danoeh.antennapod.preferences.PreferenceController; /** @@ -22,6 +33,8 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv private Solo solo; private UITestUtils uiTestUtils; + private SharedPreferences prefs; + public MainActivityTest() { super(MainActivity.class); } @@ -38,7 +51,7 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv adapter.close(); // override first launch preference - SharedPreferences prefs = getInstrumentation().getTargetContext().getSharedPreferences(MainActivity.PREF_NAME, Context.MODE_PRIVATE); + prefs = getInstrumentation().getTargetContext().getSharedPreferences(MainActivity.PREF_NAME, Context.MODE_PRIVATE); prefs.edit().putBoolean(MainActivity.PREF_IS_FIRST_LAUNCH, false).commit(); } @@ -46,7 +59,12 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv protected void tearDown() throws Exception { uiTestUtils.tearDown(); solo.finishOpenedActivities(); + PodDBAdapter.deleteDatabase(getInstrumentation().getTargetContext()); + + // reset preferences + prefs.edit().clear().commit(); + super.tearDown(); } @@ -68,14 +86,17 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv solo.waitForText(solo.getString(R.string.subscribed_label)); } + @FlakyTest(tolerance = 3) public void testClickNavDrawer() throws Exception { uiTestUtils.addLocalFeedData(false); - // all episodes + UserPreferences.setHiddenDrawerItems(getInstrumentation().getTargetContext(), new ArrayList<String>()); + + // queue openNavDrawer(); - solo.clickOnText(solo.getString(R.string.all_episodes_label)); + solo.clickOnText(solo.getString(R.string.queue_label)); solo.waitForView(android.R.id.list); - assertEquals(solo.getString(R.string.all_episodes_label), getActionbarTitle()); + assertEquals(solo.getString(R.string.queue_label), getActionbarTitle()); // new episodes openNavDrawer(); @@ -83,11 +104,11 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv solo.waitForView(android.R.id.list); assertEquals(solo.getString(R.string.new_episodes_label), getActionbarTitle()); - // queue + // all episodes openNavDrawer(); - solo.clickOnText(solo.getString(R.string.queue_label)); + solo.clickOnText(solo.getString(R.string.all_episodes_label)); solo.waitForView(android.R.id.list); - assertEquals(solo.getString(R.string.queue_label), getActionbarTitle()); + assertEquals(solo.getString(R.string.all_episodes_label), getActionbarTitle()); // downloads openNavDrawer(); @@ -123,9 +144,78 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv return ((MainActivity)solo.getCurrentActivity()).getMainActivtyActionBar().getTitle().toString(); } + @FlakyTest(tolerance = 3) public void testGoToPreferences() { openNavDrawer(); - solo.clickOnMenuItem(solo.getString(R.string.settings_label)); + solo.clickOnText(solo.getString(R.string.settings_label)); solo.waitForActivity(PreferenceController.getPreferenceActivity()); } + + public void testDrawerPreferencesHideSomeElements() { + UserPreferences.setHiddenDrawerItems(getInstrumentation().getTargetContext(), new ArrayList<String>()); + openNavDrawer(); + solo.clickLongOnText(solo.getString(R.string.queue_label)); + solo.waitForDialogToOpen(); + solo.clickOnText(solo.getString(R.string.all_episodes_label)); + solo.clickOnText(solo.getString(R.string.playback_history_label)); + solo.clickOnText(solo.getString(R.string.confirm_label)); + solo.waitForDialogToClose(); + List<String> hidden = UserPreferences.getHiddenDrawerItems(); + assertEquals(2, hidden.size()); + assertTrue(hidden.contains(AllEpisodesFragment.TAG)); + assertTrue(hidden.contains(PlaybackHistoryFragment.TAG)); + } + + public void testDrawerPreferencesUnhideSomeElements() { + List<String> hidden = Arrays.asList(NewEpisodesFragment.TAG, DownloadsFragment.TAG); + UserPreferences.setHiddenDrawerItems(getInstrumentation().getTargetContext(), hidden); + openNavDrawer(); + solo.clickLongOnText(solo.getString(R.string.queue_label)); + solo.waitForDialogToOpen(); + solo.clickOnText(solo.getString(R.string.downloads_label)); + solo.clickOnText(solo.getString(R.string.queue_label)); + solo.clickOnText(solo.getString(R.string.confirm_label)); + solo.waitForDialogToClose(); + hidden = UserPreferences.getHiddenDrawerItems(); + assertEquals(2, hidden.size()); + assertTrue(hidden.contains(QueueFragment.TAG)); + assertTrue(hidden.contains(NewEpisodesFragment.TAG)); + } + + public void testDrawerPreferencesHideAllElements() { + UserPreferences.setHiddenDrawerItems(getInstrumentation().getTargetContext(), new ArrayList<String>()); + String[] titles = getInstrumentation().getTargetContext().getResources().getStringArray(R.array.nav_drawer_titles); + + openNavDrawer(); + solo.clickLongOnText(solo.getString(R.string.queue_label)); + solo.waitForDialogToOpen(); + for(String title : titles) { + solo.clickOnText(title); + } + solo.clickOnText(solo.getString(R.string.confirm_label)); + solo.waitForDialogToClose(); + List<String> hidden = UserPreferences.getHiddenDrawerItems(); + assertEquals(6, hidden.size()); + for(String tag : MainActivity.NAV_DRAWER_TAGS) { + assertTrue(hidden.contains(tag)); + } + } + + public void testDrawerPreferencesHideCurrentElement() { + UserPreferences.setHiddenDrawerItems(getInstrumentation().getTargetContext(), new ArrayList<String>()); + + openNavDrawer(); + String downloads = solo.getString(R.string.downloads_label); + solo.clickOnText(downloads); + solo.waitForView(android.R.id.list); + openNavDrawer(); + solo.clickLongOnText(downloads); + solo.waitForDialogToOpen(); + solo.clickOnText(downloads); + solo.clickOnText(solo.getString(R.string.confirm_label)); + solo.waitForDialogToClose(); + List<String> hidden = UserPreferences.getHiddenDrawerItems(); + assertEquals(1, hidden.size()); + assertTrue(hidden.contains(DownloadsFragment.TAG)); + } } diff --git a/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java b/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java index 8f1477192..775bc0ecd 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java @@ -1,17 +1,18 @@ package de.test.antennapod.ui; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.test.ActivityInstrumentationTestCase2; -import android.widget.TextView; +import com.robotium.solo.Condition; import com.robotium.solo.Solo; +import com.robotium.solo.Timeout; import java.util.List; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.activity.AudioplayerActivity; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.preferences.UserPreferences; @@ -28,6 +29,8 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> private Solo solo; private UITestUtils uiTestUtils; + private Context context; + public PlaybackTest() { super(MainActivity.class); } @@ -36,28 +39,33 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> public void setUp() throws Exception { super.setUp(); solo = new Solo(getInstrumentation(), getActivity()); - uiTestUtils = new UITestUtils(getInstrumentation().getTargetContext()); + context = getInstrumentation().getContext(); + + uiTestUtils = new UITestUtils(context); uiTestUtils.setup(); + // create database - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); + PodDBAdapter adapter = new PodDBAdapter(context); adapter.open(); adapter.close(); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getInstrumentation().getTargetContext()); - prefs.edit().putBoolean(UserPreferences.PREF_UNPAUSE_ON_HEADSET_RECONNECT, false).commit(); - prefs.edit().putBoolean(UserPreferences.PREF_PAUSE_ON_HEADSET_DISCONNECT, false).commit(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + prefs.edit() + .putBoolean(UserPreferences.PREF_UNPAUSE_ON_HEADSET_RECONNECT, false) + .putBoolean(UserPreferences.PREF_PAUSE_ON_HEADSET_DISCONNECT, false) + .putString(UserPreferences.PREF_HIDDEN_DRAWER_ITEMS, "") + .commit(); } @Override public void tearDown() throws Exception { uiTestUtils.tearDown(); solo.finishOpenedActivities(); - PodDBAdapter.deleteDatabase(getInstrumentation().getTargetContext()); + PodDBAdapter.deleteDatabase(context); // shut down playback service skipEpisode(); - getInstrumentation().getTargetContext().sendBroadcast( - new Intent(PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE)); + context.sendBroadcast(new Intent(PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE)); super.tearDown(); } @@ -67,70 +75,97 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> } private void setContinuousPlaybackPreference(boolean value) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getInstrumentation().getTargetContext()); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs.edit().putBoolean(UserPreferences.PREF_FOLLOW_QUEUE, value).commit(); } private void skipEpisode() { Intent skipIntent = new Intent(PlaybackService.ACTION_SKIP_CURRENT_EPISODE); - getInstrumentation().getTargetContext().sendBroadcast(skipIntent); + context.sendBroadcast(skipIntent); } private void startLocalPlayback() { - assertTrue(solo.waitForActivity(MainActivity.class)); openNavDrawer(); + solo.clickOnText(solo.getString(R.string.all_episodes_label)); - solo.waitForView(android.R.id.list); + final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(context, 10); + assertTrue(solo.waitForView(solo.getView(R.id.butSecondaryAction))); + solo.clickOnView(solo.getView(R.id.butSecondaryAction)); - assertTrue(solo.waitForActivity(AudioplayerActivity.class)); assertTrue(solo.waitForView(solo.getView(R.id.butPlay))); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return episodes.get(0).getMedia().isCurrentlyPlaying(); + } + }, Timeout.getLargeTimeout()); } private void startLocalPlaybackFromQueue() { - assertTrue(solo.waitForActivity(MainActivity.class)); - openNavDrawer(); - solo.clickOnText(solo.getString(R.string.queue_label)); assertTrue(solo.waitForView(solo.getView(R.id.butSecondaryAction))); + final List<FeedItem> queue = DBReader.getQueue(context); solo.clickOnImageButton(1); - assertTrue(solo.waitForActivity(AudioplayerActivity.class)); assertTrue(solo.waitForView(solo.getView(R.id.butPlay))); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return queue.get(0).getMedia().isCurrentlyPlaying(); + } + }, Timeout.getLargeTimeout()); } public void testStartLocal() throws Exception { uiTestUtils.addLocalFeedData(true); - DBWriter.clearQueue(getInstrumentation().getTargetContext()).get(); + DBWriter.clearQueue(context).get(); startLocalPlayback(); - - solo.clickOnView(solo.getView(R.id.butPlay)); } public void testContinousPlaybackOffSingleEpisode() throws Exception { setContinuousPlaybackPreference(false); uiTestUtils.addLocalFeedData(true); - DBWriter.clearQueue(getInstrumentation().getTargetContext()).get(); + DBWriter.clearQueue(context).get(); startLocalPlayback(); - assertTrue(solo.waitForActivity(MainActivity.class)); } public void testContinousPlaybackOffMultipleEpisodes() throws Exception { setContinuousPlaybackPreference(false); uiTestUtils.addLocalFeedData(true); - List<FeedItem> queue = DBReader.getQueue(getInstrumentation().getTargetContext()); - FeedItem second = queue.get(0); + List<FeedItem> queue = DBReader.getQueue(context); + final FeedItem first = queue.get(0); + final FeedItem second = queue.get(1); startLocalPlaybackFromQueue(); - assertTrue(solo.waitForText(second.getTitle())); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return first.getMedia().isCurrentlyPlaying() == false; + } + }, 10000); + Thread.sleep(1000); + assertTrue(second.getMedia().isCurrentlyPlaying() == false); } public void testContinuousPlaybackOnMultipleEpisodes() throws Exception { setContinuousPlaybackPreference(true); uiTestUtils.addLocalFeedData(true); - List<FeedItem> queue = DBReader.getQueue(getInstrumentation().getTargetContext()); - FeedItem second = queue.get(1); + List<FeedItem> queue = DBReader.getQueue(context); + final FeedItem first = queue.get(0); + final FeedItem second = queue.get(1); startLocalPlaybackFromQueue(); - assertTrue(solo.waitForText(second.getTitle())); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return first.getMedia().isCurrentlyPlaying() == false; + } + }, 10000); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return second.getMedia().isCurrentlyPlaying() == true; + } + }, 10000); } /** @@ -139,14 +174,24 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> private void replayEpisodeCheck(boolean followQueue) throws Exception { setContinuousPlaybackPreference(followQueue); uiTestUtils.addLocalFeedData(true); - DBWriter.clearQueue(getInstrumentation().getTargetContext()).get(); - String title = ((TextView) solo.getView(R.id.txtvTitle)).getText().toString(); + DBWriter.clearQueue(context).get(); + final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(context, 10); + startLocalPlayback(); - assertTrue(solo.waitForText(title)); - assertTrue(solo.waitForActivity(MainActivity.class)); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return false == episodes.get(0).getMedia().isCurrentlyPlaying(); + } + }, Timeout.getLargeTimeout()); + startLocalPlayback(); - assertTrue(solo.waitForText(title)); - assertTrue(solo.waitForActivity(MainActivity.class)); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return false == episodes.get(0).getMedia().isCurrentlyPlaying(); + } + }, Timeout.getLargeTimeout()); } public void testReplayEpisodeContinuousPlaybackOn() throws Exception { diff --git a/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java b/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java new file mode 100644 index 000000000..eb1cb9c71 --- /dev/null +++ b/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java @@ -0,0 +1,453 @@ +package de.test.antennapod.ui; + +import android.content.Context; +import android.content.res.Resources; +import android.test.ActivityInstrumentationTestCase2; +import android.test.FlakyTest; + +import com.robotium.solo.Condition; +import com.robotium.solo.Solo; +import com.robotium.solo.Timeout; + +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.PreferenceActivity; +import de.danoeh.antennapod.core.preferences.UserPreferences; + +public class PreferencesTest extends ActivityInstrumentationTestCase2<PreferenceActivity> { + + private static final String TAG = "PreferencesTest"; + + private Solo solo; + private Context context; + private Resources res; + + public PreferencesTest() { + super(PreferenceActivity.class); + } + + @Override + public void setUp() throws Exception { + super.setUp(); + solo = new Solo(getInstrumentation(), getActivity()); + Timeout.setSmallTimeout(500); + Timeout.setLargeTimeout(1000); + context = getInstrumentation().getTargetContext(); + res = getActivity().getResources(); + UserPreferences.createInstance(context); + } + + @Override + public void tearDown() throws Exception { + solo.finishOpenedActivities(); + super.tearDown(); + } + + public void testSwitchTheme() { + final int theme = UserPreferences.getTheme(); + int otherTheme; + if(theme == de.danoeh.antennapod.core.R.style.Theme_AntennaPod_Light) { + otherTheme = R.string.pref_theme_title_dark; + } else { + otherTheme = R.string.pref_theme_title_light; + } + 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()); + } + + public void testSwitchThemeBack() { + final int theme = UserPreferences.getTheme(); + int otherTheme; + if(theme == de.danoeh.antennapod.core.R.style.Theme_AntennaPod_Light) { + otherTheme = R.string.pref_theme_title_dark; + } else { + otherTheme = R.string.pref_theme_title_light; + } + 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()); + } + + 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()); + solo.clickOnText(solo.getString(R.string.pref_expandNotify_title)); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return 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()); + solo.clickOnText(solo.getString(R.string.pref_persistNotify_title)); + solo.waitForCondition(new Condition() { + @Override public boolean isSatisfied() { + return 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()); + solo.clickOnText(solo.getString(R.string.pref_queueAddToFront_title)); + solo.waitForCondition(new Condition() { + @Override public boolean isSatisfied() { + return 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()); + solo.clickOnText(solo.getString(R.string.pref_pauseOnHeadsetDisconnect_title)); + solo.waitForCondition(new Condition() { + @Override public boolean isSatisfied() { + return 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()); + } + 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()); + solo.clickOnText(solo.getString(R.string.pref_unpauseOnHeadsetReconnect_title)); + solo.waitForCondition(new Condition() { + @Override public boolean isSatisfied() { + return 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()); + solo.clickOnText(solo.getString(R.string.pref_followQueue_title)); + solo.waitForCondition(new Condition() { + @Override public boolean isSatisfied() { + return 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()); + solo.clickOnText(solo.getString(R.string.pref_auto_delete_title)); + solo.waitForCondition(new Condition() { + @Override public boolean isSatisfied() { + return autoDelete == UserPreferences.isAutoDelete(); + } + }, Timeout.getLargeTimeout()); + } + + public void testPlaybackSpeeds() { + solo.clickOnText(solo.getString(R.string.pref_playback_speed_title)); + solo.waitForDialogToOpen(1000); + assertTrue(solo.searchText(solo.getString(R.string.no_playback_plugin_title))); + solo.clickOnText(solo.getString(R.string.close_label)); + solo.waitForDialogToClose(1000); + } + + 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()); + solo.clickOnText(solo.getString(R.string.pref_auto_delete_title)); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return pauseForFocusLoss == UserPreferences.shouldPauseForFocusLoss(); + } + }, Timeout.getLargeTimeout()); + } + + public void testDisableUpdateInterval() { + solo.clickOnText(solo.getString(R.string.pref_autoUpdateIntervall_title)); + solo.waitForDialogToOpen(); + solo.clickOnText(solo.getString(R.string.pref_update_interval_hours_manual)); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return UserPreferences.getUpdateInterval() == 0; + } + }, 1000); + } + + public void testSetUpdateInterval() { + solo.clickOnText(solo.getString(R.string.pref_autoUpdateIntervall_title)); + solo.waitForDialogToOpen(); + 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()); + } + + 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()); + solo.clickOnText(solo.getString(R.string.pref_mobileUpdate_title)); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return mobileUpdates == UserPreferences.isAllowMobileUpdate(); + } + }, Timeout.getLargeTimeout()); + } + + public void testSetSequentialDownload() { + solo.clickOnText(solo.getString(R.string.pref_parallel_downloads_title)); + solo.waitForDialogToOpen(); + 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()); + } + + public void testSetParallelDownloads() { + solo.clickOnText(solo.getString(R.string.pref_parallel_downloads_title)); + solo.waitForDialogToOpen(); + 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()); + } + + public void testSetParallelDownloadsInvalidInput() { + solo.clickOnText(solo.getString(R.string.pref_parallel_downloads_title)); + solo.waitForDialogToOpen(); + solo.clearEditText(0); + solo.enterText(0, "0"); + assertEquals("1", solo.getEditText(0).getText().toString()); + solo.clearEditText(0); + solo.enterText(0, "100"); + assertEquals("50", solo.getEditText(0).getText().toString()); + } + + public void testSetEpisodeCache() { + String[] entries = res.getStringArray(R.array.episode_cache_size_entries); + String[] values = res.getStringArray(R.array.episode_cache_size_values); + String entry = entries[entries.length/2]; + final int value = Integer.valueOf(values[values.length/2]); + 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()); + } + + public void testSetEpisodeCacheMin() { + String[] entries = res.getStringArray(R.array.episode_cache_size_entries); + String[] values = res.getStringArray(R.array.episode_cache_size_values); + String minEntry = entries[0]; + final int minValue = Integer.valueOf(values[0]); + solo.clickOnText(solo.getString(R.string.pref_episode_cache_title)); + solo.waitForDialogToOpen(1000); + solo.scrollUp(); + solo.clickOnText(minEntry); + solo.waitForCondition(new Condition() { + @Override + public boolean isSatisfied() { + return UserPreferences.getEpisodeCacheSize() == minValue; + } + }, Timeout.getLargeTimeout()); + } + + + public void testSetEpisodeCacheMax() { + String[] entries = res.getStringArray(R.array.episode_cache_size_entries); + String[] values = res.getStringArray(R.array.episode_cache_size_values); + String maxEntry = entries[entries.length-1]; + final int maxValue = Integer.valueOf(values[values.length-1]); + 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()); + } + + public void testAutomaticDownload() { + final boolean automaticDownload = UserPreferences.isEnableAutodownload(); + 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()); + 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()); + 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()); + 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()); + 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()); + } + + @FlakyTest(tolerance = 3) + public void testAbout() throws IOException { + int numViews = 0, numLinks = 0; + InputStream input = getActivity().getResources().getAssets().open("about.html"); + List<String> lines = IOUtils.readLines(input); + input.close(); + for(String line : lines) { + if(line.contains("(View)")) { + numViews++; + } else if(line.contains("(Link)")) { + numLinks++; + } + } + for(int i=0; i < numViews; i++) { + solo.clickOnText(solo.getString(R.string.about_pref)); + solo.clickOnText("(View)", i); + solo.goBack(); + } + for(int i=0; i < numLinks; i++) { + solo.clickOnText(solo.getString(R.string.about_pref)); + solo.clickOnText("(Link)", i); + solo.goBack(); + } + } + +} diff --git a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java index 249cb0dd6..613826932 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java @@ -25,7 +25,9 @@ import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedImage; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.QueueEvent; import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.greenrobot.event.EventBus; import de.test.antennapod.util.service.download.HTTPBin; import de.test.antennapod.util.syndication.feedgenerator.RSS2Generator; @@ -139,11 +141,12 @@ public class UITestUtils { // create items List<FeedItem> items = new ArrayList<FeedItem>(); for (int j = 0; j < NUM_ITEMS_PER_FEED; j++) { - FeedItem item = new FeedItem(0, "item" + j, "item" + j, "http://example.com/feed" + i + "/item/" + j, new Date(), true, feed); + FeedItem item = new FeedItem(j, "Feed " + (i+1) + ": Item " + (j+1), "item" + j, + "http://example.com/feed" + i + "/item/" + j, new Date(), false, feed); items.add(item); File mediaFile = newMediaFile("feed-" + i + "-episode-" + j + ".mp3"); - item.setMedia(new FeedMedia(0, item, 0, 0, mediaFile.length(), "audio/mp3", null, hostFile(mediaFile), false, null, 0)); + item.setMedia(new FeedMedia(j, item, 0, 0, mediaFile.length(), "audio/mp3", null, hostFile(mediaFile), false, null, 0)); } feed.setItems(items); @@ -167,7 +170,9 @@ public class UITestUtils { * @param downloadEpisodes true if episodes should also be marked as downloaded. */ public void addLocalFeedData(boolean downloadEpisodes) throws Exception { - if (localFeedDataAdded) throw new IllegalStateException("addLocalFeedData was called twice on the same instance"); + if (localFeedDataAdded) { + throw new IllegalStateException("addLocalFeedData was called twice on the same instance"); + } if (!feedDataHosted) { addHostedFeedData(); } @@ -202,6 +207,6 @@ public class UITestUtils { adapter.setQueue(queue); adapter.close(); EventDistributor.getInstance().sendFeedUpdateBroadcast(); - EventDistributor.getInstance().sendQueueUpdateBroadcast(); + EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.ADDED_ITEMS, queue)); } } diff --git a/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/AtomGenerator.java b/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/AtomGenerator.java index 69cc827ec..bd3df0f9d 100644 --- a/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/AtomGenerator.java +++ b/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/AtomGenerator.java @@ -1,15 +1,17 @@ package de.test.antennapod.util.syndication.feedgenerator; import android.util.Xml; -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.syndication.util.SyndDateUtils; + import org.xmlpull.v1.XmlSerializer; import java.io.IOException; import java.io.OutputStream; +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.util.DateUtils; + /** * Creates Atom feeds. See FeedGenerator for more information. */ @@ -83,9 +85,9 @@ public class AtomGenerator implements FeedGenerator{ if (item.getPubDate() != null) { xml.startTag(null, "published"); if ((flags & FEATURE_USE_RFC3339LOCAL) != 0) { - xml.text(SyndDateUtils.formatRFC3339Local(item.getPubDate())); + xml.text(DateUtils.formatRFC3339Local(item.getPubDate())); } else { - xml.text(SyndDateUtils.formatRFC3339UTC(item.getPubDate())); + xml.text(DateUtils.formatRFC3339UTC(item.getPubDate())); } xml.endTag(null, "published"); } diff --git a/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/RSS2Generator.java b/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/RSS2Generator.java index d37434f06..27e89620d 100644 --- a/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/RSS2Generator.java +++ b/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/RSS2Generator.java @@ -3,7 +3,7 @@ package de.test.antennapod.util.syndication.feedgenerator; import android.util.Xml; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.syndication.util.SyndDateUtils; +import de.danoeh.antennapod.core.util.DateUtils; import org.xmlpull.v1.XmlSerializer; import java.io.IOException; @@ -79,7 +79,7 @@ public class RSS2Generator implements FeedGenerator{ } if (item.getPubDate() != null) { xml.startTag(null, "pubDate"); - xml.text(SyndDateUtils.formatRFC822Date(item.getPubDate())); + xml.text(DateUtils.formatRFC822Date(item.getPubDate())); xml.endTag(null, "pubDate"); } if ((flags & FEATURE_WRITE_GUID) != 0) { |