blob: 6705d7e3df66a7d27a51aaf6aa04b9b04b9c7997 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id$ */
package org.apache.fop.intermediate;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import org.custommonkey.xmlunit.XMLAssert;
import org.junit.After;
import org.junit.Before;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.NullOutputStream;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.events.model.EventSeverity;
import org.apache.fop.util.ConsoleEventListenerForTests;
/**
* Abstract base class for intermediate format tests.
*/
public abstract class AbstractIntermediateTestCase {
/** the test environment */
protected static TestAssistant testAssistant = new TestAssistant();
/** the FOP factory */
protected FopFactory fopFactory;
/** the directory containing the tests */
protected File testDir = new File("test/layoutengine/standard-testcases");
/** the output directory for any files generated by the tests */
protected File outputDir;
/** the test file */
protected File testFile;
/** the test document as DOM */
protected Document testDoc;
/** the intermediate format document as DOM */
protected Document intermediate;
/**
* Constructor for the test suite that is used for each test file.
* @param testFile the test file to run
* @throws IOException if an I/O error occurs while loading the test case
*/
public AbstractIntermediateTestCase(File testFile)
throws IOException {
this.testFile = testFile;
}
@Before
public void setUp() throws Exception {
setupOutputDirectory();
this.testDoc = testAssistant.loadTestCase(testFile);
this.fopFactory = testAssistant.getFopFactory(testDoc);
intermediate = buildIntermediateDocument(testAssistant.getTestcase2FOStylesheet());
if (outputDir != null) {
testAssistant.saveDOM(intermediate, new File(outputDir,
testFile.getName() + ".1" + getIntermediateFileExtension()));
}
}
@After
public void tearDown() throws Exception {
//Release memory
this.intermediate = null;
this.fopFactory = null;
this.testDoc = null;
}
/**
* Returns the file extension for the intermediate file format.
* @return the file extension
*/
protected abstract String getIntermediateFileExtension();
/**
* Returns the MIME type for which to test or to mimic for the intermediate format.
* @return the MIME type
*/
protected String getTargetMIME() {
return MimeConstants.MIME_PDF;
}
/**
* Validates the intermediate format file.
* @param doc the intermediate file
* @throws IOException if an IO error occurs while loading the schema
* @throws SAXException if a SAX-related exception (including a validation error) occurs
*/
protected void validate(Document doc) throws SAXException, IOException {
//nop by default
}
/**
* Builds an intermediate format document from a source file.
* @param templates the (optional) stylesheet
* @return the intermediate format document as a DOM
* @throws Exception if an error occurs while processing the document
*/
protected abstract Document buildIntermediateDocument(Templates templates) throws Exception;
/**
* Creates a new FOP user agent.
* @return the user agent
*/
protected FOUserAgent createUserAgent() {
FOUserAgent userAgent = fopFactory.newFOUserAgent();
try {
userAgent.setBaseURL(testDir.toURI().toURL().toExternalForm());
userAgent.getEventBroadcaster().addEventListener(
new ConsoleEventListenerForTests(testFile.getName(), EventSeverity.FATAL));
} catch (MalformedURLException e) {
// Shouldn't happen
throw new AssertionError();
}
return userAgent;
}
/**
* Sets up the output directory.
*/
protected void setupOutputDirectory() {
String s = System.getProperty("fop.intermediate.outdir");
if (s != null && s.length() > 0) {
outputDir = new File(s);
outputDir.mkdirs();
}
}
/**
* Tests the area tree parser by running the parsed area tree again through the area tree
* renderer. The source and result documents are compared to each other.
* @throws Exception if the test fails
*/
public void testParserToIntermediateFormat() throws Exception {
validate(intermediate);
Source src = new DOMSource(intermediate);
Document doc = parseAndRenderToIntermediateFormat(src);
if (outputDir != null) {
File tgtFile = new File(outputDir, testFile.getName() + ".2"
+ getIntermediateFileExtension());
testAssistant.saveDOM(doc, tgtFile);
}
XMLAssert.assertXMLEqual(intermediate, doc);
}
/**
* Parses the intermediate file and renders it back to the intermediate format.
* @param src the source for the intermediate file
* @return a DOM Document with the re-created intermediate file
* @throws Exception if an error occurs while processing the document
*/
protected abstract Document parseAndRenderToIntermediateFormat(Source src) throws Exception;
/**
* Tests the area tree parser by sending the parsed area tree to the PDF Renderer. Some
* errors might be caught by the PDFRenderer.
* @throws Exception if the test fails
*/
public void testParserToPDF() throws Exception {
OutputStream out;
if (outputDir != null) {
File tgtFile = new File(outputDir, testFile.getName() + ".pdf");
out = new FileOutputStream(tgtFile);
out = new BufferedOutputStream(out);
} else {
out = new NullOutputStream();
}
try {
Source src = new DOMSource(intermediate);
parseAndRender(src, out);
} finally {
IOUtils.closeQuietly(out);
}
}
/**
* Parses and renders an intermediate format document to a final format.
* @param src the source document
* @param out the target output stream
* @throws Exception if an error occurs while rendering the document
*/
protected abstract void parseAndRender(Source src, OutputStream out)
throws Exception;
/**
* Run the test.
*
* @throws Exception if an error occurs during the test
*/
public abstract void runTest() throws Exception;
/**
* Sets an error listener which doesn't swallow errors like Xalan's default one.
* @param transformer the transformer to set the error listener on
*/
protected void setErrorListener(Transformer transformer) {
transformer.setErrorListener(new ErrorListener() {
public void error(TransformerException exception) throws TransformerException {
throw exception;
}
public void fatalError(TransformerException exception) throws TransformerException {
throw exception;
}
public void warning(TransformerException exception) throws TransformerException {
//ignore
}
});
}
}