/*
* eXist Open Source Native XML Database
* Copyright (C) 2010-2011 The eXist Project
* http://exist-db.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* $Id$
*/
package xquery;
import static org.exist.util.ArgumentUtil.getOpt;
import static org.junit.Assert.fail;
import static se.softhouse.jargo.Arguments.fileArgument;
import static se.softhouse.jargo.Arguments.helpArgument;
import static se.softhouse.jargo.Arguments.stringArgument;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import org.exist.source.FileSource;
import org.exist.source.Source;
import org.exist.util.FileUtils;
import org.exist.util.SystemExitCodes;
import org.exist.xmldb.DatabaseInstanceManager;
import org.exist.xmldb.XQueryService;
import org.exist.xmldb.XmldbURI;
import org.exist.xquery.value.Sequence;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
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.modules.XMLResource;
import se.softhouse.jargo.Argument;
import se.softhouse.jargo.ArgumentException;
import se.softhouse.jargo.CommandLineParser;
import se.softhouse.jargo.ParsedArguments;
public class TestRunnerMain {
/* general arguments */
private static final Argument<?> helpArg = helpArgument("-h", "--help");
/* control arguments */
private static final Argument<String> singleTestArg = stringArgument("-s", "--single")
.description("run a single test identified by its id attribute.")
.build();
private static final Argument<List<File>> fileArg = fileArgument()
.description("files containing tests to run")
.variableArity()
.build();
private static Collection rootCollection;
/**
* @param args
*/
public static void main(final String[] args) {
try {
final ParsedArguments arguments = CommandLineParser
.withArguments(singleTestArg)
.andArguments(fileArg)
.andArguments(helpArg)
.parse(args);
process(arguments);
} catch (final ArgumentException e) {
System.out.println(e.getMessageAndUsage());
System.exit(SystemExitCodes.INVALID_ARGUMENT_EXIT_CODE);
}
}
private static void process(final ParsedArguments arguments) {
final String id = getOpt(arguments, singleTestArg).orElse(null);
final List<Path> files = arguments.get(fileArg).stream().map(File::toPath).collect(Collectors.toList());
init();
try {
runTests(files, id);
} finally {
shutdown();
}
}
private static void runTests(final List<Path> files, final String id) {
try {
StringBuilder results = new StringBuilder();
XQueryService xqs = (XQueryService) rootCollection.getService("XQueryService", "1.0");
Source query = new FileSource(Paths.get("test/src/xquery/runTests.xql"), false);
for (final Path file : files) {
if (!Files.isReadable(file)) {
System.console().printf("Test file not found: %s\n", file.normalize().toAbsolutePath().toString());
return;
}
Document doc = TestRunner.parse(file);
xqs.declareVariable("doc", doc);
if (id != null) {
xqs.declareVariable("id", id);
} else {
xqs.declareVariable("id", Sequence.EMPTY_SEQUENCE);
}
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")) {
System.err.println(resource.getContent());
return;
}
}
}
System.out.println(results);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void init() {
// initialize driver
try {
Class<?> cl = Class.forName("org.exist.xmldb.DatabaseImpl");
Database database = (Database) cl.newInstance();
database.setProperty("create-database", "true");
DatabaseManager.registerDatabase(database);
rootCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void shutdown() {
if (rootCollection != null) {
try {
DatabaseInstanceManager dim =
(DatabaseInstanceManager) rootCollection.getService("DatabaseInstanceManager", "1.0");
dim.shutdown();
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
}
}