diff options
Diffstat (limited to 'src/instrumentationTest')
6 files changed, 403 insertions, 4 deletions
diff --git a/src/instrumentationTest/de/test/antennapod/AntennaPodTestRunner.java b/src/instrumentationTest/de/test/antennapod/AntennaPodTestRunner.java index 7aaa14909..e1699139d 100644 --- a/src/instrumentationTest/de/test/antennapod/AntennaPodTestRunner.java +++ b/src/instrumentationTest/de/test/antennapod/AntennaPodTestRunner.java @@ -12,7 +12,9 @@ public class AntennaPodTestRunner extends InstrumentationTestRunner { @Override public TestSuite getAllTests() { - return new TestSuiteBuilder(AntennaPodTestRunner.class).includeAllPackagesUnderHere().build(); - //return new TestSuiteBuilder(AntennaPodTestRunner.class).includeAllPackagesUnderHere().excludePackages("instrumentationTest.de.test.antennapod.syndication.handler").build(); + return new TestSuiteBuilder(AntennaPodTestRunner.class).includeAllPackagesUnderHere() + // .excludePackages("instrumentationTest.de.test.antennapod.syndication.handler") + // .excludePackages("instrumentationTest.de.test.antennapod.gpodnet") + .build(); } } diff --git a/src/instrumentationTest/de/test/antennapod/service/download/HttpDownloaderTest.java b/src/instrumentationTest/de/test/antennapod/service/download/HttpDownloaderTest.java index 8df35ce67..5506a3bc9 100644 --- a/src/instrumentationTest/de/test/antennapod/service/download/HttpDownloaderTest.java +++ b/src/instrumentationTest/de/test/antennapod/service/download/HttpDownloaderTest.java @@ -108,6 +108,12 @@ public class HttpDownloaderTest extends InstrumentationTestCase { assertFalse(new File(feedFile.getFile_url()).exists()); } + /* TODO: replace with smaller test file + public void testUrlWithSpaces() { + download("http://acedl.noxsolutions.com/ace/Don't Call Salman Rushdie Sneezy in Finland.mp3", "testUrlWithSpaces", true); + } + */ + private static class FeedFileImpl extends FeedFile { public FeedFileImpl(String download_url) { super(null, download_url, false); diff --git a/src/instrumentationTest/de/test/antennapod/storage/DBReaderTest.java b/src/instrumentationTest/de/test/antennapod/storage/DBReaderTest.java index 0fb733b67..91ac61867 100644 --- a/src/instrumentationTest/de/test/antennapod/storage/DBReaderTest.java +++ b/src/instrumentationTest/de/test/antennapod/storage/DBReaderTest.java @@ -1,11 +1,289 @@ package instrumentationTest.de.test.antennapod.storage; +import android.content.Context; import android.test.InstrumentationTestCase; +import de.danoeh.antennapod.feed.Feed; +import de.danoeh.antennapod.feed.FeedItem; +import de.danoeh.antennapod.storage.DBReader; +import de.danoeh.antennapod.storage.PodDBAdapter; +import static instrumentationTest.de.test.antennapod.storage.DBTestUtils.*; + +import java.util.*; /** * Test class for DBReader */ public class DBReaderTest extends InstrumentationTestCase { + @Override + protected void tearDown() throws Exception { + super.tearDown(); + final Context context = getInstrumentation().getTargetContext(); + assertTrue(PodDBAdapter.deleteDatabase(context)); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + final Context context = getInstrumentation().getTargetContext(); + context.deleteDatabase(PodDBAdapter.DATABASE_NAME); + // make sure database is created + PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + adapter.close(); + } + + 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); + feed.setItems(new ArrayList<FeedItem>()); + PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.close(); + + assertTrue(feed.getId() != 0); + List<Feed> expiredFeeds = DBReader.getExpiredFeedsList(context, expirationTime); + assertNotNull(expiredFeeds); + if (shouldReturn) { + assertTrue(expiredFeeds.size() == 1); + assertTrue(expiredFeeds.get(0).getId() == feed.getId()); + } else { + assertTrue(expiredFeeds.isEmpty()); + } + } + + public void testGetExpiredFeedsListShouldReturnFeed() { + final long expirationTime = 1000 * 60 * 60; // 1 hour + expiredFeedListTestHelper(System.currentTimeMillis() - expirationTime - 1, expirationTime, true); + } + + public void testGetExpiredFeedsListShouldNotReturnFeed() { + final long expirationTime = 1000 * 60 * 60; // 1 hour + expiredFeedListTestHelper(System.currentTimeMillis() - expirationTime / 2, expirationTime, false); + } + + + + public void testGetFeedList() { + final Context context = getInstrumentation().getTargetContext(); + List<Feed> feeds = saveFeedlist(context, 10, 0, false); + List<Feed> savedFeeds = DBReader.getFeedList(context); + assertNotNull(savedFeeds); + assertTrue(savedFeeds.size() == feeds.size()); + for (int i = 0; i < feeds.size(); i++) { + assertTrue(savedFeeds.get(i).getId() == feeds.get(i).getId()); + } + } + + public void testFeedListDownloadUrls() { + final Context context = getInstrumentation().getTargetContext(); + List<Feed> feeds = saveFeedlist(context, 10, 0, false); + List<String> urls = DBReader.getFeedListDownloadUrls(context); + assertNotNull(urls); + assertTrue(urls.size() == feeds.size()); + for (int i = 0; i < urls.size(); i++) { + assertEquals(urls.get(i), feeds.get(i).getDownload_url()); + } + } + + public void testLoadFeedDataOfFeedItemlist() { + final Context context = getInstrumentation().getTargetContext(); + final int numFeeds = 10; + final int numItems = 1; + List<Feed> feeds = saveFeedlist(context, numFeeds, numItems, false); + List<FeedItem> items = new ArrayList<FeedItem>(); + for (Feed f : feeds) { + for (FeedItem item : f.getItems()) { + item.setFeed(null); + item.setFeedId(f.getId()); + items.add(item); + } + } + DBReader.loadFeedDataOfFeedItemlist(context, items); + for (int i = 0; i < numFeeds; i++) { + for (int j = 0; j < numItems; j++) { + FeedItem item = feeds.get(i).getItems().get(j); + assertNotNull(item.getFeed()); + assertTrue(item.getFeed().getId() == feeds.get(i).getId()); + assertTrue(item.getFeedId() == item.getFeed().getId()); + } + } + } + + public void testGetFeedItemList() { + final Context context = getInstrumentation().getTargetContext(); + final int numFeeds = 1; + final int numItems = 10; + Feed feed = saveFeedlist(context, numFeeds, numItems, false).get(0); + List<FeedItem> items = feed.getItems(); + feed.setItems(null); + List<FeedItem> savedItems = DBReader.getFeedItemList(context, feed); + assertNotNull(savedItems); + assertTrue(savedItems.size() == items.size()); + for (int i = 0; i < savedItems.size(); i++) { + assertTrue(items.get(i).getId() == savedItems.get(i).getId()); + } + } + + private List<FeedItem> saveQueue(int numItems) { + if (numItems <= 0) { + throw new IllegalArgumentException("numItems<=0"); + } + final Context context = getInstrumentation().getTargetContext(); + List<Feed> feeds = saveFeedlist(context, numItems, numItems, false); + List<FeedItem> allItems = new ArrayList<FeedItem>(); + for (Feed f : feeds) { + allItems.addAll(f.getItems()); + } + // take random items from every feed + Random random = new Random(); + List<FeedItem> queue = new ArrayList<FeedItem>(); + while (queue.size() < numItems) { + int index = random.nextInt(numItems); + if (!queue.contains(allItems.get(index))) { + queue.add(allItems.get(index)); + } + } + PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + adapter.setQueue(queue); + adapter.close(); + return queue; + } + + public void testGetQueueIDList() { + final Context context = getInstrumentation().getTargetContext(); + final int numItems = 10; + List<FeedItem> queue = saveQueue(numItems); + List<Long> ids = DBReader.getQueueIDList(context); + assertNotNull(ids); + assertTrue(queue.size() == ids.size()); + for (int i = 0; i < queue.size(); i++) { + assertTrue(ids.get(i) != 0); + assertTrue(queue.get(i).getId() == ids.get(i)); + } + } + + public void testGetQueue() { + final Context context = getInstrumentation().getTargetContext(); + final int numItems = 10; + List<FeedItem> queue = saveQueue(numItems); + List<FeedItem> savedQueue = DBReader.getQueue(context); + assertNotNull(savedQueue); + assertTrue(queue.size() == savedQueue.size()); + for (int i = 0; i < queue.size(); i++) { + assertTrue(savedQueue.get(i).getId() != 0); + assertTrue(queue.get(i).getId() == savedQueue.get(i).getId()); + } + } + + private List<FeedItem> saveDownloadedItems(int numItems) { + if (numItems <= 0) { + throw new IllegalArgumentException("numItems<=0"); + } + final Context context = getInstrumentation().getTargetContext(); + List<Feed> feeds = saveFeedlist(context, numItems, numItems, true); + List<FeedItem> items = new ArrayList<FeedItem>(); + for (Feed f : feeds) { + items.addAll(f.getItems()); + } + List<FeedItem> downloaded = new ArrayList<FeedItem>(); + Random random = new Random(); + + while (downloaded.size() < numItems) { + int i = random.nextInt(numItems); + if (!downloaded.contains(items.get(i))) { + FeedItem item = items.get(i); + item.getMedia().setDownloaded(true); + item.getMedia().setFile_url("file" + i); + downloaded.add(item); + } + } + PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + adapter.setFeedItemlist(downloaded); + adapter.close(); + return downloaded; + } + + public void testGetDownloadedItems() { + final Context context = getInstrumentation().getTargetContext(); + final int numItems = 10; + List<FeedItem> downloaded = saveDownloadedItems(numItems); + List<FeedItem> downloaded_saved = DBReader.getDownloadedItems(context); + assertNotNull(downloaded_saved); + assertTrue(downloaded_saved.size() == downloaded.size()); + for (FeedItem item : downloaded_saved) { + assertNotNull(item.getMedia()); + assertTrue(item.getMedia().isDownloaded()); + assertNotNull(item.getMedia().getDownload_url()); + } + } + + private List<FeedItem> saveUnreadItems(int numItems) { + if (numItems <= 0) { + throw new IllegalArgumentException("numItems<=0"); + } + final Context context = getInstrumentation().getTargetContext(); + List<Feed> feeds = saveFeedlist(context, numItems, numItems, true); + List<FeedItem> items = new ArrayList<FeedItem>(); + for (Feed f : feeds) { + items.addAll(f.getItems()); + } + List<FeedItem> unread = new ArrayList<FeedItem>(); + Random random = new Random(); + + while (unread.size() < numItems) { + int i = random.nextInt(numItems); + if (!unread.contains(items.get(i))) { + FeedItem item = items.get(i); + item.setRead(false); + unread.add(item); + } + } + PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + adapter.setFeedItemlist(unread); + adapter.close(); + return unread; + } + + public void testGetUnreadItemsList() { + final Context context = getInstrumentation().getTargetContext(); + final int numItems = 10; + + List<FeedItem> unread = saveUnreadItems(numItems); + List<FeedItem> unreadSaved = DBReader.getUnreadItemsList(context); + assertNotNull(unreadSaved); + assertTrue(unread.size() == unreadSaved.size()); + for (FeedItem item : unreadSaved) { + assertFalse(item.isRead()); + } + } + + public void testGetUnreadItemIds() { + final Context context = getInstrumentation().getTargetContext(); + final int numItems = 10; + List<FeedItem> unread = saveUnreadItems(numItems); + long[] unreadIds = new long[unread.size()]; + for (int i = 0; i < unread.size(); i++) { + unreadIds[i] = unread.get(i).getId(); + } + long[] unreadSaved = DBReader.getUnreadItemIds(context); + assertNotNull(unreadSaved); + assertTrue(unread.size() == unreadSaved.length); + for (long savedId : unreadSaved) { + boolean found = false; + for (long id : unreadIds) { + if (id == savedId) { + found = true; + break; + } + } + assertTrue(found); + } + } } diff --git a/src/instrumentationTest/de/test/antennapod/storage/DBTasksTest.java b/src/instrumentationTest/de/test/antennapod/storage/DBTasksTest.java index 6d9ad707a..4f8302690 100644 --- a/src/instrumentationTest/de/test/antennapod/storage/DBTasksTest.java +++ b/src/instrumentationTest/de/test/antennapod/storage/DBTasksTest.java @@ -19,6 +19,8 @@ import java.util.Collections; import java.util.Date; import java.util.List; +import static instrumentationTest.de.test.antennapod.storage.DBTestUtils.*; + /** * Test class for DBTasks */ @@ -167,6 +169,29 @@ public class DBTasksTest extends InstrumentationTestCase { } } + /** + * 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 + */ + 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); + FeedMedia m = feeds.get(0).getItems().get(0).getMedia(); + m.setDownloaded(true); + m.setFile_url("file"); + PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + adapter.setMedia(m); + adapter.close(); + + testPerformAutoCleanupShouldNotDeleteBecauseInQueue(); + } + public void testUpdateFeedNewFeed() { final Context context = getInstrumentation().getTargetContext(); final int NUM_ITEMS = 10; @@ -249,4 +274,36 @@ public class DBTasksTest extends InstrumentationTestCase { lastDate = item.getPubDate(); } } + + 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); + feed.setItems(new ArrayList<FeedItem>()); + PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.close(); + + assertTrue(feed.getId() != 0); + List<Feed> expiredFeeds = DBTasks.getExpiredFeeds(context); + assertNotNull(expiredFeeds); + if (shouldReturn) { + assertTrue(expiredFeeds.size() == 1); + assertTrue(expiredFeeds.get(0).getId() == feed.getId()); + } else { + assertTrue(expiredFeeds.isEmpty()); + } + } + + public void testGetExpiredFeedsTestShouldReturn() { + final long expirationTime = 1000 * 60 * 60; + expiredFeedListTestHelper(System.currentTimeMillis() - expirationTime - 1, expirationTime, true); + } + + public void testGetExpiredFeedsTestShouldNotReturn() { + final long expirationTime = 1000 * 60 * 60; + expiredFeedListTestHelper(System.currentTimeMillis() - expirationTime / 2, expirationTime, false); + } } diff --git a/src/instrumentationTest/de/test/antennapod/storage/DBTestUtils.java b/src/instrumentationTest/de/test/antennapod/storage/DBTestUtils.java new file mode 100644 index 000000000..fbb7b0386 --- /dev/null +++ b/src/instrumentationTest/de/test/antennapod/storage/DBTestUtils.java @@ -0,0 +1,56 @@ +package instrumentationTest.de.test.antennapod.storage; + +import android.content.Context; +import de.danoeh.antennapod.feed.Feed; +import de.danoeh.antennapod.feed.FeedItem; +import de.danoeh.antennapod.feed.FeedMedia; +import de.danoeh.antennapod.storage.PodDBAdapter; +import de.danoeh.antennapod.util.comparator.FeedItemPubdateComparator; +import junit.framework.Assert; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +/** + * Utility methods for DB* tests. + */ +public class DBTestUtils { + + public static List<Feed> saveFeedlist(Context context, int numFeeds, int numItems, boolean withMedia) { + if (numFeeds <= 0) { + throw new IllegalArgumentException("numFeeds<=0"); + } + if (numItems < 0) { + throw new IllegalArgumentException("numItems<0"); + } + + List<Feed> feeds = new ArrayList<Feed>(); + PodDBAdapter adapter = new PodDBAdapter(context); + 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); + 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(), + true, f); + if (withMedia) { + FeedMedia media = new FeedMedia(item, "url" + j, 1, "audio/mp3"); + item.setMedia(media); + } + f.getItems().add(item); + } + Collections.sort(f.getItems(), new FeedItemPubdateComparator()); + adapter.setCompleteFeed(f); + Assert.assertTrue(f.getId() != 0); + for (FeedItem item : f.getItems()) { + Assert.assertTrue(item.getId() != 0); + } + feeds.add(f); + } + adapter.close(); + return feeds; + } +} diff --git a/src/instrumentationTest/de/test/antennapod/storage/DBWriterTest.java b/src/instrumentationTest/de/test/antennapod/storage/DBWriterTest.java index 527e410d2..679ae1ad3 100644 --- a/src/instrumentationTest/de/test/antennapod/storage/DBWriterTest.java +++ b/src/instrumentationTest/de/test/antennapod/storage/DBWriterTest.java @@ -708,7 +708,7 @@ public class DBWriterTest extends InstrumentationTestCase { } } - public void testMarkAllItemsReadSameFeed() { + public void testMarkAllItemsReadSameFeed() throws InterruptedException, ExecutionException, TimeoutException { final Context context = getInstrumentation().getTargetContext(); final int NUM_ITEMS = 10; Feed feed = new Feed("url", new Date(), "title"); @@ -728,7 +728,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertTrue(item.getId() != 0); } - DBWriter.markAllItemsRead(context); + DBWriter.markAllItemsRead(context).get(TIMEOUT, TimeUnit.SECONDS); List<FeedItem> loadedItems = DBReader.getFeedItemList(context, feed); for (FeedItem item : loadedItems) { assertTrue(item.isRead()); |