blob: e2d3bd4ac4b0bf911c8bb3d30edc831796561d91 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and Others
* 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.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Hisashi MIYASHITA - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.ai.xmlstore.nvdl.driver;
import java.io.File;
import java.io.FilenameFilter;
import javax.xml.parsers.SAXParser;
import javax.xml.validation.ValidatorHandler;
import org.eclipse.actf.ai.xmlstore.nvdl.NVDLException;
import org.eclipse.actf.ai.xmlstore.nvdl.dispatcher.NVDLSAXDispatcher;
import org.eclipse.actf.ai.xmlstore.nvdl.model.NVDLRules;
import org.eclipse.actf.ai.xmlstore.nvdl.reader.NVDLSAXReader;
import org.eclipse.actf.ai.xmlstore.nvdl.util.DefaultErrorHandler;
import org.eclipse.actf.ai.xmlstore.nvdl.util.IRIUtil;
import org.eclipse.actf.ai.xmlstore.nvdl.util.Log;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class TestDriver {
SAXParser parser;
NVDLSAXReader r;
TestDriver() throws SAXException {
this.parser = NVDLSAXReader.newSAXParser();
parser.getXMLReader().setErrorHandler(DefaultErrorHandler.getErrorHandler());
this.r = new NVDLSAXReader(parser);
}
static public class TestSet {
boolean result;
String baseName;
String nvdlFilename;
Case[] cases;
public class Case {
boolean result;
String xmlFilename;
}
Case newCase() {
return new Case();
}
}
NVDLRules readTest(String path, boolean result) throws Exception {
InputSource is = IRIUtil.newInputSourceFromFilename(path);
if (!result) {
System.out.println("Interpret " + path
+ ", assuming it is invalid.");
try {
r.parse(is);
} catch (Exception e) {
return null;
}
throw new NVDLException("The test failed... ");
} else {
System.out.println("Interpret " + path
+ ", assuming it is valid.");
return r.parse(is);
}
}
void dispatchTest(XMLReader vr, File d, TestSet.Case c) throws Exception {
String path = d.getPath() + File.separator + c.xmlFilename;
InputSource is = IRIUtil.newInputSourceFromFilename(path);
if (!c.result) {
System.out.println("Validate " + path
+ ", assuming it is invalid.");
try {
vr.parse(is);
} catch (Exception e) {
return;
}
throw new NVDLException("The test failed... ");
} else {
System.out.println("Validate " + path
+ ", assuming it is valid.");
vr.parse(is);
}
}
void doTest(File d, TestSet ts) throws Exception {
NVDLRules rules = readTest(d.getPath() + File.separator
+ ts.nvdlFilename, ts.result);
if (!ts.result) return;
NVDLSAXDispatcher dispatcher = new NVDLSAXDispatcher(rules, false);
ValidatorHandler h = dispatcher.getValidatorHandler();
XMLReader vr = XMLReaderFactory.createXMLReader();
vr.setFeature("http://xml.org/sax/features/namespaces", true);
vr.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
h.setErrorHandler(DefaultErrorHandler.getErrorHandler());
vr.setContentHandler(h);
vr.setErrorHandler(DefaultErrorHandler.getErrorHandler());
for (int i = 0; i < ts.cases.length; i++) {
dispatchTest(vr, d, ts.cases[i]);
dispatcher.reset();
}
}
void invalidFilename(String filename) {
throw new IllegalArgumentException("Filename must be of the form of '<name>-<true/false>-<number>.<suffix>':" + filename);
}
static class BaseNameFilter implements FilenameFilter {
final String baseName;
public boolean accept(File dir, String name) {
if (!name.endsWith(".xml")) return false;
String[] parts = name.split("-");
if (parts.length != 3) return false;
if (!parts[0].equals(baseName)) return false;
return true;
}
BaseNameFilter(String baseName) {
this.baseName = baseName;
}
}
void testCaseSet(File base, TestSet ts) {
String[] fileList;
fileList = base.list(new BaseNameFilter(ts.baseName));
ts.cases = new TestSet.Case[fileList.length];
for (int i = 0; i < fileList.length; i++) {
String[] parts = fileList[i].split("-");
TestSet.Case cs = ts.newCase();
cs.xmlFilename = fileList[i];
if ("true".equals(parts[1])) {
cs.result = true;
} else if ("false".equals(parts[1])) {
cs.result = false;
} else {
invalidFilename(cs.xmlFilename);
}
ts.cases[i] = cs;
}
}
TestSet parseFilename(File base, String filename) {
String[] parts = filename.split("-");
if (parts.length != 3) {
invalidFilename(filename);
}
TestSet ts = new TestSet();
ts.nvdlFilename = filename;
ts.baseName = parts[0];
if ("true".equals(parts[1])) {
ts.result = true;
testCaseSet(base, ts);
} else if ("false".equals(parts[1])) {
ts.result = false;
} else {
invalidFilename(filename);
}
return ts;
}
void testDir(String dir) throws Exception {
File f = new File(dir);
if (!f.exists()) {
Log.error("Directory:" + dir + " does not exist. Skip it.");
return;
}
if (!f.isDirectory()) {
Log.error(dir + " is not a directory. Skip it.");
return;
}
String[] fileList;
fileList = f.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
if (!name.endsWith(".nvdl")) return false;
String[] parts = name.split("-");
if (parts.length != 3) return false;
return true;
}
});
for (int i = 0; i < fileList.length; i++) {
doTest(f, parseFilename(f, fileList[i]));
}
}
public static void main(String[] args) {
try {
TestDriver td = new TestDriver();
for (int i = 0; i < args.length; i++) {
td.testDir(args[i]);
}
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace(System.out);
System.out.flush();
System.exit(255);
}
System.out.println("All tests are done.");
System.out.flush();
System.exit(0);
}
}