package com.limegroup.gnutella.xml; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import junit.framework.Test; import org.limewire.gnutella.tests.LimeTestCase; import org.limewire.gnutella.tests.LimeTestUtils; import org.limewire.util.NameValue; import org.xml.sax.SAXException; import com.google.inject.Injector; /** * Tests for the XMLParsingUtils class */ @SuppressWarnings("unchecked") public class XMLParsingUtilsTest extends LimeTestCase { private static final String AUDIO_SCHEMA = "http://www.limewire.com/schemas/audio.xsd"; private LimeXMLDocumentFactory limeXMLDocumentFactory; public XMLParsingUtilsTest(String name) { super(name); } public static Test suite() { return buildTestSuite(XMLParsingUtilsTest.class); } @Override protected void setUp() throws Exception { Injector injector = LimeTestUtils.createInjectorNonEagerly(); limeXMLDocumentFactory = injector.getInstance(LimeXMLDocumentFactory.class); } public void testSplit() throws Exception { String xml1 = "<?xml version='1.0'><text>one</text>"; String xml2 = "<?xml version='1.0'><text>two</text>"; String xml3 = "<?xml version='1.0'><text>three</text>"; Iterator i = XMLParsingUtils.split(xml1+xml2+xml3).iterator(); assertEquals(xml1, i.next()); assertEquals(xml2, i.next()); assertEquals(xml3, i.next()); assertFalse(i.hasNext()); assertEquals(3,XMLParsingUtils.split("<?xml<?xml<?xml").size()); assertEquals(1,XMLParsingUtils.split("<xml?xml<?xml<?xm").size()); assertTrue(XMLParsingUtils.split("<xml ?><<><?xm>l").isEmpty()); } public void testParseValid() throws Exception { String xml = "<?xml version=\"1.0\"?>"+ "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+ "<audio genre=\"Rock\" identifier=\"def1.txt\" bitrate=\"190\"/>"+ "<audio genre=\"Classical\" identifier=\"def2.txt\" bitrate=\"2192\"/>"+ "<audio genre=\"Blues\" identifier=\"def.txt\" bitrate=\"192\"/></audios>"; XMLParsingUtils.ParseResult r = XMLParsingUtils.parse(xml,3); assertEquals("http://www.limewire.com/schemas/audio.xsd", r.schemaURI); assertEquals("audio", r.type); assertEquals("audios__audio__", r.canonicalKeyPrefix); List list = new ArrayList(); HashMap map = new HashMap(); map.put("audios__audio__genre__","Rock"); map.put("audios__audio__identifier__","def1.txt"); map.put("audios__audio__bitrate__","190"); list.add(map); map = new HashMap(); map.put("audios__audio__genre__","Classical"); map.put("audios__audio__identifier__","def2.txt"); map.put("audios__audio__bitrate__","2192"); list.add(map); map = new HashMap(); map.put("audios__audio__genre__","Blues"); map.put("audios__audio__identifier__","def.txt"); map.put("audios__audio__bitrate__","192"); list.add(map); assertEquals(list, r); String invalid = "<?xml version=\"1.0\"?>"+ "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+ "<video something=\"something\"/></audios>"; r = XMLParsingUtils.parse(invalid,1); assertFalse(r.isEmpty()); assertNotNull(r.canonicalKeyPrefix); assertNotNull(r.schemaURI); String nested ="<?xml version=\"1.0\"?>"+ "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+ "<audio genre=\"Rock\" identifier=\"def1.txt\" bitrate=\"190\">"+ "<audio genre=\"Classical\" identifier=\"def2.txt\" bitrate=\"2192\">"+ "<audio genre=\"Blues\" identifier=\"def.txt\" bitrate=\"192\"/></audio></audio></audios>"; r = XMLParsingUtils.parse(nested,3); assertFalse(r.isEmpty()); assertNotNull(r.canonicalKeyPrefix); assertNotNull(r.schemaURI); assertEquals(list, r); String empty1 = "<?xml version=\"1.0\"?>"+ "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+ "</audios>"; r = XMLParsingUtils.parse(empty1,1); assertTrue(r.isEmpty()); assertNotNull(r.canonicalKeyPrefix); assertNull(r.schemaURI); String empty2 = "<?xml version=\"1.0\"?>"+ "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"/>"; r = XMLParsingUtils.parse(empty2,1); assertTrue(r.isEmpty()); assertNotNull(r.canonicalKeyPrefix); assertNull(r.schemaURI); } public void testParseEncodings() throws Exception { List<NameValue<String>> list = new ArrayList<NameValue<String>>(); list.add(new NameValue<String>("audios__audio__title__", "Rock 'n Roll")); list.add(new NameValue<String>("audios__audio__album__", "m&alformed")); list.add(new NameValue<String>("audios__audio__comments__", "Sung by \"Joe Smith\"")); list.add(new NameValue<String>("audios__audio__artist__", "also <malformed")); list.add(new NameValue<String>("audios__audio__license__", ">still malformed")); list.add(new NameValue<String>("audios__audio__language__", "s\tpace")); list.add(new NameValue<String>("audios__audio__seconds__", "even[ m�r�] c�a��cters")); list.add(new NameValue<String>("audios__audio__bitrate__", "a\u0002\u0003\u0004b")); String xml = limeXMLDocumentFactory.createLimeXMLDocument(list, AUDIO_SCHEMA).getXMLString(); XMLParsingUtils.ParseResult r = XMLParsingUtils.parse(xml,1); assertEquals("http://www.limewire.com/schemas/audio.xsd", r.schemaURI); assertEquals("audio", r.type); Map<String, String> result = r.get(0); assertEquals(result.toString(), "m&alformed", result.get("audios__audio__album__")); assertEquals(result.toString(), "Rock 'n Roll", result.get("audios__audio__title__")); assertEquals(result.toString(), null, result.get("audios__audio__comments__")); // comment is not kept // assertEquals(result.toString(), "Sung by \"Joe Smith\"", result.get("audios__audio__comments__")); assertEquals(result.toString(), "also <malformed", result.get("audios__audio__artist__")); assertEquals(result.toString(), ">still malformed", result.get("audios__audio__license__")); assertEquals(result.toString(), "s pace", result.get("audios__audio__language__")); assertEquals(result.toString(), "even[ m�r�] c�a��cters", result.get("audios__audio__seconds__")); assertEquals(result.toString(), "a b", result.get("audios__audio__bitrate__")); } public void testParseInvalid() throws Exception { String invalid = "<?xml asdf asdf>"; try { XMLParsingUtils.parse(invalid,1); fail("parsed invalid xml"); }catch(SAXException expected){} invalid = "<?xml version=\"1.0\"?>"+ "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+ "<audio genre=\"Rock\" identifier=\"def1.txt\" bitrate=\"190\"/>"; try { XMLParsingUtils.parse(invalid,1); fail("parsed w/o closing audios tag"); }catch(SAXException expected){} invalid = "<?xml version=\"1.0\"?>"+ "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+ "<audio genre=\"Rock\" identifier=\"def1.txt\" bitrate=\"190\"></audios>"; try { XMLParsingUtils.parse(invalid,1); fail("parsed with non-null not-closed audio element"); }catch(SAXException expected){} invalid = "<?xml version=\"1.0\"?>"+ "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+ "<audio genre=\"Rock\" identifier=\"def1.txt bitrate=\"190\"/></audios>"; try { XMLParsingUtils.parse(invalid,1); fail("parsed with malformed attribute"); }catch(SAXException expected){} } }