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: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to