/******************************************************************************* * Copyright (c) 2017 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.ajc190; import junit.framework.Test; import org.aspectj.apache.bcel.classfile.Attribute; import org.aspectj.apache.bcel.classfile.Code; import org.aspectj.apache.bcel.classfile.JavaClass; import org.aspectj.apache.bcel.classfile.Method; import org.aspectj.testing.JavaVersionSpecificXMLBasedAjcTestCase; import org.aspectj.testing.XMLBasedAjcTestCase; import org.aspectj.util.LangUtil; /** * Building and weaving with modules in the picture. * * Module options from https://openjdk.java.net/jeps/261 * * @author Andy Clement * */ public class ModuleTests extends JavaVersionSpecificXMLBasedAjcTestCase { public ModuleTests() { super(9); } public void testBuildAModule() { runTest("build a module"); } public void testRunModuleClassPath() { runTest("run a module - classpath"); } public void testRunModuleModulePath() { runTest("run a module - modulepath"); } public void testPackageAndRunModuleFromModulePath() { runTest("package and run a module - modulepath"); } public void testBuildModuleIncludingAspects() { runTest("compile module including aspects"); } public void testBuildModuleAndApplyAspectsFromAspectPath() { runTest("compile module and apply aspects via aspectpath"); } public void testBinaryWeavingAModuleJar() { // Pass a module on inpath, does it weave ok with a source aspect, does it run afterwards? runTest("binary weaving module"); } public void testModulepathClasspathResolution1() { runTest("module path vs classpath 1"); } // public void testModulepathClasspathResolution2() { // runTest("module path vs classpath 2"); // } // --add-modules // This tests that when using --add-modules with one of the JDK modules (in the jmods subfolder of the JDK) // that it can be found without needing to set --module-path (this seems to be implicitly included by javac too) public void testAddModules1() { if (LangUtil.isVMGreaterOrEqual(11)) { // java.xml.bind is gone in Java11 return; } runTest("compile use of java.xml.bind"); } // This tests that we can use add-modules to pull in something from the JDK jmods package and that // when subsequently weaving we can see types from those modules public void testWovenAfterAddModules() { if (LangUtil.isVMGreaterOrEqual(11)) { // java.xml.bind is gone in Java11 return; } runTest("weave use of java.xml.bind"); } // --limit-modules public void testLimitModules1() { if (LangUtil.isVMGreaterOrEqual(11)) { // java.xml.bind is gone in Java11 return; } runTest("limit modules 1"); } // --add-reads public void testAddReads1() { if (LangUtil.isVMGreaterOrEqual(11)) { // java.xml.bind is gone in Java11 return; } runTest("add reads 1"); } // --- /* For the specified class, check that each method has a stackmap attribute */ private void checkStackMapExistence(String classname, String toIgnore) throws ClassNotFoundException { toIgnore = "_" + (toIgnore == null ? "" : toIgnore) + "_"; JavaClass jc = getClassFrom(ajc.getSandboxDirectory(), classname); Method[] methods = jc.getMethods(); for (Method method : methods) { if (toIgnore.contains("_" + method.getName() + "_")) { continue; } boolean hasStackMapAttribute = findAttribute(method.getAttributes(), "StackMapTable"); if (!hasStackMapAttribute) { fail("Could not find StackMap attribute for method " + method.getName()); } } } private boolean findAttribute(Attribute[] attrs, String attributeName) { if (attrs == null) { return false; } for (Attribute attribute : attrs) { if (attribute.getName().equals(attributeName)) { return true; } // System.out.println(attribute.getName()); if (attribute.getName().equals("Code")) { Code c = (Code) attribute; Attribute[] codeAttributes = c.getAttributes(); for (Attribute codeAttribute : codeAttributes) { if (codeAttribute.getName().equals(attributeName)) { return true; // System.out.println(codeAttribute.getName()); } } } } return false; } // Check the stackmap stuff is removed when a method gets woven (for now...) // public void testStackMapAttributesDeletedInWovenCode() { // fail("Not implemented"); // } // /////////////////////////////////////// public static Test suite() { return XMLBasedAjcTestCase.loadSuite(ModuleTests.class); } @Override protected java.net.URL getSpecFile() { return getClassResource("ajc190.xml"); } }