########################################################################### # A module with regression test suite # # Copyright (C) 2016-2018 Andrey Ponomarenko's ABI Laboratory # # Written by Andrey Ponomarenko # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301 USA. ########################################################################### use strict; use File::Copy qw(copy); sub testTool() { printMsg("INFO", "\nVerifying detectable Java library changes"); printMsg("INFO", "Creating test library ..."); my $LibName = "libsample_java"; if(-d $LibName) { rmtree($LibName); } my $PackageName = "TestPackage"; my $Path_v1 = "$LibName/$PackageName.v1/$PackageName"; mkpath($Path_v1); my $Path_v2 = "$LibName/$PackageName.v2/$PackageName"; mkpath($Path_v2); my $TestsPath = "$LibName/Tests"; mkpath($TestsPath); # FirstCheckedException my $FirstCheckedException = "package $PackageName; public class FirstCheckedException extends Exception { }"; writeFile($Path_v1."/FirstCheckedException.java", $FirstCheckedException); writeFile($Path_v2."/FirstCheckedException.java", $FirstCheckedException); # SecondCheckedException my $SecondCheckedException = "package $PackageName; public class SecondCheckedException extends Exception { }"; writeFile($Path_v1."/SecondCheckedException.java", $SecondCheckedException); writeFile($Path_v2."/SecondCheckedException.java", $SecondCheckedException); # FirstUncheckedException my $FirstUncheckedException = "package $PackageName; public class FirstUncheckedException extends RuntimeException { }"; writeFile($Path_v1."/FirstUncheckedException.java", $FirstUncheckedException); writeFile($Path_v2."/FirstUncheckedException.java", $FirstUncheckedException); # SecondUncheckedException my $SecondUncheckedException = "package $PackageName; public class SecondUncheckedException extends RuntimeException { }"; writeFile($Path_v1."/SecondUncheckedException.java", $SecondUncheckedException); writeFile($Path_v2."/SecondUncheckedException.java", $SecondUncheckedException); # BaseAbstractClass my $BaseAbstractClass = "package $PackageName; public abstract class BaseAbstractClass { public Integer field; public Integer someMethod(Integer param) { return param; } public abstract Integer abstractMethod(Integer param); }"; writeFile($Path_v1."/BaseAbstractClass.java", $BaseAbstractClass); writeFile($Path_v2."/BaseAbstractClass.java", $BaseAbstractClass); # BaseClass my $BaseClass = "package $PackageName; public class BaseClass { public Integer field; public Integer method(Integer param) { return param; } }"; writeFile($Path_v1."/BaseClass.java", $BaseClass); writeFile($Path_v2."/BaseClass.java", $BaseClass); # BaseClass2 my $BaseClass2 = "package $PackageName; public class BaseClass2 { public Integer field2; public Integer method2(Integer param) { return param; } }"; writeFile($Path_v1."/BaseClass2.java", $BaseClass2); writeFile($Path_v2."/BaseClass2.java", $BaseClass2); # BaseInterface my $BaseInterface = "package $PackageName; public interface BaseInterface { public Integer field = 100; public Integer method(Integer param); }"; writeFile($Path_v1."/BaseInterface.java", $BaseInterface); writeFile($Path_v2."/BaseInterface.java", $BaseInterface); # BaseInterface2 my $BaseInterface2 = "package $PackageName; public interface BaseInterface2 { public Integer field2 = 100; public Integer method2(Integer param); }"; writeFile($Path_v1."/BaseInterface2.java", $BaseInterface2); writeFile($Path_v2."/BaseInterface2.java", $BaseInterface2); # BaseConstantInterface my $BaseConstantInterface = "package $PackageName; public interface BaseConstantInterface { public Integer CONSTANT = 10; public Integer CONSTANT2 = 100; }"; writeFile($Path_v1."/BaseConstantInterface.java", $BaseConstantInterface); writeFile($Path_v2."/BaseConstantInterface.java", $BaseConstantInterface); if(cmpVersions($In::Opt{"CompilerVer"}, "1.5")>=0) { # GenericClass1 writeFile($Path_v1."/GenericClass1.java", "package $PackageName; public class GenericClass1 { public Integer method(T param) { return 0; } }"); writeFile($Path_v2."/GenericClass1.java", "package $PackageName; public class GenericClass1 { public Integer method(T param) { return 0; } }"); # GenericClass2 writeFile($Path_v1."/GenericClass2.java", "package $PackageName; public class GenericClass2 { public void method() { } }"); writeFile($Path_v2."/GenericClass2.java", "package $PackageName; public class GenericClass2 { public void method() { } }"); # Class became generic writeFile($Path_v1."/ClassBecameGeneric.java", "package $PackageName; public abstract class ClassBecameGeneric { public ClassBecameGeneric() {} public abstract ClassBecameGeneric doSomething(); }"); writeFile($Path_v2."/ClassBecameGeneric.java", "package $PackageName; public abstract class ClassBecameGeneric { public ClassBecameGeneric() {} public abstract T doSomething(); }"); writeFile($TestsPath."/Test_ClassBecameGeneric.java", "import $PackageName.*; class GenerifyingClassDerived extends ClassBecameGeneric { public ClassBecameGeneric doSomething() { return new GenerifyingClassDerived(); } public static void main(String[] args) { } } public class Test_ClassBecameGeneric { public static void main(String[] args) { GenerifyingClassDerived X = new GenerifyingClassDerived(); ClassBecameGeneric Res = X.doSomething(); } }"); # Class became raw writeFile($Path_v1."/ClassBecameRaw.java", "package $PackageName; public class ClassBecameRaw { public void method(T param) { } }"); writeFile($Path_v2."/ClassBecameRaw.java", "package $PackageName; public class ClassBecameRaw { public void method(String param) { } }"); writeFile($TestsPath."/Test_ClassBecameRaw.java", "import $PackageName.*; public class Test_ClassBecameRaw { public static void main(String[] args) { ClassBecameRaw X = new ClassBecameRaw(); X.method(\"XXX\"); } }"); # Interface became generic writeFile($Path_v1."/InterfaceBecameGeneric.java", "package $PackageName; public interface InterfaceBecameGeneric { public void method(); }"); writeFile($Path_v2."/InterfaceBecameGeneric.java", "package $PackageName; public interface InterfaceBecameGeneric { public void method(); }"); # Interface became raw writeFile($Path_v1."/InterfaceBecameRaw.java", "package $PackageName; public interface InterfaceBecameRaw { public void method(); }"); writeFile($Path_v2."/InterfaceBecameRaw.java", "package $PackageName; public interface InterfaceBecameRaw { public void method(); }"); writeFile($TestsPath."/Test_InterfaceBecameRaw.java", "import $PackageName.*; class InterfaceBecameRawDerived implements InterfaceBecameRaw { public void method() { } public static void main(String[] args) { } } public class Test_InterfaceBecameRaw { public static void main(String[] args) { InterfaceBecameRawDerived X = new InterfaceBecameRawDerived(); X.method(); } }"); # Changed generic super-class writeFile($Path_v1."/GenericSuperClassChanged.java", "package $PackageName; public class GenericSuperClassChanged extends GenericClass1 { public Integer method() { return 0; } }"); writeFile($Path_v2."/GenericSuperClassChanged.java", "package $PackageName; public class GenericSuperClassChanged extends GenericClass1 { public Integer method() { return 0; } }"); # Extending class with generic parameters writeFile($Path_v1."/ExtendingClassWithGeneric.java", "package $PackageName; public class ExtendingClassWithGeneric { public void method() { } }"); writeFile($Path_v2."/ExtendingClassWithGeneric.java", "package $PackageName; public class ExtendingClassWithGeneric extends GenericClass2 { }"); # Renamed generic parameter writeFile($Path_v1."/RenamedGenericParameter.java", "package $PackageName; public class RenamedGenericParameter { public void method(A param) { } }"); writeFile($Path_v2."/RenamedGenericParameter.java", "package $PackageName; public class RenamedGenericParameter { public void method(B param) { } }"); # Changed field type by introducing of a generic parameter writeFile($Path_v1."/ChangedFieldTypeByGenericParam.java", "package $PackageName; public class ChangedFieldTypeByGenericParam { public ChangedFieldTypeByGenericParam(String param) { f=param; } public void method() { } public String f; }"); writeFile($Path_v2."/ChangedFieldTypeByGenericParam.java", "package $PackageName; public class ChangedFieldTypeByGenericParam { public ChangedFieldTypeByGenericParam(T param) { f=param; } public void method() { } public T f; }"); writeFile($Path_v1."/TestGeneric.java", "package $PackageName; public class TestGeneric { public ChangedFieldTypeByGenericParam get1() { return new ChangedFieldTypeByGenericParam(\"XXX\"); } public ChangedFieldTypeByGenericParam get2() { return new ChangedFieldTypeByGenericParam(\"XXX\"); } }"); writeFile($Path_v2."/TestGeneric.java", "package $PackageName; public class TestGeneric { public ChangedFieldTypeByGenericParam get1() { return new ChangedFieldTypeByGenericParam(\"XXX\"); } public ChangedFieldTypeByGenericParam get2() { return new ChangedFieldTypeByGenericParam(0); } }"); writeFile($TestsPath."/Test_ChangedFieldTypeByGenericParam.java", "import $PackageName.*; public class Test_ChangedFieldTypeByGenericParam { public static void main(String[] args) { TestGeneric X = new TestGeneric(); ChangedFieldTypeByGenericParam Res1 = X.get1(); ChangedFieldTypeByGenericParam Res2 = X.get2(); Res1.f = Res2.f; } }"); # Changed constructor after generifying writeFile($Path_v1."/ChangedCtorAfterGenerifying.java", "package $PackageName; public class ChangedCtorAfterGenerifying { public ChangedCtorAfterGenerifying(String param) { } public String f; }"); writeFile($Path_v2."/ChangedCtorAfterGenerifying.java", "package $PackageName; public class ChangedCtorAfterGenerifying { public ChangedCtorAfterGenerifying(T param) { } public T f; }"); writeFile($TestsPath."/Test_ChangedCtorAfterGenerifying.java", "import $PackageName.*; public class Test_ChangedCtorAfterGenerifying { public static void main(String[] args) { ChangedCtorAfterGenerifying X = new ChangedCtorAfterGenerifying(\"XXX\"); } }"); # Array to variable arity writeFile($Path_v1."/ArrayToVariableArity.java", "package $PackageName; public class ArrayToVariableArity { public void method(Integer x, String[] y) { } }"); writeFile($Path_v2."/ArrayToVariableArity.java", "package $PackageName; public class ArrayToVariableArity { public void method(Integer x, String... y) { } }"); writeFile($TestsPath."/Test_ArrayToVariableArity.java", "import $PackageName.*; public class Test_ArrayToVariableArity { public static void main(String[] args) { ArrayToVariableArity X = new ArrayToVariableArity(); X.method(0, new String[]{\"a\", \"b\"}); } }"); # Variable arity to array writeFile($Path_v1."/VariableArityToArray.java", "package $PackageName; public class VariableArityToArray { public void method(Integer x, String... y) { } }"); writeFile($Path_v2."/VariableArityToArray.java", "package $PackageName; public class VariableArityToArray { public void method(Integer x, String[] y) { } }"); writeFile($TestsPath."/Test_VariableArityToArray.java", "import $PackageName.*; public class Test_VariableArityToArray { public static void main(String[] args) { VariableArityToArray X = new VariableArityToArray(); X.method(0, \"a\", \"b\"); } }"); # Added vararg parameter writeFile($Path_v1."/AddedVarargParam.java", "package $PackageName; public class AddedVarargParam { public void method(Integer x, String... y) { } }"); writeFile($Path_v2."/AddedVarargParam.java", "package $PackageName; public class AddedVarargParam { public void method(Integer x, String... y) { } }"); writeFile($TestsPath."/Test_AddedVarargParam.java", "import $PackageName.*; public class Test_AddedVarargParam { public static void main(String[] args) { AddedVarargParam X = new AddedVarargParam(); X.method(0); } }"); # Removed_Annotation writeFile($Path_v1."/RemovedAnnotation.java", "package $PackageName; public \@interface RemovedAnnotation { }"); writeFile($TestsPath."/Test_RemovedAnnotation.java", "import $PackageName.*; public class Test_RemovedAnnotation { public static void main(String[] args) { testMethod(); } \@RemovedAnnotation static void testMethod() { } }"); # Changed Annotation writeFile($Path_v1."/ChangedAnnotation.java", "package $PackageName; enum MyEnum { SUNDAY, MONDAY } public \@interface ChangedAnnotation { String value(); String datatype() default \"Str\"; int num1() default 1; String[] values() default {\"Alice\", \"Bob\", \"Cindy\"}; int[] nums() default {1, 2, 3}; String safe_change() default \"Str\"; MyEnum day() default MyEnum.SUNDAY; short num2() default 1; long num3() default 1; byte num4() default 1; float num5() default 1.5f; double num6() default 1.5; boolean bit() default true; char ch() default 'A'; }"); writeFile($Path_v2."/ChangedAnnotation.java", "package $PackageName; enum MyEnum { SUNDAY, MONDAY } public \@interface ChangedAnnotation { String value() default \"Str\"; String datatype(); int[] values(); int[] nums() default {1, 2}; int[] new_default_param() default {1, 2}; int[] new_param(); String[] safe_change() default {\"Str\"}; MyEnum day() default MyEnum.MONDAY; }"); writeFile($TestsPath."/Test_ChangedAnnotation.java", "import $PackageName.*; public class Test_ChangedAnnotation { public static void main(String[] args) { testMethod(); } \@ChangedAnnotation(value=\"Val\") static void testMethod() { } }"); # Beta Annotation writeFile($Path_v1."/Beta.java", "package $PackageName; public \@interface Beta { }"); writeFile($Path_v2."/Beta.java", "package $PackageName; public \@interface Beta { }"); # Removed_Method (Beta method) writeFile($Path_v1."/RemovedBetaMethod.java", "package $PackageName; public class RemovedBetaMethod { \@Beta public Integer someMethod() { return 0; } }"); writeFile($Path_v2."/RemovedBetaMethod.java", "package $PackageName; public class RemovedBetaMethod { }"); # Removed_Method (from Beta class) writeFile($Path_v1."/RemovedMethodFromBetaClass.java", "package $PackageName; \@Beta public class RemovedMethodFromBetaClass { public Integer someMethod() { return 0; } }"); writeFile($Path_v2."/RemovedMethodFromBetaClass.java", "package $PackageName; \@Beta public class RemovedMethodFromBetaClass { }"); # Removed_Class (Beta) writeFile($Path_v1."/RemovedBetaClass.java", "package $PackageName; \@Beta public class RemovedBetaClass { public Integer someMethod() { return 0; } }"); } # Abstract_Method_Added_Checked_Exception writeFile($Path_v1."/AbstractMethodAddedCheckedException.java", "package $PackageName; public abstract class AbstractMethodAddedCheckedException { public abstract Integer someMethod() throws FirstCheckedException; }"); writeFile($Path_v2."/AbstractMethodAddedCheckedException.java", "package $PackageName; public abstract class AbstractMethodAddedCheckedException { public abstract Integer someMethod() throws FirstCheckedException, SecondCheckedException; }"); # Abstract_Method_Removed_Checked_Exception writeFile($Path_v1."/AbstractMethodRemovedCheckedException.java", "package $PackageName; public abstract class AbstractMethodRemovedCheckedException { public abstract Integer someMethod() throws FirstCheckedException, SecondCheckedException; }"); writeFile($Path_v2."/AbstractMethodRemovedCheckedException.java", "package $PackageName; public abstract class AbstractMethodRemovedCheckedException { public abstract Integer someMethod() throws FirstCheckedException; }"); # NonAbstract_Method_Added_Checked_Exception writeFile($Path_v1."/NonAbstractMethodAddedCheckedException.java", "package $PackageName; public class NonAbstractMethodAddedCheckedException { public Integer someMethod() throws FirstCheckedException { return 10; } }"); writeFile($Path_v2."/NonAbstractMethodAddedCheckedException.java", "package $PackageName; public class NonAbstractMethodAddedCheckedException { public Integer someMethod() throws FirstCheckedException, SecondCheckedException { return 10; } }"); # NonAbstract_Method_Removed_Checked_Exception writeFile($Path_v1."/NonAbstractMethodRemovedCheckedException.java", "package $PackageName; public class NonAbstractMethodRemovedCheckedException { public Integer someMethod() throws FirstCheckedException, SecondCheckedException { return 10; } }"); writeFile($Path_v2."/NonAbstractMethodRemovedCheckedException.java", "package $PackageName; public class NonAbstractMethodRemovedCheckedException { public Integer someMethod() throws FirstCheckedException { return 10; } }"); # Added_Unchecked_Exception writeFile($Path_v1."/AddedUncheckedException.java", "package $PackageName; public class AddedUncheckedException { public Integer someMethod() throws FirstUncheckedException { return 10; } }"); writeFile($Path_v2."/AddedUncheckedException.java", "package $PackageName; public class AddedUncheckedException { public Integer someMethod() throws FirstUncheckedException, SecondUncheckedException, NullPointerException { return 10; } }"); # Removed_Unchecked_Exception writeFile($Path_v1."/RemovedUncheckedException.java", "package $PackageName; public class RemovedUncheckedException { public Integer someMethod() throws FirstUncheckedException, SecondUncheckedException, NullPointerException { return 10; } }"); writeFile($Path_v2."/RemovedUncheckedException.java", "package $PackageName; public class RemovedUncheckedException { public Integer someMethod() throws FirstUncheckedException { return 10; } }"); # Changed_Method_Return_From_Void writeFile($Path_v1."/ChangedMethodReturnFromVoid.java", "package $PackageName; public class ChangedMethodReturnFromVoid { public void changedMethod(Integer param1) { } }"); writeFile($Path_v2."/ChangedMethodReturnFromVoid.java", "package $PackageName; public class ChangedMethodReturnFromVoid { public Integer changedMethod(Integer param1){ return param1; } }"); writeFile($TestsPath."/Test_ChangedMethodReturnFromVoid.java", "import $PackageName.*; public class Test_ChangedMethodReturnFromVoid { public static void main(String[] args) { ChangedMethodReturnFromVoid X = new ChangedMethodReturnFromVoid(); X.changedMethod(1); } }"); # Changed_Method_Return writeFile($Path_v1."/ChangedMethodReturn.java", "package $PackageName; public class ChangedMethodReturn { public Integer changedMethod(Integer param) { return 0; } }"); writeFile($Path_v2."/ChangedMethodReturn.java", "package $PackageName; public class ChangedMethodReturn { public String changedMethod(Integer param) { return \"XXX\"; } }"); writeFile($TestsPath."/Test_ChangedMethodReturn.java", "import $PackageName.*; public class Test_ChangedMethodReturn { public static void main(String[] args) { ChangedMethodReturn X = new ChangedMethodReturn(); Integer Res = X.changedMethod(0); } }"); # Added_Method writeFile($Path_v1."/AddedMethod.java", "package $PackageName; public class AddedMethod { public Integer field = 100; }"); writeFile($Path_v2."/AddedMethod.java", "package $PackageName; public class AddedMethod { public Integer field = 100; public Integer addedMethod(Integer param1, String[] param2) { return param1; } public static String[] addedStaticMethod(String[] param) { return param; } }"); # Added_Method (Constructor) writeFile($Path_v1."/AddedConstructor.java", "package $PackageName; public class AddedConstructor { public Integer field = 100; }"); writeFile($Path_v2."/AddedConstructor.java", "package $PackageName; public class AddedConstructor { public Integer field = 100; public AddedConstructor() { } public AddedConstructor(Integer x, String y) { } }"); # Class_Added_Field writeFile($Path_v1."/ClassAddedField.java", "package $PackageName; public class ClassAddedField { public Integer otherField; }"); writeFile($Path_v2."/ClassAddedField.java", "package $PackageName; public class ClassAddedField { public Integer addedField; public Integer otherField; }"); # Interface_Added_Field writeFile($Path_v1."/InterfaceAddedField.java", "package $PackageName; public interface InterfaceAddedField { public Integer method(); }"); writeFile($Path_v2."/InterfaceAddedField.java", "package $PackageName; public interface InterfaceAddedField { public Integer addedField = 100; public Integer method(); }"); # Removed_NonConstant_Field (Class) writeFile($Path_v1."/ClassRemovedField.java", "package $PackageName; public class ClassRemovedField { public Integer removedField; public Integer otherField; }"); writeFile($Path_v2."/ClassRemovedField.java", "package $PackageName; public class ClassRemovedField { public Integer otherField; }"); writeFile($TestsPath."/Test_ClassRemovedField.java", "import $PackageName.*; public class Test_ClassRemovedField { public static void main(String[] args) { ClassRemovedField X = new ClassRemovedField(); Integer Copy = X.removedField; } }"); # Removed_Constant_Field (Interface) writeFile($Path_v1."/InterfaceRemovedConstantField.java", "package $PackageName; public interface InterfaceRemovedConstantField { public String someMethod(); public int removedField_Int = 1000; public String removedField_Str = \"Value\"; }"); writeFile($Path_v2."/InterfaceRemovedConstantField.java", "package $PackageName; public interface InterfaceRemovedConstantField { public String someMethod(); }"); # Removed_NonConstant_Field (Interface) writeFile($Path_v1."/InterfaceRemovedField.java", "package $PackageName; public interface InterfaceRemovedField { public String someMethod(); public BaseClass removedField = new BaseClass(); }"); writeFile($Path_v2."/InterfaceRemovedField.java", "package $PackageName; public interface InterfaceRemovedField { public String someMethod(); }"); # Renamed_Field writeFile($Path_v1."/RenamedField.java", "package $PackageName; public class RenamedField { public String oldName; }"); writeFile($Path_v2."/RenamedField.java", "package $PackageName; public class RenamedField { public String newName; }"); # Renamed_Constant_Field writeFile($Path_v1."/RenamedConstantField.java", "package $PackageName; public class RenamedConstantField { public final String oldName = \"Value\"; }"); writeFile($Path_v2."/RenamedConstantField.java", "package $PackageName; public class RenamedConstantField { public final String newName = \"Value\"; }"); # Changed_Field_Type writeFile($Path_v1."/ChangedFieldType.java", "package $PackageName; public class ChangedFieldType { public String fieldName; }"); writeFile($Path_v2."/ChangedFieldType.java", "package $PackageName; public class ChangedFieldType { public Integer fieldName; }"); writeFile($TestsPath."/Test_ChangedFieldType.java", "import $PackageName.*; public class Test_ChangedFieldType { public static void main(String[] args) { ChangedFieldType X = new ChangedFieldType(); String R = X.fieldName; } }"); # Changed_Field_Access writeFile($Path_v1."/ChangedFieldAccess.java", "package $PackageName; public class ChangedFieldAccess { public String fieldName; }"); writeFile($Path_v2."/ChangedFieldAccess.java", "package $PackageName; public class ChangedFieldAccess { private String fieldName; }"); # Changed_Final_Field_Value writeFile($Path_v1."/ChangedFinalFieldValue.java", "package $PackageName; public class ChangedFinalFieldValue { enum MyEnum { ONE, TWO } public final int field1 = 1; public final String field2 = \" \"; public final MyEnum field3 = MyEnum.ONE; }"); writeFile($Path_v2."/ChangedFinalFieldValue.java", "package $PackageName; public class ChangedFinalFieldValue { enum MyEnum { ONE, TWO } public final int field1 = 2; public final String field2 = \"newValue\"; public final MyEnum field3 = MyEnum.TWO; }"); # NonConstant_Field_Became_Static writeFile($Path_v1."/NonConstantFieldBecameStatic.java", "package $PackageName; public class NonConstantFieldBecameStatic { public String fieldName; }"); writeFile($Path_v2."/NonConstantFieldBecameStatic.java", "package $PackageName; public class NonConstantFieldBecameStatic { public static String fieldName; }"); writeFile($TestsPath."/Test_NonConstantFieldBecameStatic.java", "import $PackageName.*; public class Test_NonConstantFieldBecameStatic { public static void main(String[] args) { NonConstantFieldBecameStatic X = new NonConstantFieldBecameStatic(); String R = X.fieldName; } }"); # NonConstant_Field_Became_NonStatic writeFile($Path_v1."/NonConstantFieldBecameNonStatic.java", "package $PackageName; public class NonConstantFieldBecameNonStatic { public static String fieldName; }"); writeFile($Path_v2."/NonConstantFieldBecameNonStatic.java", "package $PackageName; public class NonConstantFieldBecameNonStatic { public String fieldName; }"); # Constant_Field_Became_NonStatic writeFile($Path_v1."/ConstantFieldBecameNonStatic.java", "package $PackageName; public class ConstantFieldBecameNonStatic { public final static String fieldName = \"Value\"; }"); writeFile($Path_v2."/ConstantFieldBecameNonStatic.java", "package $PackageName; public class ConstantFieldBecameNonStatic { public final String fieldName = \"Value\"; }"); # Field_Became_Final writeFile($Path_v1."/FieldBecameFinal.java", "package $PackageName; public class FieldBecameFinal { public String fieldName; }"); writeFile($Path_v2."/FieldBecameFinal.java", "package $PackageName; public class FieldBecameFinal { public final String fieldName = \"Value\"; }"); # Field_Became_NonFinal writeFile($Path_v1."/FieldBecameNonFinal.java", "package $PackageName; public class FieldBecameNonFinal { public final String fieldName = \"Value\"; }"); writeFile($Path_v2."/FieldBecameNonFinal.java", "package $PackageName; public class FieldBecameNonFinal { public String fieldName; }"); # Removed_Method writeFile($Path_v1."/RemovedMethod.java", "package $PackageName; public class RemovedMethod { public Integer field = 100; public Integer removedMethod(Integer param1, String param2) { return param1; } public static Integer removedStaticMethod(Integer param) { return param; } }"); writeFile($Path_v2."/RemovedMethod.java", "package $PackageName; public class RemovedMethod { public Integer field = 100; }"); # Removed protected method from final class writeFile($Path_v1."/RemovedProtectedMethodFromFinalClass.java", "package $PackageName; public final class RemovedProtectedMethodFromFinalClass { protected void removedMethod(Integer param) { } }"); writeFile($Path_v2."/RemovedProtectedMethodFromFinalClass.java", "package $PackageName; public final class RemovedProtectedMethodFromFinalClass { }"); # Removed_Method (move up to java.lang.Object) writeFile($Path_v1."/MoveUpToJavaLangObject.java", "package $PackageName; public class MoveUpToJavaLangObject extends java.lang.Object { public int hashCode() { return 0; } }"); writeFile($Path_v2."/MoveUpToJavaLangObject.java", "package $PackageName; public class MoveUpToJavaLangObject extends java.lang.Object { }"); writeFile($TestsPath."/Test_MoveUpToJavaLangObject.java", "import $PackageName.*; public class Test_MoveUpToJavaLangObject { public static void main(String[] args) { MoveUpToJavaLangObject X = new MoveUpToJavaLangObject(); int R = X.hashCode(); } }"); # Removed_Method (Deprecated) writeFile($Path_v1."/RemovedDeprecatedMethod.java", "package $PackageName; public class RemovedDeprecatedMethod { public Integer field = 100; public Integer otherMethod(Integer param) { return param; } \@Deprecated public Integer removedMethod(Integer param1, String param2) { return param1; } }"); writeFile($Path_v2."/RemovedDeprecatedMethod.java", "package $PackageName; public class RemovedDeprecatedMethod { public Integer field = 100; public Integer otherMethod(Integer param) { return param; } }"); # Interface_Removed_Abstract_Method writeFile($Path_v1."/InterfaceRemovedAbstractMethod.java", "package $PackageName; public interface InterfaceRemovedAbstractMethod extends BaseInterface, BaseInterface2 { public void removedMethod(Integer param1, java.io.ObjectOutput param2); public void someMethod(Integer param); }"); writeFile($Path_v2."/InterfaceRemovedAbstractMethod.java", "package $PackageName; public interface InterfaceRemovedAbstractMethod extends BaseInterface, BaseInterface2 { public void someMethod(Integer param); }"); # Interface_Removed_Abstract_Method (Last) writeFile($Path_v1."/InterfaceRemovedLastAbstractMethod.java", "package $PackageName; public interface InterfaceRemovedLastAbstractMethod { public void removedMethod(Integer param); }"); writeFile($Path_v2."/InterfaceRemovedLastAbstractMethod.java", "package $PackageName; public interface InterfaceRemovedLastAbstractMethod { }"); writeFile($TestsPath."/Test_InterfaceRemovedLastAbstractMethod.java", "import $PackageName.*; class InterfaceRemovedLastAbstractMethodDerived implements InterfaceRemovedLastAbstractMethod { public void removedMethod(Integer param) { } public static void main(String[] args) { } }; public class Test_InterfaceRemovedLastAbstractMethod { public static void main(String[] args) { InterfaceRemovedLastAbstractMethod Obj = new InterfaceRemovedLastAbstractMethodDerived(); Obj.removedMethod(0); } }"); # Interface_Added_Abstract_Method writeFile($Path_v1."/InterfaceAddedAbstractMethod.java", "package $PackageName; public interface InterfaceAddedAbstractMethod extends BaseInterface, BaseInterface2 { public void someMethod(Integer param); }"); writeFile($Path_v2."/InterfaceAddedAbstractMethod.java", "package $PackageName; public interface InterfaceAddedAbstractMethod extends BaseInterface, BaseInterface2 { public void someMethod(Integer param); public Integer addedMethod(Integer param); }"); # Interface_Added_Default_Method writeFile($Path_v1."/InterfaceAddedDefaultMethod.java", "package $PackageName; public interface InterfaceAddedDefaultMethod { public void someMethod(Integer param); }"); writeFile($Path_v2."/InterfaceAddedDefaultMethod.java", "package $PackageName; public interface InterfaceAddedDefaultMethod { public void someMethod(Integer param); default Integer addedMethod(Integer param) { return 0; } }"); # Method_Became_NonDefault writeFile($Path_v1."/MethodBecameNonDefault.java", "package $PackageName; public interface MethodBecameNonDefault { default Integer someMethod(Integer param) { return 0; } }"); writeFile($Path_v2."/MethodBecameNonDefault.java", "package $PackageName; public interface MethodBecameNonDefault { public Integer someMethod(Integer param); }"); writeFile($TestsPath."/Test_MethodBecameNonDefault.java", "import $PackageName.*; class Class_MethodBecameNonDefault implements MethodBecameNonDefault { public static void main(String[] args) { } }; public class Test_MethodBecameNonDefault { public static void main(String[] args) { Class_MethodBecameNonDefault Obj = new Class_MethodBecameNonDefault(); Integer Res = Obj.someMethod(0); } }"); # Class_Became_Interface writeFile($Path_v1."/ClassBecameInterface.java", "package $PackageName; public class ClassBecameInterface extends BaseClass { public Integer someMethod(Integer param) { return param; } }"); writeFile($Path_v2."/ClassBecameInterface.java", "package $PackageName; public interface ClassBecameInterface extends BaseInterface, BaseInterface2 { public Integer someMethod(Integer param); }"); # Added_Super_Class writeFile($Path_v1."/AddedSuperClass.java", "package $PackageName; public class AddedSuperClass { public Integer someMethod(Integer param) { return param; } }"); writeFile($Path_v2."/AddedSuperClass.java", "package $PackageName; public class AddedSuperClass extends BaseClass { public Integer someMethod(Integer param) { return param; } }"); # Abstract_Class_Added_Super_Abstract_Class writeFile($Path_v1."/AbstractClassAddedSuperAbstractClass.java", "package $PackageName; public abstract class AbstractClassAddedSuperAbstractClass { public Integer someMethod(Integer param) { return param; } }"); writeFile($Path_v2."/AbstractClassAddedSuperAbstractClass.java", "package $PackageName; public abstract class AbstractClassAddedSuperAbstractClass extends BaseAbstractClass { public Integer someMethod(Integer param) { return param; } }"); # Removed_Super_Class writeFile($Path_v1."/RemovedSuperClass.java", "package $PackageName; public class RemovedSuperClass extends BaseClass { public Integer someMethod(Integer param) { return param; } }"); writeFile($Path_v2."/RemovedSuperClass.java", "package $PackageName; public class RemovedSuperClass { public Integer someMethod(Integer param) { return param; } }"); # Changed_Super_Class writeFile($Path_v1."/ChangedSuperClass.java", "package $PackageName; public class ChangedSuperClass extends BaseClass { public Integer someMethod(Integer param) { return param; } }"); writeFile($Path_v2."/ChangedSuperClass.java", "package $PackageName; public class ChangedSuperClass extends BaseClass2 { public Integer someMethod(Integer param) { return param; } }"); # Abstract_Class_Added_Super_Interface writeFile($Path_v1."/AbstractClassAddedSuperInterface.java", "package $PackageName; public abstract class AbstractClassAddedSuperInterface implements BaseInterface { public Integer method(Integer param) { return param; } }"); writeFile($Path_v2."/AbstractClassAddedSuperInterface.java", "package $PackageName; public abstract class AbstractClassAddedSuperInterface implements BaseInterface, BaseInterface2 { public Integer method(Integer param) { return param; } }"); # Abstract_Class_Added_Super_Interface_With_Implemented_Methods writeFile($Path_v1."/AbstractClassAddedSuperInterfaceWithImplementedMethods.java", "package $PackageName; public abstract class AbstractClassAddedSuperInterfaceWithImplementedMethods implements BaseInterface { public Integer method(Integer param) { return param; } public Integer method2(Integer param) { return param; } }"); writeFile($Path_v2."/AbstractClassAddedSuperInterfaceWithImplementedMethods.java", "package $PackageName; public abstract class AbstractClassAddedSuperInterfaceWithImplementedMethods implements BaseInterface, BaseInterface2 { public Integer method(Integer param) { return param; } public Integer method2(Integer param) { return param; } }"); # Class_Removed_Super_Interface writeFile($Path_v1."/ClassRemovedSuperInterface.java", "package $PackageName; public class ClassRemovedSuperInterface implements BaseInterface, BaseInterface2 { public Integer method(Integer param) { return param; } public Integer method2(Integer param) { return param; } }"); writeFile($Path_v2."/ClassRemovedSuperInterface.java", "package $PackageName; public class ClassRemovedSuperInterface implements BaseInterface { public Integer method(Integer param) { return param; } public Integer method2(Integer param) { return param; } }"); writeFile($TestsPath."/Test_ClassRemovedSuperInterface.java", "import $PackageName.*; public class Test_ClassRemovedSuperInterface { public static void main(String[] args) { ClassRemovedSuperInterface Obj = new ClassRemovedSuperInterface(); Integer Res = Obj.method2(0); } }"); # Interface_Added_Super_Interface writeFile($Path_v1."/InterfaceAddedSuperInterface.java", "package $PackageName; public interface InterfaceAddedSuperInterface extends BaseInterface { public Integer someMethod(Integer param); }"); writeFile($Path_v2."/InterfaceAddedSuperInterface.java", "package $PackageName; public interface InterfaceAddedSuperInterface extends BaseInterface, BaseInterface2 { public Integer someMethod(Integer param); }"); # Interface_Added_Super_Constant_Interface writeFile($Path_v1."/InterfaceAddedSuperConstantInterface.java", "package $PackageName; public interface InterfaceAddedSuperConstantInterface extends BaseInterface { public Integer someMethod(Integer param); }"); writeFile($Path_v2."/InterfaceAddedSuperConstantInterface.java", "package $PackageName; public interface InterfaceAddedSuperConstantInterface extends BaseInterface, BaseConstantInterface { public Integer someMethod(Integer param); }"); # Interface_Removed_Super_Interface writeFile($Path_v1."/InterfaceRemovedSuperInterface.java", "package $PackageName; public interface InterfaceRemovedSuperInterface extends BaseInterface, BaseInterface2 { public Integer someMethod(Integer param); }"); writeFile($Path_v2."/InterfaceRemovedSuperInterface.java", "package $PackageName; public interface InterfaceRemovedSuperInterface extends BaseInterface { public Integer someMethod(Integer param); }"); # Interface_Removed_Super_Constant_Interface writeFile($Path_v1."/InterfaceRemovedSuperConstantInterface.java", "package $PackageName; public interface InterfaceRemovedSuperConstantInterface extends BaseInterface, BaseConstantInterface { public Integer someMethod(Integer param); }"); writeFile($Path_v2."/InterfaceRemovedSuperConstantInterface.java", "package $PackageName; public interface InterfaceRemovedSuperConstantInterface extends BaseInterface { public Integer someMethod(Integer param); }"); # Interface_Became_Class writeFile($Path_v1."/InterfaceBecameClass.java", "package $PackageName; public interface InterfaceBecameClass extends BaseInterface, BaseInterface2 { public Integer someMethod(Integer param); }"); writeFile($Path_v2."/InterfaceBecameClass.java", "package $PackageName; public class InterfaceBecameClass extends BaseClass { public Integer someMethod(Integer param) { return param; } }"); # Removed_Class writeFile($Path_v1."/RemovedClass.java", "package $PackageName; public class RemovedClass extends BaseClass { public Integer someMethod(Integer param){ return param; } }"); # Removed_Class (w/o methods) writeFile($Path_v1."/RemovedFieldClass.java", "package $PackageName; public class RemovedFieldClass { public Integer field; }"); writeFile($TestsPath."/Test_RemovedFieldClass.java", "import $PackageName.*; public class Test_RemovedFieldClass { public static void main(String[] args) { RemovedFieldClass X = new RemovedFieldClass(); Integer Copy = X.field; } }"); # Removed_Class (with static fields, private constructor) writeFile($Path_v1."/RemovedClassWithStaticField.java", "package $PackageName; public class RemovedClassWithStaticField { private RemovedClassWithStaticField(){} public static Integer cnt = 0; }"); writeFile($TestsPath."/Test_RemovedClassWithStaticField.java", "import $PackageName.*; public class Test_RemovedClassWithStaticField { public static void main(String[] args) { Integer Copy = RemovedClassWithStaticField.cnt; } }"); # Removed_Field (static field, private constructor) writeFile($Path_v1."/RemovedStaticFieldFromClassWithPrivateCtor.java", "package $PackageName; public class RemovedStaticFieldFromClassWithPrivateCtor { private RemovedStaticFieldFromClassWithPrivateCtor(){} public static Integer cnt = 0; }"); writeFile($Path_v2."/RemovedStaticFieldFromClassWithPrivateCtor.java", "package $PackageName; public class RemovedStaticFieldFromClassWithPrivateCtor { private RemovedStaticFieldFromClassWithPrivateCtor(){} }"); writeFile($TestsPath."/Test_RemovedStaticFieldFromClassWithPrivateCtor.java", "import $PackageName.*; public class Test_RemovedStaticFieldFromClassWithPrivateCtor { public static void main(String[] args) { Integer Copy = RemovedStaticFieldFromClassWithPrivateCtor.cnt; } }"); # Removed_Constant_Field writeFile($Path_v1."/ClassRemovedStaticConstantField.java", "package $PackageName; public class ClassRemovedStaticConstantField { public static int removedField_Int = 1000; public static String removedField_Str = \"Value\"; }"); writeFile($Path_v2."/ClassRemovedStaticConstantField.java", "package $PackageName; public class ClassRemovedStaticConstantField { }"); writeFile($TestsPath."/Test_ClassRemovedStaticConstantField.java", "import $PackageName.*; public class Test_ClassRemovedStaticConstantField { public static void main(String[] args) { Integer Copy = ClassRemovedStaticConstantField.removedField_Int; } }"); # Removed_Class (Deprecated) writeFile($Path_v1."/RemovedDeprecatedClass.java", "package $PackageName; \@Deprecated public class RemovedDeprecatedClass { public Integer someMethod(Integer param){ return param; } }"); # Removed_Interface writeFile($Path_v1."/RemovedInterface.java", "package $PackageName; public interface RemovedInterface extends BaseInterface, BaseInterface2 { public Integer someMethod(Integer param); }"); # NonAbstract_Class_Added_Abstract_Method writeFile($Path_v1."/NonAbstractClassAddedAbstractMethod.java", "package $PackageName; public class NonAbstractClassAddedAbstractMethod { public Integer someMethod(Integer param1, String[] param2) { return param1; }; }"); writeFile($Path_v2."/NonAbstractClassAddedAbstractMethod.java", "package $PackageName; public abstract class NonAbstractClassAddedAbstractMethod { public Integer someMethod(Integer param1, String[] param2) { return param1; }; public abstract Integer addedMethod(Integer param); }"); # Abstract_Class_Added_Abstract_Method writeFile($Path_v1."/AbstractClassAddedAbstractMethod.java", "package $PackageName; public abstract class AbstractClassAddedAbstractMethod { public Integer someMethod(Integer param1, String[] param2) { return param1; }; }"); writeFile($Path_v2."/AbstractClassAddedAbstractMethod.java", "package $PackageName; public abstract class AbstractClassAddedAbstractMethod { public Integer someMethod(Integer param1, String[] param2) { return param1; }; public abstract Integer addedMethod(Integer param); }"); # Class_Became_Abstract writeFile($Path_v1."/ClassBecameAbstract.java", "package $PackageName; public class ClassBecameAbstract { public Integer someMethod(Integer param1, String[] param2) { return param1; }; }"); writeFile($Path_v2."/ClassBecameAbstract.java", "package $PackageName; public abstract class ClassBecameAbstract { public Integer someMethod(Integer param1, String[] param2) { return param1; }; public abstract Integer addedMethod(Integer param); }"); # Class_Became_Final writeFile($Path_v1."/ClassBecameFinal.java", "package $PackageName; public class ClassBecameFinal { public Integer someMethod(Integer param1, String[] param2) { return param1; }; }"); writeFile($Path_v2."/ClassBecameFinal.java", "package $PackageName; public final class ClassBecameFinal { public Integer someMethod(Integer param1, String[] param2) { return param1; }; }"); # Class_Removed_Abstract_Method writeFile($Path_v1."/ClassRemovedAbstractMethod.java", "package $PackageName; public abstract class ClassRemovedAbstractMethod { public Integer someMethod(Integer param1, String[] param2) { return param1; }; public abstract void removedMethod(Integer param); }"); writeFile($Path_v2."/ClassRemovedAbstractMethod.java", "package $PackageName; public abstract class ClassRemovedAbstractMethod { public Integer someMethod(Integer param1, String[] param2) { return param1; }; }"); writeFile($TestsPath."/Test_ClassRemovedAbstractMethod.java", "import $PackageName.*; class ClassRemovedAbstractMethodDerived extends ClassRemovedAbstractMethod { public void removedMethod(Integer param) { } public static void main(String[] args) { } }; public class Test_ClassRemovedAbstractMethod { public static void main(String[] args) { ClassRemovedAbstractMethod Obj = new ClassRemovedAbstractMethodDerived(); Obj.removedMethod(0); } }"); # Class_Method_Became_Abstract writeFile($Path_v1."/ClassMethodBecameAbstract.java", "package $PackageName; public abstract class ClassMethodBecameAbstract { public Integer someMethod(Integer param1, String[] param2) { return param1; }; public Integer someMethod(Integer param){ return param; }; }"); writeFile($Path_v2."/ClassMethodBecameAbstract.java", "package $PackageName; public abstract class ClassMethodBecameAbstract { public Integer someMethod(Integer param1, String[] param2) { return param1; }; public abstract Integer someMethod(Integer param); }"); # Class_Method_Became_NonAbstract writeFile($Path_v1."/ClassMethodBecameNonAbstract.java", "package $PackageName; public abstract class ClassMethodBecameNonAbstract { public Integer someMethod(Integer param1, String[] param2) { return param1; }; public abstract Integer someMethod(Integer param); }"); writeFile($Path_v2."/ClassMethodBecameNonAbstract.java", "package $PackageName; public abstract class ClassMethodBecameNonAbstract { public Integer someMethod(Integer param1, String[] param2) { return param1; }; public Integer someMethod(Integer param){ return param; }; }"); # Method_Became_Static writeFile($Path_v1."/MethodBecameStatic.java", "package $PackageName; public class MethodBecameStatic { public Integer someMethod(Integer param) { return param; }; }"); writeFile($Path_v2."/MethodBecameStatic.java", "package $PackageName; public class MethodBecameStatic { public static Integer someMethod(Integer param) { return param; }; }"); # Method_Became_NonStatic writeFile($Path_v1."/MethodBecameNonStatic.java", "package $PackageName; public class MethodBecameNonStatic { public static Integer someMethod(Integer param) { return param; }; }"); writeFile($Path_v2."/MethodBecameNonStatic.java", "package $PackageName; public class MethodBecameNonStatic { public Integer someMethod(Integer param) { return param; }; }"); # Static_Method_Became_Final writeFile($Path_v2."/StaticMethodBecameFinal.java", "package $PackageName; public class StaticMethodBecameFinal { public static Integer someMethod(Integer param) { return param; }; }"); writeFile($Path_v1."/StaticMethodBecameFinal.java", "package $PackageName; public class StaticMethodBecameFinal { public static final Integer someMethod(Integer param) { return param; }; }"); writeFile($TestsPath."/Test_StaticMethodBecameFinal.java", "import $PackageName.*; public class Test_StaticMethodBecameFinal { public static void main(String[] args) { Integer R = StaticMethodBecameFinal.someMethod(0); } }"); # NonStatic_Method_Became_Final writeFile($Path_v1."/NonStaticMethodBecameFinal.java", "package $PackageName; public class NonStaticMethodBecameFinal { public Integer someMethod(Integer param) { return param; }; }"); writeFile($Path_v2."/NonStaticMethodBecameFinal.java", "package $PackageName; public class NonStaticMethodBecameFinal { public final Integer someMethod(Integer param) { return param; }; }"); # Method_Became_Abstract writeFile($Path_v1."/MethodBecameAbstract.java", "package $PackageName; public abstract class MethodBecameAbstract { public Integer someMethod(Integer param) { return param; }; }"); writeFile($Path_v2."/MethodBecameAbstract.java", "package $PackageName; public abstract class MethodBecameAbstract { public abstract Integer someMethod(Integer param); }"); # Method_Became_NonAbstract writeFile($Path_v1."/MethodBecameNonAbstract.java", "package $PackageName; public abstract class MethodBecameNonAbstract { public abstract Integer someMethod(Integer param); }"); writeFile($Path_v2."/MethodBecameNonAbstract.java", "package $PackageName; public abstract class MethodBecameNonAbstract { public Integer someMethod(Integer param) { return param; }; }"); # Changed_Method_Access writeFile($Path_v1."/ChangedMethodAccess.java", "package $PackageName; public class ChangedMethodAccess { public Integer someMethod(Integer param) { return param; }; }"); writeFile($Path_v2."/ChangedMethodAccess.java", "package $PackageName; public class ChangedMethodAccess { protected Integer someMethod(Integer param) { return param; }; }"); # Method_Became_Synchronized writeFile($Path_v1."/MethodBecameSynchronized.java", "package $PackageName; public class MethodBecameSynchronized { public Integer someMethod(Integer param) { return param; }; }"); writeFile($Path_v2."/MethodBecameSynchronized.java", "package $PackageName; public class MethodBecameSynchronized { public synchronized Integer someMethod(Integer param) { return param; }; }"); # Method_Became_NonSynchronized writeFile($Path_v1."/MethodBecameNonSynchronized.java", "package $PackageName; public class MethodBecameNonSynchronized { public synchronized Integer someMethod(Integer param) { return param; }; }"); writeFile($Path_v2."/MethodBecameNonSynchronized.java", "package $PackageName; public class MethodBecameNonSynchronized { public Integer someMethod(Integer param) { return param; }; }"); # Class_Overridden_Method writeFile($Path_v1."/OverriddenMethod.java", "package $PackageName; public class OverriddenMethod extends BaseClass { public Integer someMethod(Integer param) { return param; } }"); writeFile($Path_v2."/OverriddenMethod.java", "package $PackageName; public class OverriddenMethod extends BaseClass { public Integer someMethod(Integer param) { return param; } public Integer method(Integer param) { return 2*param; } }"); # Class_Method_Moved_Up_Hierarchy writeFile($Path_v1."/ClassMethodMovedUpHierarchy.java", "package $PackageName; public class ClassMethodMovedUpHierarchy extends BaseClass { public Integer someMethod(Integer param) { return param; } public Integer method(Integer param) { return 2*param; } }"); writeFile($Path_v2."/ClassMethodMovedUpHierarchy.java", "package $PackageName; public class ClassMethodMovedUpHierarchy extends BaseClass { public Integer someMethod(Integer param) { return param; } }"); # Class_Method_Moved_Up_Hierarchy (Interface Method) - should not be reported writeFile($Path_v1."/InterfaceMethodMovedUpHierarchy.java", "package $PackageName; public interface InterfaceMethodMovedUpHierarchy extends BaseInterface { public Integer method(Integer param); public Integer method2(Integer param); }"); writeFile($Path_v2."/InterfaceMethodMovedUpHierarchy.java", "package $PackageName; public interface InterfaceMethodMovedUpHierarchy extends BaseInterface { public Integer method2(Integer param); }"); # Class_Method_Moved_Up_Hierarchy (Abstract Method) - should not be reported writeFile($Path_v1."/AbstractMethodMovedUpHierarchy.java", "package $PackageName; public abstract class AbstractMethodMovedUpHierarchy implements BaseInterface { public abstract Integer method(Integer param); public abstract Integer method2(Integer param); }"); writeFile($Path_v2."/AbstractMethodMovedUpHierarchy.java", "package $PackageName; public abstract class AbstractMethodMovedUpHierarchy implements BaseInterface { public abstract Integer method2(Integer param); }"); # Use writeFile($Path_v1."/Use.java", "package $PackageName; public class Use { public FieldBecameFinal field; public void someMethod(FieldBecameFinal[] param) { }; public void someMethod(Use param) { }; public Integer someMethod(AbstractClassAddedSuperAbstractClass param) { return 0; } public Integer someMethod(AbstractClassAddedAbstractMethod param) { return 0; } public Integer someMethod(InterfaceAddedAbstractMethod param) { return 0; } public Integer someMethod(InterfaceAddedSuperInterface param) { return 0; } public Integer someMethod(AbstractClassAddedSuperInterface param) { return 0; } public Integer someMethod(AbstractClassAddedSuperInterfaceWithImplementedMethods param) { return 0; } public Integer someMethod(InterfaceRemovedLastAbstractMethod param) { return 0; } }"); writeFile($Path_v2."/Use.java", "package $PackageName; public class Use { public FieldBecameFinal field; public void someMethod(FieldBecameFinal[] param) { }; public void someMethod(Use param) { }; public Integer someMethod(AbstractClassAddedSuperAbstractClass param) { return param.abstractMethod(100)+param.field; } public Integer someMethod(AbstractClassAddedAbstractMethod param) { return param.addedMethod(100); } public Integer someMethod(InterfaceAddedAbstractMethod param) { return param.addedMethod(100); } public Integer someMethod(InterfaceAddedSuperInterface param) { return param.method2(100); } public Integer someMethod(AbstractClassAddedSuperInterface param) { return param.method2(100); } public Integer someMethod(AbstractClassAddedSuperInterfaceWithImplementedMethods param) { return param.method2(100); } public Integer someMethod(InterfaceRemovedLastAbstractMethod param) { return 0; } }"); # Added_Package writeFile($Path_v2."/AddedPackage/AddedPackageClass.java", "package $PackageName.AddedPackage; public class AddedPackageClass { public Integer field; public void someMethod(Integer param) { }; }"); # Removed_Package writeFile($Path_v1."/RemovedPackage/RemovedPackageClass.java", "package $PackageName.RemovedPackage; public class RemovedPackageClass { public Integer field; public void someMethod(Integer param) { }; }"); my $BuildRoot1 = getDirname($Path_v1); my $BuildRoot2 = getDirname($Path_v2); if(compileJavaLib($LibName, $BuildRoot1, $BuildRoot2)) { runTests($TestsPath, $PackageName, getAbsPath($BuildRoot1), getAbsPath($BuildRoot2)); runChecker($LibName, $BuildRoot1, $BuildRoot2); } } sub checkJavaCompiler($) { # check javac: compile simple program my $Cmd = $_[0]; if(not $Cmd) { return; } my $TmpDir = $In::Opt{"Tmp"}; writeFile($TmpDir."/test_javac/Simple.java", "public class Simple { public Integer f; public void method(Integer p) { }; }"); chdir($TmpDir."/test_javac"); system("$Cmd Simple.java 2>errors.txt"); chdir($In::Opt{"OrigDir"}); if($?) { my $Msg = "something is going wrong with the Java compiler (javac):\n"; my $Err = readFile($TmpDir."/test_javac/errors.txt"); $Msg .= $Err; if($Err=~/elf\/start\.S/ and $Err=~/undefined\s+reference\s+to/) { # /usr/lib/gcc/i586-suse-linux/4.5/../../../crt1.o: In function _start: # /usr/src/packages/BUILD/glibc-2.11.3/csu/../sysdeps/i386/elf/start.S:115: undefined reference to main $Msg .= "\nDid you install a JDK-devel package?"; } exitStatus("Error", $Msg); } } sub runTests($$$$) { my ($TestsPath, $PackageName, $Path_v1, $Path_v2) = @_; printMsg("INFO", "Running tests ..."); # compile with old version of package my $JavacCmd = getCmdPath("javac"); if(not $JavacCmd) { exitStatus("Not_Found", "can't find \"javac\" compiler"); } my $JavaCmd = getCmdPath("java"); if(not $JavaCmd) { exitStatus("Not_Found", "can't find \"java\" command"); } chdir($TestsPath); system($JavacCmd." -classpath \"".$Path_v1."\" -g *.java"); chdir($In::Opt{"OrigDir"}); foreach my $TestSrc (cmdFind($TestsPath, "", "*\\.java")) { # remove test source unlink($TestSrc); } my $TEST_REPORT = ""; foreach my $TestPath (cmdFind($TestsPath, "", "*\\.class", 1)) { # run tests my $Name = getFilename($TestPath); $Name=~s/\.class\Z//g; chdir($TestsPath); system($JavaCmd." -classpath \"".join_A($Path_v2, ".")."\" $Name >result.txt 2>&1"); chdir($In::Opt{"OrigDir"}); my $Result = readFile($TestsPath."/result.txt"); unlink($TestsPath."/result.txt"); $TEST_REPORT .= "TEST CASE: $Name\n"; if($Result) { $TEST_REPORT .= "RESULT: FAILED\n"; $TEST_REPORT .= "OUTPUT:\n$Result\n"; } else { $TEST_REPORT .= "RESULT: SUCCESS\n"; } $TEST_REPORT .= "\n"; } my $Journal = $TestsPath."/Journal.txt"; writeFile($Journal, $TEST_REPORT); printMsg("INFO", "See journal with test results: $Journal"); } sub compileJavaLib($$$) { my ($LibName, $BuildRoot1, $BuildRoot2) = @_; my $JavacCmd = getCmdPath("javac"); if(not $JavacCmd) { exitStatus("Not_Found", "can't find \"javac\" compiler"); } checkJavaCompiler($JavacCmd); my $JarCmd = getCmdPath("jar"); if(not $JarCmd) { exitStatus("Not_Found", "can't find \"jar\" command"); } # space before value, new line writeFile("$BuildRoot1/MANIFEST.MF", "Implementation-Version: 1.0\n"); writeFile("$BuildRoot2/MANIFEST.MF", "Implementation-Version: 2.0\n"); my (%SrcDir1, %SrcDir2) = (); foreach my $Path (cmdFind($BuildRoot1, "f", "*\\.java")) { $SrcDir1{getDirname($Path)} = 1; } foreach my $Path (cmdFind($BuildRoot2, "f", "*\\.java")) { $SrcDir2{getDirname($Path)} = 1; } # build classes v.1 foreach my $Dir (keys(%SrcDir1)) { chdir($Dir); system("$JavacCmd -g *.java"); chdir($In::Opt{"OrigDir"}); if($?) { exitStatus("Error", "can't compile classes v.1"); } } # create java archive v.1 chdir($BuildRoot1); system("$JarCmd -cmf MANIFEST.MF $LibName.jar TestPackage"); chdir($In::Opt{"OrigDir"}); # build classes v.2 foreach my $Dir (keys(%SrcDir2)) { chdir($Dir); system("$JavacCmd -g *.java"); chdir($In::Opt{"OrigDir"}); if($?) { exitStatus("Error", "can't compile classes v.2"); } } # create java archive v.2 chdir($BuildRoot2); system("$JarCmd -cmf MANIFEST.MF $LibName.jar TestPackage"); chdir($In::Opt{"OrigDir"}); foreach my $SrcPath (cmdFind($BuildRoot1, "", "*\\.java")) { unlink($SrcPath); } foreach my $SrcPath (cmdFind($BuildRoot2, "", "*\\.java")) { unlink($SrcPath); } return 1; } sub runChecker($$$) { my ($LibName, $Path1, $Path2) = @_; writeFile("$LibName/v1.xml", " 1.0 ".getAbsPath($Path1)." \n"); writeFile("$LibName/v2.xml", " 2.0 ".getAbsPath($Path2)." \n"); my $Cmd = "perl $0 -l $LibName $LibName/v1.xml $LibName/v2.xml"; if($In::Opt{"Quick"}) { $Cmd .= " -quick"; } if(defined $In::Opt{"SkipDeprecated"}) { $Cmd .= " -skip-deprecated"; } if(defined $In::Opt{"OldStyle"}) { $Cmd .= " -old-style"; } if(my $JdkPath = $In::Opt{"JdkPath"}) { $Cmd .= " -jdk-path \"$JdkPath\""; } my $TmpDir = $In::Opt{"Tmp"}; writeFile($TmpDir."/skip-annotations.list", "TestPackage.Beta"); $Cmd .= " -skip-annotations-list ".$TmpDir."/skip-annotations.list"; if($In::Opt{"Debug"}) { $Cmd .= " -debug"; printMsg("INFO", "Executing $Cmd"); } my $Report = "compat_reports/$LibName/1.0_to_2.0/compat_report.html"; if(-f $Report) { unlink($Report); } system($Cmd); if(not -f $Report) { exitStatus("Error", "analysis has failed"); } # Binary my $BReport = readAttributes($Report, 0); my $NProblems = $BReport->{"type_problems_high"}+$BReport->{"type_problems_medium"}; $NProblems += $BReport->{"method_problems_high"}+$BReport->{"method_problems_medium"}; $NProblems += $BReport->{"removed"}; # Source my $SReport = readAttributes($Report, 1); $NProblems += $SReport->{"type_problems_high"}+$SReport->{"type_problems_medium"}; $NProblems += $SReport->{"method_problems_high"}+$SReport->{"method_problems_medium"}; $NProblems += $SReport->{"removed"}; if($NProblems>=100) { printMsg("INFO", "Test result: SUCCESS ($NProblems breaks found)\n"); } else { printMsg("ERROR", "Test result: FAILED ($NProblems breaks found)\n"); } } return 1;