/* ******************************************************************* * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC). * 2005 Contributors * All rights reserved. * This program and the accompanying materials are made available * under the terms of the Eclipse Public License v 2.0 * which accompanies this distribution and is available at * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt * * Contributors: * PARC initial implementation * ******************************************************************/ package org.aspectj.weaver.patterns; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.aspectj.weaver.CompressingDataOutputStream; import org.aspectj.weaver.Member; import org.aspectj.weaver.TestUtils; import org.aspectj.weaver.VersionedDataInputStream; import org.aspectj.weaver.World; import org.aspectj.weaver.reflect.ReflectionWorld; public class SignaturePatternTestCase extends PatternsTestCase { @Override public World getWorld() { return new ReflectionWorld(true, this.getClass().getClassLoader()); } public void testThrowsMatch() throws IOException { Member onlyDerivedOnDerived = TestUtils.methodFromString("static void org.aspectj.weaver.testcode.Derived.onlyDerived()"); Member mOnBase = TestUtils.methodFromString("void org.aspectj.weaver.testcode.Base.m()"); Member mOnDerived = TestUtils.methodFromString("void org.aspectj.weaver.testcode.Derived.m()"); checkMatch(makeMethodPat("* org.aspectj.weaver.testcode.Base.*(..) throws java.lang.CloneNotSupportedException"), new Member[] { mOnBase }, new Member[] { mOnDerived }); checkMatch(makeMethodPat("* org.aspectj.weaver.testcode.Derived.*(..) throws java.lang.CloneNotSupportedException"), new Member[] {}, new Member[] { mOnBase, mOnDerived }); // XXX need pattern checks Member[] NONE = new Member[] {}; Member[] M = new Member[] { onlyDerivedOnDerived }; Member[] NO_EXCEPTIONS = new Member[] { mOnDerived }; Member[] BOTH = new Member[] { mOnDerived, onlyDerivedOnDerived }; checkMatch(makeMethodPat("* *(..)"), M, NONE); checkMatch(makeMethodPat("* *(..) throws !*"), NO_EXCEPTIONS, M); checkMatch(makeMethodPat("* *(..) throws *"), M, NO_EXCEPTIONS); checkMatch(makeMethodPat("* *(..) throws *, !*"), NONE, BOTH); checkMatch(makeMethodPat("* *(..) throws (!*)"), NONE, BOTH); checkMatch(makeMethodPat("* *(..) throws !(!*)"), BOTH, NONE); checkMatch(makeMethodPat("* *(..) throws *..IOException"), M, NO_EXCEPTIONS); checkMatch(makeMethodPat("* *(..) throws *..IOException, *..Clone*"), M, NO_EXCEPTIONS); checkMatch(makeMethodPat("* *(..) throws *..IOException, !*..Clone*"), NONE, BOTH); checkMatch(makeMethodPat("* *(..) throws !*..IOException"), NO_EXCEPTIONS, M); } /* * public void testInstanceMethodMatchSpeed() throws IOException { // Member objectToString = * TestUtils.methodFromString("java.lang.String java.lang.Object.toString()"); Member objectToString = * TestUtils.methodFromString( * "java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)").resolve(world); SignaturePattern * signaturePattern = makeMethodPat("* *(..))"); signaturePattern = signaturePattern.resolveBindings(new TestScope(world, new * FormalBinding[0]), new Bindings(0)); for (int i = 0; i < 1000; i++) { boolean matches = * signaturePattern.matches(objectToString, world, false); } long stime = System.currentTimeMillis(); for (int i = 0; i < * 2000000; i++) { boolean matches = signaturePattern.matches(objectToString, world, false); } long etime = * System.currentTimeMillis(); System.out.println("Took " + (etime - stime) + "ms for 2,000,000");// 4081 * * signaturePattern = makeMethodPat("* *())"); signaturePattern = signaturePattern.resolveBindings(new TestScope(world, new * FormalBinding[0]), new Bindings(0)); for (int i = 0; i < 1000; i++) { boolean matches = * signaturePattern.matches(objectToString, world, false); } stime = System.currentTimeMillis(); for (int i = 0; i < 2000000; * i++) { boolean matches = signaturePattern.matches(objectToString, world, false); } etime = System.currentTimeMillis(); * System.out.println("Took " + (etime - stime) + "ms for 2,000,000");// 4081 } * * public void testInstanceMethodMatchSpeed2() throws IOException { // Member objectToString = * TestUtils.methodFromString("java.lang.String java.lang.Object.toString()"); Member objectToString = * TestUtils.methodFromString( * "java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)").resolve(world); SignaturePattern * signaturePattern = makeMethodPat("!void *(..))"); signaturePattern = signaturePattern.resolveBindings(new TestScope(world, * new FormalBinding[0]), new Bindings(0)); for (int i = 0; i < 1000; i++) { boolean matches = * signaturePattern.matches(objectToString, world, false); } long stime = System.currentTimeMillis(); for (int i = 0; i < * 2000000; i++) { boolean matches = signaturePattern.matches(objectToString, world, false); } long etime = * System.currentTimeMillis(); System.out.println("Took " + (etime - stime) + "ms for 2,000,000");// 4081 } */ public void testInstanceMethodMatch() throws IOException { Member objectToString = TestUtils.methodFromString("java.lang.String java.lang.Object.toString()"); Member integerToString = TestUtils.methodFromString("java.lang.String java.lang.Integer.toString()"); Member integerIntValue = TestUtils.methodFromString("int java.lang.Integer.intValue()"); // Member objectToString = Member.methodFromString("java.lang.String java.lang.Object.toString()"); checkMatch(makeMethodPat("* java.lang.Object.*(..)"), new Member[] { objectToString, integerToString }, new Member[] { integerIntValue }); checkMatch(makeMethodPat("* java.lang.Integer.*(..)"), new Member[] { integerIntValue, integerToString }, new Member[] { objectToString }); } public void testStaticMethodMatch() throws IOException { Member onlyBaseOnBase = TestUtils.methodFromString("static void org.aspectj.weaver.testcode.Base.onlyBase()"); Member onlyBaseOnDerived = TestUtils.methodFromString("static void org.aspectj.weaver.testcode.Derived.onlyBase()"); Member onlyDerivedOnDerived = TestUtils.methodFromString("static void org.aspectj.weaver.testcode.Derived.onlyDerived()"); Member bothOnBase = TestUtils.methodFromString("static void org.aspectj.weaver.testcode.Base.both()"); Member bothOnDerived = TestUtils.methodFromString("static void org.aspectj.weaver.testcode.Derived.both()"); checkMatch(makeMethodPat("* org.aspectj.weaver.testcode.Base.*(..)"), new Member[] { onlyBaseOnBase, onlyBaseOnDerived, bothOnBase }, new Member[] { onlyDerivedOnDerived, bothOnDerived }); checkMatch(makeMethodPat("* org.aspectj.weaver.testcode.Derived.*(..)"), new Member[] { onlyBaseOnDerived, bothOnDerived, onlyDerivedOnDerived }, new Member[] { onlyBaseOnBase, bothOnBase }); } public void testFieldMatch() throws IOException { Member onlyBaseOnBase = TestUtils.fieldFromString("int org.aspectj.weaver.testcode.Base.onlyBase"); Member onlyBaseOnDerived = TestUtils.fieldFromString("int org.aspectj.weaver.testcode.Derived.onlyBase"); Member onlyDerivedOnDerived = TestUtils.fieldFromString("int org.aspectj.weaver.testcode.Derived.onlyDerived"); Member bothOnBase = TestUtils.fieldFromString("int org.aspectj.weaver.testcode.Base.both"); Member bothOnDerived = TestUtils.fieldFromString("int org.aspectj.weaver.testcode.Derived.both"); checkMatch(makeFieldPat("* org.aspectj.weaver.testcode.Base.*"), new Member[] { onlyBaseOnBase, onlyBaseOnDerived, bothOnBase }, new Member[] { onlyDerivedOnDerived, bothOnDerived }); checkMatch(makeFieldPat("* org.aspectj.weaver.testcode.Derived.*"), new Member[] { onlyBaseOnDerived, bothOnDerived, onlyDerivedOnDerived }, new Member[] { onlyBaseOnBase, bothOnBase }); } public void testConstructorMatch() throws IOException { Member onBase = TestUtils.methodFromString("void org.aspectj.weaver.testcode.Base.()"); Member onDerived = TestUtils.methodFromString("void org.aspectj.weaver.testcode.Derived.()"); Member onBaseWithInt = TestUtils.methodFromString("void org.aspectj.weaver.testcode.Base.(int)"); checkMatch(makeMethodPat("org.aspectj.weaver.testcode.Base.new(..)"), new Member[] { onBase, onBaseWithInt }, new Member[] { onDerived }); checkMatch(makeMethodPat("org.aspectj.weaver.testcode.Derived.new(..)"), new Member[] { onDerived }, new Member[] { onBase, onBaseWithInt }); } public void checkMatch(SignaturePattern p, Member[] yes, Member[] no) throws IOException { p = p.resolveBindings(new TestScope(world, new FormalBinding[0]), new Bindings(0)); for (Member value : yes) { checkMatch(p, value, true); } for (Member member : no) { checkMatch(p, member, false); } checkSerialization(p); } private void checkMatch(SignaturePattern p, Member member, boolean b) { boolean matches = p.matches(member, world, false); assertEquals(p.toString() + " matches " + member.toString(), b, matches); } private SignaturePattern makeMethodPat(String pattern) { return new PatternParser(pattern).parseMethodOrConstructorSignaturePattern(); } private SignaturePattern makeFieldPat(String pattern) { return new PatternParser(pattern).parseFieldSignaturePattern(); } private void checkSerialization(SignaturePattern p) throws IOException { ByteArrayOutputStream bo = new ByteArrayOutputStream(); ConstantPoolSimulator cps = new ConstantPoolSimulator(); CompressingDataOutputStream out = new CompressingDataOutputStream(bo, cps); p.write(out); out.close(); ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); VersionedDataInputStream in = new VersionedDataInputStream(bi, cps); SignaturePattern newP = SignaturePattern.read(in, null); assertEquals("write/read", p, newP); } }