1/*
2 * Copyright (c) 2013, 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import java.io.File;
25import java.lang.reflect.Method;
26import java.net.URL;
27import java.net.URLClassLoader;
28import java.util.Arrays;
29
30/**
31 * @test
32 * @summary Tests for the RMI unmarshalling errors not to cause silent failure.
33 * @author Jaroslav Bachorik
34 * @bug 6937053 8005472
35 *
36 * @modules java.management
37 *          jdk.compiler
38 * @run clean TestSerializationMismatch
39 * @run main/othervm TestSerializationMismatch
40 *
41 */
42public class TestSerializationMismatch {
43    static final String clientDir = "Client";
44    static final String serverDir = "Server";
45    static final String testSrc = System.getProperty("test.src");
46    static final String testSrcDir = testSrc != null ? testSrc : ".";
47    static final String testSrcClientDir = testSrcDir + File.separator + clientDir + File.separator;
48    static final String testSrcServerDir = testSrcDir + File.separator + serverDir + File.separator;
49    static final String testClasses = System.getProperty("test.classes");
50    static final String testClassesDir = testClasses != null ? testClasses : ".";
51    static final String testClassesClientDir = testClassesDir + File.separator + clientDir + File.separator;
52    static final String testClassesServerDir = testClassesDir + File.separator + serverDir + File.separator;
53
54    static final boolean debug = true;
55
56    public static void main(String[] args) throws Exception {
57        setup();
58
59        compileClient();
60        compileServer();
61
62        debug("starting server");
63        String url = startServer();
64        debug("server started and listening on " + url);
65        debug("starting client");
66        startClient(url);
67    }
68
69    static void setup() {
70        debug("setting up the output dirs");
71        cleanupDir(testClassesClientDir);
72        cleanupDir(testClassesServerDir);
73    }
74
75    static void cleanupDir(String path) {
76        debug("cleaning " + path);
77        File dir = new File(path);
78        if (dir.exists()) {
79            for(File src : dir.listFiles()) {
80                boolean rslt = src.delete();
81                debug((rslt == false ? "not " : "") + "deleted " + src);
82            }
83        } else {
84            dir.mkdirs();
85        }
86    }
87
88    static void compileClient() {
89        debug("compiling client");
90        compile("-d" , testClassesClientDir,
91            "-sourcepath", testSrcClientDir,
92            testSrcClientDir + "Client.java",
93            testSrcClientDir + "ConfigKey.java",
94            testSrcClientDir + "TestNotification.java");
95    }
96
97    static void compileServer() {
98        debug("compiling server");
99        compile("-d" , testClassesServerDir,
100            "-sourcepath", testSrcServerDir,
101            testSrcServerDir + "Server.java",
102            testSrcServerDir + "ConfigKey.java",
103            testSrcServerDir + "TestNotification.java",
104            testSrcServerDir + "Ste.java",
105            testSrcServerDir + "SteMBean.java");
106    }
107
108    static String startServer() throws Exception {
109        ClassLoader serverCL = customCL(testClassesServerDir);
110
111        Class serverClz = serverCL.loadClass("Server");
112        Method startMethod = serverClz.getMethod("start");
113        return (String)startMethod.invoke(null);
114    }
115
116    static void startClient(String url) throws Exception {
117        ClassLoader clientCL = customCL(testClassesClientDir);
118
119        Thread.currentThread().setContextClassLoader(clientCL);
120        Class clientClz = clientCL.loadClass("Client");
121        Method runMethod = clientClz.getMethod("run", String.class);
122        runMethod.invoke(null, url);
123    }
124
125    static ClassLoader customCL(String classDir) throws Exception {
126        return new URLClassLoader(
127            new URL[]{
128                new File(classDir).toURI().toURL()
129            },
130            TestSerializationMismatch.class.getClassLoader()
131        );
132    }
133
134    static void debug(Object message) {
135        if (debug) {
136            System.out.println(message);
137        }
138    }
139
140    /* run javac <args> */
141    static void compile(String... args) {
142        debug("Running: javac " + Arrays.toString(args));
143        if (com.sun.tools.javac.Main.compile(args) != 0) {
144            throw new RuntimeException("javac failed: args=" + Arrays.toString(args));
145        }
146    }
147}
148