[Clirr-devel] CVS: clirr/core/src/test/net/sf/clirr/core/internal/checks AbstractCheckerTestCase.jav
Status: Alpha
Brought to you by:
lkuehne
Update of /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16302/src/test/net/sf/clirr/core/internal/checks Modified Files: GenderChangeCheckTest.java FieldSetCheckTest.java ClassHierarchyCheckTest.java InterfaceSetCheckTest.java AbstractCheckTestCase.java ClassScopeCheckTest.java ClassAddedRemovedTest.java ClassModifierCheckTest.java TestDiffListener.java MethodSetCheckTest.java Added Files: AbstractCheckerTestCase.java AbstractRegressionTestCase.java Log Message: changed class hierarchy of check testcases to allow easy addition of regression tests --- NEW FILE --- package net.sf.clirr.core.internal.checks; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import net.sf.clirr.core.Checker; import net.sf.clirr.core.ClassFilter; import net.sf.clirr.core.internal.bcel.BcelTypeArrayBuilder; import net.sf.clirr.core.spi.JavaType; import junit.framework.TestCase; /** * Abstract baseclass for unit tests that check the output of the {@link Checker}. * * @author lk */ public abstract class AbstractCheckerTestCase extends TestCase { private TestDiffListener tdl = new TestDiffListener(); /** * Returns the directory where test input jars are located. * <p> * Note that this method requires a System property 'testinput' to point to the directory. * This is handled automatically during by the normal build but * requires manual intervention so it the tests can be run from the IDE. * <p> * For example in Eclipse, you need to add a VM argument like * <code>-Dtestinput=target/testinput</code> in your JUnit launch configuration. */ protected final File getTestInputDir() { // property is set in project.properties return new File(System.getProperty("testinput")); } /** * Returns the baseline jar files to test agaoinst (the old version). */ protected File[] getBaseLine() { return new File[]{ new File(getTestInputDir(), "testlib-v1.jar") }; } /** * Returns the current set of jar files (the new version). */ protected File[] getCurrent() { return new File[]{ new File(getTestInputDir(), "testlib-v2.jar") }; } /** * Call runChecker and verifies the comparison results. * @param expected the expected differences */ protected void verify(ExpectedDiff[] expected) throws Exception { runChecker(); tdl.checkExpected(expected); } /** * Creates a Checker, wires it with a test listener, executes the * checker. */ protected void runChecker() { Checker checker = createChecker(); ClassFilter classSelector = createClassFilter(); final JavaType[] origClasses = BcelTypeArrayBuilder.createClassSet(getBaseLine(), new URLClassLoader(new URL[]{}), classSelector); final JavaType[] newClasses = BcelTypeArrayBuilder.createClassSet(getCurrent(), new URLClassLoader(new URL[]{}), classSelector); checker.reportDiffs(origClasses, newClasses); } /** * Creates a filter which selects the appropriate classes from the * test jars for this unit test. */ protected abstract ClassFilter createClassFilter(); /** * Createas the Checker that is configured to run this test. * * @param tdl a */ protected abstract Checker createChecker(); protected final TestDiffListener getTestDiffListener() { return tdl; } } --- NEW FILE --- package net.sf.clirr.core.internal.checks; import net.sf.clirr.core.Checker; import net.sf.clirr.core.ClassFilter; import net.sf.clirr.core.ClassSelector; /** * Abstract Baseclass for a regression test that covers a bug reported in our bug tracker. * @author lk */ public abstract class AbstractRegressionTestCase extends AbstractCheckerTestCase { protected abstract String getTrackerId(); protected ClassFilter createClassFilter() { ClassSelector classSelector = new ClassSelector(ClassSelector.MODE_IF); classSelector.addPackageTree("testlib.regressions.bug" + getTrackerId()); return classSelector; } protected Checker createChecker() { final Checker checker = new Checker(); checker.addDiffListener(getTestDiffListener()); return checker; } } Index: GenderChangeCheckTest.java =================================================================== RCS file: /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks/GenderChangeCheckTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- GenderChangeCheckTest.java 11 Jul 2004 10:29:24 -0000 1.1 +++ GenderChangeCheckTest.java 9 Jan 2006 21:38:37 -0000 1.2 @@ -2,9 +2,6 @@ import net.sf.clirr.core.Severity; import net.sf.clirr.core.internal.ClassChangeCheck; -import net.sf.clirr.core.internal.checks.GenderChangeCheck; -import net.sf.clirr.core.internal.checks.AbstractCheckTestCase; -import net.sf.clirr.core.internal.checks.ExpectedDiff; public class GenderChangeCheckTest extends AbstractCheckTestCase { @@ -17,8 +14,9 @@ verify(expected); } - protected final ClassChangeCheck createCheck(TestDiffListener tdl) { - return new GenderChangeCheck(tdl); + protected final ClassChangeCheck createCheck() + { + return new GenderChangeCheck(getTestDiffListener()); } } Index: FieldSetCheckTest.java =================================================================== RCS file: /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks/FieldSetCheckTest.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- FieldSetCheckTest.java 23 Jul 2004 08:13:06 -0000 1.3 +++ FieldSetCheckTest.java 9 Jan 2006 21:38:38 -0000 1.4 @@ -1,11 +1,8 @@ package net.sf.clirr.core.internal.checks; -import net.sf.clirr.core.Severity; import net.sf.clirr.core.ScopeSelector; +import net.sf.clirr.core.Severity; import net.sf.clirr.core.internal.ClassChangeCheck; -import net.sf.clirr.core.internal.checks.FieldSetCheck; -import net.sf.clirr.core.internal.checks.AbstractCheckTestCase; -import net.sf.clirr.core.internal.checks.ExpectedDiff; /** * Tests FieldSetCheck. @@ -41,10 +38,10 @@ } - protected final ClassChangeCheck createCheck(TestDiffListener tdl) + protected final ClassChangeCheck createCheck() { ScopeSelector scopeSelector = new ScopeSelector(); - return new FieldSetCheck(tdl, scopeSelector); + return new FieldSetCheck(getTestDiffListener(), scopeSelector); } } Index: ClassHierarchyCheckTest.java =================================================================== RCS file: /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks/ClassHierarchyCheckTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ClassHierarchyCheckTest.java 11 Jul 2004 10:29:24 -0000 1.1 +++ ClassHierarchyCheckTest.java 9 Jan 2006 21:38:38 -0000 1.2 @@ -20,8 +20,8 @@ verify(expected); } - protected ClassChangeCheck createCheck(TestDiffListener tdl) + protected ClassChangeCheck createCheck() { - return new ClassHierarchyCheck(tdl); + return new ClassHierarchyCheck(getTestDiffListener()); } } Index: InterfaceSetCheckTest.java =================================================================== RCS file: /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks/InterfaceSetCheckTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- InterfaceSetCheckTest.java 22 Aug 2005 04:05:24 -0000 1.1 +++ InterfaceSetCheckTest.java 9 Jan 2006 21:38:38 -0000 1.2 @@ -16,9 +16,9 @@ verify(expected); } - protected ClassChangeCheck createCheck(TestDiffListener tdl) + protected ClassChangeCheck createCheck() { - return new InterfaceSetCheck(tdl); + return new InterfaceSetCheck(getTestDiffListener()); } } Index: AbstractCheckTestCase.java =================================================================== RCS file: /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks/AbstractCheckTestCase.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- AbstractCheckTestCase.java 5 Sep 2005 21:14:52 -0000 1.3 +++ AbstractCheckTestCase.java 9 Jan 2006 21:38:38 -0000 1.4 @@ -1,82 +1,34 @@ package net.sf.clirr.core.internal.checks; -import junit.framework.TestCase; import net.sf.clirr.core.Checker; import net.sf.clirr.core.ClassSelector; -import net.sf.clirr.core.ApiDifference; import net.sf.clirr.core.CheckerFactory; import net.sf.clirr.core.ClassFilter; import net.sf.clirr.core.internal.ClassChangeCheck; -import net.sf.clirr.core.internal.bcel.BcelTypeArrayBuilder; -import net.sf.clirr.core.spi.JavaType; - -import org.apache.bcel.util.ClassSet; - -import java.io.File; -import java.net.URL; -import java.net.URLClassLoader; /** * Abstract Baseclass to test individual Checks. * @author lkuehne */ -public abstract class AbstractCheckTestCase extends TestCase +public abstract class AbstractCheckTestCase extends AbstractCheckerTestCase { - protected final File getTestInputDir() - { - // property is set in project.properties - return new File(System.getProperty("testinput")); - } - - protected void verify( - Checker checker, - ClassSet baseline, ClassSet current, - ApiDifference[] expected) - { - } - - protected File[] getBaseLine() - { - return new File[]{ - new File(getTestInputDir(), "testlib-v1.jar") - }; - } - - protected File[] getCurrent() - { - return new File[]{ - new File(getTestInputDir(), "testlib-v2.jar") - }; - } - - protected void verify(ExpectedDiff[] expected) - throws Exception + /** + * Createas the Checker that is configured to run this test. + * + * @param tdl a + */ + protected Checker createChecker() { - TestDiffListener tdl = new TestDiffListener(); - Checker checker = CheckerFactory.createChecker(createCheck(tdl)); - ClassFilter classSelector = createClassSelector(); - - final JavaType[] origClasses = - BcelTypeArrayBuilder.createClassSet(getBaseLine(), new URLClassLoader(new URL[]{}), classSelector); - - final JavaType[] newClasses = - BcelTypeArrayBuilder.createClassSet(getCurrent(), new URLClassLoader(new URL[]{}), classSelector); - - checker.reportDiffs(origClasses, newClasses); - - tdl.checkExpected(expected); + return CheckerFactory.createChecker(createCheck()); } /** - * Creates an object which selects the appropriate classes from the - * test jars for this test. - * <p> - * This base implementation returns a selector which selects all classes + * This base implementation returns a filter which selects all classes * in the base "testlib" package (but no sub-packages). Tests which wish * to select different classes from the test jars should override this * method. */ - protected ClassFilter createClassSelector() + protected ClassFilter createClassFilter() { // only check classes in the base "testlib" package of the jars ClassSelector classSelector = new ClassSelector(ClassSelector.MODE_IF); @@ -90,5 +42,5 @@ * @param tdl the test diff listener that records the recognized api changes. * @return the confiured check */ - protected abstract ClassChangeCheck createCheck(TestDiffListener tdl); + protected abstract ClassChangeCheck createCheck(); } Index: ClassScopeCheckTest.java =================================================================== RCS file: /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks/ClassScopeCheckTest.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ClassScopeCheckTest.java 26 Aug 2005 05:35:53 -0000 1.4 +++ ClassScopeCheckTest.java 9 Jan 2006 21:38:38 -0000 1.5 @@ -5,8 +5,6 @@ import net.sf.clirr.core.ClassSelector; import net.sf.clirr.core.ScopeSelector; import net.sf.clirr.core.ClassFilter; -import net.sf.clirr.core.internal.checks.ClassScopeCheck; -import net.sf.clirr.core.internal.checks.AbstractCheckTestCase; import net.sf.clirr.core.spi.Scope; /** @@ -39,13 +37,13 @@ verify(expected); } - protected ClassChangeCheck createCheck(TestDiffListener tdl) + protected ClassChangeCheck createCheck() { ScopeSelector scopeSelector = new ScopeSelector(Scope.PRIVATE); - return new ClassScopeCheck(tdl, scopeSelector); + return new ClassScopeCheck(getTestDiffListener(), scopeSelector); } - protected ClassFilter createClassSelector() + protected ClassFilter createClassFilter() { // only check the testlib/scope/ClassScopeChange class. ClassSelector classSelector = new ClassSelector(ClassSelector.MODE_IF); Index: ClassAddedRemovedTest.java =================================================================== RCS file: /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks/ClassAddedRemovedTest.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ClassAddedRemovedTest.java 5 Sep 2005 21:14:52 -0000 1.2 +++ ClassAddedRemovedTest.java 9 Jan 2006 21:38:38 -0000 1.3 @@ -5,11 +5,11 @@ import net.sf.clirr.core.Checker; import net.sf.clirr.core.CheckerFactory; +import net.sf.clirr.core.ClassFilter; import net.sf.clirr.core.Severity; import net.sf.clirr.core.internal.ClassChangeCheck; import net.sf.clirr.core.internal.bcel.BcelTypeArrayBuilder; import net.sf.clirr.core.spi.JavaType; -import net.sf.clirr.core.ClassFilter; public class ClassAddedRemovedTest extends AbstractCheckTestCase { @@ -19,7 +19,7 @@ TestDiffListener tld = new TestDiffListener(); checker.addDiffListener(tld); - ClassFilter classSelector = createClassSelector(); + ClassFilter classSelector = createClassFilter(); final JavaType[] origClasses = BcelTypeArrayBuilder.createClassSet(getBaseLine(), new URLClassLoader(new URL[]{}), classSelector); @@ -37,7 +37,7 @@ tld.checkExpected(expected); } - protected ClassChangeCheck createCheck(TestDiffListener tdl) + protected ClassChangeCheck createCheck() { // changes are reported directly by the Checker return null; Index: ClassModifierCheckTest.java =================================================================== RCS file: /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks/ClassModifierCheckTest.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ClassModifierCheckTest.java 6 Mar 2005 17:01:35 -0000 1.2 +++ ClassModifierCheckTest.java 9 Jan 2006 21:38:38 -0000 1.3 @@ -21,12 +21,12 @@ verify(expected); } - protected ClassChangeCheck createCheck(TestDiffListener tdl) + protected ClassChangeCheck createCheck() { - return new ClassModifierCheck(tdl); + return new ClassModifierCheck(getTestDiffListener()); } - protected ClassFilter createClassSelector() + protected ClassFilter createClassFilter() { // only apply the check to classes in the testlib.modifiers package. ClassSelector classSelector = new ClassSelector(ClassSelector.MODE_IF); Index: TestDiffListener.java =================================================================== RCS file: /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks/TestDiffListener.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- TestDiffListener.java 26 Aug 2005 05:35:53 -0000 1.5 +++ TestDiffListener.java 9 Jan 2006 21:38:38 -0000 1.6 @@ -9,103 +9,132 @@ import net.sf.clirr.core.ApiDifference; import net.sf.clirr.core.DiffListener; import net.sf.clirr.core.MessageTranslator; +import net.sf.clirr.core.Severity; import junit.framework.TestCase; class TestDiffListener implements ApiDiffDispatcher, DiffListener { - private MessageTranslator translator = new MessageTranslator(); - - private Set diffs = new HashSet(); - - public void fireDiff(ApiDifference difference) + private MessageTranslator translator = new MessageTranslator(); + + private Set diffs = new HashSet(); + + public void fireDiff(ApiDifference difference) + { + diffs.add(difference); + } + + public void checkExpected(ExpectedDiff[] expectedDiffs) + { + for (int i=0; i<expectedDiffs.length; ++i) { - diffs.add(difference); - } + ExpectedDiff expected = expectedDiffs[i]; - public void checkExpected(ExpectedDiff[] expectedDiffs) - { - for (int i=0; i<expectedDiffs.length; ++i) + // now see if the expected diff is in fact in the set of + // diffs that occurred during the test comparison + boolean found = false; + for(Iterator j = diffs.iterator(); j.hasNext() && !found;) { - ExpectedDiff expected = expectedDiffs[i]; - - // now see if the expected diff is in fact in the set of - // diffs that occurred during the test comparison - boolean found = false; - for(Iterator j = diffs.iterator(); j.hasNext() && !found;) - { - ApiDifference actual = (ApiDifference) j.next(); - found = expected.matches(actual); - } - - if (!found) - { - // build a useful failure message - MessageTranslator translator = new MessageTranslator(); - - StringBuffer buf = new StringBuffer(); - buf.append("Expected diff " + expected + " was not generated.\n"); - if (diffs.size() == 0) - { - buf.append("No diffs were generated."); - } - else - { - buf.append("Actual diffs generated were: \n"); - for(Iterator diffIter = diffs.iterator(); diffIter.hasNext();) - { - ApiDifference diff = (ApiDifference) diffIter.next(); - - buf.append(" * "); - buf.append(diff.toString(translator)); - buf.append("\n"); - } - } - - TestCase.fail(buf.toString()); - } + ApiDifference actual = (ApiDifference) j.next(); + found = expected.matches(actual); } - StringBuffer buf = null; - for (Iterator it = diffs.iterator(); it.hasNext();) + if (!found) { - ApiDifference actual = (ApiDifference) it.next(); - - // see if the actual (generated) diff is in the expected set - boolean found = false; - for(int i=0; i<expectedDiffs.length && !found; ++i) + // build a useful failure message + MessageTranslator translator = new MessageTranslator(); + + StringBuffer buf = new StringBuffer(); + buf.append("Expected diff " + expected + " was not generated.\n"); + if (diffs.size() == 0) { - found = expectedDiffs[i].matches(actual); + buf.append("No diffs were generated."); } - - if (!found) + else { - if (buf == null) + buf.append("Actual diffs generated were: \n"); + for(Iterator diffIter = diffs.iterator(); diffIter.hasNext();) { - buf = new StringBuffer(); - buf.append("Unexpected diffs:\n"); + ApiDifference diff = (ApiDifference) diffIter.next(); + + buf.append(" * "); + buf.append(diff.toString(translator)); + buf.append("\n"); } - buf.append(" * "); - buf.append(actual.toString(translator)); - buf.append("\n"); } + + TestCase.fail(buf.toString()); } - - if (buf != null) + } + + StringBuffer buf = null; + for (Iterator it = diffs.iterator(); it.hasNext();) + { + ApiDifference actual = (ApiDifference) it.next(); + + // see if the actual (generated) diff is in the expected set + boolean found = false; + for(int i=0; i<expectedDiffs.length && !found; ++i) { - // we must have found at least one unexpected diff - TestCase.fail(buf.toString()); + found = expectedDiffs[i].matches(actual); + } + + if (!found) + { + if (buf == null) + { + buf = new StringBuffer(); + buf.append("Unexpected diffs:\n"); + } + buf.append(" * "); + buf.append(actual.toString(translator)); + buf.append("\n"); } } - - public void start() + + if (buf != null) { + // we must have found at least one unexpected diff + TestCase.fail(buf.toString()); } + } - public void reportDiff(ApiDifference difference) { - diffs.add(difference); + public int countBinaryCompatibilityDiffs(Severity severity) + { + int ret = 0; + for (Iterator it = diffs.iterator(); it.hasNext();) + { + ApiDifference diff = (ApiDifference) it.next(); + if (diff.getBinaryCompatibilitySeverity().equals(severity)) + { + ret += 1; + } } - - public void stop() + return ret; + } + + public int countSourceCompatibilityDiffs(Severity severity) + { + int ret = 0; + for (Iterator it = diffs.iterator(); it.hasNext();) { + ApiDifference diff = (ApiDifference) it.next(); + if (diff.getSourceCompatibilitySeverity().equals(severity)) + { + ret += 1; + } } + return ret; + } + + public void start() + { + } + + public void reportDiff(ApiDifference difference) { + diffs.add(difference); + } + + public void stop() + { + } } Index: MethodSetCheckTest.java =================================================================== RCS file: /cvsroot/clirr/clirr/core/src/test/net/sf/clirr/core/internal/checks/MethodSetCheckTest.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- MethodSetCheckTest.java 1 Aug 2005 07:21:43 -0000 1.4 +++ MethodSetCheckTest.java 9 Jan 2006 21:38:38 -0000 1.5 @@ -1,11 +1,8 @@ package net.sf.clirr.core.internal.checks; -import net.sf.clirr.core.internal.ClassChangeCheck; -import net.sf.clirr.core.Severity; import net.sf.clirr.core.ScopeSelector; -import net.sf.clirr.core.internal.checks.MethodSetCheck; -import net.sf.clirr.core.internal.checks.AbstractCheckTestCase; -import net.sf.clirr.core.internal.checks.ExpectedDiff; +import net.sf.clirr.core.Severity; +import net.sf.clirr.core.internal.ClassChangeCheck; /** * TODO: Docs. @@ -77,8 +74,8 @@ verify(expected); } - protected final ClassChangeCheck createCheck(TestDiffListener tdl) + protected final ClassChangeCheck createCheck() { - return new MethodSetCheck(tdl, new ScopeSelector()); + return new MethodSetCheck(getTestDiffListener(), new ScopeSelector()); } } |