package de.test.antennapod.handler; import android.content.Context; import android.test.InstrumentationTestCase; import org.xml.sax.SAXException; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.xml.parsers.ParserConfigurationException; 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.syndication.handler.FeedHandler; import de.danoeh.antennapod.core.syndication.handler.UnsupportedFeedtypeException; import de.test.antennapod.util.syndication.feedgenerator.AtomGenerator; import de.test.antennapod.util.syndication.feedgenerator.FeedGenerator; import de.test.antennapod.util.syndication.feedgenerator.RSS2Generator; /** * Tests for FeedHandler */ public class FeedHandlerTest extends InstrumentationTestCase { private static final String FEEDS_DIR = "testfeeds"; File file = null; OutputStream outputStream = null; protected void setUp() throws Exception { super.setUp(); Context context = getInstrumentation().getContext(); File destDir = context.getExternalFilesDir(FEEDS_DIR); assertNotNull(destDir); file = new File(destDir, "feed.xml"); file.delete(); assertNotNull(file); assertFalse(file.exists()); outputStream = new FileOutputStream(file); } @Override protected void tearDown() throws Exception { super.tearDown(); file.delete(); file = null; outputStream.close(); outputStream = null; } private Feed runFeedTest(Feed feed, FeedGenerator g, String encoding, long flags) throws IOException, UnsupportedFeedtypeException, SAXException, ParserConfigurationException { g.writeFeed(feed, outputStream, encoding, flags); FeedHandler handler = new FeedHandler(); Feed parsedFeed = new Feed(feed.getDownload_url(), feed.getLastUpdate()); parsedFeed.setFile_url(file.getAbsolutePath()); parsedFeed.setDownloaded(true); handler.parseFeed(parsedFeed); return parsedFeed; } private void feedValid(Feed feed, Feed parsedFeed, String feedType) { assertEquals(feed.getTitle(), parsedFeed.getTitle()); if (feedType.equals(Feed.TYPE_ATOM1)) { assertEquals(feed.getFeedIdentifier(), parsedFeed.getFeedIdentifier()); } else { assertEquals(feed.getLanguage(), parsedFeed.getLanguage()); } assertEquals(feed.getLink(), parsedFeed.getLink()); assertEquals(feed.getDescription(), parsedFeed.getDescription()); assertEquals(feed.getPaymentLink(), parsedFeed.getPaymentLink()); if (feed.getImage() != null) { FeedImage image = feed.getImage(); FeedImage parsedImage = parsedFeed.getImage(); assertNotNull(parsedImage); assertEquals(image.getTitle(), parsedImage.getTitle()); assertEquals(image.getDownload_url(), parsedImage.getDownload_url()); } if (feed.getItems() != null) { assertNotNull(parsedFeed.getItems()); assertEquals(feed.getItems().size(), parsedFeed.getItems().size()); for (int i = 0; i < feed.getItems().size(); i++) { FeedItem item = feed.getItems().get(i); FeedItem parsedItem = parsedFeed.getItems().get(i); if (item.getItemIdentifier() != null) assertEquals(item.getItemIdentifier(), parsedItem.getItemIdentifier()); assertEquals(item.getTitle(), parsedItem.getTitle()); assertEquals(item.getDescription(), parsedItem.getDescription()); assertEquals(item.getContentEncoded(), parsedItem.getContentEncoded()); assertEquals(item.getLink(), parsedItem.getLink()); assertEquals(item.getPubDate().getTime(), parsedItem.getPubDate().getTime()); assertEquals(item.getPaymentLink(), parsedItem.getPaymentLink()); if (item.hasMedia()) { assertTrue(parsedItem.hasMedia()); FeedMedia media = item.getMedia(); FeedMedia parsedMedia = parsedItem.getMedia(); assertEquals(media.getDownload_url(), parsedMedia.getDownload_url()); assertEquals(media.getSize(), parsedMedia.getSize()); assertEquals(media.getMime_type(), parsedMedia.getMime_type()); } if (item.hasItemImage()) { assertTrue(parsedItem.hasItemImage()); FeedImage image = item.getImage(); FeedImage parsedImage = parsedItem.getImage(); assertEquals(image.getTitle(), parsedImage.getTitle()); assertEquals(image.getDownload_url(), parsedImage.getDownload_url()); } if (item.getChapters() != null) { assertNotNull(parsedItem.getChapters()); assertEquals(item.getChapters().size(), parsedItem.getChapters().size()); List<Chapter> chapters = item.getChapters(); List<Chapter> parsedChapters = parsedItem.getChapters(); for (int j = 0; j < chapters.size(); j++) { Chapter chapter = chapters.get(j); Chapter parsedChapter = parsedChapters.get(j); assertEquals(chapter.getTitle(), parsedChapter.getTitle()); assertEquals(chapter.getLink(), parsedChapter.getLink()); } } } } } public void testRSS2Basic() throws IOException, UnsupportedFeedtypeException, SAXException, ParserConfigurationException { Feed f1 = createTestFeed(10, false, true, true); Feed f2 = runFeedTest(f1, new RSS2Generator(), "UTF-8", RSS2Generator.FEATURE_WRITE_GUID); feedValid(f1, f2, Feed.TYPE_RSS2); } public void testAtomBasic() throws IOException, UnsupportedFeedtypeException, SAXException, ParserConfigurationException { Feed f1 = createTestFeed(10, false, true, true); Feed f2 = runFeedTest(f1, new AtomGenerator(), "UTF-8", 0); feedValid(f1, f2, Feed.TYPE_ATOM1); } private Feed createTestFeed(int numItems, boolean withImage, boolean withFeedMedia, boolean withChapters) { FeedImage image = null; if (withImage) { image = new FeedImage(0, "image", null, "http://example.com/picture", false); } Feed feed = new Feed(0, null, "title", "http://example.com", "This is the description", "http://example.com/payment", "Daniel", "en", null, "http://example.com/feed", image, file.getAbsolutePath(), "http://example.com/feed", true); feed.setItems(new ArrayList<FeedItem>()); for (int i = 0; i < numItems; i++) { FeedItem item = new FeedItem(0, "item-" + i, "http://example.com/item-" + i, "http://example.com/items/" + i, new Date(i*60000), FeedItem.UNPLAYED, feed); feed.getItems().add(item); if (withFeedMedia) { item.setMedia(new FeedMedia(0, item, 4711, 0, 1024*1024, "audio/mp3", null, "http://example.com/media-" + i, false, null, 0, 0)); } } return feed; } }