forked from eclipse-aspectj/aspectj
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add integration test for '--release N' compiler option
Relates to eclipse-aspectj#70 Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
- Loading branch information
Showing
4 changed files
with
101 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import java.nio.Buffer; | ||
import java.nio.ByteBuffer; | ||
|
||
public class Buffers { | ||
/** | ||
* Running this method will fail during runtime on JDK 8, if compiled on JDK 9+ with {@code -source 8 -target 8}, | ||
* because the API has changed: In JDK 8 there was only {@code Buffer.flip()}, but since JDK 9 it is overloaded by | ||
* {@code ByteBuffer.flip()}. | ||
* <p> | ||
* Therefore, it is imperative to compile against the old API, using the correct boot classpath. On JDK 9+, the | ||
* canonical way to do this is to use {@code --release 8}, because the JDK contains a compatibility layer exactly for | ||
* this purpose. | ||
* <p> | ||
* If incorrectly compiled against JDK 9+ API, this will fail with: | ||
* <pre>{@code java.lang.NoSuchMethodError: java.nio.ByteBuffer.flip()Ljava/nio/ByteBuffer; }</pre> | ||
*/ | ||
public static Buffer flip(ByteBuffer buffer) { | ||
return buffer.flip(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
73 changes: 73 additions & 0 deletions
73
tests/src/test/java/org/aspectj/systemtest/ajc198/CompileWithReleaseTests.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
/******************************************************************************* | ||
* Copyright (c) 2021 Contributors | ||
* All rights reserved. This program and the accompanying materials | ||
* are made available under the terms of the Eclipse Public License v 2.0 | ||
* which accompanies this distribution, and is available at | ||
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt | ||
*******************************************************************************/ | ||
package org.aspectj.systemtest.ajc198; | ||
|
||
import junit.framework.Test; | ||
import org.aspectj.apache.bcel.Constants; | ||
import org.aspectj.apache.bcel.classfile.JavaClass; | ||
import org.aspectj.apache.bcel.classfile.Method; | ||
import org.aspectj.testing.XMLBasedAjcTestCase; | ||
import org.aspectj.testing.XMLBasedAjcTestCaseForJava9OrLater; | ||
|
||
import java.util.Objects; | ||
|
||
/** | ||
* @author Alexander Kriegisch | ||
*/ | ||
public class CompileWithReleaseTests extends XMLBasedAjcTestCaseForJava9OrLater { | ||
|
||
/** | ||
* In order to avoid a complicated test involving two different JDKs (9+ for compilation, 8 for runtime), we inspect | ||
* the byte code of test class {@code Buffers} with BCEL, simply grepping on the disassembled byte code. If compiled | ||
* correctly with {@code --release 8}, the byte code should contain the equivalent of a {@code Buffer.flip()} call, | ||
* not a {@code ByteBuffer.flip()} one. | ||
*/ | ||
public void testCompileToOlderJDKRelease() { | ||
runTest("compile to older JDK release"); | ||
|
||
// Check compiled byte code version | ||
String className = "Buffers"; | ||
checkVersion(className, Constants.MAJOR_1_8, Constants.MINOR_1_8); | ||
|
||
// Disassemble method and check if Java 8 API is used as expected | ||
JavaClass javaClass; | ||
try { | ||
javaClass = getClassFrom(ajc.getSandboxDirectory(), className); | ||
} | ||
catch (ClassNotFoundException e) { | ||
throw new IllegalStateException("Cannot find class " + className, e); | ||
} | ||
Method method = Objects.requireNonNull(getMethodFromClass(javaClass, "flip")); | ||
String disassembledMethod = method.getCode().toString(); | ||
|
||
final String JAVA8_API_CALL = "XXXinvokevirtual\tjava.nio.ByteBuffer.flip ()Ljava/nio/Buffer;"; | ||
final String JAVA9_API_CALL = "invokevirtual\tjava.nio.ByteBuffer.flip ()Ljava/nio/ByteBuffer;"; | ||
if (disassembledMethod.contains(JAVA9_API_CALL)) | ||
fail( | ||
"Class '" + className + "' was compiled against Java 9+ API. " + | ||
"There seems to be a problem with the '--release' compiler option.\n" + | ||
"Disassembled method:\n" + disassembledMethod | ||
); | ||
else if (!disassembledMethod.contains(JAVA8_API_CALL)) | ||
fail( | ||
"Cannot determine if class '" + className + "' was compiled against Java 8 or 9+ API. " + | ||
"This should never happen.\n" + | ||
"Disassembled method:\n" + disassembledMethod | ||
); | ||
} | ||
|
||
public static Test suite() { | ||
return XMLBasedAjcTestCase.loadSuite(CompileWithReleaseTests.class); | ||
} | ||
|
||
@Override | ||
protected java.net.URL getSpecFile() { | ||
return getClassResource("ajc198.xml"); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters