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 
24 import java.io.File;
25 import java.lang.reflect.Method;
26 import java.net.URL;
27 import java.net.URLClassLoader;
28 import 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  */
42 public 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 
main(String[] args)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 
setup()69     static void setup() {
70         debug("setting up the output dirs");
71         cleanupDir(testClassesClientDir);
72         cleanupDir(testClassesServerDir);
73     }
74 
cleanupDir(String path)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 
compileClient()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 
compileServer()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 
startServer()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 
startClient(String url)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 
customCL(String classDir)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 
debug(Object message)134     static void debug(Object message) {
135         if (debug) {
136             System.out.println(message);
137         }
138     }
139 
140     /* run javac <args> */
compile(String... 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