|
|
@@ -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 = "invokevirtual\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"); |
|
|
|
} |
|
|
|
|
|
|
|
} |