summaryrefslogtreecommitdiff
path: root/asm-test/src/test/java/org/objectweb/asm/test/ClassFileTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'asm-test/src/test/java/org/objectweb/asm/test/ClassFileTest.java')
-rw-r--r--asm-test/src/test/java/org/objectweb/asm/test/ClassFileTest.java152
1 files changed, 152 insertions, 0 deletions
diff --git a/asm-test/src/test/java/org/objectweb/asm/test/ClassFileTest.java b/asm-test/src/test/java/org/objectweb/asm/test/ClassFileTest.java
new file mode 100644
index 00000000..e2e2a13b
--- /dev/null
+++ b/asm-test/src/test/java/org/objectweb/asm/test/ClassFileTest.java
@@ -0,0 +1,152 @@
+package org.objectweb.asm.test;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.function.Executable;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+import org.junit.jupiter.params.provider.MethodSource;
+
+/**
+ * Unit tests for {@link ClassFile}.
+ *
+ * @author Eric Bruneton
+ */
+class ClassFileTest extends AsmTest {
+
+ @Test
+ void testGetConstantPoolDump() {
+ ClassFile classFile = new ClassFile(PrecompiledClass.JDK3_ALL_INSTRUCTIONS.getBytes());
+
+ String constantPoolDump = classFile.getConstantPoolDump();
+
+ assertTrue(constantPoolDump.contains("constant_pool: ConstantClassInfo jdk3/AllInstructions"));
+ }
+
+ /** Tests that newInstance() succeeds for each precompiled class. */
+ @ParameterizedTest
+ @MethodSource(ALL_CLASSES_AND_LATEST_API)
+ void testNewInstance_validClass(final PrecompiledClass classParameter, final Api apiParameter) {
+ ClassFile classFile = new ClassFile(classParameter.getBytes());
+
+ Executable newInstance = () -> classFile.newInstance();
+
+ if (classParameter.isNotCompatibleWithCurrentJdk()) {
+ assertThrows(UnsupportedClassVersionError.class, newInstance);
+ } else {
+ assertDoesNotThrow(newInstance);
+ }
+ }
+
+ /** Tests that newInstance() fails when trying to load an invalid or unverifiable class. */
+ @ParameterizedTest
+ @EnumSource(InvalidClass.class)
+ void testNewInstance_invalidClass(final InvalidClass invalidClass) {
+ ClassFile classFile = new ClassFile(invalidClass.getBytes());
+
+ Executable newInstance = () -> classFile.newInstance();
+
+ assertThrows(ClassFormatException.class, newInstance);
+ }
+
+ /**
+ * Tests that the static newInstance() method fails when trying to load an invalid or unverifiable
+ * class.
+ */
+ @ParameterizedTest
+ @EnumSource(InvalidClass.class)
+ void testStaticNewInstance_invalidClass(final InvalidClass invalidClass) {
+ String className = invalidClass.toString();
+ byte[] classContent = invalidClass.getBytes();
+
+ Executable newInstance = () -> ClassFile.newInstance(className, classContent);
+
+ switch (invalidClass) {
+ case INVALID_ELEMENT_VALUE:
+ case INVALID_TYPE_ANNOTATION_TARGET_TYPE:
+ case INVALID_INSN_TYPE_ANNOTATION_TARGET_TYPE:
+ break;
+ case INVALID_BYTECODE_OFFSET:
+ case INVALID_OPCODE:
+ case INVALID_WIDE_OPCODE:
+ assertThrows(VerifyError.class, newInstance);
+ break;
+ case INVALID_CLASS_VERSION:
+ case INVALID_CODE_LENGTH:
+ case INVALID_CONSTANT_POOL_INDEX:
+ case INVALID_CONSTANT_POOL_REFERENCE:
+ case INVALID_CP_INFO_TAG:
+ case INVALID_SOURCE_DEBUG_EXTENSION:
+ case INVALID_STACK_MAP_FRAME_TYPE:
+ case INVALID_VERIFICATION_TYPE_INFO:
+ assertThrows(ClassFormatError.class, newInstance);
+ break;
+ default:
+ fail("Unknown invalid class");
+ break;
+ }
+ }
+
+ @Test
+ void testEquals() {
+ ClassFile classFile1 = new ClassFile(PrecompiledClass.JDK3_ALL_INSTRUCTIONS.getBytes());
+ ClassFile classFile2 = new ClassFile(PrecompiledClass.JDK5_ALL_INSTRUCTIONS.getBytes());
+
+ boolean equalsThis = classFile1.equals(classFile1);
+ boolean equalsDifferentClass = classFile1.equals(classFile2);
+ boolean equalsInvalidClass = classFile1.equals(new byte[0]);
+
+ assertTrue(equalsThis);
+ assertFalse(equalsDifferentClass);
+ assertFalse(equalsInvalidClass);
+ }
+
+ @Test
+ void testHashcode_validClass() {
+ PrecompiledClass precompiledClass = PrecompiledClass.JDK3_ALL_INSTRUCTIONS;
+ ClassFile classFile = new ClassFile(precompiledClass.getBytes());
+
+ int hashCode = classFile.hashCode();
+
+ assertNotEquals(0, hashCode);
+ }
+
+ @Test
+ void testHashcode_invalidClass() {
+ InvalidClass invalidClass = InvalidClass.INVALID_CLASS_VERSION;
+ ClassFile classFile = new ClassFile(invalidClass.getBytes());
+
+ Executable hashCode = () -> classFile.hashCode();
+
+ Exception exception = assertThrows(ClassFormatException.class, hashCode);
+ assertEquals("Unsupported class version", exception.getMessage());
+ }
+
+ @Test
+ void testToString_validClass() {
+ PrecompiledClass precompiledClass = PrecompiledClass.JDK3_ALL_INSTRUCTIONS;
+ ClassFile classFile = new ClassFile(precompiledClass.getBytes());
+
+ String classString = classFile.toString();
+
+ assertTrue(classString.contains(precompiledClass.getInternalName()));
+ }
+
+ @Test
+ void testToString_invalidClass() {
+ InvalidClass invalidClass = InvalidClass.INVALID_CLASS_VERSION;
+ ClassFile classFile = new ClassFile(invalidClass.getBytes());
+
+ Executable toString = () -> classFile.toString();
+
+ Exception exception = assertThrows(ClassFormatException.class, toString);
+ assertEquals("Unsupported class version", exception.getMessage());
+ }
+}