/* ********************************************************************** ** ** Copyright notice ** ** ** ** (c) 2005-2009 RSSOwl Development Team ** ** http://www.rssowl.org/ ** ** ** ** All rights reserved ** ** ** ** This program and the accompanying materials are made available under ** ** the terms of the Eclipse Public License v1.0 which accompanies this ** ** distribution, and is available at: ** ** http://www.rssowl.org/legal/epl-v10.html ** ** ** ** A copy is found in the file epl-v10.html and important notices to the ** ** license from the team is found in the textfile LICENSE.txt distributed ** ** in this package. ** ** ** ** This copyright notice MUST APPEAR in all copies of the file! ** ** ** ** Contributors: ** ** RSSOwl Development Team - initial API and implementation ** ** ** ** ********************************************************************** */ package org.rssowl.core.tests.interpreter; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.junit.Ignore; import org.junit.Test; import org.rssowl.core.Owl; import org.rssowl.core.internal.interpreter.json.JSONObject; import org.rssowl.core.internal.persist.Feed; import org.rssowl.core.interpreter.UnknownFormatException; import org.rssowl.core.persist.IAttachment; import org.rssowl.core.persist.IFeed; import org.rssowl.core.persist.INews; import org.rssowl.core.util.DateUtils; import org.rssowl.core.util.StringUtils; import org.rssowl.core.util.SyncUtils; import org.xml.sax.InputSource; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URI; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; /** * This TestCase covers use-cases for the Interpreter Plugin. * * @author bpasero */ public class InterpreterTest { /** * Test an Atom Feed. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testAtom() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_atom.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_atom.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("Atom 1.0", feed.getFormat()); assertEquals("atom_title", feed.getTitle()); assertEquals("atom_subtitle", feed.getDescription()); assertEquals(new URI("atom_link_html"), feed.getHomepage()); assertEquals("atom_generator", feed.getGenerator()); assertEquals("en-us", feed.getLanguage()); assertEquals(new URI("http://www.feed-uri.de"), feed.getBase()); assertNotNull(feed.getImage()); assertEquals(new URI("atom_logo"), feed.getImage().getLink()); assertNotNull(feed.getLastModifiedDate()); assertEquals(1, feed.getCategories().size()); assertEquals("atom_category.label", feed.getCategories().get(0).getName()); assertEquals("atom_category.term", feed.getCategories().get(0).getDomain()); assertEquals("atom_copyright", feed.getCopyright()); assertNotNull(feed.getAuthor()); assertEquals("atom_author.name", feed.getAuthor().getName()); assertEquals(new URI("atom_author.uri"), feed.getAuthor().getUri()); assertEquals(new URI("atom_author.email"), feed.getAuthor().getEmail()); assertEquals(6, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("atom_entry1.title", news1.getTitle()); assertEquals("atom_entry1.description", news1.getDescription()); assertEquals(new URI("http://www.entry-uri.de"), news1.getBase()); assertNotNull(news1.getCategories()); assertEquals("atom_entry1.category.label", news1.getCategories().get(0).getName()); assertEquals("atom_entry1.category.term", news1.getCategories().get(0).getDomain()); assertNotNull(news1.getGuid()); assertEquals("atom_entry1.id", news1.getGuid().getValue()); assertEquals(new URI("atom_entry1.link.href"), news1.getLink()); assertEquals(2, news1.getAttachments().size()); assertEquals(new URI("atom_entry1.enclosure1.href"), news1.getAttachments().get(0).getLink()); assertEquals("mp3", news1.getAttachments().get(0).getType()); assertEquals(4500000, news1.getAttachments().get(0).getLength()); assertEquals(new URI("atom_entry1.enclosure2.href"), news1.getAttachments().get(1).getLink()); assertEquals("wav", news1.getAttachments().get(1).getType()); assertEquals(2500000, news1.getAttachments().get(1).getLength()); assertNotNull(news1.getPublishDate()); assertNotNull(news1.getModifiedDate()); assertNotNull(news1.getSource()); assertEquals("atom_entry1.source.title", news1.getSource().getName()); assertEquals(new URI("atom_entry1.source.id"), news1.getSource().getLink()); assertNotNull(news1.getAuthor()); assertEquals("atom_entry1.author.name", news1.getAuthor().getName()); assertEquals(new URI("atom_entry1.author.uri"), news1.getAuthor().getUri()); assertEquals(new URI("atom_entry1.author.email"), news1.getAuthor().getEmail()); INews news2 = feed.getNews().get(1); assertEquals("<p>atom_entry2.title</p>", news2.getTitle()); assertEquals("<p>atom_entry2.description</p>", news2.getDescription()); assertEquals(new URI("http://www.feed-uri.de/subfolder"), news2.getBase()); assertNotNull(news2.getSource()); assertEquals(new URI("atom_entry2.source.link"), news2.getSource().getLink()); INews news3 = feed.getNews().get(2); assertEquals("<p xmlns=\"http://www.w3.org/1999/xhtml\">atom_entry3.title</p>", news3.getTitle()); assertEquals("<p xmlns=\"http://www.w3.org/1999/xhtml\">atom_entry3.description</p>", news3.getDescription()); assertEquals(new URI("http://www.feed-uri.de"), news3.getBase()); INews news4 = feed.getNews().get(3); assertEquals(new URI("atom_entry4.link.href"), news4.getLink()); INews news5 = feed.getNews().get(4); assertEquals("<p xmlns=\"http://www.w3.org/1999/xhtml\">atom_entry5.title</p>", news5.getTitle()); assertEquals("<p xmlns=\"http://www.w3.org/1999/xhtml\">atom_entry5.description</p>", news5.getDescription()); INews news6 = feed.getNews().get(5); assertEquals("<p>atom_entry6.title</p>", news6.getTitle()); } /** * Test an RSS Feed. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testRSS() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_rss.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_rss.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("RSS 2.0", feed.getFormat()); assertEquals("rss_title", feed.getTitle()); assertEquals(new URI("rss_link"), feed.getHomepage()); assertEquals("rss_description", feed.getDescription()); assertEquals("rss_language", feed.getLanguage()); assertNotNull(feed.getPublishDate()); assertNotNull(feed.getLastBuildDate()); assertEquals(new URI("rss_docs"), feed.getDocs()); assertEquals("rss_generator", feed.getGenerator()); assertNotNull(feed.getAuthor()); assertEquals("rss_managingeditor", feed.getAuthor().getName()); assertEquals("rss_webmaster", feed.getWebmaster()); assertEquals("rss_copyright", feed.getCopyright()); assertEquals(120, feed.getTTL()); assertEquals(1, feed.getCategories().size()); assertEquals("rss_category", feed.getCategories().get(0).getName()); assertEquals("rss_category.domain", feed.getCategories().get(0).getDomain()); assertNotNull(feed.getImage()); assertEquals(new URI("rss_image.url"), feed.getImage().getLink()); assertEquals(3, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("rss_item1.title", news1.getTitle()); assertEquals(new URI("rss_item1.link"), news1.getLink()); assertNotNull(news1.getAuthor()); assertEquals("rss_item1.author", news1.getAuthor().getName()); assertEquals("rss_item1.description", news1.getDescription()); assertNotNull(news1.getPublishDate()); assertEquals("rss_item1.guid", news1.getGuid().getValue()); assertEquals("rss_item1.comments", news1.getComments()); assertEquals(1, news1.getAttachments().size()); assertEquals(new URI("rss_item1.enclosure.url"), news1.getAttachments().get(0).getLink()); assertEquals("rss_item1.enclosure.type", news1.getAttachments().get(0).getType()); assertEquals(2500000, news1.getAttachments().get(0).getLength()); assertEquals(1, news1.getCategories().size()); assertEquals("rss_item1.category", news1.getCategories().get(0).getName()); assertEquals("rss_item1.category.domain", news1.getCategories().get(0).getDomain()); assertNotNull(news1.getSource()); assertEquals("rss_item1.source", news1.getSource().getName()); assertEquals(new URI("rss_item1.source.url"), news1.getSource().getLink()); } /** * Test URIs being normalized. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testURINormalized() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_uri_mix.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_rss.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals(new URI("http://www.link.com/feed/link/"), feed.getHomepage()); assertEquals(new URI("http://www.link.com/feed/docs"), feed.getDocs()); assertNotNull(feed.getImage()); assertEquals(new URI("http://www.link.com/image/url//"), feed.getImage().getLink()); assertEquals(3, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals(new URI("http://www.Link%20.com/%5Bfeed%5D/%7Bitem1%7D/link/"), news1.getLink()); assertEquals(1, news1.getAttachments().size()); assertEquals(new URI("http://www.Link.com/feed/item1/attachment1/link/"), news1.getAttachments().get(0).getLink()); } /** * Test an RDF Feed. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testRDF() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_rdf.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_rdf.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("RDF", feed.getFormat()); assertEquals("rdf_title", feed.getTitle()); assertEquals(new URI("rdf_link"), feed.getHomepage()); assertEquals("rdf_description", feed.getDescription()); assertEquals("rdf_rights", feed.getCopyright()); assertEquals("en-us", feed.getLanguage()); assertNotNull(feed.getAuthor()); assertEquals("rdf_publisher", feed.getAuthor().getName()); assertNotNull(feed.getPublishDate()); assertNotNull(feed.getImage()); assertEquals(new URI("rdf_image.url"), feed.getImage().getLink()); assertEquals("rdf_image.title", feed.getImage().getTitle()); assertEquals(new URI("rdf_image.link"), feed.getImage().getHomepage()); assertEquals(4, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("rdf_item1.title", news1.getTitle()); assertEquals(new URI("rdf_item1.link"), news1.getLink()); assertEquals("rdf_item1.description", news1.getDescription()); assertNotNull(news1.getGuid()); assertEquals("rdf_item1.identifier", news1.getGuid().getValue()); assertNotNull(news1.getPublishDate()); assertNotNull(news1.getAuthor()); assertEquals("rdf_item1.publisher", news1.getAuthor().getName()); assertNotNull(news1.getSource()); assertEquals(new URI("rdf_item1.source"), news1.getSource().getLink()); INews news4 = feed.getNews().get(3); assertEquals("rdf_item4.title", news4.getTitle()); assertEquals(new URI("rdf_item4.link"), news4.getLink()); assertEquals("rdf_item4.description", news4.getDescription()); } /** * Test an RDF Feed with more DC elements. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testRDF_DublinCore() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_rdf_dc.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_rdf.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("RDF", feed.getFormat()); assertEquals("rdf_title", feed.getTitle()); assertEquals(new URI("rdf_link"), feed.getHomepage()); assertEquals("rdf_description", feed.getDescription()); assertEquals("rdf_rights", feed.getCopyright()); assertEquals("en-us", feed.getLanguage()); assertNotNull(feed.getAuthor()); assertEquals("rdf_publisher", feed.getAuthor().getName()); assertNotNull(feed.getPublishDate()); assertNotNull(feed.getImage()); assertEquals(new URI("rdf_image.url"), feed.getImage().getLink()); assertEquals("rdf_image.title", feed.getImage().getTitle()); assertEquals(new URI("rdf_image.link"), feed.getImage().getHomepage()); } /** * Test an RDF Feed with rdf:about. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testRDFAbout() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_rdf_about.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_rdf_about.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("RDF", feed.getFormat()); assertEquals("rdf_title", feed.getTitle()); assertEquals(new URI("rdf_link"), feed.getHomepage()); assertEquals("rdf_description", feed.getDescription()); assertEquals("rdf_rights", feed.getCopyright()); assertEquals("en-us", feed.getLanguage()); assertNotNull(feed.getAuthor()); assertEquals("rdf_publisher", feed.getAuthor().getName()); assertNotNull(feed.getPublishDate()); assertNotNull(feed.getImage()); assertEquals(new URI("rdf_image.url"), feed.getImage().getLink()); assertEquals("rdf_image.title", feed.getImage().getTitle()); assertEquals(new URI("rdf_image.link"), feed.getImage().getHomepage()); assertEquals(3, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("rdf_item1.title", news1.getTitle()); assertEquals(new URI("rdf_item1.link"), news1.getLink()); assertEquals("rdf_item1.description", news1.getDescription()); assertNotNull(news1.getGuid()); assertEquals("rdf_item1.identifier", news1.getGuid().getValue()); assertNotNull(news1.getPublishDate()); assertNotNull(news1.getAuthor()); assertEquals("rdf_item1.publisher", news1.getAuthor().getName()); assertNotNull(news1.getSource()); assertEquals(new URI("rdf_item1.source"), news1.getSource().getLink()); INews news2 = feed.getNews().get(1); assertNotNull(news2.getGuid()); assertEquals("rdf_item2.link", news2.getGuid().getValue()); assertTrue(news2.getGuid().isPermaLink()); INews news3 = feed.getNews().get(2); assertNull(news3.getGuid()); } /** * Test an CDF Feed. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testCDF() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_cdf.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_cdf.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("CDF", feed.getFormat()); assertEquals(new URI("cdf_base"), feed.getHomepage()); assertNotNull(feed.getLastModifiedDate()); assertEquals("cdf_title", feed.getTitle()); assertEquals("cdf_abstract", feed.getDescription()); assertEquals(3, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("cdf_entry1.title", news1.getTitle()); assertEquals("cdf_entry1.abstract", news1.getDescription()); assertEquals(new URI("cdf_base/cdf_entry1.href"), news1.getLink()); assertNotNull(news1.getPublishDate()); } /** * Test an OPML Feed. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testOPML() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_opml.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_opml.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("OPML", feed.getFormat()); assertEquals("opml_title", feed.getTitle()); assertNotNull(feed.getLastModifiedDate()); assertNotNull(feed.getLastBuildDate()); assertNotNull(feed.getAuthor()); assertEquals("opml_ownername", feed.getAuthor().getName()); assertEquals(new URI("opml_owneremail"), feed.getAuthor().getEmail()); assertEquals(4, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("opml_outline1.title", news1.getTitle()); assertEquals(new URI("opml_outline1.url"), news1.getLink()); assertEquals("opml_outline1.text", news1.getDescription()); INews news4 = feed.getNews().get(3); assertEquals("opml_outline4.title", news4.getTitle()); assertEquals(new URI("opml_outline4.url"), news4.getLink()); assertEquals("opml_outline4.text", news4.getDescription()); } /** * Test contributing Format Handlers. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testFormat() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_format.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_format.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("MyFeed", feed.getFormat()); assertEquals("format_custom", feed.getTitle()); assertEquals("format_channel.sprache", feed.getLanguage()); assertEquals(1, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("format_item1.title", news1.getTitle()); assertEquals(new URI("format_item1.link"), news1.getLink()); assertEquals("format_item1.description", news1.getDescription()); } /** * Test a Feed using ISO Encoding. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testISO() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_ISO-8859-1.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_atom.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("iso_title#\u00F6\u00E4\u00FC\u00DF", feed.getTitle()); assertEquals("iso_description#\u00F6\u00E4\u00FC\u00DF", feed.getDescription()); assertEquals(1, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("iso_item1.title#\u00F6\u00E4\u00FC\u00DF", news1.getTitle()); assertEquals("iso_item1.description#\u00F6\u00E4\u00FC\u00DF", news1.getDescription()); } /** * Test a Feed using Entities. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testEntities() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_entities.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_atom.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("entities_title#\u00F6\u00E4\u00FC&<>", feed.getTitle()); assertEquals("entities_description#\u00F6\u00E4\u00FC&<>", feed.getDescription()); assertEquals(1, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("entities_item1.title#\u00F6\u00E4\u00FC&<>", news1.getTitle()); assertEquals("entities_item1.description#\u00F6\u00E4\u00FC&<>", news1.getDescription()); } /** * Test a Feed using undeclared Entities. TODO: Enable again once it succeeds * on Java 1.6 (see Bug 325) * * @throws Exception */ @Test @Ignore @SuppressWarnings("nls") public void testUndeclaredEntities() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_undeclared_entities.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_atom.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("entities_title#\u00F6\u00E4\u00FC&<>", feed.getTitle()); assertEquals("entities_description#\u00F6\u00E4\u00FC&<>", feed.getDescription()); assertEquals(1, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("entities_item1.title#\u00F6\u00E4\u00FC&<>", news1.getTitle()); assertEquals("entities_item1.description#\u00F6\u00E4\u00FC&<>", news1.getDescription()); } /** * See Bug 1078. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testMediaTitle() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_media_title.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_rss.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals(1, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("News Title", news1.getTitle()); } /** * Test a Feed that has been loaded via W3C Document. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testW3CDocument() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_opml.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = factory.newDocumentBuilder(); InputSource source = new InputSource(inS); org.w3c.dom.Document doc = documentBuilder.parse(source); inS.close(); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_opml.xml")); Owl.getInterpreter().interpretW3CDocument(doc, feed); assertEquals("OPML", feed.getFormat()); assertEquals("opml_title", feed.getTitle()); assertNotNull(feed.getLastModifiedDate()); assertNotNull(feed.getLastBuildDate()); assertNotNull(feed.getAuthor()); assertEquals("opml_ownername", feed.getAuthor().getName()); assertEquals(new URI("opml_owneremail"), feed.getAuthor().getEmail()); assertEquals(4, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("opml_outline1.title", news1.getTitle()); assertEquals(new URI("opml_outline1.url"), news1.getLink()); assertEquals("opml_outline1.text", news1.getDescription()); INews news4 = feed.getNews().get(3); assertEquals("opml_outline4.title", news4.getTitle()); assertEquals(new URI("opml_outline4.url"), news4.getLink()); assertEquals("opml_outline4.text", news4.getDescription()); } /** * Test a Feed with an unknown format * * @throws Exception */ @Test @SuppressWarnings("nls") public void testUnknownFormat() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_unknown.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_unknown.xml")); UnknownFormatException e = null; try { Owl.getInterpreter().interpret(inS, feed, null); } catch (UnknownFormatException e1) { e = e1; } assertNotNull(e); } /** * Test parsing some dates. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testDateParser() throws Exception { Calendar cal = new GregorianCalendar(); cal.setTimeZone(TimeZone.getTimeZone("GMT")); /* Undetailed Checks */ assertNotNull(DateUtils.parseDate("Mon, 19 Dec 2005 13:56:00 GMT")); assertNotNull(DateUtils.parseDate("Mon, 19 Dec 2005 07:00:21 PST")); assertNotNull(DateUtils.parseDate("Fri, 16 Dec 2005 00:00:00 EDT")); assertNotNull(DateUtils.parseDate("Mon, 19 Dec 2005 17:00:00 -0500")); assertNotNull(DateUtils.parseDate("Tue, 19 Jul 05 23:00:51 GMT")); assertNotNull(DateUtils.parseDate("2005-12-14T00:00:00+00:00")); assertNotNull(DateUtils.parseDate("2005-12-16T00:00:00Z")); assertNotNull(DateUtils.parseDate("2009-11-04T06:44:55.985-07:00")); assertNotNull(DateUtils.parseDate("2005-12-16T11:29:19+01:00")); assertNotNull(DateUtils.parseDate("2005-12-16T11:29:19 -01:00")); assertNotNull(DateUtils.parseDate("2005-12-16")); /* Detailed Check #1 */ cal.setTime(DateUtils.parseDate("Tue, 19 Jul 2005 23:00:51 GMT")); assertEquals(2005, cal.get(Calendar.YEAR)); assertEquals(6, cal.get(Calendar.MONTH)); assertEquals(19, cal.get(Calendar.DAY_OF_MONTH)); assertEquals(3, cal.get(Calendar.DAY_OF_WEEK)); assertEquals(23, cal.get(Calendar.HOUR_OF_DAY)); assertEquals(0, cal.get(Calendar.MINUTE)); assertEquals(51, cal.get(Calendar.SECOND)); /* Detailed Check #2 */ cal.setTime(DateUtils.parseDate("Tue, 19 Jul 05 23:00:51 GMT")); assertEquals(2005, cal.get(Calendar.YEAR)); assertEquals(6, cal.get(Calendar.MONTH)); assertEquals(19, cal.get(Calendar.DAY_OF_MONTH)); assertEquals(3, cal.get(Calendar.DAY_OF_WEEK)); assertEquals(23, cal.get(Calendar.HOUR_OF_DAY)); assertEquals(0, cal.get(Calendar.MINUTE)); assertEquals(51, cal.get(Calendar.SECOND)); } /** * Test contributing an ElementHandler to a RSS. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testRSSElements() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_rss_elements.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_rss_elements.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("sub_rss_leveld", feed.getProperty("sub_rss_leveld")); assertEquals("sub_channel_leveld", feed.getProperty("sub_channel_leveld")); assertNotNull(feed.getImage()); assertEquals(1, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals("sub_item_leveld", news.getProperty("sub_item_leveld")); } /** * Test contributing an NamespaceHandler and using it in a RSS. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testRSSNamespaces() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_rss_namespaces.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_rss_namespaces.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("custom_formatAttribute", feed.getProperty("custom_formatAttribute")); assertEquals("custom_channelAttribute", feed.getProperty("custom_channelAttribute")); assertEquals("sub_channel_leveld", feed.getProperty("sub_channel_leveld")); assertEquals("custom_skipHoursAttribute", feed.getProperty("custom_skipHoursAttribute")); assertEquals("custom_skipDaysAttribute", feed.getProperty("custom_skipDaysAttribute")); assertEquals(1, feed.getCategories().size()); assertEquals("custom_categoryAttribute", feed.getCategories().get(0).getProperty("custom_categoryAttribute")); assertNotNull(feed.getImage()); assertEquals(1, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals("custom_itemAttribute", news.getProperty("custom_itemAttribute")); assertEquals("sub_item_leveld", news.getProperty("sub_item_leveld")); assertEquals("custom_titleAttribute", news.getProperty("custom_titleAttribute")); assertNotNull(news.getSource()); assertNotNull(news.getAttachments()); assertEquals("custom_enclosureAttribute", news.getAttachments().get(0).getProperty("custom_enclosureAttribute")); assertNotNull(news.getSource()); } /** * Test contributing an ElementHandler to an Atom. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testAtomElements() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_atom_elements.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_atom_elements.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("entry_leveld", feed.getProperty("entry_leveld")); assertNotNull(feed.getAuthor()); assertEquals("sub_author_leveld", feed.getAuthor().getProperty("sub_author_leveld")); assertEquals(1, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals("sub_entry_leveld", news.getProperty("sub_entry_leveld")); assertNotNull(news.getSource()); assertNotNull(news.getAuthor()); assertEquals("sub_author_leveld", news.getAuthor().getProperty("sub_author_leveld")); } /** * Test contributing an NamespaceHandler and using it in an Atom. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testAtomNamespaces() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_atom_namespaces.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_atom_namespaces.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("custom_formatAttribute", feed.getProperty("custom_formatAttribute")); assertEquals("custom_titleAttribute", feed.getProperty("custom_titleAttribute")); assertEquals("custom_linkAttribute", feed.getProperty("custom_linkAttribute")); assertEquals(1, feed.getCategories().size()); assertEquals("custom_categoryAttribute", feed.getCategories().get(0).getProperty("custom_categoryAttribute")); assertEquals("entry_leveld", feed.getProperty("entry_leveld")); assertNotNull(feed.getAuthor()); assertEquals("sub_author_leveld", feed.getAuthor().getProperty("sub_author_leveld")); assertEquals("custom_authorAttribute", feed.getAuthor().getProperty("custom_authorAttribute")); assertEquals("custom_nameAttribute", feed.getAuthor().getProperty("custom_nameAttribute")); assertEquals(1, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals("sub_entry_leveld", news.getProperty("sub_entry_leveld")); assertEquals("custom_entryAttribute", news.getProperty("custom_entryAttribute")); assertEquals("custom_titleAttribute", news.getProperty("custom_titleAttribute")); assertEquals("custom_linkAttribute", news.getProperty("custom_linkAttribute")); assertEquals(1, news.getCategories().size()); assertEquals("custom_categoryAttribute", news.getCategories().get(0).getProperty("custom_categoryAttribute")); assertEquals(1, news.getAttachments().size()); assertEquals("custom_enclosureAttribute", news.getAttachments().get(0).getProperty("custom_enclosureAttribute")); assertNotNull(news.getSource()); assertNotNull(news.getAuthor()); assertEquals("sub_author_leveld", news.getAuthor().getProperty("sub_author_leveld")); assertEquals("custom_authorAttribute", news.getAuthor().getProperty("custom_authorAttribute")); assertEquals("custom_nameAttribute", news.getAuthor().getProperty("custom_nameAttribute")); } /** * Test contributing an ElementHandler to an OPML. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testOPMLElements() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_opml_elements.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_opml_elements.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("head_leveld", feed.getProperty("head_leveld")); assertEquals("sub_head_leveld", feed.getProperty("sub_head_leveld")); assertEquals("outline_leveld", feed.getProperty("outline_leveld")); } /** * Test contributing an NamespaceHandler and using it in an OPML. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testOPMLNamespaces() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_opml_namespaces.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_opml_namespaces.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("custom_formatAttribute", feed.getProperty("custom_formatAttribute")); assertEquals("custom_headAttribute", feed.getProperty("custom_headAttribute")); assertEquals("custom_titleAttribute", feed.getProperty("custom_titleAttribute")); assertEquals("custom_bodyAttribute", feed.getProperty("custom_bodyAttribute")); assertEquals("head_leveld", feed.getProperty("head_leveld")); assertEquals("sub_head_leveld", feed.getProperty("sub_head_leveld")); assertEquals("outline_leveld", feed.getProperty("outline_leveld")); assertEquals(1, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals("custom_outlineAttribute", news.getProperty("custom_outlineAttribute")); } /** * Test contributing an ElementHandler to a CDF. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testCDFElements() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_cdf_elements.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_cdf_elements.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("item_leveld", feed.getProperty("item_leveld")); assertEquals(1, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals("sub_item_leveld", news.getProperty("sub_item_leveld")); } /** * Test contributing an NamespaceHandler and using it in a CDF. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testCDFNamespaces() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_cdf_namespaces.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_cdf_namespaces.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("custom_formatAttribute", feed.getProperty("custom_formatAttribute")); assertEquals("custom_titleAttribute", feed.getProperty("custom_titleAttribute")); assertEquals("item_leveld", feed.getProperty("item_leveld")); assertEquals(1, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals("sub_item_leveld", news.getProperty("sub_item_leveld")); assertEquals("custom_itemAttribute", news.getProperty("custom_itemAttribute")); assertEquals("custom_titleAttribute", news.getProperty("custom_titleAttribute")); } /** * Test contributing an ElementHandler to a RDF. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testRDFElements() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_rdf_elements.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_rdf_elements.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("channel_leveld", feed.getProperty("channel_leveld")); assertEquals("sub_channel_leveld", feed.getProperty("sub_channel_leveld")); assertNotNull(feed.getImage()); assertEquals(1, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals("sub_item_leveld", news.getProperty("sub_item_leveld")); } /** * Test contributing an NamespaceHandler and using it in a RDF. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testRDFNamespaces() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_rdf_namespaces.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_rdf_namespaces.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("custom_formatAttribute", feed.getProperty("custom_formatAttribute")); assertEquals("custom_channelAttribute", feed.getProperty("custom_channelAttribute")); assertEquals("custom_titleAttribute", feed.getProperty("custom_titleAttribute")); assertEquals("channel_leveld", feed.getProperty("channel_leveld")); assertEquals("sub_channel_leveld", feed.getProperty("sub_channel_leveld")); assertNotNull(feed.getImage()); assertEquals(1, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals("sub_item_leveld", news.getProperty("sub_item_leveld")); assertEquals("custom_itemAttribute", news.getProperty("custom_itemAttribute")); assertEquals("custom_titleAttribute", news.getProperty("custom_titleAttribute")); } /** * Test a Bugzilla-Bug-XML * * @throws Exception */ @Test @SuppressWarnings("nls") public void testBugzilla() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_bugzilla.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_bugzilla.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("Bugzilla 2.20", feed.getFormat()); assertEquals(new URI("http://dev.rssowl.org/"), feed.getBase()); assertEquals("bugzilla_short_description", feed.getTitle()); assertEquals(new URI("http://dev.rssowl.org/show_bug.cgi?id=10"), feed.getHomepage()); assertEquals(new URI("bugzilla_reporter@mail.xx"), feed.getAuthor().getEmail()); assertEquals(3, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals(new URI("http://dev.rssowl.org/show_bug.cgi?id=10"), news.getLink()); assertEquals("Comment from bugzilla_who", news.getTitle()); assertEquals("bugzilla_thetext", news.getDescription()); assertEquals(DateUtils.parseDate("2006-01-12 22:29"), news.getModifiedDate()); } /** * @throws Exception */ @Test @SuppressWarnings("nls") public void testSyndicationNamespace() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_syndication.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_syndication.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals("RSS 2.0", feed.getFormat()); } /** * Test a Media Feed with multiple Attachments. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testMedia() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_media.xml"); IFeed feed = new Feed(new URI("http://www.data.interpreter.feed_media.xml")); Owl.getInterpreter().interpret(inS, feed, null); assertEquals(2, feed.getNews().size()); INews news = feed.getNews().get(0); assertEquals(1, news.getAttachments().size()); IAttachment attachment = news.getAttachments().get(0); assertEquals("http://blip.tv/file/get/NostalgiaCritic-HercNYBMB104.FLV", attachment.getLink().toString()); assertEquals("video/x-flv", attachment.getType()); assertEquals(162018262, attachment.getLength()); news = feed.getNews().get(1); assertEquals(2, news.getAttachments().size()); IAttachment attachment1 = news.getAttachments().get(0); IAttachment attachment2 = news.getAttachments().get(1); assertEquals("http://blip.tv/file/get/NostalgiaCritic-BimbosBCCrossover552.wmv", attachment1.getLink().toString()); assertEquals("video/ms-wmv", attachment1.getType()); assertEquals(434020795, attachment1.getLength()); assertEquals("http://blip.tv/file/get/NostalgiaCritic-BimbosBCCrossover785.m4v", attachment2.getLink().toString()); assertEquals("video/x-m4v", attachment2.getType()); assertEquals(217916291, attachment2.getLength()); } /** * Test an JSON Feed. * * @throws Exception */ @Test @SuppressWarnings("nls") public void testJSON() throws Exception { InputStream inS = getClass().getResourceAsStream("/data/interpreter/feed_json.txt"); IFeed feed = new Feed(new URI("reader://www.data.interpreter.feed_json.txt")); JSONObject obj = new JSONObject(StringUtils.readString(new InputStreamReader(inS, "UTF-8"))); Owl.getInterpreter().interpretJSONObject(obj, feed); assertEquals("RSSOwl News", feed.getTitle()); assertEquals("This is the rssowl.org feed", feed.getDescription()); assertEquals("http://www.rssowl.org", feed.getHomepage().toString()); assertEquals(1307818900000l, feed.getPublishDate().getTime()); assertEquals(3, feed.getNews().size()); INews news1 = feed.getNews().get(0); assertEquals("http://www.rssowl.org/node/279", news1.getLink().toString()); assertEquals("feed/http://www.rssowl.org/newsfeed", news1.getInReplyTo()); assertTrue(SyncUtils.isSynchronized(news1)); assertEquals("tag:google.com,2005:reader/item/83514e0c32f4c92b", news1.getGuid().getValue()); assertEquals( "We are happy to announce that the beta of RSSOwl 2.1 is now available for download. \nThe 2.1 release comes with some exciting cool new features:\n\n<ul>\n<li>new headlines and list layout</li>\n<li>redesigned newspaper view</li>\n<li>news archiving</li>\n<li>readability support</li>\n<li>instant folder aggregation</li>\n<li>improved performance and reliability</li>\n<li>Full <a href=\"http://wiki.rssowl.org/index.php/2.1_Beta\">Changelog</a></li>\n</ul>\n\n<b>Download for:</b> <a href=\"http://www.rssowl.org/dl/Integration_Build/rssowl-2.1.beta.win32.zip\">Windows</a> | <a href=\"http://www.rssowl.org/dl/Integration_Build/rssowl-2.1.beta.linux.x86.zip\">Linux</a> | <a href=\"http://www.rssowl.org/dl/Integration_Build/rssowl-2.1.beta.linux.x86_64.zip\">Linux 64Bit</a> | <a href=\"http://www.rssowl.org/dl/Integration_Build/rssowl-2.1.beta.macosx.zip\">Mac</a>\n<br><br>\nPlease visit our <a href=\"http://wiki.rssowl.org/index.php/2.1_Beta\">2.1 Beta</a> site for installation instructions and a complete changelog. We welcome every feedback on this release in our <a href=\"https://sourceforge.net/projects/rssowl/forums\">forums</a> or <a href=\"https://sourceforge.net/tracker/?group_id=86683&atid=2238642\">bug tracker</a>.<br><br><a href=\"http://www.rssowl.org/node/279\">Read the full article</a>", news1.getDescription()); assertEquals("bpasero", news1.getAuthor().getName()); assertEquals("RSSOwl 2.1 Beta available", news1.getTitle()); assertEquals(1308564626000l, news1.getPublishDate().getTime()); assertEquals(1, news1.getAttachments().size()); IAttachment attachment = news1.getAttachments().get(0); assertEquals("http://feedproxy.google.com/~r/astronomycast/~5/4TPW83-0h4Y/AstroCast-090921.mp3", attachment.getLink().toString()); assertEquals("audio/mpeg", attachment.getType()); assertEquals(17610000, attachment.getLength()); assertEquals(2, news1.getCategories().size()); assertEquals("Test 123", news1.getCategories().get(0).getName()); assertEquals("Foo Bar", news1.getCategories().get(1).getName()); assertNotNull(news1.getProperty(SyncUtils.GOOGLE_MARKED_UNREAD)); assertNotNull(news1.getProperty(SyncUtils.GOOGLE_MARKED_READ)); assertNotNull(news1.getProperty(SyncUtils.GOOGLE_LABELS)); Object object = news1.getProperty(SyncUtils.GOOGLE_LABELS); assertTrue(object instanceof String[]); assertEquals(2, ((String[]) object).length); int count = 0; for (String str : ((String[]) object)) { if ("RSSOwl Label".equals(str)) count++; else if ("Foo".equals(str)) count++; } assertEquals(2, count); INews news2 = feed.getNews().get(1); assertEquals("http://www.rssowl.org/node/278", news2.getLink().toString()); assertEquals("feed/http://www.rssowl.org/newsfeed", news2.getInReplyTo()); assertTrue(SyncUtils.isSynchronized(news2)); assertEquals("tag:google.com,2005:reader/item/24ecce137a4e42b9", news2.getGuid().getValue()); assertEquals("bpasero", news2.getAuthor().getName()); assertEquals("RSSOwl 2.1 Changelog", news2.getTitle()); INews news3 = feed.getNews().get(2); assertEquals("http://www.rssowl.org/node/277", news3.getLink().toString()); assertEquals("feed/http://www.rssowl.org/newsfeed", news3.getInReplyTo()); assertTrue(SyncUtils.isSynchronized(news3)); assertEquals("tag:google.com,2005:reader/item/5c5d5801a50753bd", news3.getGuid().getValue()); assertEquals("bpasero", news3.getAuthor().getName()); assertEquals("RSSOwl 2.1 is in the making", news3.getTitle()); } }