package xquery; import org.exist.Namespaces; import org.exist.memtree.SAXAdapter; import org.exist.source.FileSource; import org.exist.source.Source; import org.exist.storage.DBBroker; import org.exist.util.XMLFilenameFilter; import org.exist.xmldb.DatabaseInstanceManager; import org.exist.xmldb.XQueryService; import org.junit.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Database; import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import java.io.File; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import static org.junit.Assert.fail; public abstract class TestRunner { private Collection rootCollection; protected abstract String getDirectory(); @Test public void run() { File dir = new File(getDirectory()); File[] files = dir.listFiles(new XMLFilenameFilter()); try { StringBuilder fails = new StringBuilder(); StringBuilder results = new StringBuilder(); XQueryService xqs = (XQueryService) rootCollection.getService("XQueryService", "1.0"); Source query = new FileSource(new File("test/src/xquery/runTests.xql"), "UTF-8", false); for (File file : files) { Document doc = parse(file); xqs.declareVariable("doc", doc); ResourceSet result = xqs.execute(query); XMLResource resource = (XMLResource) result.getResource(0); results.append(resource.getContent()).append('\n'); Element root = (Element) resource.getContentAsDOM(); NodeList tests = root.getElementsByTagName("test"); for (int i = 0; i < tests.getLength(); i++) { Element test = (Element) tests.item(i); String passed = test.getAttribute("pass"); if (passed.equals("false")) { fails.append("Test " + test.getAttribute("n") + "in file " + file.getName() + " failed.\n"); } } } if (fails.length() > 0) { System.err.print(results); fail(fails.toString()); } System.out.println(results); } catch (XMLDBException e) { e.printStackTrace(); fail(e.getMessage()); } catch (IOException e) { e.printStackTrace(); fail(e.getMessage()); } catch (SAXException e) { e.printStackTrace(); fail(e.getMessage()); } catch (ParserConfigurationException e) { e.printStackTrace(); fail(e.getMessage()); } } @Before public void setUpBefore() throws Exception { // initialize driver Class<?> cl = Class.forName("org.exist.xmldb.DatabaseImpl"); Database database = (Database) cl.newInstance(); database.setProperty("create-database", "true"); DatabaseManager.registerDatabase(database); rootCollection = DatabaseManager.getCollection("xmldb:exist://" + DBBroker.ROOT_COLLECTION, "admin", null); } @After public void tearDownAfter() { if (rootCollection != null) { try { DatabaseInstanceManager dim = (DatabaseInstanceManager) rootCollection.getService( "DatabaseInstanceManager", "1.0"); dim.shutdown(); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } rootCollection = null; } protected static Document parse(File file) throws IOException, SAXException, ParserConfigurationException { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(true); InputSource src = new InputSource(file.toURI().toASCIIString()); SAXParser parser = factory.newSAXParser(); XMLReader xr = parser.getXMLReader(); SAXAdapter adapter = new SAXAdapter(); xr.setContentHandler(adapter); xr.setProperty(Namespaces.SAX_LEXICAL_HANDLER, adapter); xr.parse(src); return adapter.getDocument(); } }