From 3cd59d8fddec3dd15ec10e8fb1bf1a1ca29f22cd Mon Sep 17 00:00:00 2001 From: Eric Bruneton Date: Sat, 7 Oct 2017 09:27:51 +0200 Subject: [PATCH] Refactor the unit tests to use JUnit 4 annotations. Also remove the dependency from AnalyzerUnitTest to ClassWriterComputeMaxUnitTest (by duplicating some code; this will be needed to use a multi-project layout). --- test/build.xml | 1 - .../org/objectweb/asm/AttributeTest.java | 7 +- .../objectweb/asm/ClassReaderUnitTest.java | 18 +- .../asm/ClassWriterComputeMaxsUnitTest.java | 22 +- .../objectweb/asm/ClassWriterUnitTest.java | 9 +- .../asm/commons/ClassRemapperUnitTest.java | 9 +- .../commons/JSRInlinerAdapterUnitTest.java | 47 +- .../SerialVersionUIDAdderUnitTest.java | 11 +- .../commons/SignatureRemapperUnitTest.java | 15 +- .../asm/commons/StaticInitMergerTest.java | 6 +- .../objectweb/asm/tree/ClassNodeUnitTest.java | 22 +- .../objectweb/asm/tree/InsnListUnitTest.java | 106 ++- .../asm/tree/analysis/AnalyzerUnitTest.java | 783 +++++++++++++++++- .../tree/analysis/SimpleVerifierUnitTest.java | 59 +- .../asm/tree/analysis/SmallSetUnitTest.java | 8 +- .../asm/tree/analysis/ValueUnitTest.java | 8 +- .../objectweb/asm/util/ASMifierUnitTest.java | 5 +- .../asm/util/CheckClassAdapterUnitTest.java | 88 +- .../util/CheckSignatureAdapterUnitTest.java | 72 +- .../asm/util/TraceClassAdapterUnitTest.java | 5 +- .../util/TraceSignatureVisitorUnitTest.java | 45 +- .../asm/xml/ASMContentHandlerUnitTest.java | 14 +- .../objectweb/asm/xml/SAXAdapterUnitTest.java | 14 +- test/conform/staticinitmerger.xml | 48 -- test/conform/unit.xml | 1 + 25 files changed, 1195 insertions(+), 228 deletions(-) delete mode 100644 test/conform/staticinitmerger.xml diff --git a/test/build.xml b/test/build.xml index 139cc1025..d15a263e4 100644 --- a/test/build.xml +++ b/test/build.xml @@ -153,7 +153,6 @@ - diff --git a/test/conform/org/objectweb/asm/AttributeTest.java b/test/conform/org/objectweb/asm/AttributeTest.java index 6b83b8b34..6b177066b 100644 --- a/test/conform/org/objectweb/asm/AttributeTest.java +++ b/test/conform/org/objectweb/asm/AttributeTest.java @@ -27,15 +27,18 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; -import junit.framework.TestCase; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; /** * Attribute unit tests. * * @author Eric Bruneton */ -public class AttributeTest extends TestCase { +public class AttributeTest { + @Test public void testUnknown() { assertTrue(new Attribute("Comment").isUnknown()); } diff --git a/test/conform/org/objectweb/asm/ClassReaderUnitTest.java b/test/conform/org/objectweb/asm/ClassReaderUnitTest.java index a41f8f749..0aba0237b 100644 --- a/test/conform/org/objectweb/asm/ClassReaderUnitTest.java +++ b/test/conform/org/objectweb/asm/ClassReaderUnitTest.java @@ -27,10 +27,15 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + import java.io.IOException; import java.io.InputStream; -import junit.framework.TestCase; +import org.junit.Test; /** * ClassReader unit tests. @@ -38,8 +43,9 @@ import junit.framework.TestCase; * @author Eric Bruneton * @author Eugene Kuleshov */ -public class ClassReaderUnitTest extends TestCase implements Opcodes { +public class ClassReaderUnitTest implements Opcodes { + @Test public void testIllegalConstructorArgument() { try { new ClassReader((InputStream) null); @@ -48,6 +54,7 @@ public class ClassReaderUnitTest extends TestCase implements Opcodes { } } + @Test public void testGetItem() throws IOException { ClassReader cr = new ClassReader(getClass().getName()); int item = cr.getItem(1); @@ -55,28 +62,33 @@ public class ClassReaderUnitTest extends TestCase implements Opcodes { assertTrue(item < cr.header); } + @Test public void testReadByte() throws IOException { ClassReader cr = new ClassReader(getClass().getName()); assertEquals(cr.b[0] & 0xFF, cr.readByte(0)); } + @Test public void testGetAccess() throws Exception { String name = getClass().getName(); assertEquals(Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, new ClassReader(name).getAccess()); } + @Test public void testGetClassName() throws Exception { String name = getClass().getName(); assertEquals(name.replace('.', '/'), new ClassReader(name).getClassName()); } + @Test public void testGetSuperName() throws Exception { assertEquals( - TestCase.class.getName().replace('.', '/'), + Object.class.getName().replace('.', '/'), new ClassReader(getClass().getName()).getSuperName()); assertEquals(null, new ClassReader(Object.class.getName()).getSuperName()); } + @Test public void testGetInterfaces() throws Exception { String[] interfaces = new ClassReader(getClass().getName()).getInterfaces(); assertNotNull(interfaces); diff --git a/test/conform/org/objectweb/asm/ClassWriterComputeMaxsUnitTest.java b/test/conform/org/objectweb/asm/ClassWriterComputeMaxsUnitTest.java index 507f83d4c..97a071bb2 100644 --- a/test/conform/org/objectweb/asm/ClassWriterComputeMaxsUnitTest.java +++ b/test/conform/org/objectweb/asm/ClassWriterComputeMaxsUnitTest.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.lang.reflect.Field; @@ -38,14 +41,15 @@ import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; -import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Test; /** * ClassWriter unit tests for COMPUTE_MAXS option with JSR instructions. * * @author Eric Bruneton */ -public class ClassWriterComputeMaxsUnitTest extends TestCase { +public class ClassWriterComputeMaxsUnitTest { private Field successors; @@ -61,8 +65,8 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { private Label start; - @Override - protected void setUp() throws Exception { + @Before + public void setUp() throws Exception { Class lClass = Label.class; Class eClass = Edge.class; try { @@ -281,6 +285,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { * } * */ + @Test public void testBasic() { Label L0 = new Label(); Label L1 = new Label(); @@ -351,6 +356,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { * } * */ + @Test public void testIfElseInFinally() { Label L0 = new Label(); Label L1 = new Label(); @@ -433,6 +439,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { * } * */ + @Test public void testSimpleNestedFinally() { Label L0 = new Label(); Label L1 = new Label(); @@ -524,6 +531,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { * } * */ + @Test public void testSubroutineWithNoRet() { Label L0 = new Label(); Label L1 = new Label(); @@ -589,6 +597,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { * RETURN * */ + @Test public void testSubroutineWithNoRet2() { Label L0 = new Label(); Label L1 = new Label(); @@ -629,6 +638,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { * } * */ + @Test public void testImplicitExit() { Label L0 = new Label(); Label L1 = new Label(); @@ -714,6 +724,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { * This example is from the paper, "Subroutine Inlining and Bytecode Abstraction to Simplify * Static and Dynamic Analysis" by Cyrille Artho and Armin Biere. */ + @Test public void testImplicitExitToAnotherSubroutine() { Label T1 = new Label(); Label C1 = new Label(); @@ -805,6 +816,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { + "N45=N5,N10\n"); } + @Test public void testImplicitExitToAnotherSubroutine2() { Label L1 = new Label(); Label L2 = new Label(); @@ -840,6 +852,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { * *

This would not normally be produced by a java compiler. */ + @Test public void testInterleavedCode() { Label L1 = new Label(); Label L2 = new Label(); @@ -907,6 +920,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase { * } * */ + @Test public void testImplicitExitInTryCatch() { Label T1 = new Label(); Label C1 = new Label(); diff --git a/test/conform/org/objectweb/asm/ClassWriterUnitTest.java b/test/conform/org/objectweb/asm/ClassWriterUnitTest.java index 5ffa1e034..4891d222b 100644 --- a/test/conform/org/objectweb/asm/ClassWriterUnitTest.java +++ b/test/conform/org/objectweb/asm/ClassWriterUnitTest.java @@ -27,15 +27,18 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; -import junit.framework.TestCase; +import static org.junit.Assert.fail; + +import org.junit.Test; /** * ClassWriter unit tests. * * @author Eric Bruneton */ -public class ClassWriterUnitTest extends TestCase { +public class ClassWriterUnitTest { + @Test public void testNewConst() { ClassWriter cw = new ClassWriter(0); cw.newConst(new Byte((byte) 0)); @@ -46,6 +49,7 @@ public class ClassWriterUnitTest extends TestCase { cw.newMethod("A", "m", "()V", false); } + @Test public void testIllegalNewConstArgument() { ClassWriter cw = new ClassWriter(0); try { @@ -55,6 +59,7 @@ public class ClassWriterUnitTest extends TestCase { } } + @Test public void testIllegalGetCommonSuperClassArguments() { ClassWriter cw = new ClassWriter(0); try { diff --git a/test/conform/org/objectweb/asm/commons/ClassRemapperUnitTest.java b/test/conform/org/objectweb/asm/commons/ClassRemapperUnitTest.java index b0b4c5e89..8cfb5c3f8 100644 --- a/test/conform/org/objectweb/asm/commons/ClassRemapperUnitTest.java +++ b/test/conform/org/objectweb/asm/commons/ClassRemapperUnitTest.java @@ -25,17 +25,17 @@ // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF // THE POSSIBILITY OF SUCH DAMAGE. - package org.objectweb.asm.commons; +import static org.junit.Assert.assertEquals; + import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.ListIterator; import java.util.Map; -import junit.framework.TestCase; - +import org.junit.Test; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; @@ -54,8 +54,9 @@ import org.objectweb.asm.tree.MultiANewArrayInsnNode; import org.objectweb.asm.tree.TryCatchBlockNode; import org.objectweb.asm.tree.TypeInsnNode; -public class ClassRemapperUnitTest extends TestCase implements Opcodes { +public class ClassRemapperUnitTest implements Opcodes { + @Test public void testClassRemapper() throws Exception { Map map = new HashMap(); map.put("Boo", "B1"); diff --git a/test/conform/org/objectweb/asm/commons/JSRInlinerAdapterUnitTest.java b/test/conform/org/objectweb/asm/commons/JSRInlinerAdapterUnitTest.java index 5f265febf..c8228364b 100644 --- a/test/conform/org/objectweb/asm/commons/JSRInlinerAdapterUnitTest.java +++ b/test/conform/org/objectweb/asm/commons/JSRInlinerAdapterUnitTest.java @@ -27,8 +27,11 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import org.junit.Before; +import org.junit.Test; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; @@ -42,15 +45,14 @@ import org.objectweb.asm.util.Textifier; * * @author Eugene Kuleshov, Niko Matsakis, Eric Bruneton */ -public class JSRInlinerAdapterUnitTest extends TestCase { +public class JSRInlinerAdapterUnitTest { private JSRInlinerAdapter jsr; private MethodNode exp; private MethodVisitor current; - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { jsr = new JSRInlinerAdapter(Opcodes.ASM5, null, 0, "m", "()V", null, null) { @Override @@ -193,6 +195,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * } * */ + @Test public void testBasic() { { Label L0 = new Label(); @@ -290,7 +293,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(1, 4); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } /** @@ -310,6 +313,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * } * */ + @Test public void testIfElseInFinally() { { Label L0 = new Label(); @@ -431,7 +435,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(1, 4); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } /** @@ -452,6 +456,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * } * */ + @Test public void testSimpleNestedFinally() { { Label L0 = new Label(); @@ -613,7 +618,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(2, 6); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } /** @@ -637,6 +642,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * } * */ + @Test public void testSubroutineWithNoRet() { { Label L0 = new Label(); @@ -739,7 +745,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(1, 4); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } /** @@ -752,6 +758,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * RETURN * */ + @Test public void testSubroutineWithNoRet2() { { Label L0 = new Label(); @@ -783,7 +790,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(1, 1); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } /** @@ -808,6 +815,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * } * */ + @Test public void testImplicitExit() { { Label L0 = new Label(); @@ -923,7 +931,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(1, 4); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } /** @@ -951,6 +959,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * This example is from the paper, "Subroutine Inlining and Bytecode Abstraction to Simplify * Static and Dynamic Analysis" by Cyrille Artho and Armin Biere. */ + @Test public void testImplicitExitToAnotherSubroutine() { { Label T1 = new Label(); @@ -1185,7 +1194,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(1, 6); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } /** @@ -1195,6 +1204,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * *

I don't believe this can be represented in Java. */ + @Test public void testCommonCodeWhichMustBeDuplicated() { { Label L1 = new Label(); @@ -1294,7 +1304,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(1, 2); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } /** @@ -1303,6 +1313,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * *

This would not normally be produced by a java compiler. */ + @Test public void testInterleavedCode() { { Label L1 = new Label(); @@ -1393,7 +1404,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(1, 3); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } /** @@ -1424,6 +1435,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * } * */ + @Test public void testImplicitExitInTryCatch() { { Label T1 = new Label(); @@ -1705,7 +1717,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(1, 6); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } /** @@ -1723,6 +1735,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase { * LV "a" from 1 to 6 * */ + @Test public void testBasicLineNumberAndLocalVars() { { Label LM1 = new Label(); @@ -1837,10 +1850,10 @@ public class JSRInlinerAdapterUnitTest extends TestCase { END(1, 4); } - assertEquals(exp, jsr); + assertMethodEquals(exp, jsr); } - public void assertEquals(final MethodNode exp, final MethodNode actual) { + public void assertMethodEquals(final MethodNode exp, final MethodNode actual) { String textexp = getText(exp); String textact = getText(actual); System.err.println("Expected=" + textexp); diff --git a/test/conform/org/objectweb/asm/commons/SerialVersionUIDAdderUnitTest.java b/test/conform/org/objectweb/asm/commons/SerialVersionUIDAdderUnitTest.java index 9603d4b19..d18deddaa 100644 --- a/test/conform/org/objectweb/asm/commons/SerialVersionUIDAdderUnitTest.java +++ b/test/conform/org/objectweb/asm/commons/SerialVersionUIDAdderUnitTest.java @@ -27,11 +27,12 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; +import static org.junit.Assert.assertEquals; + import java.io.IOException; import java.io.Serializable; -import junit.framework.TestCase; - +import org.junit.Test; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Opcodes; @@ -64,7 +65,7 @@ enum SerialVersionEnum { * @author Alexandre Vasseur * @author Eric Bruneton */ -public class SerialVersionUIDAdderUnitTest extends TestCase implements Serializable { +public class SerialVersionUIDAdderUnitTest implements Serializable { static { System.setIn(System.in); @@ -84,21 +85,25 @@ public class SerialVersionUIDAdderUnitTest extends TestCase implements Serializa return svuid[0]; } + @Test public void testClass() throws Throwable { long UID = computeSerialVersionUID(SerialVersionClass.class.getName()); assertEquals(4737241769335595888L, UID); } + @Test public void testInterface() throws Throwable { long UID = computeSerialVersionUID(SerialVersionInterface.class.getName()); assertEquals(-1271936742430161320L, UID); } + @Test public void testEmptyInterface() throws Throwable { long UID = computeSerialVersionUID(SerialVersionEmptyInterface.class.getName()); assertEquals(8675733916152748550L, UID); } + @Test public void testEnum() throws Throwable { long UID = computeSerialVersionUID(SerialVersionEnum.class.getName()); assertEquals(0L, UID); diff --git a/test/conform/org/objectweb/asm/commons/SignatureRemapperUnitTest.java b/test/conform/org/objectweb/asm/commons/SignatureRemapperUnitTest.java index 2e8da8d2f..063bfa80e 100644 --- a/test/conform/org/objectweb/asm/commons/SignatureRemapperUnitTest.java +++ b/test/conform/org/objectweb/asm/commons/SignatureRemapperUnitTest.java @@ -28,22 +28,26 @@ package org.objectweb.asm.commons; +import static org.junit.Assert.assertEquals; + import java.util.Collections; import java.util.HashMap; import java.util.Map; -import junit.framework.TestCase; +import org.junit.Test; -public class SignatureRemapperUnitTest extends TestCase { +public class SignatureRemapperUnitTest { - public static void testRemappingParentOnlyNestedClassExtends() { + @Test + public void testRemappingParentOnlyNestedClassExtends() { Remapper remapper = new SimpleRemapper(Collections.singletonMap("Outer", "RenamedOuter")); assertEquals( "LRenamedOuter.Inner;", remapper.mapSignature("LOuter.Inner;", false)); } - public static void testRemappingChildOnlyNestedClassExtends() { + @Test + public void testRemappingChildOnlyNestedClassExtends() { Remapper remapper = new SimpleRemapper(Collections.singletonMap("Outer$Inner", "Outer$RenamedInner")); assertEquals( @@ -51,7 +55,8 @@ public class SignatureRemapperUnitTest extends TestCase { remapper.mapSignature("LOuter.Inner;", false)); } - public static void testRemappingBothParentAndChildNestedClassExtends() { + @Test + public void testRemappingBothParentAndChildNestedClassExtends() { Map mapping = new HashMap(); mapping.put("Outer", "RenamedOuter"); mapping.put("Outer$Inner", "RenamedOuter$RenamedInner"); diff --git a/test/conform/org/objectweb/asm/commons/StaticInitMergerTest.java b/test/conform/org/objectweb/asm/commons/StaticInitMergerTest.java index 565802546..f91bd5b90 100644 --- a/test/conform/org/objectweb/asm/commons/StaticInitMergerTest.java +++ b/test/conform/org/objectweb/asm/commons/StaticInitMergerTest.java @@ -27,8 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import org.junit.Test; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; @@ -39,10 +40,11 @@ import org.objectweb.asm.Opcodes; * * @author Eric Bruneton */ -public class StaticInitMergerTest extends TestCase implements Opcodes { +public class StaticInitMergerTest implements Opcodes { private static final TestClassLoader LOADER = new TestClassLoader(); + @Test public void test() throws Exception { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassVisitor cv = new StaticInitMerger("$clinit$", cw); diff --git a/test/conform/org/objectweb/asm/tree/ClassNodeUnitTest.java b/test/conform/org/objectweb/asm/tree/ClassNodeUnitTest.java index 3d2d41b86..b34bf8a6d 100644 --- a/test/conform/org/objectweb/asm/tree/ClassNodeUnitTest.java +++ b/test/conform/org/objectweb/asm/tree/ClassNodeUnitTest.java @@ -27,8 +27,10 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Test; import org.objectweb.asm.Handle; import org.objectweb.asm.Label; import org.objectweb.asm.Opcodes; @@ -38,19 +40,22 @@ import org.objectweb.asm.Opcodes; * * @author Eric Bruneton */ -public class ClassNodeUnitTest extends TestCase implements Opcodes { +public class ClassNodeUnitTest implements Opcodes { + @Test public void testFrameNode() { FrameNode fn = new FrameNode(F_SAME, 0, null, 0, null); assertEquals(AbstractInsnNode.FRAME, fn.getType()); } + @Test public void testInsnNode() { InsnNode in = new InsnNode(NOP); assertEquals(in.getOpcode(), NOP); assertEquals(AbstractInsnNode.INSN, in.getType()); } + @Test public void testIntInsnNode() { IntInsnNode iin = new IntInsnNode(BIPUSH, 0); iin.setOpcode(SIPUSH); @@ -58,6 +63,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes { assertEquals(AbstractInsnNode.INT_INSN, iin.getType()); } + @Test public void testVarInsnNode() { VarInsnNode vn = new VarInsnNode(ALOAD, 0); vn.setOpcode(ASTORE); @@ -65,6 +71,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes { assertEquals(AbstractInsnNode.VAR_INSN, vn.getType()); } + @Test public void testTypeInsnNode() { TypeInsnNode tin = new TypeInsnNode(NEW, "java/lang/Object"); tin.setOpcode(CHECKCAST); @@ -72,6 +79,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes { assertEquals(AbstractInsnNode.TYPE_INSN, tin.getType()); } + @Test public void testFieldInsnNode() { FieldInsnNode fn = new FieldInsnNode(GETSTATIC, "owner", "name", "I"); fn.setOpcode(PUTSTATIC); @@ -79,6 +87,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes { assertEquals(AbstractInsnNode.FIELD_INSN, fn.getType()); } + @Test public void testMethodInsnNode() { MethodInsnNode mn = new MethodInsnNode(INVOKESTATIC, "owner", "name", "I", false); mn.setOpcode(INVOKESPECIAL); @@ -86,6 +95,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes { assertEquals(AbstractInsnNode.METHOD_INSN, mn.getType()); } + @Test public void testInvokeDynamicInsnNode() { Handle bsm = new Handle(Opcodes.H_INVOKESTATIC, "owner", "name", "()V", false); InvokeDynamicInsnNode mn = new InvokeDynamicInsnNode("name", "()V", bsm, new Object[0]); @@ -94,6 +104,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes { assertEquals(AbstractInsnNode.INVOKE_DYNAMIC_INSN, mn.getType()); } + @Test public void testJumpInsnNode() { JumpInsnNode jn = new JumpInsnNode(GOTO, new LabelNode()); jn.setOpcode(IFEQ); @@ -101,6 +112,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes { assertEquals(AbstractInsnNode.JUMP_INSN, jn.getType()); } + @Test public void testLabelNode() { LabelNode ln = new LabelNode(); assertEquals(AbstractInsnNode.LABEL, ln.getType()); @@ -110,31 +122,37 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes { ln.getLabel().info = new Object(); } + @Test public void testIincInsnNode() { IincInsnNode iincn = new IincInsnNode(1, 1); assertEquals(AbstractInsnNode.IINC_INSN, iincn.getType()); } + @Test public void testLdcInsnNode() { LdcInsnNode ldcn = new LdcInsnNode("s"); assertEquals(AbstractInsnNode.LDC_INSN, ldcn.getType()); } + @Test public void testLookupSwitchInsnNode() { LookupSwitchInsnNode lsn = new LookupSwitchInsnNode(null, null, null); assertEquals(AbstractInsnNode.LOOKUPSWITCH_INSN, lsn.getType()); } + @Test public void testTableSwitchInsnNode() { TableSwitchInsnNode tsn = new TableSwitchInsnNode(0, 1, null, (LabelNode[]) null); assertEquals(AbstractInsnNode.TABLESWITCH_INSN, tsn.getType()); } + @Test public void testMultiANewArrayInsnNode() { MultiANewArrayInsnNode manan = new MultiANewArrayInsnNode("[[I", 2); assertEquals(AbstractInsnNode.MULTIANEWARRAY_INSN, manan.getType()); } + @Test public void testCloneMethod() { MethodNode n = new MethodNode(); Label l0 = new Label(); diff --git a/test/conform/org/objectweb/asm/tree/InsnListUnitTest.java b/test/conform/org/objectweb/asm/tree/InsnListUnitTest.java index d63a2515e..7ca6884dc 100644 --- a/test/conform/org/objectweb/asm/tree/InsnListUnitTest.java +++ b/test/conform/org/objectweb/asm/tree/InsnListUnitTest.java @@ -27,11 +27,18 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + import java.util.ListIterator; import java.util.NoSuchElementException; -import junit.framework.TestCase; - +import org.junit.Before; +import org.junit.Test; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; @@ -42,7 +49,7 @@ import org.objectweb.asm.Opcodes; * @author Eric Bruneton * @author Eugene Kuleshov */ -public class InsnListUnitTest extends TestCase { +public class InsnListUnitTest { InsnList l1; @@ -52,9 +59,8 @@ public class InsnListUnitTest extends TestCase { InsnNode in2; - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { l1 = new CheckedInsnList(); l2 = new CheckedInsnList(); in1 = new InsnNode(0); @@ -63,25 +69,29 @@ public class InsnListUnitTest extends TestCase { l2.add(in2); } - protected void assertEquals(final AbstractInsnNode[] expected, final AbstractInsnNode[] value) { + void assertInsnEquals(final AbstractInsnNode[] expected, final AbstractInsnNode[] value) { assertEquals(expected.length, value.length); for (int i = 0; i < value.length; ++i) { assertEquals(expected[i], value[i]); } } + @Test public void testSize() { assertEquals(0, l1.size()); } + @Test public void testGetFirst() { assertEquals(null, l1.getFirst()); } + @Test public void testGetLast() { assertEquals(null, l1.getLast()); } + @Test public void testInvalidGet() { try { l1.get(0); @@ -90,10 +100,12 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testContains() { assertEquals(false, l1.contains(new InsnNode(0))); } + @Test public void testIterator() { InsnNode insn = new InsnNode(0); @@ -178,6 +190,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(in2, it.next()); } + @Test public void testIterator2() { ListIterator it = l2.iterator(l2.size()); @@ -207,6 +220,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(3, it.nextIndex()); } + @Test public void testIterator3() { InsnNode insn = new InsnNode(0); l2.add(insn); @@ -239,6 +253,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(in1, l2.getFirst()); } + @Test public void testIterator4() { try { new InsnList().iterator().next(); @@ -247,6 +262,7 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testIterator5() { // Call add() on empty list ListIterator it = l1.iterator(); @@ -276,6 +292,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(1, it.next().opcode); } + @Test public void testInvalidIndexOf() { try { l1.indexOf(new InsnNode(0)); @@ -284,10 +301,12 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testToArray() { assertEquals(0, l1.toArray().length); } + @Test public void testInvalidSet() { try { l1.set(new InsnNode(0), new InsnNode(0)); @@ -296,6 +315,7 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testSet() { l1.add(new InsnNode(0)); AbstractInsnNode insn = new InsnNode(0); @@ -319,6 +339,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(insn, l1.get(1)); } + @Test public void testInvalidAdd() { try { l1.add(in1); @@ -327,6 +348,7 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testAddEmpty() { InsnNode insn = new InsnNode(0); l1.add(insn); @@ -336,11 +358,12 @@ public class InsnListUnitTest extends TestCase { assertEquals(insn, l1.get(0)); assertEquals(true, l1.contains(insn)); assertEquals(0, l1.indexOf(insn)); - assertEquals(new AbstractInsnNode[] {insn}, l1.toArray()); + assertInsnEquals(new AbstractInsnNode[] {insn}, l1.toArray()); assertEquals(null, insn.getPrevious()); assertEquals(null, insn.getNext()); } + @Test public void testAddNonEmpty() { InsnNode insn = new InsnNode(0); l1.add(new InsnNode(0)); @@ -352,14 +375,16 @@ public class InsnListUnitTest extends TestCase { assertEquals(true, l1.contains(insn)); } + @Test public void testAddEmptyList() { l1.add(new InsnList()); assertEquals(0, l1.size()); assertEquals(null, l1.getFirst()); assertEquals(null, l1.getLast()); - assertEquals(new AbstractInsnNode[0], l1.toArray()); + assertInsnEquals(new AbstractInsnNode[0], l1.toArray()); } + @Test public void testInvalidAddAll() { try { l1.add(l1); @@ -368,6 +393,7 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testAddAllEmpty() { l1.add(l2); assertEquals(2, l1.size()); @@ -378,9 +404,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(true, l1.contains(in2)); assertEquals(0, l1.indexOf(in1)); assertEquals(1, l1.indexOf(in2)); - assertEquals(new AbstractInsnNode[] {in1, in2}, l1.toArray()); + assertInsnEquals(new AbstractInsnNode[] {in1, in2}, l1.toArray()); } + @Test public void testAddAllNonEmpty() { InsnNode insn = new InsnNode(0); l1.add(insn); @@ -395,9 +422,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(0, l1.indexOf(insn)); assertEquals(1, l1.indexOf(in1)); assertEquals(2, l1.indexOf(in2)); - assertEquals(new AbstractInsnNode[] {insn, in1, in2}, l1.toArray()); + assertInsnEquals(new AbstractInsnNode[] {insn, in1, in2}, l1.toArray()); } + @Test public void testInvalidInsert() { try { l1.insert(in1); @@ -406,6 +434,7 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testInsertEmpty() { InsnNode insn = new InsnNode(0); l1.insert(insn); @@ -415,9 +444,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(insn, l1.get(0)); assertEquals(true, l1.contains(insn)); assertEquals(0, l1.indexOf(insn)); - assertEquals(new AbstractInsnNode[] {insn}, l1.toArray()); + assertInsnEquals(new AbstractInsnNode[] {insn}, l1.toArray()); } + @Test public void testInsertNonEmpty() { InsnNode insn = new InsnNode(0); l1.add(new InsnNode(0)); @@ -429,6 +459,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(0, l1.indexOf(insn)); } + @Test public void testInvalidInsertAll() { try { l1.insert(l1); @@ -437,14 +468,16 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testInsertAllEmptyList() { l1.insert(new InsnList()); assertEquals(0, l1.size()); assertEquals(null, l1.getFirst()); assertEquals(null, l1.getLast()); - assertEquals(new AbstractInsnNode[0], l1.toArray()); + assertInsnEquals(new AbstractInsnNode[0], l1.toArray()); } + @Test public void testInsertAllEmpty() { l1.insert(l2); assertEquals(2, l1.size(), 2); @@ -455,9 +488,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(true, l1.contains(in2)); assertEquals(0, l1.indexOf(in1)); assertEquals(1, l1.indexOf(in2)); - assertEquals(new AbstractInsnNode[] {in1, in2}, l1.toArray()); + assertInsnEquals(new AbstractInsnNode[] {in1, in2}, l1.toArray()); } + @Test public void testInsertAllNonEmpty() { InsnNode insn = new InsnNode(0); l1.add(insn); @@ -472,9 +506,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(0, l1.indexOf(in1)); assertEquals(1, l1.indexOf(in2)); assertEquals(2, l1.indexOf(insn)); - assertEquals(new AbstractInsnNode[] {in1, in2, insn}, l1.toArray()); + assertInsnEquals(new AbstractInsnNode[] {in1, in2, insn}, l1.toArray()); } + @Test public void testInvalidInsert2() { try { l1.insert(new InsnNode(0), new InsnNode(0)); @@ -483,6 +518,7 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testInsert2NotLast() { InsnNode insn = new InsnNode(0); l2.insert(in1, insn); @@ -492,9 +528,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(in1, l2.get(0)); assertEquals(true, l2.contains(insn)); assertEquals(1, l2.indexOf(insn)); - assertEquals(new AbstractInsnNode[] {in1, insn, in2}, l2.toArray()); + assertInsnEquals(new AbstractInsnNode[] {in1, insn, in2}, l2.toArray()); } + @Test public void testInsert2Last() { InsnNode insn = new InsnNode(0); l2.insert(in2, insn); @@ -504,9 +541,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(in1, l2.get(0)); assertEquals(true, l2.contains(insn)); assertEquals(2, l2.indexOf(insn)); - assertEquals(new AbstractInsnNode[] {in1, in2, insn}, l2.toArray()); + assertInsnEquals(new AbstractInsnNode[] {in1, in2, insn}, l2.toArray()); } + @Test public void testInsertBefore() { InsnNode insn = new InsnNode(0); l2.insertBefore(in2, insn); @@ -516,9 +554,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(insn, l2.get(1)); assertEquals(true, l2.contains(insn)); assertEquals(1, l2.indexOf(insn)); - assertEquals(new AbstractInsnNode[] {in1, insn, in2}, l2.toArray()); + assertInsnEquals(new AbstractInsnNode[] {in1, insn, in2}, l2.toArray()); } + @Test public void testInsertBeforeFirst() { InsnNode insn = new InsnNode(0); l2.insertBefore(in1, insn); @@ -528,9 +567,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(insn, l2.get(0)); assertEquals(true, l2.contains(insn)); assertEquals(0, l2.indexOf(insn)); - assertEquals(new AbstractInsnNode[] {insn, in1, in2}, l2.toArray()); + assertInsnEquals(new AbstractInsnNode[] {insn, in1, in2}, l2.toArray()); } + @Test public void testInvalidInsertBefore() { try { l1.insertBefore(new InsnNode(0), new InsnNode(0)); @@ -539,6 +579,7 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testInvalidInsertAll2() { try { l1.insert(new InsnNode(0), new InsnList()); @@ -547,6 +588,7 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testInsertAll2EmptyList() { InsnNode insn = new InsnNode(0); l1.add(insn); @@ -554,9 +596,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(1, l1.size()); assertEquals(insn, l1.getFirst()); assertEquals(insn, l1.getLast()); - assertEquals(new AbstractInsnNode[] {insn}, l1.toArray()); + assertInsnEquals(new AbstractInsnNode[] {insn}, l1.toArray()); } + @Test public void testInsertAll2NotLast() { InsnNode insn = new InsnNode(0); l1.add(insn); @@ -573,6 +616,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(2, l1.indexOf(in2)); } + @Test public void testInsertAll2Last() { InsnNode insn = new InsnNode(0); l1.add(insn); @@ -587,9 +631,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(0, l1.indexOf(insn)); assertEquals(1, l1.indexOf(in1)); assertEquals(2, l1.indexOf(in2)); - assertEquals(new AbstractInsnNode[] {insn, in1, in2}, l1.toArray()); + assertInsnEquals(new AbstractInsnNode[] {insn, in1, in2}, l1.toArray()); } + @Test public void testInvalidInsertBeforeAll() { try { l1.insertBefore(new InsnNode(0), new InsnList()); @@ -598,6 +643,7 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testInsertBeforeAll2EmptyList() { InsnNode insn = new InsnNode(0); l1.add(insn); @@ -605,9 +651,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(1, l1.size()); assertEquals(insn, l1.getFirst()); assertEquals(insn, l1.getLast()); - assertEquals(new AbstractInsnNode[] {insn}, l1.toArray()); + assertInsnEquals(new AbstractInsnNode[] {insn}, l1.toArray()); } + @Test public void testInsertBeforeAll2NotLast() { InsnNode insn = new InsnNode(0); l1.add(new InsnNode(0)); @@ -624,6 +671,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(2, l1.indexOf(in2)); } + @Test public void testInsertBeforeAll2First() { InsnNode insn = new InsnNode(0); l1.insert(insn); @@ -638,9 +686,10 @@ public class InsnListUnitTest extends TestCase { assertEquals(2, l1.indexOf(insn)); assertEquals(0, l1.indexOf(in1)); assertEquals(1, l1.indexOf(in2)); - assertEquals(new AbstractInsnNode[] {in1, in2, insn}, l1.toArray()); + assertInsnEquals(new AbstractInsnNode[] {in1, in2, insn}, l1.toArray()); } + @Test public void testInvalidRemove() { try { l1.remove(new InsnNode(0)); @@ -648,6 +697,7 @@ public class InsnListUnitTest extends TestCase { } } + @Test public void testRemoveSingle() { InsnNode insn = new InsnNode(0); l1.add(insn); @@ -656,11 +706,12 @@ public class InsnListUnitTest extends TestCase { assertEquals(null, l1.getFirst()); assertEquals(null, l1.getLast()); assertEquals(false, l1.contains(insn)); - assertEquals(new AbstractInsnNode[0], l1.toArray()); + assertInsnEquals(new AbstractInsnNode[0], l1.toArray()); assertEquals(null, insn.getPrevious()); assertEquals(null, insn.getNext()); } + @Test public void testRemoveFirst() { InsnNode insn = new InsnNode(0); l1.add(insn); @@ -671,6 +722,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(null, insn.getNext()); } + @Test public void testRemoveMiddle() { InsnNode insn = new InsnNode(0); l1.add(new InsnNode(0)); @@ -682,6 +734,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(null, insn.getNext()); } + @Test public void testRemoveLast() { InsnNode insn = new InsnNode(0); l1.add(new InsnNode(0)); @@ -692,6 +745,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(null, insn.getNext()); } + @Test public void testClear() { InsnNode insn = new InsnNode(0); l1.add(new InsnNode(0)); @@ -702,11 +756,12 @@ public class InsnListUnitTest extends TestCase { assertEquals(null, l1.getFirst()); assertEquals(null, l1.getLast()); assertEquals(false, l1.contains(insn)); - assertEquals(new AbstractInsnNode[0], l1.toArray()); + assertInsnEquals(new AbstractInsnNode[0], l1.toArray()); assertEquals(null, insn.getPrevious()); assertEquals(null, insn.getNext()); } + @Test public void testAcceptor1() { l1.add(new InsnNode(55)); l1.add(new InsnNode(77)); @@ -724,6 +779,7 @@ public class InsnListUnitTest extends TestCase { assertEquals(77, lst.get(1).opcode); } + @Test public void testResetLabels() throws Exception { LabelNode labelNode = new LabelNode(); diff --git a/test/conform/org/objectweb/asm/tree/analysis/AnalyzerUnitTest.java b/test/conform/org/objectweb/asm/tree/analysis/AnalyzerUnitTest.java index 4d8171376..224a44d21 100644 --- a/test/conform/org/objectweb/asm/tree/analysis/AnalyzerUnitTest.java +++ b/test/conform/org/objectweb/asm/tree/analysis/AnalyzerUnitTest.java @@ -27,9 +27,15 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree.analysis; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import org.junit.Before; +import org.junit.Test; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriterComputeMaxsUnitTest; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.MethodNode; @@ -39,14 +45,776 @@ import org.objectweb.asm.tree.MethodNode; * * @author Eric Bruneton */ -public class AnalyzerUnitTest extends ClassWriterComputeMaxsUnitTest { +public class AnalyzerUnitTest { + + protected ClassWriter cw; + + protected MethodVisitor mv; + + private Label start; + + @Before + public void setUp() throws Exception { + cw = new ClassWriter(0); + cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "C", null, "java/lang/Object", null); + mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", "()V", null, null); + mv.visitCode(); + mv.visitVarInsn(Opcodes.ALOAD, 0); + mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", "()V", false); + mv.visitInsn(Opcodes.RETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "m", "()V", null, null); + mv.visitCode(); + start = new Label(); + LABEL(start); + } + + private void NOP() { + mv.visitInsn(Opcodes.NOP); + } + + private void PUSH() { + mv.visitInsn(Opcodes.ICONST_0); + } + + private void ICONST_0() { + mv.visitInsn(Opcodes.ICONST_0); + } + + private void ISTORE(final int var) { + mv.visitVarInsn(Opcodes.ISTORE, var); + } + + private void ALOAD(final int var) { + mv.visitVarInsn(Opcodes.ALOAD, var); + } + + private void ILOAD(final int var) { + mv.visitVarInsn(Opcodes.ILOAD, var); + } + + private void ASTORE(final int var) { + mv.visitVarInsn(Opcodes.ASTORE, var); + } + + private void RET(final int var) { + mv.visitVarInsn(Opcodes.RET, var); + } + + private void ATHROW() { + mv.visitInsn(Opcodes.ATHROW); + } + + private void ACONST_NULL() { + mv.visitInsn(Opcodes.ACONST_NULL); + } + + private void RETURN() { + mv.visitInsn(Opcodes.RETURN); + } + + private void LABEL(final Label l) { + mv.visitLabel(l); + } + + private void IINC(final int var, final int amnt) { + mv.visitIincInsn(var, amnt); + } + + private void GOTO(final Label l) { + mv.visitJumpInsn(Opcodes.GOTO, l); + } + + private void JSR(final Label l) { + mv.visitJumpInsn(Opcodes.JSR, l); + } - @Override - protected boolean isComputeMaxs() { - return false; + private void IFNONNULL(final Label l) { + mv.visitJumpInsn(Opcodes.IFNONNULL, l); + } + + private void IFNE(final Label l) { + mv.visitJumpInsn(Opcodes.IFNE, l); + } + + private void TRYCATCH(final Label start, final Label end, final Label handler) { + mv.visitTryCatchBlock(start, end, handler, null); + } + + protected static class TestClassLoader extends ClassLoader { + + public TestClassLoader() {} + + public Class defineClass(final String name, final byte[] b) { + return defineClass(name, b, 0, b.length); + } + } + + /** + * Tests a method which has the most basic try{}finally form imaginable: + * + *

+   * public void a() {
+   *     int a = 0;
+   *     try {
+   *         a++;
+   *     } finally {
+   *         a--;
+   *     }
+   * }
+   * 
+ */ + @Test + public void testBasic() { + Label L0 = new Label(); + Label L1 = new Label(); + Label L2 = new Label(); + Label L3 = new Label(); + Label L4 = new Label(); + + ICONST_0(); // N0 + ISTORE(1); + + /* L0: body of try block */ + LABEL(L0); // N2 + IINC(1, 1); + GOTO(L1); + + /* L2: exception handler */ + LABEL(L2); // N8 + ASTORE(3); + JSR(L3); + ALOAD(3); // N12 + ATHROW(); + + /* L3: subroutine */ + LABEL(L3); // N14 + ASTORE(2); + IINC(1, -1); + PUSH(); + PUSH(); + RET(2); + + /* L1: non-exceptional exit from try block */ + LABEL(L1); // N22 + JSR(L3); + PUSH(); // N25 + PUSH(); + LABEL(L4); // N27 + RETURN(); + + TRYCATCH(L0, L2, L2); + TRYCATCH(L1, L4, L2); + + assertMaxs(4, 4); + } + + /** + * Tests a method which has an if/else-if w/in the finally clause: + * + *
+   * public void a() {
+   *     int a = 0;
+   *     try {
+   *         a++;
+   *     } finally {
+   *         if (a == 0)
+   *             a += 2;
+   *         else
+   *             a += 3;
+   *     }
+   * }
+   * 
+ */ + @Test + public void testIfElseInFinally() { + Label L0 = new Label(); + Label L1 = new Label(); + Label L2 = new Label(); + Label L3 = new Label(); + Label L4 = new Label(); + Label L5 = new Label(); + Label L6 = new Label(); + + ICONST_0(); // N0 + ISTORE(1); + + /* L0: body of try block */ + LABEL(L0); // N2 + IINC(1, 1); + GOTO(L1); + + /* L2: exception handler */ + LABEL(L2); // N8 + ASTORE(3); + JSR(L3); + PUSH(); // N12 + PUSH(); + ALOAD(3); + ATHROW(); + + /* L3: subroutine */ + LABEL(L3); // N16 + ASTORE(2); + PUSH(); + PUSH(); + ILOAD(1); + IFNE(L4); + IINC(1, 2); + GOTO(L5); + + LABEL(L4); // N29 + IINC(1, 3); + + LABEL(L5); // N32 common exit + RET(2); + + /* L1: non-exceptional exit from try block */ + LABEL(L1); // N34 + JSR(L3); + LABEL(L6); // N37 + RETURN(); + + TRYCATCH(L0, L2, L2); + TRYCATCH(L1, L6, L2); + + assertMaxs(5, 4); + } + + /** + * Tests a simple nested finally: + * + *
+   * public void a1() {
+   *     int a = 0;
+   *     try {
+   *         a += 1;
+   *     } finally {
+   *         try {
+   *             a += 2;
+   *         } finally {
+   *             a += 3;
+   *         }
+   *     }
+   * }
+   * 
+ */ + @Test + public void testSimpleNestedFinally() { + Label L0 = new Label(); + Label L1 = new Label(); + Label L2 = new Label(); + Label L3 = new Label(); + Label L4 = new Label(); + Label L5 = new Label(); + + ICONST_0(); // N0 + ISTORE(1); + + // L0: Body of try block: + LABEL(L0); // N2 + IINC(1, 1); + JSR(L3); + GOTO(L1); // N8 + + // L2: First exception handler: + LABEL(L2); // N11 + ASTORE(4); + JSR(L3); + ALOAD(4); // N16 + ATHROW(); + + // L3: First subroutine: + LABEL(L3); // N19 + ASTORE(2); + IINC(1, 2); + JSR(L4); + PUSH(); // N26 + PUSH(); + RET(2); + + // L5: Second exception handler: + LABEL(L5); // N30 + ASTORE(5); + JSR(L4); + ALOAD(5); // N35 + ATHROW(); + + // L4: Second subroutine: + LABEL(L4); // N38 + ASTORE(3); + PUSH(); + PUSH(); + IINC(1, 3); + RET(3); + + // L1: On normal exit, try block jumps here: + LABEL(L1); // N46 + RETURN(); + + TRYCATCH(L0, L2, L2); + TRYCATCH(L3, L5, L5); + + assertMaxs(5, 6); + } + + /** + * This tests a subroutine which has no ret statement, but ends in a "return" instead. + * + *

We structure this as a try/finally with a break in the finally. Because the while loop is + * infinite, it's clear from the byte code that the only path which reaches the RETURN instruction + * is through the subroutine. + * + *

+   * public void a1() {
+   *     int a = 0;
+   *     while (true) {
+   *         try {
+   *             a += 1;
+   *         } finally {
+   *             a += 2;
+   *             break;
+   *         }
+   *     }
+   * }
+   * 
+ */ + @Test + public void testSubroutineWithNoRet() { + Label L0 = new Label(); + Label L1 = new Label(); + Label L2 = new Label(); + Label L3 = new Label(); + Label L4 = new Label(); + + ICONST_0(); // N0 + ISTORE(1); + + // L0: while loop header/try block + LABEL(L0); // N2 + IINC(1, 1); + JSR(L1); + GOTO(L2); // N8 + + // L3: implicit catch block + LABEL(L3); // N11 + ASTORE(2); + JSR(L1); + PUSH(); // N15 + PUSH(); + ALOAD(2); + ATHROW(); + + // L1: subroutine ... + LABEL(L1); // N19 + ASTORE(3); + IINC(1, 2); + GOTO(L4); // ...not that it does not return! + + // L2: end of the loop... goes back to the top! + LABEL(L2); // N26 + GOTO(L0); + + // L4: + LABEL(L4); // N29 + RETURN(); + + TRYCATCH(L0, L3, L3); + + assertMaxs(1, 4); + } + + /** + * This tests a subroutine which has no ret statement, but ends in a "return" instead. + * + *
+   *   ACONST_NULL
+   *   JSR L0
+   * L0:
+   *   ASTORE 0
+   *   ASTORE 0
+   *   RETURN
+   * 
+ */ + @Test + public void testSubroutineWithNoRet2() { + Label L0 = new Label(); + Label L1 = new Label(); + + ACONST_NULL(); // N0 + JSR(L0); + NOP(); // N4 + LABEL(L0); // N5 + ASTORE(0); + ASTORE(0); + RETURN(); + LABEL(L1); // N8 + mv.visitLocalVariable("i", "I", null, L0, L1, 1); + + assertMaxs(2, 2); + } + + /** + * This tests a subroutine which has no ret statement, but instead exits implicitely by branching + * to code which is not part of the subroutine. (Sadly, this is legal) + * + *

We structure this as a try/finally in a loop with a break in the finally. The loop is not + * trivially infinite, so the RETURN statement is reachable both from the JSR subroutine and from + * the main entry point. + * + *

+   * public void a1() {
+   *     int a = 0;
+   *     while (null == null) {
+   *         try {
+   *             a += 1;
+   *         } finally {
+   *             a += 2;
+   *             break;
+   *         }
+   *     }
+   * }
+   * 
+ */ + @Test + public void testImplicitExit() { + Label L0 = new Label(); + Label L1 = new Label(); + Label L2 = new Label(); + Label L3 = new Label(); + Label L4 = new Label(); + Label L5 = new Label(); + + ICONST_0(); // N0 + ISTORE(1); + + // L5: while loop header + LABEL(L5); // N2 + ACONST_NULL(); + IFNONNULL(L4); + + // L0: try block + LABEL(L0); // N6 + IINC(1, 1); + JSR(L1); + GOTO(L2); // N12 + + // L3: implicit catch block + LABEL(L3); // N15 + ASTORE(2); + JSR(L1); + ALOAD(2); // N19 + PUSH(); + PUSH(); + ATHROW(); + + // L1: subroutine ... + LABEL(L1); // N23 + ASTORE(3); + IINC(1, 2); + GOTO(L4); // ...not that it does not return! + + // L2: end of the loop... goes back to the top! + LABEL(L2); // N30 + GOTO(L0); + + // L4: + LABEL(L4); // N33 + RETURN(); + + TRYCATCH(L0, L3, L3); + + assertMaxs(1, 4); + } + + /** + * Tests a nested try/finally with implicit exit from one subroutine to the other subroutine. + * Equivalent to the following java code: + * + *
+   * void m(boolean b) {
+   *     try {
+   *         return;
+   *     } finally {
+   *         while (b) {
+   *             try {
+   *                 return;
+   *             } finally {
+   *                 // NOTE --- this break avoids the second return above (weird)
+   *                 if (b)
+   *                     break;
+   *             }
+   *         }
+   *     }
+   * }
+   * 
+ * + * This example is from the paper, "Subroutine Inlining and Bytecode Abstraction to Simplify + * Static and Dynamic Analysis" by Cyrille Artho and Armin Biere. + */ + @Test + public void testImplicitExitToAnotherSubroutine() { + Label T1 = new Label(); + Label C1 = new Label(); + Label S1 = new Label(); + Label L = new Label(); + Label C2 = new Label(); + Label S2 = new Label(); + Label W = new Label(); + Label X = new Label(); + + // variable numbers: + int b = 1; + int e1 = 2; + int e2 = 3; + int r1 = 4; + int r2 = 5; + + ICONST_0(); // N0 + ISTORE(1); + + // T1: first try: + LABEL(T1); // N2 + JSR(S1); + RETURN(); // N5 + + // C1: exception handler for first try + LABEL(C1); // N6 + ASTORE(e1); + JSR(S1); + PUSH(); // N10 + PUSH(); + ALOAD(e1); + ATHROW(); + + // S1: first finally handler + LABEL(S1); // N14 + ASTORE(r1); + PUSH(); + PUSH(); + GOTO(W); + + // L: body of while loop, also second try + LABEL(L); // N21 + JSR(S2); + RETURN(); // N24 + + // C2: exception handler for second try + LABEL(C2); // N25 + ASTORE(e2); + PUSH(); + PUSH(); + JSR(S2); + ALOAD(e2); // N31 + ATHROW(); + + // S2: second finally handler + LABEL(S2); // N33 + ASTORE(r2); + ILOAD(b); + IFNE(X); + RET(r2); + + // W: test for the while loop + LABEL(W); // N41 + ILOAD(b); + IFNE(L); // falls through to X + + // X: exit from finally{} block + LABEL(X); // N45 + RET(r1); + + TRYCATCH(T1, C1, C1); + TRYCATCH(L, C2, C2); + + assertMaxs(5, 6); + } + + @Test + public void testImplicitExitToAnotherSubroutine2() { + Label L1 = new Label(); + Label L2 = new Label(); + Label L3 = new Label(); + + ICONST_0(); // N0 + ISTORE(1); + JSR(L1); + RETURN(); // N5 + + LABEL(L1); // N6 + ASTORE(2); + JSR(L2); + GOTO(L3); // N10 + + LABEL(L2); // N13 + ASTORE(3); + ILOAD(1); + IFNE(L3); + RET(3); + + LABEL(L3); // N20 + RET(2); + + assertMaxs(1, 4); + } + + /** + * This tests a simple subroutine where the control flow jumps back and forth between the + * subroutine and the caller. + * + *

This would not normally be produced by a java compiler. + */ + @Test + public void testInterleavedCode() { + Label L1 = new Label(); + Label L2 = new Label(); + Label L3 = new Label(); + Label L4 = new Label(); + + ICONST_0(); // N0 + ISTORE(1); + JSR(L1); + GOTO(L2); // N5 + + // L1: subroutine 1 + LABEL(L1); // N8 + ASTORE(2); + IINC(1, 1); + GOTO(L3); + + // L2: second part of main subroutine + LABEL(L2); // N15 + IINC(1, 2); + GOTO(L4); + + // L3: second part of subroutine 1 + LABEL(L3); // N21 + IINC(1, 4); + PUSH(); + PUSH(); + RET(2); + + // L4: third part of main subroutine + LABEL(L4); // N28 + PUSH(); + PUSH(); + RETURN(); + + assertMaxs(4, 3); + } + + /** + * Tests a nested try/finally with implicit exit from one subroutine to the other subroutine, and + * with a surrounding try/catch thrown in the mix. Equivalent to the following java code: + * + *

+   * void m(int b) {
+   *     try {
+   *         try {
+   *             return;
+   *         } finally {
+   *             while (b) {
+   *                 try {
+   *                     return;
+   *                 } finally {
+   *                     // NOTE --- this break avoids the second return above
+   *                     // (weird)
+   *                     if (b)
+   *                         break;
+   *                 }
+   *             }
+   *         }
+   *     } catch (Exception e) {
+   *         b += 3;
+   *         return;
+   *     }
+   * }
+   * 
+ */ + @Test + public void testImplicitExitInTryCatch() { + Label T1 = new Label(); + Label C1 = new Label(); + Label S1 = new Label(); + Label L = new Label(); + Label C2 = new Label(); + Label S2 = new Label(); + Label W = new Label(); + Label X = new Label(); + Label OC = new Label(); + + // variable numbers: + int b = 1; + int e1 = 2; + int e2 = 3; + int r1 = 4; + int r2 = 5; + + ICONST_0(); // N0 + ISTORE(1); + + // T1: first try: + LABEL(T1); // N2 + JSR(S1); + RETURN(); // N5 + + // C1: exception handler for first try + LABEL(C1); // N6 + ASTORE(e1); + JSR(S1); + ALOAD(e1); // N10 + ATHROW(); + + // S1: first finally handler + LABEL(S1); // N12 + ASTORE(r1); + GOTO(W); + + // L: body of while loop, also second try + LABEL(L); // N17 + JSR(S2); + PUSH(); // N20 + PUSH(); + RETURN(); + + // C2: exception handler for second try + LABEL(C2); // N23 + ASTORE(e2); + JSR(S2); + ALOAD(e2); // N27 + ATHROW(); + + // S2: second finally handler + LABEL(S2); // N29 + ASTORE(r2); + ILOAD(b); + IFNE(X); + PUSH(); + PUSH(); + RET(r2); + + // W: test for the while loop + LABEL(W); // N39 + ILOAD(b); + IFNE(L); // falls through to X + + // X: exit from finally{} block + LABEL(X); // N43 + RET(r1); + + // OC: outermost catch + LABEL(OC); // N45 + IINC(b, 3); + RETURN(); + + TRYCATCH(T1, C1, C1); + TRYCATCH(L, C2, C2); + TRYCATCH(T1, OC, OC); + + assertMaxs(4, 6); } - @Override protected void assertMaxs(final int maxStack, final int maxLocals) { mv.visitMaxs(maxStack, maxLocals); mv.visitEnd(); @@ -99,7 +867,4 @@ public class AnalyzerUnitTest extends ClassWriterComputeMaxsUnitTest { fail(t.getMessage()); } } - - @Override - protected void assertGraph(final String graph) {} } diff --git a/test/conform/org/objectweb/asm/tree/analysis/SimpleVerifierUnitTest.java b/test/conform/org/objectweb/asm/tree/analysis/SimpleVerifierUnitTest.java index 467ce53e3..4e985e8f2 100644 --- a/test/conform/org/objectweb/asm/tree/analysis/SimpleVerifierUnitTest.java +++ b/test/conform/org/objectweb/asm/tree/analysis/SimpleVerifierUnitTest.java @@ -27,8 +27,11 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree.analysis; -import junit.framework.TestCase; +import static org.junit.Assert.fail; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; @@ -40,14 +43,14 @@ import org.objectweb.asm.tree.MethodNode; * * @author Eric Bruneton */ -public class SimpleVerifierUnitTest extends TestCase implements Opcodes { +public class SimpleVerifierUnitTest implements Opcodes { private Analyzer a; private MethodNode mn; - @Override - protected void setUp() { + @Before + public void setUp() { Type c = Type.getType("LC;"); Type d = Type.getType("Ljava/lang/Number;"); a = new Analyzer(new SimpleVerifier(c, d, false)); @@ -79,17 +82,20 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { } } + @Test public void testInvalidOpcode() { mn.visitInsn(-1); assertInvalid(); } + @Test public void testInvalidPop() { mn.visitInsn(LCONST_0); mn.visitInsn(POP); assertInvalid(); } + @Test public void testInvalidPop2() { mn.visitInsn(LCONST_0); mn.visitInsn(ICONST_0); @@ -97,12 +103,14 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidDup() { mn.visitInsn(LCONST_0); mn.visitInsn(DUP); assertInvalid(); } + @Test public void testInvalidDupx1() { mn.visitInsn(LCONST_0); mn.visitInsn(ICONST_0); @@ -110,6 +118,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidDupx2() { mn.visitInsn(LCONST_0); mn.visitInsn(ICONST_0); @@ -118,6 +127,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidDup2() { mn.visitInsn(LCONST_0); mn.visitInsn(ICONST_0); @@ -125,6 +135,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidDup2x1() { mn.visitInsn(LCONST_0); mn.visitInsn(ICONST_0); @@ -133,6 +144,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidDup2x2() { mn.visitInsn(LCONST_0); mn.visitInsn(ICONST_0); @@ -142,6 +154,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidSwap() { mn.visitInsn(LCONST_0); mn.visitInsn(ICONST_0); @@ -149,22 +162,26 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidGetLocal() { mn.visitVarInsn(ALOAD, 10); assertInvalid(); } + @Test public void testInvalidSetLocal() { mn.visitInsn(ACONST_NULL); mn.visitVarInsn(ASTORE, 10); assertInvalid(); } + @Test public void testInvalidEmptyStack() { mn.visitInsn(POP); assertInvalid(); } + @Test public void testInvalidFullStack() { mn.visitInsn(ICONST_0); mn.visitInsn(ICONST_0); @@ -180,6 +197,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInconsistentStackHeights() { Label l0 = new Label(); mn.visitInsn(ICONST_0); @@ -189,12 +207,14 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidNewArray() { mn.visitInsn(ICONST_1); mn.visitIntInsn(NEWARRAY, -1); assertInvalid(); } + @Test public void testInvalidAload() { mn.visitInsn(ICONST_0); mn.visitVarInsn(ISTORE, 1); @@ -202,42 +222,49 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidAstore() { mn.visitInsn(ICONST_0); mn.visitVarInsn(ASTORE, 1); assertInvalid(); } + @Test public void testInvalidIstore() { mn.visitInsn(ACONST_NULL); mn.visitVarInsn(ISTORE, 1); assertInvalid(); } + @Test public void testInvalidCheckcast() { mn.visitInsn(ICONST_0); mn.visitTypeInsn(CHECKCAST, "java/lang/String"); assertInvalid(); } + @Test public void testInvalidArraylength() { mn.visitInsn(ICONST_0); mn.visitInsn(ARRAYLENGTH); assertInvalid(); } + @Test public void testInvalidAthrow() { mn.visitInsn(ICONST_0); mn.visitInsn(ATHROW); assertInvalid(); } + @Test public void testInvalidIneg() { mn.visitInsn(FCONST_0); mn.visitInsn(INEG); assertInvalid(); } + @Test public void testInvalidIadd() { mn.visitInsn(FCONST_0); mn.visitInsn(ICONST_0); @@ -245,6 +272,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidIsub() { mn.visitInsn(ICONST_0); mn.visitInsn(FCONST_0); @@ -252,6 +280,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidIastore() { mn.visitInsn(ICONST_1); mn.visitIntInsn(NEWARRAY, T_INT); @@ -261,6 +290,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidFastore() { mn.visitInsn(ICONST_1); mn.visitIntInsn(NEWARRAY, T_FLOAT); @@ -270,6 +300,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidLastore() { mn.visitInsn(ICONST_1); mn.visitInsn(ICONST_0); @@ -278,6 +309,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidMultianewarray() { mn.visitInsn(FCONST_1); mn.visitInsn(ICONST_2); @@ -285,6 +317,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidInvokevirtual() { mn.visitInsn(ACONST_NULL); mn.visitTypeInsn(CHECKCAST, "java/lang/Object"); @@ -292,6 +325,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidInvokeinterface() { mn.visitInsn(ACONST_NULL); mn.visitTypeInsn(CHECKCAST, "java/util/List"); @@ -300,11 +334,13 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testInvalidRet() { mn.visitVarInsn(RET, 1); assertInvalid(); } + @Test public void testInvalidFalloff() { mn.visitMaxs(10, 10); try { @@ -316,6 +352,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { } } + @Test public void testInvalidSubroutineFalloff() { Label l0 = new Label(); Label l1 = new Label(); @@ -335,6 +372,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { } } + @Test public void testNestedSubroutines() throws AnalyzerException { Label l0 = new Label(); Label l1 = new Label(); @@ -351,6 +389,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertValid(); } + @Test public void testSubroutineLocalsAccess() throws AnalyzerException { MethodVisitor mv = mn; mv.visitCode(); @@ -380,11 +419,11 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertValid(); } - public void _testOverlappingSubroutines() { - // TODO currently Analyzer can not detect this situation. The problem - // is that other overlapping subroutine situations are valid, such as - // when a nested subroutine implicitly returns to its parent - // subroutine, without a RET. + @Ignore("TODO currently Analyzer can not detect this situation") + @Test + public void testOverlappingSubroutines() { + // The problem is that other overlapping subroutine situations are valid, such as + // when a nested subroutine implicitly returns to its parent subroutine, without a RET. Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); @@ -401,6 +440,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertInvalid(); } + @Test public void testMerge() throws AnalyzerException { Label l0 = new Label(); mn.visitVarInsn(ALOAD, 0); @@ -423,6 +463,7 @@ public class SimpleVerifierUnitTest extends TestCase implements Opcodes { assertValid(); } + @Test public void testClassNotFound() { Label l0 = new Label(); mn.visitVarInsn(ALOAD, 0); diff --git a/test/conform/org/objectweb/asm/tree/analysis/SmallSetUnitTest.java b/test/conform/org/objectweb/asm/tree/analysis/SmallSetUnitTest.java index 644318a19..ce5f0ac57 100644 --- a/test/conform/org/objectweb/asm/tree/analysis/SmallSetUnitTest.java +++ b/test/conform/org/objectweb/asm/tree/analysis/SmallSetUnitTest.java @@ -27,22 +27,25 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree.analysis; +import static org.junit.Assert.assertEquals; + import java.util.Set; -import junit.framework.TestCase; +import org.junit.Test; /** * SmallSet unit tests. * * @author Eric Bruneton */ -public class SmallSetUnitTest extends TestCase { +public class SmallSetUnitTest { private final Object A = new Object(); private final Object B = new Object(); private final Object C = new Object(); private final Object D = new Object(); + @Test public void testSubsetUnion() { SmallSet s1 = new SmallSet(A, B); SmallSet s2 = new SmallSet(A, null); @@ -52,6 +55,7 @@ public class SmallSetUnitTest extends TestCase { s1.remove(); } + @Test public void testDisjointUnion() { SmallSet s1 = new SmallSet(A, B); SmallSet s2 = new SmallSet(C, D); diff --git a/test/conform/org/objectweb/asm/tree/analysis/ValueUnitTest.java b/test/conform/org/objectweb/asm/tree/analysis/ValueUnitTest.java index affeab63b..4d4a974f2 100644 --- a/test/conform/org/objectweb/asm/tree/analysis/ValueUnitTest.java +++ b/test/conform/org/objectweb/asm/tree/analysis/ValueUnitTest.java @@ -27,15 +27,18 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree.analysis; -import junit.framework.TestCase; +import static org.junit.Assert.assertFalse; + +import org.junit.Test; /** * BasicValue and SourceValue unit tests. * * @author Eric Bruneton */ -public class ValueUnitTest extends TestCase { +public class ValueUnitTest { + @Test public void testBasicValue() { assertFalse(BasicValue.INT_VALUE.equals(new Object())); BasicValue.INT_VALUE.hashCode(); @@ -44,6 +47,7 @@ public class ValueUnitTest extends TestCase { BasicValue.REFERENCE_VALUE.toString(); } + @Test public void testSourceValue() { new SourceValue(1).hashCode(); assertFalse(new SourceValue(1).equals(null)); diff --git a/test/conform/org/objectweb/asm/util/ASMifierUnitTest.java b/test/conform/org/objectweb/asm/util/ASMifierUnitTest.java index 70847ab18..9638d5c93 100644 --- a/test/conform/org/objectweb/asm/util/ASMifierUnitTest.java +++ b/test/conform/org/objectweb/asm/util/ASMifierUnitTest.java @@ -27,15 +27,16 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; -import junit.framework.TestCase; +import org.junit.Test; /** * ASMifierClassVisitor unit tests * * @author Eric Bruneton */ -public class ASMifierUnitTest extends TestCase { +public class ASMifierUnitTest { + @Test public void testASMifierClassVisitor() throws Exception { String s = getClass().getName(); ASMifier.main(new String[0]); diff --git a/test/conform/org/objectweb/asm/util/CheckClassAdapterUnitTest.java b/test/conform/org/objectweb/asm/util/CheckClassAdapterUnitTest.java index 7b9de819e..610972928 100644 --- a/test/conform/org/objectweb/asm/util/CheckClassAdapterUnitTest.java +++ b/test/conform/org/objectweb/asm/util/CheckClassAdapterUnitTest.java @@ -27,12 +27,13 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import static org.junit.Assert.fail; + import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; -import junit.framework.TestCase; - +import org.junit.Test; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -42,8 +43,9 @@ import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; -public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { +public class CheckClassAdapterUnitTest implements Opcodes { + @Test public void testCheckClassVisitor() throws Exception { String s = getClass().getName(); CheckClassAdapter.main(new String[0]); @@ -51,11 +53,13 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { CheckClassAdapter.main(new String[] {"java.lang.Object"}); } + @Test public void testVerifyValidClass() throws Exception { ClassReader cr = new ClassReader(getClass().getName()); CheckClassAdapter.verify(cr, true, new PrintWriter(System.err)); } + @Test public void testVerifyInvalidClass() { ClassWriter cw = new ClassWriter(0); cw.visit(V1_1, ACC_PUBLIC, "C", null, "java/lang/Object", null); @@ -71,6 +75,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { CheckClassAdapter.verify(cr, true, new PrintWriter(System.err)); } + @Test public void testIllegalClassAccessFlag() { ClassVisitor cv = new CheckClassAdapter(null); try { @@ -80,6 +85,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalSuperClass() { ClassVisitor cv = new CheckClassAdapter(null); try { @@ -89,6 +95,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalInterfaceSuperClass() { ClassVisitor cv = new CheckClassAdapter(null); try { @@ -98,6 +105,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalClassSignature() { ClassVisitor cv = new CheckClassAdapter(null); try { @@ -107,6 +115,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalClassAccessFlagSet() { ClassVisitor cv = new CheckClassAdapter(null); try { @@ -116,6 +125,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalClassMemberVisitBeforeStart() { ClassVisitor cv = new CheckClassAdapter(null); try { @@ -125,6 +135,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalClassAttribute() { ClassVisitor cv = new CheckClassAdapter(null); cv.visit(V1_1, ACC_PUBLIC, "C", null, "java/lang/Object", null); @@ -135,6 +146,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMultipleVisitCalls() { ClassVisitor cv = new CheckClassAdapter(null); cv.visit(V1_1, ACC_PUBLIC, "C", null, "java/lang/Object", null); @@ -145,6 +157,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMultipleVisitSourceCalls() { ClassVisitor cv = new CheckClassAdapter(null); cv.visit(V1_1, ACC_PUBLIC, "C", null, "java/lang/Object", null); @@ -156,6 +169,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalOuterClassName() { ClassVisitor cv = new CheckClassAdapter(null); cv.visit(V1_1, ACC_PUBLIC, "C", null, "java/lang/Object", null); @@ -166,6 +180,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMultipleVisitOuterClassCalls() { ClassVisitor cv = new CheckClassAdapter(null); cv.visit(V1_1, ACC_PUBLIC, "C", null, "java/lang/Object", null); @@ -177,6 +192,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldAccessFlagSet() { ClassVisitor cv = new CheckClassAdapter(null); cv.visit(V1_1, ACC_PUBLIC, "C", null, "java/lang/Object", null); @@ -187,6 +203,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldSignature() { ClassVisitor cv = new CheckClassAdapter(null); cv.visit(V1_1, ACC_PUBLIC, "C", null, "java/lang/Object", null); @@ -207,6 +224,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalClassMemberVisitAfterEnd() { ClassVisitor cv = new CheckClassAdapter(null); cv.visit(V1_1, ACC_PUBLIC, "C", null, "java/lang/Object", null); @@ -218,6 +236,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldMemberVisitAfterEnd() { FieldVisitor fv = new CheckFieldAdapter(null); fv.visitEnd(); @@ -228,6 +247,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldAttribute() { FieldVisitor fv = new CheckFieldAdapter(null); try { @@ -237,6 +257,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalAnnotationDesc() { MethodVisitor mv = new CheckMethodAdapter(null); try { @@ -246,6 +267,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalAnnotationName() { AnnotationVisitor av = new CheckAnnotationAdapter(null); try { @@ -255,6 +277,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalAnnotationValue() { AnnotationVisitor av = new CheckAnnotationAdapter(null); try { @@ -264,6 +287,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalAnnotationEnumValue() { AnnotationVisitor av = new CheckAnnotationAdapter(null); try { @@ -273,6 +297,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalAnnotationValueAfterEnd() { AnnotationVisitor av = new CheckAnnotationAdapter(null); av.visitEnd(); @@ -283,6 +308,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodMemberVisitAfterEnd() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitEnd(); @@ -293,6 +319,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodAttribute() { MethodVisitor mv = new CheckMethodAdapter(null); try { @@ -302,6 +329,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodSignature() { ClassVisitor cv = new CheckClassAdapter(null); cv.visit(V1_1, ACC_PUBLIC, "C", null, "java/lang/Object", null); @@ -312,6 +340,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnVisitBeforeStart() { MethodVisitor mv = new CheckMethodAdapter(null); try { @@ -321,6 +350,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFrameType() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -331,6 +361,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFrameLocalCount() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -341,6 +372,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFrameStackCount() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -351,6 +383,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFrameLocalArray() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -361,6 +394,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFrameStackArray() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -371,6 +405,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFrameValue() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -386,6 +421,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsn() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -396,6 +432,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalByteInsnOperand() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -406,6 +443,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalShortInsnOperand() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -416,6 +454,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalVarInsnOperand() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -426,6 +465,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalIntInsnOperand() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -436,6 +476,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalTypeInsnOperand() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -446,6 +487,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalLabelInsnOperand() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -458,6 +500,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalDebugLabelUse() throws IOException { ClassReader cr = new ClassReader("java.lang.Object"); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); @@ -499,6 +542,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalTableSwitchParameters1() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -509,6 +553,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalTableSwitchParameters2() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -519,6 +564,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalTableSwitchParameters3() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -529,6 +575,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalTableSwitchParameters4() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -539,6 +586,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalLookupSwitchParameters1() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -549,6 +597,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalLookupSwitchParameters2() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -559,6 +608,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalLookupSwitchParameters3() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -569,6 +619,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnNullOwner() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -579,6 +630,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnOwner() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -589,6 +641,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnNullName() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -599,6 +652,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnName() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -609,6 +663,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnName2() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -620,6 +675,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnNullDesc() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -630,6 +686,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnVoidDesc() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -640,6 +697,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnPrimitiveDesc() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -650,6 +708,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnArrayDesc() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -660,6 +719,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnReferenceDesc() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -670,6 +730,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalFieldInsnReferenceDesc2() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -680,6 +741,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnNullName() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -690,6 +752,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnName() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -700,6 +763,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnName2() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -710,6 +774,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnNullDesc() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -720,6 +785,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnDesc() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -730,6 +796,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnParameterDesc() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -740,6 +807,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnReturnDesc() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -750,6 +818,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnItf() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -760,6 +829,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnItf2() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -770,6 +840,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMethodInsnItf3() { CheckMethodAdapter mv = new CheckMethodAdapter(null); mv.version = Opcodes.V1_7; @@ -781,6 +852,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testMethodInsnItf() { CheckMethodAdapter mv = new CheckMethodAdapter(null); mv.version = Opcodes.V1_8; @@ -788,6 +860,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { mv.visitMethodInsn(INVOKESPECIAL, "C", "m", "()V", true); } + @Test public void testIllegalLdcInsnOperand() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -798,6 +871,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMultiANewArrayDesc() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -808,6 +882,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMultiANewArrayDims() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -818,6 +893,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalMultiANewArrayDims2() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -828,6 +904,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalTryCatchBlock() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -851,6 +928,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalDataflow() { MethodVisitor mv = new CheckMethodAdapter(ACC_PUBLIC, "m", "(I)V", null, new HashMap()); @@ -865,6 +943,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalDataflobjectweb() { MethodVisitor mv = new CheckMethodAdapter(ACC_PUBLIC, "m", "(I)I", null, new HashMap()); @@ -878,6 +957,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalLocalVariableLabels() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -893,6 +973,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalLineNumerLabel() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); @@ -903,6 +984,7 @@ public class CheckClassAdapterUnitTest extends TestCase implements Opcodes { } } + @Test public void testIllegalInsnVisitAfterEnd() { MethodVisitor mv = new CheckMethodAdapter(null); mv.visitCode(); diff --git a/test/conform/org/objectweb/asm/util/CheckSignatureAdapterUnitTest.java b/test/conform/org/objectweb/asm/util/CheckSignatureAdapterUnitTest.java index d3bddb917..47936e6de 100644 --- a/test/conform/org/objectweb/asm/util/CheckSignatureAdapterUnitTest.java +++ b/test/conform/org/objectweb/asm/util/CheckSignatureAdapterUnitTest.java @@ -27,66 +27,27 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; -import junit.framework.TestCase; -import junit.framework.TestSuite; +import static org.junit.Assert.fail; -import org.objectweb.asm.signature.SignatureReader; +import org.junit.Test; import org.objectweb.asm.signature.SignatureVisitor; -import org.objectweb.asm.signature.SignatureWriter; -import org.objectweb.asm.util.TraceSignatureVisitorUnitTest.TestData; /** * CheckSignatureAdapter tests. * * @author Eric Bruneton */ -public class CheckSignatureAdapterUnitTest extends TestCase { - - public static TestSuite suite() { - TestSuite suite = new TestSuite(CheckSignatureAdapterUnitTest.class.getName()); - for (int i = 0; i < TraceSignatureVisitorUnitTest.DATA.length; i++) { - suite.addTest( - new CheckSignatureAdapterUnitTest(new TestData(TraceSignatureVisitorUnitTest.DATA[i]))); - } - suite.addTestSuite(CheckSignatureAdapterUnitTest.class); - return suite; - } - - private TestData data; +public class CheckSignatureAdapterUnitTest { private SignatureVisitor sv; - public CheckSignatureAdapterUnitTest() {} - - private CheckSignatureAdapterUnitTest(final TestData data) { - super("checkSignature"); - this.data = data; - } - - public void checkSignature() { - SignatureWriter wrt = new SignatureWriter(); - SignatureReader rdr = new SignatureReader(data.signature); - switch (data.type) { - case 'C': - rdr.accept(new CheckSignatureAdapter(CheckSignatureAdapter.CLASS_SIGNATURE, wrt)); - break; - case 'M': - rdr.accept(new CheckSignatureAdapter(CheckSignatureAdapter.METHOD_SIGNATURE, wrt)); - break; - case 'F': - rdr.acceptType(new CheckSignatureAdapter(CheckSignatureAdapter.TYPE_SIGNATURE, wrt)); - break; - default: - return; - } - assertEquals(data.signature, wrt.toString()); - } - + @Test public void testNonJavaIdentifier() { setup(CheckSignatureAdapter.CLASS_SIGNATURE); sv.visitSuperclass().visitClassType("Foo Bar"); } + @Test public void testIllegalFormalTypeParam() { setup(CheckSignatureAdapter.TYPE_SIGNATURE); try { @@ -96,6 +57,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalClassBound() { setup(CheckSignatureAdapter.CLASS_SIGNATURE); try { @@ -105,6 +67,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalInterfaceBound() { setup(CheckSignatureAdapter.CLASS_SIGNATURE); try { @@ -114,6 +77,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalSuperclass() { setup(CheckSignatureAdapter.METHOD_SIGNATURE); try { @@ -123,6 +87,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalInterface() { setup(CheckSignatureAdapter.CLASS_SIGNATURE); try { @@ -132,6 +97,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalParameterType() { setup(CheckSignatureAdapter.CLASS_SIGNATURE); try { @@ -141,6 +107,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalReturnType() { setup(CheckSignatureAdapter.METHOD_SIGNATURE); try { @@ -151,6 +118,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalExceptionType() { setup(CheckSignatureAdapter.METHOD_SIGNATURE); try { @@ -160,6 +128,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalBaseType() { setup(CheckSignatureAdapter.TYPE_SIGNATURE); try { @@ -182,6 +151,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalTypeVariable() { setup(CheckSignatureAdapter.TYPE_SIGNATURE); try { @@ -192,6 +162,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalArrayType() { setup(CheckSignatureAdapter.TYPE_SIGNATURE); try { @@ -202,6 +173,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalClassType() { setup(CheckSignatureAdapter.TYPE_SIGNATURE); try { @@ -212,6 +184,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalInnerClassType() { setup(CheckSignatureAdapter.TYPE_SIGNATURE); try { @@ -221,6 +194,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalTypeArgument() { setup(CheckSignatureAdapter.TYPE_SIGNATURE); try { @@ -243,6 +217,7 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } + @Test public void testIllegalEnd() { setup(CheckSignatureAdapter.TYPE_SIGNATURE); try { @@ -252,15 +227,6 @@ public class CheckSignatureAdapterUnitTest extends TestCase { } } - @Override - public String getName() { - if (data == null) { - return super.getName(); - } else { - return super.getName() + " " + data.signature; - } - } - private void setup(int type) { sv = new CheckSignatureAdapter(type, null); } diff --git a/test/conform/org/objectweb/asm/util/TraceClassAdapterUnitTest.java b/test/conform/org/objectweb/asm/util/TraceClassAdapterUnitTest.java index 72b46b2b7..dea061b0a 100644 --- a/test/conform/org/objectweb/asm/util/TraceClassAdapterUnitTest.java +++ b/test/conform/org/objectweb/asm/util/TraceClassAdapterUnitTest.java @@ -27,15 +27,16 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; -import junit.framework.TestCase; +import org.junit.Test; /** * TraceClassAdapter unit tests * * @author Eric Bruneton */ -public class TraceClassAdapterUnitTest extends TestCase { +public class TraceClassAdapterUnitTest { + @Test public void testTraceClassVisitor() throws Exception { String s = getClass().getName(); Textifier.main(new String[0]); diff --git a/test/conform/org/objectweb/asm/util/TraceSignatureVisitorUnitTest.java b/test/conform/org/objectweb/asm/util/TraceSignatureVisitorUnitTest.java index adabb01e7..525ac18bd 100644 --- a/test/conform/org/objectweb/asm/util/TraceSignatureVisitorUnitTest.java +++ b/test/conform/org/objectweb/asm/util/TraceSignatureVisitorUnitTest.java @@ -27,11 +27,17 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; -import java.util.StringTokenizer; +import static org.junit.Assert.assertEquals; -import junit.framework.TestCase; -import junit.framework.TestSuite; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; import org.objectweb.asm.Opcodes; import org.objectweb.asm.signature.SignatureReader; @@ -40,7 +46,8 @@ import org.objectweb.asm.signature.SignatureReader; * * @author Eugene Kuleshov */ -public class TraceSignatureVisitorUnitTest extends TestCase { +@RunWith(Parameterized.class) +public class TraceSignatureVisitorUnitTest { public static final String[] DATA = { "C|E|> implements java.lang.Comparable, java.io.Serializable" @@ -80,21 +87,19 @@ public class TraceSignatureVisitorUnitTest extends TestCase { + "|;>(Ljava/lang/Object;Ljava/util/Map;TT;)Ljava/util/Map;", }; - public static TestSuite suite() { - TestSuite suite = new TestSuite(TraceSignatureVisitorUnitTest.class.getName()); - for (int i = 0; i < DATA.length; i++) { - suite.addTest(new TraceSignatureVisitorUnitTest(new TestData(DATA[i]))); + @Parameters + public static List data() { + ArrayList result = new ArrayList(); + for (String data : DATA) { + result.add(new Object[] {new TestData(data)}); } - return suite; + return result; } - private TestData data; - - private TraceSignatureVisitorUnitTest(final TestData data) { - super("testSignature"); - this.data = data; - } + @Parameter(0) + public TestData data; + @Test public void testSignature() { TraceSignatureVisitor d = new TraceSignatureVisitor(data.access); SignatureReader r = new SignatureReader(data.signature); @@ -119,11 +124,6 @@ public class TraceSignatureVisitorUnitTest extends TestCase { } } - @Override - public String getName() { - return super.getName() + " " + data.signature; - } - public static class TestData { public final char type; @@ -156,5 +156,10 @@ public class TraceSignatureVisitorUnitTest extends TestCase { this.declaration = st.nextToken(); this.signature = st.nextToken(); } + + @Override + public String toString() { + return signature; + } } } diff --git a/test/conform/org/objectweb/asm/xml/ASMContentHandlerUnitTest.java b/test/conform/org/objectweb/asm/xml/ASMContentHandlerUnitTest.java index 89384bf31..54cae3fba 100644 --- a/test/conform/org/objectweb/asm/xml/ASMContentHandlerUnitTest.java +++ b/test/conform/org/objectweb/asm/xml/ASMContentHandlerUnitTest.java @@ -27,8 +27,10 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.xml; -import junit.framework.TestCase; +import static org.junit.Assert.fail; +import org.junit.Before; +import org.junit.Test; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; @@ -44,7 +46,7 @@ import org.xml.sax.helpers.AttributesImpl; * * @author Eric Bruneton */ -public class ASMContentHandlerUnitTest extends TestCase implements Opcodes { +public class ASMContentHandlerUnitTest implements Opcodes { ASMContentHandler h; @@ -52,8 +54,8 @@ public class ASMContentHandlerUnitTest extends TestCase implements Opcodes { MethodVisitor mv; - @Override - protected void setUp() throws Exception { + @Before + public void setUp() throws Exception { h = new ASMContentHandler( new ClassVisitor(Opcodes.ASM5) { @@ -165,6 +167,7 @@ public class ASMContentHandlerUnitTest extends TestCase implements Opcodes { mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); } + @Test public void testInvalidOpcode() { methodSetUp(); AttributesImpl attrs = new AttributesImpl(); @@ -176,6 +179,7 @@ public class ASMContentHandlerUnitTest extends TestCase implements Opcodes { } } + @Test public void testInvalidValueDescriptor() { methodSetUp(); AttributesImpl attrs = new AttributesImpl(); @@ -189,6 +193,7 @@ public class ASMContentHandlerUnitTest extends TestCase implements Opcodes { } } + @Test public void testInvalidValue() { methodSetUp(); AttributesImpl attrs = new AttributesImpl(); @@ -202,6 +207,7 @@ public class ASMContentHandlerUnitTest extends TestCase implements Opcodes { } } + @Test public void testEndDocument() { cv.visitEnd(); try { diff --git a/test/conform/org/objectweb/asm/xml/SAXAdapterUnitTest.java b/test/conform/org/objectweb/asm/xml/SAXAdapterUnitTest.java index 26220cab8..e013da6b9 100644 --- a/test/conform/org/objectweb/asm/xml/SAXAdapterUnitTest.java +++ b/test/conform/org/objectweb/asm/xml/SAXAdapterUnitTest.java @@ -27,8 +27,10 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.xml; -import junit.framework.TestCase; +import static org.junit.Assert.fail; +import org.junit.Before; +import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -38,12 +40,12 @@ import org.xml.sax.helpers.DefaultHandler; * * @author Eric Bruneton */ -public class SAXAdapterUnitTest extends TestCase { +public class SAXAdapterUnitTest { SAXAdapter sa; - @Override - protected void setUp() { + @Before + public void setUp() { sa = new SAXAdapter( new DefaultHandler() { @@ -73,6 +75,7 @@ public class SAXAdapterUnitTest extends TestCase { }) {}; } + @Test public void testInvalidAddDocumentStart() { try { sa.addDocumentStart(); @@ -81,6 +84,7 @@ public class SAXAdapterUnitTest extends TestCase { } } + @Test public void testInvalidAddDocumentEnd() { try { sa.addDocumentEnd(); @@ -89,6 +93,7 @@ public class SAXAdapterUnitTest extends TestCase { } } + @Test public void testInvalidAddStart() { try { sa.addStart("name", null); @@ -97,6 +102,7 @@ public class SAXAdapterUnitTest extends TestCase { } } + @Test public void testInvalidAddEnd() { try { sa.addEnd("name"); diff --git a/test/conform/staticinitmerger.xml b/test/conform/staticinitmerger.xml deleted file mode 100644 index 860633476..000000000 --- a/test/conform/staticinitmerger.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/test/conform/unit.xml b/test/conform/unit.xml index e9c2e4299..4ea1525ca 100644 --- a/test/conform/unit.xml +++ b/test/conform/unit.xml @@ -50,6 +50,7 @@ + -- GitLab