package org.tigris.juxy.verifier;
import junit.framework.TestCase;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.tigris.juxy.TestUtil;
/**
*/
public class UTestVerifierImpl extends TestCase {
private Verifier verifier;
private DummyReporter reporter;
protected void setUp() throws Exception {
verifier = new VerifierImpl();
reporter = new DummyReporter();
verifier.setErrorReporter(reporter);
}
public void testOneSimpleStylesheet() {
verifier.setFiles(files(new String[]{"no-imports.xsl"}));
assertTrue(verifier.verify(false));
assertEquals(1, verifier.getNumberOfVerifiedFiles());
}
public void testImportedStylesheetsUseGlobalVariable() {
verifier.setFiles(files(new String[]{"imported.xsl", "included.xsl", "root.xsl"}));
assertTrue(verifier.verify(false));
assertEquals(1, verifier.getNumberOfVerifiedFiles());
}
public void testImportUsingURIResolver() {
verifier.setFiles(files(new String[]{"imported.xsl", "resolver.xsl"}));
verifier.setURIResolver(new URIResolver() {
public Source resolve(String href, String base) {
if ("http://uri.com".equals(href))
return new StreamSource(new File("tests/xml/verifier/imported.xsl").toURI().toString());
return null;
}
});
assertTrue(verifier.verify(false));
assertEquals(1, verifier.getNumberOfVerifiedFiles());
}
public void testURIResolverThrowsException() {
verifier.setFiles(files(new String[]{"resolver.xsl"}));
verifier.setURIResolver(new URIResolver() {
public Source resolve(String href, String base) throws TransformerException {
throw new TransformerException("an exception");
}
});
assertFalse(verifier.verify(false));
assertEquals(0, verifier.getNumberOfVerifiedFiles());
// Oracle XDK && Xalan XSLTC do not report errors if URI
// resolver throws exception
if (!TestUtil.isJavaXalanXSLTC() && !TestUtil.isXalanXSLTC()) {
assertTrue(reporter.errors()[0].contains("an exception"));
}
assertEquals(1, verifier.getNumberOfNotVerifiedFiles());
}
public void testNotExistentFileIgnored() {
verifier.setFiles(files(new String[]{"non-existent-file.xsl", "root.xsl"}));
assertTrue(verifier.verify(false));
assertEquals(1, verifier.getNumberOfVerifiedFiles());
}
public void testDirectoryInsteadOfFileIgnored() {
verifier.setFiles(files(new String[]{".", "root.xsl"}));
assertTrue(verifier.verify(false));
assertEquals(1, verifier.getNumberOfVerifiedFiles());
}
public void testNotWellFormedFile() {
verifier.setFiles(files(new String[]{"not-well-formed.xsl", "root.xsl"}));
assertFalse(verifier.verify(false));
assertEquals(1, verifier.getNumberOfVerifiedFiles());
assertEquals(2, reporter.errors().length);
}
public void testNotWellFormedFileFailFast() {
verifier.setFiles(files(new String[]{"not-well-formed.xsl", "root.xsl"}));
assertFalse(verifier.verify(true));
assertEquals(0, verifier.getNumberOfVerifiedFiles());
}
public void testStylesheetIsIncorrect() {
verifier.setFiles(files(new String[]{"bad-stylesheet.xsl"}));
assertFalse(verifier.verify(false));
assertEquals(0, verifier.getNumberOfVerifiedFiles());
assertTrue(reporter.errors().length > 0);
}
public void testTransformerFactoryUnknown_DefaultUsed() {
verifier.setFiles(files(new String[]{"root.xsl"}));
String className = "org.unknown.TransformerFactory";
verifier.setTransformerFactory(className);
assertTrue(verifier.verify(false));
assertTrue(reporter.warnings().length > 0);
assertTrue(containsMessage(reporter.warnings(), "Failed to load class for specified TransformerFactory: " + className));
assertTrue(containsMessage(reporter.infos(), "Using default TransformerFactory"));
}
public void testSpecifiedTransformerFactoryUsed() {
verifier.setFiles(files(new String[]{"root.xsl"}));
String className = "net.sf.saxon.TransformerFactoryImpl";
verifier.setTransformerFactory(className);
assertTrue(verifier.verify(false));
assertTrue(containsMessage(reporter.infos(), "Obtained TransformerFactory: " + className));
className = "org.apache.xalan.processor.TransformerFactoryImpl";
verifier.setTransformerFactory(className);
assertTrue(verifier.verify(false));
assertTrue(containsMessage(reporter.infos(), "Obtained TransformerFactory: " + className));
}
public void testStylesheetsSorted() {
verifier.setFiles(files(new String[]{"3.xsl", "1.xsl", "2.xsl"}));
assertTrue(verifier.verify(false));
String[] infos = reporter.infos();
assertEquals("tests/xml/verifier/3.xsl ...", infos[infos.length - 1]);
assertEquals("tests/xml/verifier/2.xsl ...", infos[infos.length - 2]);
assertEquals("tests/xml/verifier/1.xsl ...", infos[infos.length - 3]);
}
private boolean containsMessage(String[] messages, String message) {
for (int i = 0; i < messages.length; i++) {
if (messages[i].equals(message))
return true;
}
return false;
}
private List files(String[] paths) {
List files = new ArrayList();
for (int i = 0; i < paths.length; i++) {
files.add(new File("tests/xml/verifier/", paths[i]));
}
return files;
}
class DummyReporter implements ErrorReporter {
private List errors = new ArrayList();
private List warnings = new ArrayList();
private List info = new ArrayList();
public void info(String message) {
System.out.println("[INFO] " + message);
info.add(message);
}
public void error(String message) {
System.out.println("[ERROR] " + message);
errors.add(message);
}
public void warning(String message) {
System.out.println("[WARN] " + message);
warnings.add(message);
}
public String[] errors() {
return (String[]) errors.toArray(new String[]{});
}
public String[] warnings() {
return (String[]) warnings.toArray(new String[]{});
}
public String[] infos() {
return (String[]) info.toArray(new String[]{});
}
}
}