On Aug 20, 2013, at 1:10 PM, Mark Thomas wrote:
> On 20/08/2013 18:47, Nick Williams wrote:
>> My remaining original concern was the best approach for weaving byte
>> code in Tomcat's unit tests, which I detailed in an earlier message.
>
> Use the Weaver to completely replace the byte code of the weaved class
> with the byte code from another class? That way the compiler creates the
> byte code so you know it is valid.
I ran in to a roadblock with this idea. Part of the byte code of a class
includes the fully-qualified class name. If I create a class, say
UnweavedClass, and replace its byte code in my fake transformer with that of
another class, the FQCN changes. This results in a NoClassDefFoundError because
the class loader is looking for UnweavenClass in be in the byte code when
really some other class is.
My backup idea is slightly less clean but, IMO, still more clean than adding
ASM as a test-time dependency and trying to figure all of that out. I locally
compiled fake "weaved" versions of the UnweavedClass (with the modified
behavior) and then translated each version into a Java byte array definition.
(These are extremely simple on-line, one-method classes, so the byte arrays are
relatively short.) I then simply embedded the byte array definitions as static
final byte[] fields the test class and replaced the byte code in my fake
transformer with those embedded fields' content. I've tested this and it works
great.
Here's what the embedded byte code for the fake weaved classes looks like. What
do you think? Is this acceptable?
/**
* Compiled version of org.apache.tomcat.unittest.weaving.UnweavedClass,
except that
* the doMethod method returns "Hello, Weaver #1!".
*/
private static final byte[] WEAVED_REPLACEMENT_1 = new byte[] {
-54, -2, -70, -66, 0, 0, 0, 50, 0, 17, 10, 0, 4, 0, 13, 8, 0, 14,
7, 0, 15, 7, 0, 16,
1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4,
67, 111, 100, 101,
1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97,
98, 108, 101, 1, 0, 8,
100, 111, 77, 101, 116, 104, 111, 100, 1, 0, 20, 40, 41, 76, 106,
97, 118, 97, 47, 108,
97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 10, 83,
111, 117, 114, 99,
101, 70, 105, 108, 101, 1, 0, 18, 85, 110, 119, 101, 97, 118, 101,
100, 67, 108, 97,
115, 115, 46, 106, 97, 118, 97, 12, 0, 5, 0, 6, 1, 0, 17, 72, 101,
108, 108, 111, 44,
32, 87, 101, 97, 118, 101, 114, 32, 35, 49, 33, 1, 0, 48, 111, 114,
103, 47, 97, 112,
97, 99, 104, 101, 47, 116, 111, 109, 99, 97, 116, 47, 117, 110,
105, 116, 116, 101,
115, 116, 47, 119, 101, 97, 118, 105, 110, 103, 47, 85, 110, 119,
101, 97, 118, 101,
100, 67, 108, 97, 115, 115, 1, 0, 16, 106, 97, 118, 97, 47, 108,
97, 110, 103, 47, 79,
98, 106, 101, 99, 116, 0, 33, 0, 3, 0, 4, 0, 0, 0, 0, 0, 2, 0, 1,
0, 5, 0, 6, 0, 1, 0,
7, 0, 0, 0, 29, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0,
0, 1, 0, 8, 0, 0, 0,
6, 0, 1, 0, 0, 0, 3, 0, 1, 0, 9, 0, 10, 0, 1, 0, 7, 0, 0, 0, 27, 0,
1, 0, 1, 0, 0, 0,
3, 18, 2, -80, 0, 0, 0, 1, 0, 8, 0, 0, 0, 6, 0, 1, 0, 0, 0, 6, 0,
1, 0, 11, 0, 0, 0, 2,
0, 12
};
/**
* Compiled version of org.apache.tomcat.unittest.weaving.UnweavedClass,
except that
* the doMethod method returns "Hello, Weaver #2!".
*/
private static final byte[] WEAVED_REPLACEMENT_2 = new byte[] {
-54, -2, -70, -66, 0, 0, 0, 50, 0, 17, 10, 0, 4, 0, 13, 8, 0, 14,
7, 0, 15, 7, 0, 16,
1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4,
67, 111, 100, 101,
1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97,
98, 108, 101, 1, 0, 8,
100, 111, 77, 101, 116, 104, 111, 100, 1, 0, 20, 40, 41, 76, 106,
97, 118, 97, 47, 108,
97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 10, 83,
111, 117, 114, 99,
101, 70, 105, 108, 101, 1, 0, 18, 85, 110, 119, 101, 97, 118, 101,
100, 67, 108, 97,
115, 115, 46, 106, 97, 118, 97, 12, 0, 5, 0, 6, 1, 0, 17, 72, 101,
108, 108, 111, 44,
32, 87, 101, 97, 118, 101, 114, 32, 35, 50, 33, 1, 0, 48, 111, 114,
103, 47, 97, 112,
97, 99, 104, 101, 47, 116, 111, 109, 99, 97, 116, 47, 117, 110,
105, 116, 116, 101,
115, 116, 47, 119, 101, 97, 118, 105, 110, 103, 47, 85, 110, 119,
101, 97, 118, 101,
100, 67, 108, 97, 115, 115, 1, 0, 16, 106, 97, 118, 97, 47, 108,
97, 110, 103, 47, 79,
98, 106, 101, 99, 116, 0, 33, 0, 3, 0, 4, 0, 0, 0, 0, 0, 2, 0, 1,
0, 5, 0, 6, 0, 1, 0,
7, 0, 0, 0, 29, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0,
0, 1, 0, 8, 0, 0, 0,
6, 0, 1, 0, 0, 0, 3, 0, 1, 0, 9, 0, 10, 0, 1, 0, 7, 0, 0, 0, 27, 0,
1, 0, 1, 0, 0, 0,
3, 18, 2, -80, 0, 0, 0, 1, 0, 8, 0, 0, 0, 6, 0, 1, 0, 0, 0, 6, 0,
1, 0, 11, 0, 0, 0, 2,
0, 12
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]