1 /*
   2  * Copyright (c) 2012, 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  * @run clean TestSerializationMismatch
  37  * @run main/othervm TestSerializationMismatch
  38  *
  39  */
  40 public class TestSerializationMismatch {
  41     static final String clientDir = "Client";
  42     static final String serverDir = "Server";
  43     static final String testSrc = System.getProperty("test.src");
  44     static final String testSrcDir = testSrc != null ? testSrc : ".";
  45     static final String testSrcClientDir = testSrcDir + File.separator + clientDir + File.separator;
  46     static final String testSrcServerDir = testSrcDir + File.separator + serverDir + File.separator;
  47     static final String testClasses = System.getProperty("test.classes");
  48     static final String testClassesDir = testClasses != null ? testClasses : ".";
  49     static final String testClassesClientDir = testClassesDir + File.separator + clientDir + File.separator;
  50     static final String testClassesServerDir = testClassesDir + File.separator + serverDir + File.separator;
  51 
  52     static final boolean debug = true;
  53 
  54     public static void main(String[] args) throws Exception {
  55         setup();
  56 
  57         compileClient();
  58         compileServer();
  59 
  60         debug("starting server");
  61         String url = startServer();
  62         debug("server started and listening on " + url);
  63         debug("starting client");
  64         startClient(url);
  65     }
  66 
  67     static void setup() {
  68         debug("setting up the output dirs");
  69         cleanupDir(testClassesClientDir);
  70         cleanupDir(testClassesServerDir);
  71     }
  72 
  73     static void cleanupDir(String path) {
  74         debug("cleaning " + path);
  75         File dir = new File(path);
  76         if (dir.exists()) {
  77             for(File src : dir.listFiles()) {
  78                 boolean rslt = src.delete();
  79                 debug((rslt == false ? "not " : "") + "deleted " + src);
  80             }
  81         } else {
  82             dir.mkdirs();
  83         }
  84     }
  85 
  86     static void compileClient() {
  87         debug("compiling client");
  88         compile("-d" , testClassesClientDir,
  89             "-sourcepath", testSrcClientDir,
  90             testSrcClientDir + "Client.java",
  91             testSrcClientDir + "ConfigKey.java",
  92             testSrcClientDir + "TestNotification.java");
  93     }
  94 
  95     static void compileServer() {
  96         debug("compiling server");
  97         compile("-d" , testClassesServerDir,
  98             "-sourcepath", testSrcServerDir,
  99             testSrcServerDir + "Server.java",
 100             testSrcServerDir + "ConfigKey.java",
 101             testSrcServerDir + "TestNotification.java",
 102             testSrcServerDir + "Ste.java",
 103             testSrcServerDir + "SteMBean.java");
 104     }
 105 
 106     static String startServer() throws Exception {
 107         ClassLoader serverCL = customCL(testClassesServerDir);
 108 
 109         Class serverClz = serverCL.loadClass("Server");
 110         Method startMethod = serverClz.getMethod("start");
 111         return (String)startMethod.invoke(null);
 112     }
 113 
 114     static void startClient(String url) throws Exception {
 115         ClassLoader clientCL = customCL(testClassesClientDir);
 116 
 117         Thread.currentThread().setContextClassLoader(clientCL);
 118         Class clientClz = clientCL.loadClass("Client");
 119         Method runMethod = clientClz.getMethod("run", String.class);
 120         runMethod.invoke(null, url);
 121     }
 122 
 123     static ClassLoader customCL(String classDir) throws Exception {
 124         return new URLClassLoader(
 125             new URL[]{
 126                 new File(classDir).toURI().toURL()
 127             },
 128             TestSerializationMismatch.class.getClassLoader()
 129         );
 130     }
 131 
 132     static void debug(Object message) {
 133         if (debug) {
 134             System.out.println(message);
 135         }
 136     }
 137 
 138     /* run javac <args> */
 139     static void compile(String... args) {
 140         debug("Running: javac " + Arrays.toString(args));
 141         if (com.sun.tools.javac.Main.compile(args) != 0) {
 142             throw new RuntimeException("javac failed: args=" + Arrays.toString(args));
 143         }
 144     }
 145 }