View Javadoc

1   package groovy.util;
2   
3   import groovy.lang.GroovyClassLoader;
4   import groovy.lang.Script;
5   import junit.framework.Test;
6   import junit.framework.TestSuite;
7   import org.codehaus.groovy.control.CompilationFailedException;
8   import org.codehaus.groovy.runtime.ScriptTestAdapter;
9   
10  import java.io.File;
11  import java.io.IOException;
12  import java.util.Collection;
13  import java.util.Iterator;
14  import java.util.logging.Logger;
15  
16  /***
17   * AllTestSuite can be used in extension of GroovyTestSuite to execute TestCases written in Groovy
18   * from inside a Java IDE.
19   * AllTestSuite collects all files below a given directory that comply to a given pattern.
20   * From these files, a TestSuite is constructed that can be run via an IDE graphical Test runner.
21   * The files are assumed to be Groovy source files and be either a TestCase or a Script that can
22   * be wrapped transparently into a TestCase.
23   * The directory and the pattern can be set via System properties (see this classes' constants for details.)
24   *
25   * When setting the loglevel of this class to FINEST, all file loading will be logged.
26   *
27   * See also groovy.util.AllTestSuiteTest.groovy
28   * @author Dierk Koenig based on a prototype by Andrew Glover
29   * todo: dk: make FileNameFinder injectable
30   */
31  public class AllTestSuite extends TestSuite {
32  
33      /*** The System Property to set as base directory for collection of Test Cases.
34       * The pattern will be used as an Ant fileset include basedir.
35       * Key is "groovy.test.dir".
36       * Default value is "./test/".
37       */
38      public static final String SYSPROP_TEST_DIR = "groovy.test.dir";
39  
40      /*** The System Property to set as the filename pattern for collection of Test Cases.
41       * The pattern will be used as Regualar Expression pattern applied with the find
42       * operator agains each candidate file.path.
43       * Key is "groovy.test.pattern".
44       * Default value is "Test.groovy".
45       */
46      public static final String SYSPROP_TEST_PATTERN = "groovy.test.pattern";
47  
48      private static Logger LOG = Logger.getLogger(AllTestSuite.class.getName());
49      private static ClassLoader JAVA_LOADER = AllTestSuite.class.getClassLoader();
50      private static GroovyClassLoader GROOVY_LOADER = new GroovyClassLoader(JAVA_LOADER);
51  
52      private static final String[] EMPTY_ARGS = new String[]{};
53      private static IFileNameFinder FINDER = null;
54  
55      static { // this is only needed since the Groovy Build compiles *.groovy files after *.java files
56          try {
57              Class finderClass = Class.forName("groovy.util.FileNameFinder");
58              FINDER = (IFileNameFinder) finderClass.newInstance();
59          } catch (Exception e) {
60              throw new RuntimeException("Cannot find and instantiate class FileNameFinder", e);
61          }
62      }
63  
64      public static Test suite() {
65          String basedir = System.getProperty(SYSPROP_TEST_DIR, "./test/");
66          String pattern = System.getProperty(SYSPROP_TEST_PATTERN, "**/*Test.groovy");
67          return suite(basedir, pattern);
68      }    
69  
70      public static Test suite(String basedir, String pattern) {
71          AllTestSuite suite = new AllTestSuite();
72          String fileName = "";
73          try {
74              Collection filenames = FINDER.getFileNames(basedir, pattern);
75              for (Iterator iter = filenames.iterator(); iter.hasNext();) {
76                  fileName = (String) iter.next();
77                  LOG.finest("trying to load "+ fileName);
78                  suite.loadTest(fileName);
79              }
80          } catch (CompilationFailedException e1) {
81              e1.printStackTrace();
82              throw new RuntimeException("CompilationFailedException when loading "+fileName, e1);
83          } catch (IOException e2) {
84              throw new RuntimeException("IOException when loading "+fileName, e2);
85          }
86          return suite;
87      }
88  
89      protected void loadTest(String fileName) throws CompilationFailedException, IOException {
90          Class type = compile(fileName);
91          if (!Test.class.isAssignableFrom(type) && Script.class.isAssignableFrom(type)) {
92              addTest(new ScriptTestAdapter(type, EMPTY_ARGS));
93          } else {
94              addTestSuite(type);
95          }
96      }
97  
98      protected Class compile(String fileName) throws CompilationFailedException, IOException {
99          return GROOVY_LOADER.parseClass(new File(fileName));
100     }
101 }