You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LayoutEngineTestSuite.java 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * Copyright 2005 The Apache Software Foundation.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /* $Id$ */
  17. package org.apache.fop.layoutengine;
  18. import java.io.BufferedReader;
  19. import java.io.File;
  20. import java.io.FileReader;
  21. import java.io.IOException;
  22. import java.io.Reader;
  23. import java.util.Collection;
  24. import java.util.Iterator;
  25. import java.util.List;
  26. import javax.xml.transform.Result;
  27. import javax.xml.transform.Source;
  28. import javax.xml.transform.Transformer;
  29. import javax.xml.transform.TransformerConfigurationException;
  30. import javax.xml.transform.TransformerException;
  31. import javax.xml.transform.TransformerFactory;
  32. import javax.xml.transform.sax.SAXResult;
  33. import javax.xml.transform.stream.StreamSource;
  34. import org.apache.commons.io.FileUtils;
  35. import org.apache.commons.io.filefilter.AndFileFilter;
  36. import org.apache.commons.io.filefilter.IOFileFilter;
  37. import org.apache.commons.io.filefilter.NameFileFilter;
  38. import org.apache.commons.io.filefilter.NotFileFilter;
  39. import org.apache.commons.io.filefilter.PrefixFileFilter;
  40. import org.apache.commons.io.filefilter.SuffixFileFilter;
  41. import org.apache.commons.io.filefilter.TrueFileFilter;
  42. import org.apache.fop.DebugHelper;
  43. import org.xml.sax.Attributes;
  44. import org.xml.sax.SAXException;
  45. import org.xml.sax.helpers.DefaultHandler;
  46. import junit.framework.Test;
  47. import junit.framework.TestCase;
  48. import junit.framework.TestSuite;
  49. /**
  50. * JUnit test suit for running layout engine test under JUnit control.
  51. */
  52. public class LayoutEngineTestSuite {
  53. static {
  54. DebugHelper.registerStandardElementListObservers();
  55. }
  56. public static String[] readLinesFromFile(File f) throws IOException {
  57. List lines = new java.util.ArrayList();
  58. Reader reader = new FileReader(f);
  59. BufferedReader br = new BufferedReader(reader);
  60. String line;
  61. while ((line = br.readLine()) != null) {
  62. lines.add(line);
  63. }
  64. return (String[])lines.toArray(new String[lines.size()]);
  65. }
  66. public static String[] readDisabledTestcases(File f) throws IOException {
  67. List lines = new java.util.ArrayList();
  68. Source stylesheet = new StreamSource(new File("test/layoutengine/disabled-testcase2filename.xsl"));
  69. Source source = new StreamSource(f);
  70. Result result = new SAXResult(new FilenameHandler(lines));
  71. try {
  72. Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesheet);
  73. transformer.transform(source, result);
  74. }
  75. catch( TransformerConfigurationException tce ) {
  76. throw new RuntimeException(tce);
  77. }
  78. catch( TransformerException te ) {
  79. throw new RuntimeException(te);
  80. }
  81. return (String[])lines.toArray(new String[lines.size()]);
  82. }
  83. private static class FilenameHandler extends DefaultHandler {
  84. private StringBuffer buffer = new StringBuffer(128);
  85. private boolean readingFilename =false;
  86. private List filenames;
  87. public FilenameHandler(List filenames) {
  88. this.filenames = filenames;
  89. }
  90. public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
  91. if (qName!=null && qName.equals("file")) {
  92. buffer.setLength(0);
  93. readingFilename = true;
  94. } else {
  95. throw new RuntimeException("Unexpected element while reading disabled testcase file names: "+qName);
  96. }
  97. }
  98. public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
  99. if (qName!=null && qName.equals("file")) {
  100. readingFilename = false;
  101. filenames.add(buffer.toString());
  102. } else {
  103. throw new RuntimeException("Unexpected element while reading disabled testcase file names: "+qName);
  104. }
  105. }
  106. public void characters(char[] ch, int start, int length) throws SAXException {
  107. if (readingFilename) {
  108. buffer.append(ch,start,length);
  109. }
  110. }
  111. }
  112. public static IOFileFilter decorateWithDisabledList(IOFileFilter filter) throws IOException {
  113. String disabled = System.getProperty("fop.layoutengine.disabled");
  114. if (disabled != null && disabled.length() > 0) {
  115. filter = new AndFileFilter(new NotFileFilter(
  116. // new NameFileFilter(readLinesFromFile(new File(disabled)))),
  117. new NameFileFilter(readDisabledTestcases(new File(disabled)))),
  118. filter);
  119. }
  120. return filter;
  121. }
  122. /**
  123. * @return the test suite with all the tests (one for each XML file)
  124. * @throws IOException in case of an I/O problem
  125. */
  126. public static Test suite() throws IOException {
  127. TestSuite suite = new TestSuite();
  128. File mainDir = new File("test/layoutengine");
  129. File backupDir = new File("build/test-results/layoutengine");
  130. backupDir.mkdirs();
  131. final LayoutEngineTester tester = new LayoutEngineTester(backupDir);
  132. IOFileFilter filter;
  133. String single = System.getProperty("fop.layoutengine.single");
  134. String startsWith = System.getProperty("fop.layoutengine.starts-with");
  135. if (single != null) {
  136. filter = new NameFileFilter(single);
  137. } else if (startsWith != null) {
  138. filter = new PrefixFileFilter(startsWith);
  139. filter = new AndFileFilter(filter, new SuffixFileFilter(".xml"));
  140. } else {
  141. filter = new SuffixFileFilter(".xml");
  142. filter = decorateWithDisabledList(filter);
  143. }
  144. String testset = System.getProperty("fop.layoutengine.testset");
  145. if (testset == null) {
  146. testset = "standard";
  147. }
  148. Collection files = FileUtils.listFiles(new File(mainDir, testset + "-testcases"),
  149. filter, TrueFileFilter.INSTANCE);
  150. String privateTests = System.getProperty("fop.layoutengine.private");
  151. if ("true".equalsIgnoreCase(privateTests)) {
  152. Collection privateFiles = FileUtils.listFiles(
  153. new File(mainDir, "private-testcases"),
  154. filter, TrueFileFilter.INSTANCE);
  155. files.addAll(privateFiles);
  156. }
  157. Iterator i = files.iterator();
  158. while (i.hasNext()) {
  159. File f = (File)i.next();
  160. addTestCase(suite, tester, f);
  161. }
  162. return suite;
  163. }
  164. private static void addTestCase(TestSuite suite,
  165. final LayoutEngineTester tester, final File f) {
  166. suite.addTest(new LayoutEngineTestCase(f.getName()) {
  167. public void runTest() throws Exception {
  168. org.apache.commons.logging.LogFactory.getLog(this.getClass()).info("Starting " + f.getName());
  169. prepare(tester, f);
  170. testMain();
  171. }
  172. });
  173. }
  174. private static class LayoutEngineTestCase extends TestCase {
  175. private LayoutEngineTester tester;
  176. private File testFile;
  177. public LayoutEngineTestCase(String name) {
  178. super(name);
  179. }
  180. public void prepare(LayoutEngineTester tester, File testFile) {
  181. //super(testFile.getName());
  182. this.tester = tester;
  183. this.testFile = testFile;
  184. }
  185. public void testMain() throws Exception {
  186. tester.runTest(testFile);
  187. }
  188. }
  189. }