Skip to content

Commit

Permalink
adding changes for 1.2.0.1 release - includes fix for BYTEMAN-66
Browse files Browse the repository at this point in the history
  • Loading branch information
adinn committed Dec 3, 2009
1 parent 1403486 commit 2eedaf4
Show file tree
Hide file tree
Showing 12 changed files with 403 additions and 7 deletions.
4 changes: 2 additions & 2 deletions build-release-pkgs.xml
Expand Up @@ -86,10 +86,10 @@
<property name="svnbase" <property name="svnbase"
value="https://svn.jboss.org/repos/byteman/tags"/> value="https://svn.jboss.org/repos/byteman/tags"/>
<!-- The tag as it appears under svnbase --> <!-- The tag as it appears under svnbase -->
<property name="tag" value="Byteman_1_2_0"/> <property name="tag" value="Byteman_1_2_0_1"/>
<!-- The file name base for the user downloadable files. Derive it <!-- The file name base for the user downloadable files. Derive it
from the tag --> from the tag -->
<property name="filename" value="1.2.0"/> <property name="filename" value="1.2.0.1"/>
<!-- the location the Byteman web site content svn is checked out to --> <!-- the location the Byteman web site content svn is checked out to -->
<property name="cmsdir" value="/home/adinn/jboss/byteman/"/> <property name="cmsdir" value="/home/adinn/jboss/byteman/"/>
<!-- the location the maven repository svn is checked out to. <!-- the location the maven repository svn is checked out to.
Expand Down
Expand Up @@ -213,7 +213,11 @@ public void traceRun(Runnable runnable, Object key)
StackTraceElement[] stack = Thread.currentThread().getStackTrace(); StackTraceElement[] stack = Thread.currentThread().getStackTrace();


buffer.append(" from "); buffer.append(" from ");
printlnFrame(buffer, i); if (i < l - 1) {
printlnFrame(buffer, i + 1);
} else {
buffer.append(" VM runtime\n");
}
trace(key, buffer.toString()); trace(key, buffer.toString());
} }
} }
4 changes: 2 additions & 2 deletions src/org/jboss/byteman/agent/Transformer.java
Expand Up @@ -287,10 +287,10 @@ public byte[] transform(ClassLoader loader,
// TODO -- we probably don't want to inject twice in such cases so we ought to remember whether // TODO -- we probably don't want to inject twice in such cases so we ought to remember whether
// TODO -- we have seen an interface before // TODO -- we have seen an interface before
String interfaceName = interfaces[i].getName(); String interfaceName = interfaces[i].getName();
newBuffer = tryTransform(newBuffer, internalName, loader, classBeingRedefined, interfaceName, false, true); newBuffer = tryTransform(newBuffer, internalName, loader, classBeingRedefined, interfaceName, true, true);
dotIdx = interfaceName.lastIndexOf('.'); dotIdx = interfaceName.lastIndexOf('.');
if (dotIdx >= 0) { if (dotIdx >= 0) {
newBuffer = tryTransform(newBuffer, internalName, loader, classBeingRedefined, interfaceName.substring(dotIdx + 1), false, true); newBuffer = tryTransform(newBuffer, internalName, loader, classBeingRedefined, interfaceName.substring(dotIdx + 1), true, true);
} }
} }


Expand Down
99 changes: 99 additions & 0 deletions tests/build.xml
Expand Up @@ -434,6 +434,48 @@
--> -->
<test name="org.jboss.byteman.tests.misc.TestRecursiveTriggers"/> <test name="org.jboss.byteman.tests.misc.TestRecursiveTriggers"/>
</junit> </junit>
<junit fork="true" showoutput="true">
<classpath>
<pathelement location="${build.lib.dir}/byteman-tests.jar"/>
<pathelement location="${junit.home}/${junit.jar}"/>
</classpath>
<jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/misc/TestOverridingInjection.txt"/>
<!--
<jvmarg value="-Xdebug"/>
<jvmarg value="-Xnoagent"/>
<jvmarg value="-Djava.compiler=NONE"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
-->
<test name="org.jboss.byteman.tests.misc.TestOverridingInjection"/>
</junit>
<junit fork="true" showoutput="true">
<classpath>
<pathelement location="${build.lib.dir}/byteman-tests.jar"/>
<pathelement location="${junit.home}/${junit.jar}"/>
</classpath>
<jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/misc/TestInterfaceInjection.txt"/>
<!--
<jvmarg value="-Xdebug"/>
<jvmarg value="-Xnoagent"/>
<jvmarg value="-Djava.compiler=NONE"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
-->
<test name="org.jboss.byteman.tests.misc.TestInterfaceInjection"/>
</junit>
<junit fork="true" showoutput="true">
<classpath>
<pathelement location="${build.lib.dir}/byteman-tests.jar"/>
<pathelement location="${junit.home}/${junit.jar}"/>
</classpath>
<jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/misc/TestOverridingInterfaceInjection.txt"/>
<!--
<jvmarg value="-Xdebug"/>
<jvmarg value="-Xnoagent"/>
<jvmarg value="-Djava.compiler=NONE"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
-->
<test name="org.jboss.byteman.tests.misc.TestOverridingInterfaceInjection"/>
</junit>
</target> </target>


<target name="tests.misc.compiled"> <target name="tests.misc.compiled">
Expand All @@ -452,6 +494,63 @@
--> -->
<test name="org.jboss.byteman.tests.misc.TestRecursiveTriggers"/> <test name="org.jboss.byteman.tests.misc.TestRecursiveTriggers"/>
</junit> </junit>
<junit fork="true" showoutput="true">
<classpath>
<pathelement location="${build.lib.dir}/byteman-tests.jar"/>
<pathelement location="${junit.home}/${junit.jar}"/>
</classpath>
<jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/misc/TestOverridingInjection.txt"/>
<jvmarg value="-Dorg.jboss.byteman.compileToBytecode"/>
<!-- uncomment to dump generated code
<jvmarg value="-Dorg.jboss.byteman.dump.generated.classes"/>
<jvmarg value="-Dorg.jboss.byteman.dump.generated.classes.directory=dump"/>
-->
<!--
<jvmarg value="-Xdebug"/>
<jvmarg value="-Xnoagent"/>
<jvmarg value="-Djava.compiler=NONE"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
-->
<test name="org.jboss.byteman.tests.misc.TestOverridingInjection"/>
</junit>
<junit fork="true" showoutput="true">
<classpath>
<pathelement location="${build.lib.dir}/byteman-tests.jar"/>
<pathelement location="${junit.home}/${junit.jar}"/>
</classpath>
<jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/misc/TestInterfaceInjection.txt"/>
<jvmarg value="-Dorg.jboss.byteman.compileToBytecode"/>
<!-- uncomment to dump generated code
<jvmarg value="-Dorg.jboss.byteman.dump.generated.classes"/>
<jvmarg value="-Dorg.jboss.byteman.dump.generated.classes.directory=dump"/>
-->
<!--
<jvmarg value="-Xdebug"/>
<jvmarg value="-Xnoagent"/>
<jvmarg value="-Djava.compiler=NONE"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
-->
<test name="org.jboss.byteman.tests.misc.TestInterfaceInjection"/>
</junit>
<junit fork="true" showoutput="true">
<classpath>
<pathelement location="${build.lib.dir}/byteman-tests.jar"/>
<pathelement location="${junit.home}/${junit.jar}"/>
</classpath>
<jvmarg value="-javaagent:${byteman.home}/${byteman.jar}=script:${scripts.dir}/misc/TestOverridingInterfaceInjection.txt"/>
<jvmarg value="-Dorg.jboss.byteman.compileToBytecode"/>
<!-- uncomment to dump generated code
<jvmarg value="-Dorg.jboss.byteman.dump.generated.classes"/>
<jvmarg value="-Dorg.jboss.byteman.dump.generated.classes.directory=dump"/>
-->
<!--
<jvmarg value="-Xdebug"/>
<jvmarg value="-Xnoagent"/>
<jvmarg value="-Djava.compiler=NONE"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
-->
<test name="org.jboss.byteman.tests.misc.TestOverridingInterfaceInjection"/>
</junit>
</target> </target>


<target name="tests.bugfixes"> <target name="tests.bugfixes">
Expand Down
33 changes: 33 additions & 0 deletions tests/dd/scripts/misc/TestInterfaceInjection.txt
@@ -0,0 +1,33 @@
##############################################################################
# JBoss, Home of Professional Open Source
# Copyright 2009, Red Hat Middleware LLC, and individual contributors
# by the @authors tag. See the copyright.txt in the distribution for a
# full listing of individual contributors.
#
# This is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 2.1 of
# the License, or (at your option) any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this software; if not, write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
#
# @authors Andrew Dinn
#

RULE test entry trigger for interface method
INTERFACE TestInterface
METHOD testMethod()
HELPER org.jboss.byteman.tests.helpers.Default
AT ENTRY
BIND test : Test = $0.getTest()
IF TRUE
DO test.log("ENTRY triggered in TestInterface.testMethod")
ENDRULE
43 changes: 43 additions & 0 deletions tests/dd/scripts/misc/TestOverridingInjection.txt
@@ -0,0 +1,43 @@
##############################################################################
# JBoss, Home of Professional Open Source
# Copyright 2009, Red Hat Middleware LLC, and individual contributors
# by the @authors tag. See the copyright.txt in the distribution for a
# full listing of individual contributors.
#
# This is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 2.1 of
# the License, or (at your option) any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this software; if not, write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
#
# @authors Andrew Dinn
#

RULE test overriding entry trigger for constructor
CLASS ^TestEntryExitAuxiliary
METHOD <init>(Test)
HELPER org.jboss.byteman.tests.helpers.Default
AT ENTRY
BIND test : Test = $1
IF TRUE
DO test.log("ENTRY triggered in constructor")
ENDRULE

RULE test overriding entry trigger for method
CLASS ^TestEntryExitAuxiliary
METHOD testMethod()
HELPER org.jboss.byteman.tests.helpers.Default
AT ENTRY
BIND test : Test = $0.getTest()
IF TRUE
DO test.log("ENTRY triggered in ^TestEntryExitAuxiliary.testMethod")
ENDRULE
33 changes: 33 additions & 0 deletions tests/dd/scripts/misc/TestOverridingInterfaceInjection.txt
@@ -0,0 +1,33 @@
##############################################################################
# JBoss, Home of Professional Open Source
# Copyright 2009, Red Hat Middleware LLC, and individual contributors
# by the @authors tag. See the copyright.txt in the distribution for a
# full listing of individual contributors.
#
# This is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 2.1 of
# the License, or (at your option) any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this software; if not, write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
#
# @authors Andrew Dinn
#

RULE test overriding entry trigger for interface method
INTERFACE ^TestInterface
METHOD testMethod()
HELPER org.jboss.byteman.tests.helpers.Default
AT ENTRY
BIND test : Test = $0.getTest()
IF TRUE
DO test.log("ENTRY triggered in ^TestInterface.testMethod")
ENDRULE
Expand Up @@ -28,8 +28,7 @@
/** /**
* Auxiliary class used by entry and exit location test classes * Auxiliary class used by entry and exit location test classes
*/ */
public class TestEntryExitAuxiliary public class TestEntryExitAuxiliary implements TestInterface {
{
protected Test test; protected Test test;


public TestEntryExitAuxiliary(Test test) public TestEntryExitAuxiliary(Test test)
Expand Down
12 changes: 12 additions & 0 deletions tests/src/org/jboss/byteman/tests/auxiliary/TestInterface.java
@@ -0,0 +1,12 @@
package org.jboss.byteman.tests.auxiliary;

import org.jboss.byteman.tests.Test;

/**
* Interface used to test injection through interfaces
*/
public interface TestInterface {
void testMethod();

Test getTest();
}
56 changes: 56 additions & 0 deletions tests/src/org/jboss/byteman/tests/misc/TestInterfaceInjection.java
@@ -0,0 +1,56 @@
package org.jboss.byteman.tests.misc;

import org.jboss.byteman.tests.Test;
import org.jboss.byteman.tests.auxiliary.TestEntryExitAuxiliarySub;
import org.jboss.byteman.tests.auxiliary.TestEntryExitAuxiliary;

/**
* Test class to ensure injection into interfaces without overriding works as expected
*/
public class TestInterfaceInjection extends Test
{
public TestInterfaceInjection()
{
super(TestInterfaceInjection.class.getName());
}

public void test()
{
// this is much the same as the TestEntry code but we use an interface rule to inject
// rule trace into the parent testMethod. note we cannot inject into constructors via
// an interface rule

try {
TestEntryExitAuxiliary testAuxiliary;
log("creating TestEntryExitAuxiliarySub");
testAuxiliary = new TestEntryExitAuxiliarySub(this);
log("created TestEntryExitAuxiliarySub");
log("calling TestEntryExitAuxiliarySub.testMethod");
testAuxiliary.testMethod();
log("called TestEntryExitAuxiliarySub.testMethod");
} catch (Exception e) {
log(e);
}

checkOutput();
}

@Override
public String getExpected() {
logExpected("creating TestEntryExitAuxiliarySub");
// parent constructor will log first
logExpected("inside TestEntryExitAuxiliary(Test)");
logExpected("inside TestEntryExitAuxiliarySub(Test)");
logExpected("created TestEntryExitAuxiliarySub");
// we should only see injected coed ein the superclass method
logExpected("calling TestEntryExitAuxiliarySub.testMethod");
logExpected("inside TestEntryExitAuxiliarySub.testMethod");
logExpected("calling TestEntryExitAuxiliary.testMethod");
logExpected("ENTRY triggered in TestInterface.testMethod");
logExpected("inside TestEntryExitAuxiliary.testMethod");
logExpected("called TestEntryExitAuxiliary.testMethod");
logExpected("called TestEntryExitAuxiliarySub.testMethod");

return super.getExpected();
}
}

0 comments on commit 2eedaf4

Please sign in to comment.