1   package net.sf.clirr.core.internal.checks;
2   
3   import junit.framework.TestCase;
4   import net.sf.clirr.core.Checker;
5   import net.sf.clirr.core.ClassSelector;
6   import net.sf.clirr.core.ApiDifference;
7   import net.sf.clirr.core.CheckerFactory;
8   import net.sf.clirr.core.ClassFilter;
9   import net.sf.clirr.core.internal.ClassChangeCheck;
10  import net.sf.clirr.core.internal.bcel.BcelTypeArrayBuilder;
11  import net.sf.clirr.core.spi.JavaType;
12  
13  import org.apache.bcel.util.ClassSet;
14  
15  import java.io.File;
16  import java.net.URL;
17  import java.net.URLClassLoader;
18  
19  /***
20   * Abstract Baseclass to test individual Checks.
21   * @author lkuehne
22   */
23  public abstract class AbstractCheckTestCase extends TestCase
24  {
25      protected final File getTestInputDir()
26      {
27          // property is set in project.properties
28          return new File(System.getProperty("testinput"));
29      }
30  
31      protected void verify(
32              Checker checker,
33              ClassSet baseline, ClassSet current,
34              ApiDifference[] expected)
35      {
36      }
37  
38      protected File[] getBaseLine()
39      {
40          return new File[]{
41              new File(getTestInputDir(), "testlib-v1.jar")
42          };
43      }
44  
45      protected File[] getCurrent()
46      {
47          return new File[]{
48              new File(getTestInputDir(), "testlib-v2.jar")
49          };
50      }
51  
52      protected void verify(ExpectedDiff[] expected)
53      throws Exception
54      {
55          TestDiffListener tdl = new TestDiffListener();
56          Checker checker = CheckerFactory.createChecker(createCheck(tdl));
57          ClassFilter classSelector = createClassSelector();
58  
59          final JavaType[] origClasses =
60              BcelTypeArrayBuilder.createClassSet(getBaseLine(), new URLClassLoader(new URL[]{}), classSelector);
61          
62          final JavaType[] newClasses =
63              BcelTypeArrayBuilder.createClassSet(getCurrent(), new URLClassLoader(new URL[]{}), classSelector);
64          
65          checker.reportDiffs(origClasses, newClasses);
66  
67          tdl.checkExpected(expected);
68      }
69  
70      /***
71       * Creates an object which selects the appropriate classes from the
72       * test jars for this test.
73       * <p>
74       * This base implementation returns a selector which selects all classes
75       * in the base "testlib" package (but no sub-packages). Tests which wish
76       * to select different classes from the test jars should override this
77       * method.
78       */
79      protected ClassFilter createClassSelector()
80      {
81          // only check classes in the base "testlib" package of the jars
82          ClassSelector classSelector = new ClassSelector(ClassSelector.MODE_IF);
83          classSelector.addPackage("testlib");
84          return classSelector;
85      }
86  
87      /***
88       * Creates a check and sets it up so ApiDifferences are reported to the test diff listener.
89       *
90       * @param tdl the test diff listener that records the recognized api changes.
91       * @return the confiured check
92       */
93      protected abstract ClassChangeCheck createCheck(TestDiffListener tdl);
94  }