blob: 68683f2a37fd3b8b20aefd232308b2f59770f84d [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/*
25 *
26 *
27 * Unit test for Instrumentation appendToBootstrapClassLoaderSearch method.
28 * The test works as follows:
29 *
30 * 1. Load class "Application" and execute the doSomething() method
31 *
32 * 2. Append Tracer.jar to the boot class path - Tracer.jar has a single
33 * class org.tools.Tracer.
34 *
35 * 3. Redefine class "Application" - the redefined version has an instrumented
36 * version of doSomething() that invokes a method in org.tools.Tracer.
37 *
38 * 4. Re-execute doSomething() - this should provoke the loading of org.tools.Tracer
39 * from the jar file. If updated version of doSomething() executes then test
40 * passes.
41 */
42import java.lang.instrument.*;
43import java.util.jar.JarFile;
44import java.io.*;
45
46public class DynamicTest {
47
48 public static void main(String args[]) throws Exception {
49
50 // Load Application
51 Application app = new Application();
52 if (app.doSomething() != 1) {
53 throw new RuntimeException("Test configuration error - doSomething should return 1");
54 }
55
56 // Add org.tools.Tracer package to the boot class path
57 JarFile jf = new JarFile("Tracer.jar");
58 Agent.getInstrumentation().appendToBootstrapClassLoaderSearch(jf);
59
60 // Redefine Application with the instrumented version
61 File f = new File("InstrumentedApplication.bytes");
62 int len = (int)f.length();
63 byte[] def = new byte[len];
64
65 FileInputStream fis = new FileInputStream(f);
66 int nread = 0;
67 do {
68 int n = fis.read(def, nread, len-nread);
69 if (n > 0) {
70 nread += n;
71 }
72 } while (nread < len);
73
74 ClassDefinition classDefs = new ClassDefinition(Application.class, def);
75 Agent.getInstrumentation().redefineClasses(new ClassDefinition[] { classDefs } );
76
77 // Re-execute doSomething() - should get 3 messages printed
78 int res = app.doSomething();
79 if (res != 3) {
80 throw new RuntimeException("FAIL: redefined Application returned: " + res);
81 }
82 System.out.println("PASS: Test passed.");
83 }
84}