TestSerializationMismatch.java revision 7269:dc22b7241a70
1
2import java.io.File;
3import java.lang.reflect.Method;
4import java.net.URL;
5import java.net.URLClassLoader;
6import java.util.Arrays;
7
8/**
9 * @test
10 * @summary Tests for the RMI unmarshalling errors not to cause silent failure.
11 * @author Jaroslav Bachorik
12 * @bug 6937053 8005472
13 *
14 * @run clean TestSerializationMismatch
15 * @run main/othervm TestSerializationMismatch
16 *
17 */
18public class TestSerializationMismatch {
19    static final String clientDir = "Client";
20    static final String serverDir = "Server";
21    static final String testSrc = System.getProperty("test.src");
22    static final String testSrcDir = testSrc != null ? testSrc : ".";
23    static final String testSrcClientDir = testSrcDir + File.separator + clientDir + File.separator;
24    static final String testSrcServerDir = testSrcDir + File.separator + serverDir + File.separator;
25    static final String testClasses = System.getProperty("test.classes");
26    static final String testClassesDir = testClasses != null ? testClasses : ".";
27    static final String testClassesClientDir = testClassesDir + File.separator + clientDir + File.separator;
28    static final String testClassesServerDir = testClassesDir + File.separator + serverDir + File.separator;
29
30    static final boolean debug = true;
31
32    public static void main(String[] args) throws Exception {
33        setup();
34
35        compileClient();
36        compileServer();
37
38        debug("starting server");
39        String url = startServer();
40        debug("server started and listening on " + url);
41        debug("starting client");
42        startClient(url);
43    }
44
45    static void setup() {
46        debug("setting up the output dirs");
47        cleanupDir(testClassesClientDir);
48        cleanupDir(testClassesServerDir);
49    }
50
51    static void cleanupDir(String path) {
52        debug("cleaning " + path);
53        File dir = new File(path);
54        if (dir.exists()) {
55            for(File src : dir.listFiles()) {
56                boolean rslt = src.delete();
57                debug((rslt == false ? "not " : "") + "deleted " + src);
58            }
59        } else {
60            dir.mkdirs();
61        }
62    }
63
64    static void compileClient() {
65        debug("compiling client");
66        compile("-d" , testClassesClientDir,
67            "-sourcepath", testSrcClientDir,
68            testSrcClientDir + "Client.java",
69            testSrcClientDir + "ConfigKey.java",
70            testSrcClientDir + "TestNotification.java");
71    }
72
73    static void compileServer() {
74        debug("compiling server");
75        compile("-d" , testClassesServerDir,
76            "-sourcepath", testSrcServerDir,
77            testSrcServerDir + "Server.java",
78            testSrcServerDir + "ConfigKey.java",
79            testSrcServerDir + "TestNotification.java",
80            testSrcServerDir + "Ste.java",
81            testSrcServerDir + "SteMBean.java");
82    }
83
84    static String startServer() throws Exception {
85        ClassLoader serverCL = customCL(testClassesServerDir);
86
87        Class serverClz = serverCL.loadClass("Server");
88        Method startMethod = serverClz.getMethod("start");
89        return (String)startMethod.invoke(null);
90    }
91
92    static void startClient(String url) throws Exception {
93        ClassLoader clientCL = customCL(testClassesClientDir);
94
95        Thread.currentThread().setContextClassLoader(clientCL);
96        Class clientClz = clientCL.loadClass("Client");
97        Method runMethod = clientClz.getMethod("run", String.class);
98        runMethod.invoke(null, url);
99    }
100
101    static ClassLoader customCL(String classDir) throws Exception {
102        return new URLClassLoader(
103            new URL[]{
104                new File(classDir).toURI().toURL()
105            },
106            TestSerializationMismatch.class.getClassLoader()
107        );
108    }
109
110    static void debug(Object message) {
111        if (debug) {
112            System.out.println(message);
113        }
114    }
115
116    /* run javac <args> */
117    static void compile(String... args) {
118        debug("Running: javac " + Arrays.toString(args));
119        if (com.sun.tools.javac.Main.compile(args) != 0) {
120            throw new RuntimeException("javac failed: args=" + Arrays.toString(args));
121        }
122    }
123}
124