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.

WorldTestCase.java 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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.lang.reflect.Modifier;
  14. import java.util.Objects;
  15. import java.util.function.Consumer;
  16. import org.aspectj.weaver.Advice;
  17. import org.aspectj.weaver.BcweaverTests;
  18. import org.aspectj.weaver.CommonWorldTests;
  19. import org.aspectj.weaver.Member;
  20. import org.aspectj.weaver.MemberImpl;
  21. import org.aspectj.weaver.ResolvedMember;
  22. import org.aspectj.weaver.ResolvedType;
  23. import org.aspectj.weaver.ShadowMunger;
  24. import org.aspectj.weaver.TestUtils;
  25. import org.aspectj.weaver.UnresolvedType;
  26. import org.aspectj.weaver.World;
  27. /**
  28. * This is a test case for the nameType parts of worlds.
  29. */
  30. public class WorldTestCase extends CommonWorldTests {
  31. private final BcelWorld world = new BcelWorld(BcweaverTests.TESTDATA_PATH + "/tracing.jar");
  32. protected World getWorld() {
  33. return world;
  34. }
  35. protected boolean getSupportsAutoboxing() {
  36. return true;
  37. }
  38. // XXX fix the various XXXs before expecting this test to work
  39. public void xtestTraceJar() {
  40. ResolvedType trace = world.resolve(UnresolvedType.forName("Trace"), true);
  41. assertTrue("Couldnt find type Trace", !trace.isMissing());
  42. fieldsTest(trace, Member.NONE);
  43. /* Member constr = */TestUtils.methodFromString("void Trace.<init>()");
  44. // XXX need attribute fix -
  45. // methodsTest(trace, new Member[] { constr });
  46. interfacesTest(trace, ResolvedType.NONE);
  47. superclassTest(trace, UnresolvedType.OBJECT);
  48. isInterfaceTest(trace, false);
  49. isClassTest(trace, false);
  50. isAspectTest(trace, true);
  51. pointcutsTest(trace, new Member[] { MemberImpl.pointcut(trace, "traced", "(Ljava/lang/Object;)V"), });
  52. modifiersTest(trace.findPointcut("traced"), Modifier.PUBLIC | Modifier.ABSTRACT);
  53. mungersTest(
  54. trace,
  55. new ShadowMunger[] {
  56. BcelTestUtils.shadowMunger(world, "before(foo): traced(foo) -> void Trace.ajc_before_4(java.lang.Object))",
  57. 0),
  58. BcelTestUtils
  59. .shadowMunger(
  60. world,
  61. "afterReturning(foo): traced(foo) -> void Trace.ajc_afterreturning_3(java.lang.Object, java.lang.Object))",
  62. Advice.ExtraArgument),
  63. BcelTestUtils
  64. .shadowMunger(
  65. world,
  66. "around(): execution(* doit(..)) -> java.lang.Object Trace.ajc_around_2(org.aspectj.runtime.internal.AroundClosure))",
  67. Advice.ExtraArgument),
  68. BcelTestUtils
  69. .shadowMunger(
  70. world,
  71. "around(foo): traced(foo) -> java.lang.Object Trace.ajc_around_1(java.lang.Object, org.aspectj.runtime.internal.AroundClosure))",
  72. Advice.ExtraArgument), });
  73. ResolvedType myTrace = world.resolve(UnresolvedType.forName("MyTrace"), true);
  74. assertTrue("Couldnt find type MyTrace", !myTrace.isMissing());
  75. interfacesTest(myTrace, ResolvedType.NONE);
  76. superclassTest(myTrace, trace);
  77. isInterfaceTest(myTrace, false);
  78. isClassTest(myTrace, false);
  79. isAspectTest(myTrace, true);
  80. // XXX need attribute fix -
  81. // fieldsTest(myTrace, Member.NONE);
  82. pointcutsTest(trace, new Member[] { MemberImpl.pointcut(trace, "traced", "(Ljava/lang/Object;)V"), });
  83. modifiersTest(myTrace.findPointcut("traced"), Modifier.PUBLIC);
  84. // this tests for declared mungers
  85. mungersTest(myTrace, ShadowMunger.NONE);
  86. }
  87. public void testIterator() {
  88. int abstractPublic = Modifier.ABSTRACT | Modifier.PUBLIC;
  89. ResolvedType iter = world.getCoreType(UnresolvedType.forRawTypeName("java.util.Iterator"));
  90. modifiersTest(iter, abstractPublic | Modifier.INTERFACE);
  91. fieldsTest(iter, ResolvedMember.NONE);
  92. methodsTest(iter, new Member[] {
  93. MemberImpl.method(iter, 0, "hasNext", "()Z"),
  94. MemberImpl.method(iter, 0, "remove", "()V"),
  95. MemberImpl.method(iter, 0, "next", "()Ljava/lang/Object;"),
  96. MemberImpl.method(iter, 0, "forEachRemaining", "(Ljava/util/function/Consumer;)V")
  97. // default void forEachRemaining(Consumer<? super E> action) {
  98. // Objects.requireNonNull(action);
  99. // while (hasNext())
  100. // action.accept(next());
  101. // }
  102. });
  103. ResolvedMember remove = iter.lookupMethod(MemberImpl.method(iter, 0, "remove", "()V"));
  104. assertNotNull("iterator doesn't have remove", remove);
  105. modifiersTest(remove, Modifier.PUBLIC | Modifier.INTERFACE); // no longer abstract in Java8 (default instead)
  106. exceptionsTest(remove, UnresolvedType.NONE);
  107. ResolvedMember clone = iter.lookupMethod(MemberImpl.method(UnresolvedType.OBJECT, 0, "clone", "()Ljava/lang/Object;"));
  108. assertNotNull("iterator doesn't have clone", clone);
  109. // AV: JRockit Object.clone() is not native.. corrupted test here:
  110. // modifiersTest(clone, Modifier.PROTECTED | Modifier.NATIVE);
  111. assertTrue("should be protected" + clone.toString(), Modifier.isProtected(clone.getModifiers()));
  112. exceptionsTest(clone, UnresolvedType.forNames(new String[] { "java.lang.CloneNotSupportedException" }));
  113. interfacesTest(iter, ResolvedType.NONE);
  114. superclassTest(iter, UnresolvedType.OBJECT);
  115. pointcutsTest(iter, ResolvedMember.NONE);
  116. mungersTest(iter, ShadowMunger.NONE);
  117. isInterfaceTest(iter, true);
  118. isClassTest(iter, false);
  119. isAspectTest(iter, false);
  120. }
  121. public void testObjectCoersion() {
  122. assertCouldBeCoercibleFrom("java.lang.Object", "java.lang.String");
  123. assertCouldBeCoercibleFrom("java.lang.Integer", "java.lang.Object");
  124. assertCouldBeCoercibleFrom("java.io.Serializable", "java.lang.Runnable");
  125. assertCouldBeCoercibleFrom("java.util.Stack", "java.lang.Runnable");
  126. assertCouldNotBeCoercibleFrom("java.lang.Runnable", "java.lang.Integer");
  127. assertCouldNotBeCoercibleFrom("java.lang.Integer", "java.lang.String");
  128. assertCouldNotBeCoercibleFrom("java.lang.Integer", "java.lang.Runnable");
  129. }
  130. // ----
  131. private void assertCouldBeCoercibleFrom(String a, String b) {
  132. isCoerceableFromTest(world.resolve(a), world.resolve(b), true);
  133. }
  134. private void assertCouldNotBeCoercibleFrom(String a, String b) {
  135. isCoerceableFromTest(world.resolve(a), world.resolve(b), false);
  136. }
  137. }