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 
  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 }