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.

AsmRelationshipsTest.java 8.3KB

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