Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

Ajc186Tests.java 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*******************************************************************************
  2. * Copyright (c) 2014 Contributors
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * http://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors:
  9. * Andy Clement - initial API and implementation
  10. *******************************************************************************/
  11. package org.aspectj.systemtest.ajc186;
  12. import java.io.File;
  13. import java.lang.reflect.Method;
  14. import java.net.URL;
  15. import java.net.URLClassLoader;
  16. import junit.framework.Test;
  17. import org.aspectj.apache.bcel.classfile.JavaClass;
  18. import org.aspectj.apache.bcel.classfile.Utility;
  19. import org.aspectj.apache.bcel.util.ByteSequence;
  20. import org.aspectj.testing.XMLBasedAjcTestCase;
  21. import org.aspectj.weaver.tools.ContextBasedMatcher;
  22. import org.aspectj.weaver.tools.DefaultMatchingContext;
  23. import org.aspectj.weaver.tools.FuzzyBoolean;
  24. import org.aspectj.weaver.tools.MatchingContext;
  25. import org.aspectj.weaver.tools.PointcutDesignatorHandler;
  26. import org.aspectj.weaver.tools.PointcutExpression;
  27. import org.aspectj.weaver.tools.PointcutParser;
  28. /**
  29. * @author Andy Clement
  30. */
  31. public class Ajc186Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
  32. private class FooDesignatorHandler implements PointcutDesignatorHandler {
  33. private String askedToParse;
  34. public boolean simulateDynamicTest = false;
  35. public String getDesignatorName() {
  36. return "foo";
  37. }
  38. public ContextBasedMatcher parse(String expression) {
  39. this.askedToParse = expression;
  40. return new FooPointcutExpression(expression, this.simulateDynamicTest);
  41. }
  42. public String getExpressionLastAskedToParse() {
  43. return this.askedToParse;
  44. }
  45. }
  46. private class FooPointcutExpression implements ContextBasedMatcher {
  47. private final String beanNamePattern;
  48. private final boolean simulateDynamicTest;
  49. public FooPointcutExpression(String beanNamePattern,
  50. boolean simulateDynamicTest) {
  51. this.beanNamePattern = beanNamePattern;
  52. this.simulateDynamicTest = simulateDynamicTest;
  53. }
  54. public boolean couldMatchJoinPointsInType(Class aClass) {
  55. System.out.println("wubble?");
  56. return true;
  57. }
  58. public boolean couldMatchJoinPointsInType(Class aClass,
  59. MatchingContext context) {
  60. System.out.println("wibble?");
  61. if (this.beanNamePattern.equals(context.getBinding("beanName"))) {
  62. return true;
  63. } else {
  64. return false;
  65. }
  66. }
  67. public boolean mayNeedDynamicTest() {
  68. return this.simulateDynamicTest;
  69. }
  70. public FuzzyBoolean matchesStatically(MatchingContext matchContext) {
  71. System.out.println("wobble?");
  72. if (this.simulateDynamicTest)
  73. return FuzzyBoolean.MAYBE;
  74. if (this.beanNamePattern
  75. .equals(matchContext.getBinding("beanName"))) {
  76. return FuzzyBoolean.YES;
  77. } else {
  78. return FuzzyBoolean.NO;
  79. }
  80. }
  81. public boolean matchesDynamically(MatchingContext matchContext) {
  82. System.out.println("wabble?");
  83. return this.beanNamePattern.equals(matchContext
  84. .getBinding("beanName"));
  85. }
  86. }
  87. public void testLambdaBeans() throws Exception {
  88. runTest("lambda beans");
  89. // Load the 1.8 compiled code
  90. URLClassLoader ucl = new URLClassLoader(new URL[] {ajc.getSandboxDirectory().toURI().toURL()},this.getClass().getClassLoader());
  91. Class<?> applicationClass = Class.forName("Application",false,ucl);
  92. assertNotNull(applicationClass);
  93. Object instance = applicationClass.newInstance();
  94. Method works = applicationClass.getDeclaredMethod("fromInnerClass");
  95. works.setAccessible(true);
  96. Runnable r = (Runnable) works.invoke(instance);
  97. // r.getClass().getName() == Application$1
  98. Method fails = applicationClass.getDeclaredMethod("fromLambdaExpression");
  99. fails.setAccessible(true);
  100. Runnable r2 = (Runnable) fails.invoke(instance);
  101. // r2.getClass().getName() == Application$$Lambda$1/1652149987
  102. PointcutParser parser = PointcutParser
  103. .getPointcutParserSupportingAllPrimitivesAndUsingSpecifiedClassloaderForResolution(ucl);
  104. FooDesignatorHandler beanHandler = new FooDesignatorHandler();
  105. parser.registerPointcutDesignatorHandler(beanHandler);
  106. PointcutExpression pc = parser.parsePointcutExpression("foo(myBean)");
  107. DefaultMatchingContext context = new DefaultMatchingContext();
  108. pc.setMatchingContext(context);
  109. context.addContextBinding("beanName", "myBean");
  110. assertTrue(pc.couldMatchJoinPointsInType(r.getClass()));
  111. context.addContextBinding("beanName", "yourBean");
  112. assertFalse(pc.couldMatchJoinPointsInType(r.getClass()));
  113. context.addContextBinding("beanName", "myBean");
  114. assertTrue(pc.couldMatchJoinPointsInType(r2.getClass()));
  115. context.addContextBinding("beanName", "yourBean");
  116. assertFalse(pc.couldMatchJoinPointsInType(r2.getClass()));
  117. JavaClass jc = getClassFrom(ajc.getSandboxDirectory(), "Application");
  118. System.out.println("XXXX");
  119. assertNotNull(jc);
  120. // 525541: Checking that we can disassemble invokedynamic:
  121. boolean checkedInvokeDynamic = false;
  122. for (org.aspectj.apache.bcel.classfile.Method m: jc.getMethods()) {
  123. if (m.getName().equals("fromLambdaExpression")) {
  124. String code = m.getCode().getCodeString();
  125. assertTrue(code.contains("invokedynamic"));
  126. checkedInvokeDynamic = true;
  127. }
  128. }
  129. assertTrue(checkedInvokeDynamic);
  130. }
  131. public void testMissingExtends() throws Exception {
  132. runTest("missing extends on generic target");
  133. }
  134. public void testMissingMethod_462821() throws Exception {
  135. runTest("missing method");
  136. }
  137. // ---
  138. public static Test suite() {
  139. return XMLBasedAjcTestCase.loadSuite(Ajc186Tests.class);
  140. }
  141. @Override
  142. protected File getSpecFile() {
  143. return getClassResource("ajc186.xml");
  144. }
  145. }