| /* |
| * 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.layoutengine; |
| |
| import java.io.File; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.List; |
| |
| import javax.xml.transform.Result; |
| import javax.xml.transform.Source; |
| import javax.xml.transform.Transformer; |
| import javax.xml.transform.TransformerConfigurationException; |
| import javax.xml.transform.TransformerException; |
| import javax.xml.transform.TransformerFactory; |
| import javax.xml.transform.sax.SAXResult; |
| import javax.xml.transform.stream.StreamSource; |
| |
| import org.xml.sax.Attributes; |
| import org.xml.sax.SAXException; |
| import org.xml.sax.helpers.DefaultHandler; |
| |
| import org.apache.commons.io.FileUtils; |
| import org.apache.commons.io.filefilter.AndFileFilter; |
| import org.apache.commons.io.filefilter.IOFileFilter; |
| import org.apache.commons.io.filefilter.NameFileFilter; |
| import org.apache.commons.io.filefilter.NotFileFilter; |
| import org.apache.commons.io.filefilter.PrefixFileFilter; |
| import org.apache.commons.io.filefilter.SuffixFileFilter; |
| import org.apache.commons.io.filefilter.TrueFileFilter; |
| |
| /** |
| * Utility class for layout engine tests. |
| */ |
| public final class LayoutEngineTestUtils { |
| |
| /** Set this to true to get the correspondence between test number and test file. */ |
| private static final boolean DEBUG = false; |
| |
| private LayoutEngineTestUtils() { |
| } |
| |
| private static class FilenameHandler extends DefaultHandler { |
| private StringBuffer buffer = new StringBuffer(128); |
| private boolean readingFilename; |
| private List<String> filenames; |
| |
| public FilenameHandler(List<String> filenames) { |
| this.filenames = filenames; |
| } |
| |
| public void startElement(String namespaceURI, String localName, String qName, |
| Attributes atts) throws SAXException { |
| if (qName != null && qName.equals("file")) { |
| buffer.setLength(0); |
| readingFilename = true; |
| } else { |
| throw new RuntimeException( |
| "Unexpected element while reading disabled testcase file names: " + qName); |
| } |
| } |
| |
| public void endElement(String namespaceURI, String localName, String qName) |
| throws SAXException { |
| if (qName != null && qName.equals("file")) { |
| readingFilename = false; |
| filenames.add(buffer.toString()); |
| } else { |
| throw new RuntimeException( |
| "Unexpected element while reading disabled testcase file names: " + qName); |
| } |
| } |
| |
| public void characters(char[] ch, int start, int length) throws SAXException { |
| if (readingFilename) { |
| buffer.append(ch, start, length); |
| } |
| } |
| } |
| |
| /** |
| * Removes from {@code filter} any tests that have been disabled. |
| * |
| * @param filter the filter populated with tests |
| * @param disabled name of the file containing disabled test cases. If null or empty, |
| * no file is read |
| * @return {@code filter} minus any disabled tests |
| */ |
| public static IOFileFilter decorateWithDisabledList(IOFileFilter filter, String disabled) { |
| if (disabled != null && disabled.length() > 0) { |
| filter = new AndFileFilter(new NotFileFilter(new NameFileFilter( |
| LayoutEngineTestUtils.readDisabledTestcases(new File(disabled)))), filter); |
| } |
| return filter; |
| } |
| |
| private static String[] readDisabledTestcases(File f) { |
| List<String> lines = new ArrayList<String>(); |
| Source stylesheet = new StreamSource( |
| new File("test/layoutengine/disabled-testcase2filename.xsl")); |
| Source source = new StreamSource(f); |
| Result result = new SAXResult(new FilenameHandler(lines)); |
| try { |
| Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesheet); |
| transformer.transform(source, result); |
| } catch (TransformerConfigurationException tce) { |
| throw new RuntimeException(tce); |
| } catch (TransformerException te) { |
| throw new RuntimeException(te); |
| } |
| return (String[]) lines.toArray(new String[lines.size()]); |
| } |
| |
| /** |
| * Returns the test files matching the given configuration. |
| * |
| * @param testConfig the test configuration |
| * @return the applicable test cases |
| */ |
| public static Collection<File[]> getTestFiles(TestFilesConfiguration testConfig) { |
| File mainDir = testConfig.getTestDirectory(); |
| IOFileFilter filter; |
| String single = testConfig.getSingleTest(); |
| String startsWith = testConfig.getStartsWith(); |
| if (single != null) { |
| filter = new NameFileFilter(single); |
| } else if (startsWith != null) { |
| filter = new PrefixFileFilter(startsWith); |
| filter = new AndFileFilter(filter, new SuffixFileFilter(testConfig.getFileSuffix())); |
| filter = decorateWithDisabledList(filter, testConfig.getDisabledTests()); |
| } else { |
| filter = new SuffixFileFilter(testConfig.getFileSuffix()); |
| filter = decorateWithDisabledList(filter, testConfig.getDisabledTests()); |
| } |
| String testset = testConfig.getTestSet(); |
| |
| Collection<File> files = FileUtils.listFiles(new File(mainDir, testset), filter, |
| TrueFileFilter.INSTANCE); |
| if (testConfig.hasPrivateTests()) { |
| Collection<File> privateFiles = FileUtils.listFiles(new File(mainDir, |
| "private-testcases"), filter, TrueFileFilter.INSTANCE); |
| files.addAll(privateFiles); |
| } |
| |
| Collection<File[]> parametersForJUnit4 = new ArrayList<File[]>(); |
| int index = 0; |
| for (File f : files) { |
| parametersForJUnit4.add(new File[] {f}); |
| if (DEBUG) { |
| System.out.println(String.format("%3d %s", index++, f)); |
| } |
| } |
| |
| return parametersForJUnit4; |
| } |
| |
| /** |
| * This is a helper method that uses the standard parameters for FOP's layout engine tests and |
| * returns a set of test files. These pull in System parameters to configure the layout tests |
| * to run. |
| * |
| * @return A collection of file arrays that contain the test files |
| */ |
| public static Collection<File[]> getLayoutTestFiles() { |
| String testSet = System.getProperty("fop.layoutengine.testset"); |
| testSet = (testSet != null ? testSet : "standard") + "-testcases"; |
| return getLayoutTestFiles(testSet); |
| } |
| |
| /** |
| * This is a helper method that uses the standard parameters for FOP's layout engine tests, |
| * given a test set name returns a set of test files. |
| * |
| * @param testSetName the name of the test set |
| * @return A collection of file arrays that contain the test files |
| */ |
| public static Collection<File[]> getLayoutTestFiles(String testSetName) { |
| TestFilesConfiguration.Builder builder = new TestFilesConfiguration.Builder(); |
| |
| builder.testDir("test/layoutengine") |
| .singleProperty("fop.layoutengine.single") |
| .startsWithProperty("fop.layoutengine.starts-with") |
| .suffix(".xml") |
| .testSet(testSetName) |
| .disabledProperty("fop.layoutengine.disabled", |
| "test/layoutengine/disabled-testcases.xml") |
| .privateTestsProperty("fop.layoutengine.private"); |
| |
| TestFilesConfiguration testConfig = builder.build(); |
| return getTestFiles(testConfig); |
| } |
| |
| } |