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.

AsmRelationshipsTests.java 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. * ******************************************************************/
  10. package org.aspectj.ajde.core.tests.model;
  11. import java.io.File;
  12. import java.util.Iterator;
  13. import java.util.List;
  14. import org.aspectj.ajde.core.AjdeCoreTestCase;
  15. import org.aspectj.ajde.core.TestCompilerConfiguration;
  16. import org.aspectj.ajdt.internal.core.builder.AsmHierarchyBuilder;
  17. import org.aspectj.asm.AsmManager;
  18. import org.aspectj.asm.IProgramElement;
  19. import org.aspectj.asm.IRelationship;
  20. public class AsmRelationshipsTests extends AjdeCoreTestCase {
  21. private AsmManager manager = null;
  22. private String[] files = new String[]{
  23. "ModelCoverage.java",
  24. "pkg" + File.separator + "InPackage.java"
  25. };
  26. private TestCompilerConfiguration compilerConfig;
  27. protected void setUp() throws Exception {
  28. super.setUp();
  29. initialiseProject("coverage");
  30. compilerConfig = (TestCompilerConfiguration) getCompiler()
  31. .getCompilerConfiguration();
  32. compilerConfig.setProjectSourceFiles(getSourceFileList(files));
  33. doBuild();
  34. manager = AsmManager.getDefault();
  35. }
  36. protected void tearDown() throws Exception {
  37. super.tearDown();
  38. compilerConfig = null;
  39. manager = null;
  40. }
  41. // see pr148027
  42. public void testUsesPointcut() {
  43. if (!AsmHierarchyBuilder.shouldAddUsesPointcut) return;
  44. IProgramElement ptUsage = AsmManager.getDefault().getHierarchy().findElementForType(null, "PointcutUsage");
  45. assertNotNull(ptUsage);
  46. IProgramElement pts = AsmManager.getDefault().getHierarchy().findElementForType(null, "Pointcuts");
  47. assertNotNull(pts);
  48. IProgramElement pUsesA = manager.getHierarchy().findElementForLabel(
  49. ptUsage,
  50. IProgramElement.Kind.POINTCUT,
  51. "usesA()"/*Point"*/);
  52. assertNotNull(pUsesA);
  53. IProgramElement ptsA = manager.getHierarchy().findElementForLabel(
  54. pts,
  55. IProgramElement.Kind.POINTCUT,
  56. "a()"/*Point"*/);
  57. assertNotNull(ptsA);
  58. assertTrue(AsmManager.getDefault().getRelationshipMap().get(pUsesA).size()>0);
  59. assertTrue(AsmManager.getDefault().getRelationshipMap().get(ptsA).size()>0);
  60. }
  61. public void testDeclareParents() {
  62. IProgramElement aspect = AsmManager.getDefault().getHierarchy().findElementForType(null, "DeclareCoverage");
  63. IProgramElement dp = manager.getHierarchy().findElementForLabel(
  64. aspect,
  65. IProgramElement.Kind.DECLARE_PARENTS,
  66. "declare parents: implements Serializable"/*Point"*/);
  67. assertNotNull(dp);
  68. /*List relations = */manager.getRelationshipMap().get(dp);
  69. List rels = AsmManager.getDefault().getRelationshipMap().get(dp);
  70. assertTrue(rels.size()>0);
  71. // assertTrue(rel.getTargets().size() > 0);
  72. //
  73. // checkDeclareMapping("DeclareCoverage", "Point", ,
  74. // "Point", "matched by", "matches declare",
  75. // IProgramElement.Kind.DECLARE_PARENTS);
  76. }
  77. public void testDeclareWarningAndError() {
  78. checkDeclareMapping("DeclareCoverage", "Point", "declare warning: \"Illegal call.\"",
  79. "method-call(void Point.setX(int))", "matched by", "matches declare", IProgramElement.Kind.DECLARE_WARNING);
  80. }
  81. public void testInterTypeDeclarations() {
  82. checkInterTypeMapping("InterTypeDecCoverage", "Point", "Point.xxx", "Point",
  83. "declared on", "aspect declarations", IProgramElement.Kind.INTER_TYPE_FIELD);
  84. checkInterTypeMapping("InterTypeDecCoverage", "Point", "Point.check(int,Line)",
  85. "Point", "declared on", "aspect declarations", IProgramElement.Kind.INTER_TYPE_METHOD);
  86. }
  87. public void testAdvice() {
  88. checkMapping("AdvisesRelationshipCoverage", "Point", "before(): methodExecutionP..",
  89. "setX(int)", "advises", "advised by");
  90. checkUniDirectionalMapping("AdvisesRelationshipCoverage", "Point", "before(): getP..",
  91. "field-get(int Point.x)", "advises");
  92. checkUniDirectionalMapping("AdvisesRelationshipCoverage", "Point", "before(): setP..",
  93. "field-set(int Point.x)", "advises");
  94. }
  95. private void checkDeclareMapping(String fromType, String toType, String from, String to,
  96. String forwardRelName, String backRelName, IProgramElement.Kind kind) {
  97. IProgramElement aspect = AsmManager.getDefault().getHierarchy().findElementForType(null, fromType);
  98. assertNotNull(aspect);
  99. String beforeExec = from;
  100. IProgramElement beforeExecNode = manager.getHierarchy().findElementForLabel(aspect, kind, beforeExec);
  101. assertNotNull(beforeExecNode);
  102. IRelationship rel = manager.getRelationshipMap().get(beforeExecNode, IRelationship.Kind.DECLARE, forwardRelName);
  103. assertTrue(rel.getTargets().size() > 0);
  104. String handle = (String)rel.getTargets().get(0);
  105. assertEquals(manager.getHierarchy().findElementForHandle(handle).toString(), to);
  106. IProgramElement clazz = AsmManager.getDefault().getHierarchy().findElementForType(null, toType);
  107. assertNotNull(clazz);
  108. String set = to;
  109. IProgramElement setNode = manager.getHierarchy().findElementForLabel(clazz, IProgramElement.Kind.CODE, set);
  110. assertNotNull(setNode);
  111. IRelationship rel2 = manager.getRelationshipMap().get(setNode, IRelationship.Kind.DECLARE, backRelName);
  112. String handle2 = (String)rel2.getTargets().get(0);
  113. assertEquals(manager.getHierarchy().findElementForHandle(handle2).toString(), from);
  114. }
  115. private void checkUniDirectionalMapping(String fromType, String toType, String from,
  116. String to, String relName) {
  117. IProgramElement aspect = AsmManager.getDefault().getHierarchy().findElementForType(null, fromType);
  118. assertNotNull(aspect);
  119. String beforeExec = from;
  120. IProgramElement beforeExecNode = manager.getHierarchy().findElementForLabel(aspect, IProgramElement.Kind.ADVICE, beforeExec);
  121. assertNotNull(beforeExecNode);
  122. IRelationship rel = manager.getRelationshipMap().get(beforeExecNode, IRelationship.Kind.ADVICE, relName);
  123. for (Iterator it = rel.getTargets().iterator(); it.hasNext(); ) {
  124. String currHandle = (String)it.next();
  125. if (manager.getHierarchy().findElementForHandle(currHandle).toLabelString().equals(to)) return;
  126. }
  127. fail(); // didn't find it
  128. }
  129. private void checkMapping(String fromType, String toType, String from, String to,
  130. String forwardRelName, String backRelName) {
  131. IProgramElement aspect = AsmManager.getDefault().getHierarchy().findElementForType(null, fromType);
  132. assertNotNull(aspect);
  133. String beforeExec = from;
  134. IProgramElement beforeExecNode = manager.getHierarchy().findElementForLabel(aspect, IProgramElement.Kind.ADVICE, beforeExec);
  135. assertNotNull(beforeExecNode);
  136. IRelationship rel = manager.getRelationshipMap().get(beforeExecNode, IRelationship.Kind.ADVICE, forwardRelName);
  137. String handle = (String)rel.getTargets().get(0);
  138. assertEquals(manager.getHierarchy().findElementForHandle(handle).toString(), to);
  139. IProgramElement clazz = AsmManager.getDefault().getHierarchy().findElementForType(null, toType);
  140. assertNotNull(clazz);
  141. String set = to;
  142. IProgramElement setNode = manager.getHierarchy().findElementForLabel(clazz, IProgramElement.Kind.METHOD, set);
  143. assertNotNull(setNode);
  144. IRelationship rel2 = manager.getRelationshipMap().get(setNode, IRelationship.Kind.ADVICE, backRelName);
  145. String handle2 = (String)rel2.getTargets().get(0);
  146. assertEquals(manager.getHierarchy().findElementForHandle(handle2).toString(), from);
  147. }
  148. private void checkInterTypeMapping(String fromType, String toType, String from,
  149. String to, String forwardRelName, String backRelName, IProgramElement.Kind declareKind) {
  150. IProgramElement aspect = AsmManager.getDefault().getHierarchy().findElementForType(null, fromType);
  151. assertNotNull(aspect);
  152. String beforeExec = from;
  153. IProgramElement fromNode = manager.getHierarchy().findElementForLabel(aspect, declareKind, beforeExec);
  154. assertNotNull(fromNode);
  155. IRelationship rel = manager.getRelationshipMap().get(fromNode, IRelationship.Kind.DECLARE_INTER_TYPE, forwardRelName);
  156. String handle = (String)rel.getTargets().get(0);
  157. assertEquals(manager.getHierarchy().findElementForHandle(handle).toString(), to);
  158. IProgramElement clazz = AsmManager.getDefault().getHierarchy().findElementForType(null, toType);
  159. assertNotNull(clazz);
  160. // String set = to;
  161. IRelationship rel2 = manager.getRelationshipMap().get(clazz, IRelationship.Kind.DECLARE_INTER_TYPE, backRelName);
  162. // String handle2 = (String)rel2.getTargets().get(0);
  163. for (Iterator it = rel2.getTargets().iterator(); it.hasNext(); ) {
  164. String currHandle = (String)it.next();
  165. if (manager.getHierarchy().findElementForHandle(currHandle).toLabelString().equals(from)) return;
  166. }
  167. fail(); // didn't find it
  168. }
  169. }