You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PointcutResidueTestCase.java 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /* *******************************************************************
  2. * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver.bcel;
  13. import java.io.ByteArrayInputStream;
  14. import java.io.ByteArrayOutputStream;
  15. import java.io.IOException;
  16. import java.lang.reflect.Modifier;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import org.aspectj.weaver.AdviceKind;
  20. import org.aspectj.weaver.CompressingDataOutputStream;
  21. import org.aspectj.weaver.CrosscuttingMembers;
  22. import org.aspectj.weaver.MemberImpl;
  23. import org.aspectj.weaver.ResolvedType;
  24. import org.aspectj.weaver.ShadowMunger;
  25. import org.aspectj.weaver.UnresolvedType;
  26. import org.aspectj.weaver.VersionedDataInputStream;
  27. import org.aspectj.weaver.patterns.ConstantPoolSimulator;
  28. import org.aspectj.weaver.patterns.Pointcut;
  29. import org.aspectj.weaver.patterns.SimpleScope;
  30. public class PointcutResidueTestCase extends WeaveTestCase {
  31. {
  32. regenerate = false;
  33. }
  34. public PointcutResidueTestCase(String name) {
  35. super(name);
  36. }
  37. String[] none = new String[0];
  38. // -----
  39. // ----
  40. public void testArgResidue1() throws IOException {
  41. checkMultiArgWeave("StringResidue1",
  42. "call(* *(java.lang.Object, java.lang.Object)) && args(java.lang.String, java.lang.String)");
  43. }
  44. public void testArgResidue2() throws IOException {
  45. checkMultiArgWeave("StringResidue2", "call(* *(java.lang.Object, java.lang.Object)) && args(.., java.lang.String)");
  46. }
  47. public void testArgResidue3() throws IOException {
  48. checkMultiArgWeave("StringResidue3", "call(* *(java.lang.Object, java.lang.Object)) && args(java.lang.String, ..)");
  49. }
  50. // BETAX this is a beta feature.
  51. // public void testArgResidue4() throws IOException {
  52. // checkMultiArgWeave(
  53. // "StringResidue4",
  54. // "call(* *(java.lang.Object, java.lang.Object)) && args(.., java.lang.String, ..)");
  55. // }
  56. public void testMultiArgState() throws IOException {
  57. checkWeave("StateResidue", "MultiArgHelloWorld", "call(* *(java.lang.Object, java.lang.Object)) && args(s, ..)",
  58. new String[] { "java.lang.String" }, new String[] { "s" });
  59. checkWeave("StateResidue", "MultiArgHelloWorld", "call(* *(java.lang.Object, java.lang.Object)) && args(s, *)",
  60. new String[] { "java.lang.String" }, new String[] { "s" });
  61. }
  62. public void testAdd() throws IOException {
  63. checkDynamicWeave("AddResidue", "call(public * add(..)) && target(java.util.ArrayList)");
  64. checkDynamicWeave("AddResidue", "call(public * add(..)) && (target(java.util.ArrayList) || target(java.lang.String))");
  65. checkDynamicWeave("AddResidue",
  66. "call(public * add(..)) && this(java.io.Serializable) && target(java.util.ArrayList) && !this(java.lang.Integer)");
  67. }
  68. public void testNot() throws IOException {
  69. checkDynamicWeave("AddNotResidue", "call(public * add(..)) && !target(java.util.ArrayList)");
  70. checkDynamicWeave("AddNotResidue", "call(public * add(..)) && !(target(java.util.ArrayList) || target(java.lang.String)) ");
  71. checkDynamicWeave("AddNotResidue", "call(public * add(..)) && target(java.lang.Object) && !target(java.util.ArrayList)");
  72. }
  73. public void testState() throws IOException {
  74. checkWeave("AddStateResidue", "DynamicHelloWorld", "call(public * add(..)) && target(list)",
  75. new String[] { "java.util.ArrayList" }, new String[] { "list" });
  76. checkWeave("AddStateResidue", "DynamicHelloWorld", "target(foo) && !target(java.lang.Integer) && call(public * add(..))",
  77. new String[] { "java.util.ArrayList" }, new String[] { "foo" });
  78. checkDynamicWeave("AddResidue", "call(public * add(..)) && (target(java.util.ArrayList) || target(java.lang.String))");
  79. checkDynamicWeave("AddResidue",
  80. "call(public * add(..)) && this(java.io.Serializable) && target(java.util.ArrayList) && !this(java.lang.Integer)");
  81. }
  82. public void testNoResidueArgs() throws IOException {
  83. checkDynamicWeave("NoResidue", "call(public * add(..)) && args(java.lang.Object)");
  84. checkDynamicWeave("NoResidue", "call(public * add(..)) && args(*)");
  85. checkDynamicWeave("NoResidue", "call(public * add(..))");
  86. }
  87. // ---- cflow tests
  88. public void testCflowState() throws IOException {
  89. checkWeave("CflowStateResidue", "DynamicHelloWorld",
  90. "cflow(call(public * add(..)) && target(list)) && execution(public void main(..))",
  91. new String[] { "java.util.ArrayList" }, new String[] { "list" });
  92. // checkWeave(
  93. // "CflowStateResidue",
  94. // "DynamicHelloWorld",
  95. // "cflow(call(public * add(..)) && target(list)) && this(obj) && execution(public void doit(..))",
  96. // new String[] { "java.lang.Object", "java.util.ArrayList" },
  97. // new String[] { "obj", "list" });
  98. // checkWeave(
  99. // "AddStateResidue",
  100. // "DynamicHelloWorld",
  101. // "target(foo) && !target(java.lang.Integer) && call(public * add(..))",
  102. // new String[] { "java.util.ArrayList" },
  103. // new String[] { "foo" });
  104. // checkDynamicWeave(
  105. // "AddResidue",
  106. // "call(public * add(..)) && (target(java.util.ArrayList) || target(java.lang.String))");
  107. // checkDynamicWeave(
  108. // "AddResidue",
  109. // "call(public * add(..)) && this(java.io.Serializable) && target(java.util.ArrayList) && !this(java.lang.Integer)");
  110. }
  111. // ----
  112. private void checkDynamicWeave(String label, String pointcutSource) throws IOException {
  113. checkWeave(label, "DynamicHelloWorld", pointcutSource, new String[0], new String[0]);
  114. }
  115. private void checkMultiArgWeave(String label, String pointcutSource) throws IOException {
  116. checkWeave(label, "MultiArgHelloWorld", pointcutSource, new String[0], new String[0]);
  117. }
  118. private void checkWeave(String label, String filename, String pointcutSource, String[] formalTypes, String[] formalNames)
  119. throws IOException {
  120. final Pointcut sp = Pointcut.fromString(pointcutSource);
  121. final Pointcut rp = sp.resolve(new SimpleScope(world, SimpleScope.makeFormalBindings(UnresolvedType.forNames(formalTypes),
  122. formalNames)));
  123. ShadowMunger pp = new BcelAdvice(AdviceKind.Before, rp, MemberImpl.method(UnresolvedType.forName("Aspect"),
  124. Modifier.STATIC, "ajc_before_0",
  125. MemberImpl.typesToSignature(UnresolvedType.VOID, UnresolvedType.forNames(formalTypes), false)), 0, -1, -1, null,
  126. null);
  127. ResolvedType inAspect = world.resolve("Aspect");
  128. CrosscuttingMembers xcut = new CrosscuttingMembers(inAspect, true);
  129. inAspect.crosscuttingMembers = xcut;
  130. ShadowMunger cp = pp.concretize(inAspect, world, null);
  131. xcut.addConcreteShadowMunger(cp);
  132. // System.out.println("extras: " + inAspect.getExtraConcreteShadowMungers());
  133. // List advice = new ArrayList();
  134. // advice.add(cp);
  135. // advice.addAll(inAspect.getExtraConcreteShadowMungers());
  136. weaveTest(new String[] { filename }, label, xcut.getShadowMungers());
  137. checkSerialize(rp);
  138. }
  139. public void weaveTest(String name, String outName, ShadowMunger planner) throws IOException {
  140. List l = new ArrayList(1);
  141. l.add(planner);
  142. weaveTest(name, outName, l);
  143. }
  144. public void checkSerialize(Pointcut p) throws IOException {
  145. ByteArrayOutputStream bo = new ByteArrayOutputStream();
  146. ConstantPoolSimulator cps = new ConstantPoolSimulator();
  147. CompressingDataOutputStream out = new CompressingDataOutputStream(bo, cps);
  148. p.write(out);
  149. out.close();
  150. ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
  151. VersionedDataInputStream in = new VersionedDataInputStream(bi, cps);
  152. Pointcut newP = Pointcut.read(in, null);
  153. assertEquals("write/read", p, newP);
  154. }
  155. }