# HG changeset patch # User mli # Date 1481506767 28800 # Node ID 814a5ddacddfd9c5cb9c6572eea15a95cd8784c0 # Parent d1c0a9123f872f55fe64172f6090fa42461f4d13 7195382: TEST_BUG: java/rmi/activation/CommandEnvironment/SetChildEnv.java can fail Reviewed-by: rriggs diff -r d1c0a9123f87 -r 814a5ddacddf jdk/test/java/rmi/activation/CommandEnvironment/SetChildEnv.java --- a/jdk/test/java/rmi/activation/CommandEnvironment/SetChildEnv.java Sun Dec 11 12:20:45 2016 +0100 +++ b/jdk/test/java/rmi/activation/CommandEnvironment/SetChildEnv.java Sun Dec 11 17:39:27 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,10 +39,14 @@ * java.rmi/sun.rmi.server * java.rmi/sun.rmi.transport * java.rmi/sun.rmi.transport.tcp - * @build TestLibrary RMID ActivationLibrary + * java.base/sun.nio.ch + * @build TestLibrary RMID ActivationLibrary RMIDSelectorProvider * Eliza Retireable Doctor Doctor_Stub - * @run main/othervm/timeout=240/policy=security.policy - * -Djava.compiler=NONE SetChildEnv + * @run main/othervm/timeout=240/policy=security.policy SetChildEnv 0 0 + * @run main/othervm/timeout=240/policy=security.policy SetChildEnv 1 -verbosegc + * 2 foo.bar=SetChildEnvTest sun.rmi.server.doSomething=true + * @run main/othervm/timeout=240/policy=security.policy SetChildEnv 0 1 parameter.count=zero + * @run main/othervm/timeout=240/policy=security.policy SetChildEnv 1 -Xmx32m 0 */ import java.rmi.*; import java.util.Properties; @@ -55,159 +59,136 @@ public class SetChildEnv { - public static void main(String argv[]) - throws Exception - { - int runningPort = TestLibrary.getUnusedRandomPort(); - - System.out.println("java.compiler=" + System.getProperty("java.compiler")); - // don't embed spaces in any of the test args/props, because - // they won't be parsed properly - runwith (new String[0], new String[0], runningPort); + public static void main(String argv[]) throws Exception { + RMID rmid = null; + try { + System.out.println("java.compiler=" + System.getProperty("java.compiler")); + int paramCount = Integer.valueOf(argv[0]); + String[] params = paramCount == 0 ? + new String[0] : Arrays.copyOfRange(argv, 1, paramCount+1); + int propCount = Integer.valueOf(argv[paramCount+1]); + String[] props = propCount == 0 ? + new String[0] : + Arrays.copyOfRange(argv, paramCount+2, paramCount+propCount+2); - runwith ( - new String[] { "-verbosegc" }, - new String[] { "foo.bar=SetChildEnvTest", - "sun.rmi.server.doSomething=true" }, - runningPort - ); + TestLibrary.suggestSecurityManager(TestParams.defaultSecurityManager); + + // make a "watcher" which listens on a pipe and searches for + // the debugExec line while teeing to System.err + DebugExecWatcher watcher = DebugExecWatcher.makeWithPipe(); - runwith ( - new String[] { }, - new String[] { "parameter.count=zero" }, - runningPort - ); + RMID.removeLog(); + rmid = RMID.createRMIDOnEphemeralPort(watcher.otherEnd(), + watcher.otherEnd(), true); + + rmid.start(); - runwith ( - new String[] { "-Xmx32m" }, - new String[] { }, - runningPort - ); - } + // compile props + Properties p = new Properties(); + p.put("java.security.policy", TestParams.defaultGroupPolicy); + p.put("java.security.manager", TestParams.defaultSecurityManager); + //p.put("java.rmi.server.logCalls", "true"); + int i; + for (i = 0; i < props.length; i++) { + p.put(props[i].substring(0, props[i].indexOf('=')), + props[i].substring(props[i].indexOf('=')+1)); + } + + // create CommandEnvironment and ActivationGroupDesc + ActivationGroupDesc.CommandEnvironment cmdenv = + new ActivationGroupDesc.CommandEnvironment( + null, + params); - private static void runwith( - String[] params, // extra args - String[] props, // extra system properties - int port // port on which to communicate - ) - throws Exception - { - TestLibrary.suggestSecurityManager(TestParams.defaultSecurityManager); + ActivationGroupDesc gdesc = new ActivationGroupDesc( + p, cmdenv); + + // register group + ActivationSystem actsys = ActivationGroup.getSystem(); + ActivationGroupID gid = actsys.registerGroup(gdesc); - // make a "watcher" which listens on a pipe and searches for - // the debugExec line while teeing to System.err - DebugExecWatcher watcher = DebugExecWatcher.makeWithPipe(); + // create ActivationDesc + ActivationDesc odesc = new ActivationDesc(gid, // group + "Doctor", // class + null, // codesource + null); // closure data - RMID.removeLog(); - RMID rmid = RMID.createRMID(watcher.otherEnd(), watcher.otherEnd(), - true, // debugExec turned on - true, port); + // register activatable object + Eliza doctor = (Eliza)Activatable.register(odesc); - rmid.start(); + // invoke a call with oh-so-humorous sample text + System.out.println ("Invoking complain()..."); + String complaint = + "HELP ME, DOCTOR. I FEEL VIOLENT TOWARDS PEOPLE " + + "WHO INQUIRE ABOUT MY PARENTS."; - // compile props - Properties p = new Properties(); - p.put("java.security.policy", TestParams.defaultGroupPolicy); - p.put("java.security.manager", TestParams.defaultSecurityManager); - //p.put("java.rmi.server.logCalls", "true"); - int i; - for (i = 0; i < props.length; i++) { - p.put(props[i].substring(0, props[i].indexOf('=')), - props[i].substring(props[i].indexOf('=')+1)); - } + System.out.println(complaint); + //Runtime.getRuntime().traceMethodCalls(true); + String res = doctor.complain(complaint); + //Runtime.getRuntime().traceMethodCalls(false); + System.out.println (" => " + res); - // create CommandEnvironment and ActivationGroupDesc - ActivationGroupDesc.CommandEnvironment cmdenv = - new ActivationGroupDesc.CommandEnvironment( - null, - params); + // Get debugExec line, allowing 15 seconds for it to flush + // through the buffers and pipes. + String found = watcher.found; + if (found == null) { + int fudge = 15; + while (found == null && --fudge > 0) { + Thread.sleep(1000); + found = watcher.found; + } + if (found == null) { + TestLibrary.bomb("rmid subprocess produced no " + + "recognizable debugExec line"); + } + } - ActivationGroupDesc gdesc = new ActivationGroupDesc( - p, cmdenv); - - // register group - ActivationSystem actsys = ActivationGroup.getSystem(); - ActivationGroupID gid = actsys.registerGroup(gdesc); + System.err.println("debugExec found: <<" + found + ">>"); + // q: first double-quote after debugExec + int q = found.indexOf('"', found.indexOf("rmid: debugExec")); + // qe: last double-quote on debugExec line + int qe = found.lastIndexOf('"'); + if (q <= 1 || qe <= q) { + TestLibrary.bomb("rmid subprocess produced " + + "mangled debugExec line"); + } - // create ActivationDesc - ActivationDesc odesc = new ActivationDesc(gid, // group - "Doctor", // class - null, // codesource - null); // closure data + // split args by whitespace + StringTokenizer tk = new StringTokenizer(found.substring(q+1, qe)); + tk.nextToken(); // skip command path/name - // register activatable object - Eliza doctor = (Eliza)Activatable.register(odesc); + // Now check off the requested args. Order isn't important, and + // any extra args are ignored, even if they're inconsistent or + // bargage, or duplicates. - // invoke a call with oh-so-humorous sample text - System.out.println ("Invoking complain()..."); - String complaint = - "HELP ME, DOCTOR. I FEEL VIOLENT TOWARDS PEOPLE " + - "WHO INQUIRE ABOUT MY PARENTS."; + Set argset = new HashSet(tk.countTokens()); + while (tk.hasMoreTokens()) { + argset.add(tk.nextToken()); + } - System.out.println(complaint); - //Runtime.getRuntime().traceMethodCalls(true); - String res = doctor.complain(complaint); - //Runtime.getRuntime().traceMethodCalls(false); - System.out.println (" => " + res); + int m; + for (m = 0; m < params.length; m++) { + if(!argset.contains(params[m])) + TestLibrary.bomb("Parameter \"" + params[m] + "\" not set"); + } - // Get debugExec line, allowing 15 seconds for it to flush - // through the buffers and pipes. - String found = watcher.found; - if (found == null) { - int fudge = 15; - while (found == null && --fudge > 0) { - Thread.sleep(1000); - found = watcher.found; + for (m = 0; m < props.length; m++) { + if (!argset.contains("-D" + props[m])) { + TestLibrary.bomb("Property binding \"" + props[m] + + "\" not set"); + } } - if (found == null) { - TestLibrary.bomb("rmid subprocess produced no " + - "recognizable debugExec line"); + + // End doctor + if (doctor instanceof Retireable) + ((Retireable)doctor).retire(); + actsys.unregisterGroup(gid); + } finally { + Thread.sleep(5000); + if (rmid != null) { + rmid.cleanup(); } } - - System.err.println("debugExec found: <<" + found + ">>"); - // q: first double-quote after debugExec - int q = found.indexOf('"', found.indexOf("rmid: debugExec")); - // qe: last double-quote on debugExec line - int qe = found.lastIndexOf('"'); - if (q <= 1 || qe <= q) { - TestLibrary.bomb("rmid subprocess produced " + - "mangled debugExec line"); - } - - // split args by whitespace - StringTokenizer tk = new StringTokenizer(found.substring(q+1, qe)); - tk.nextToken(); // skip command path/name - - // Now check off the requested args. Order isn't important, and - // any extra args are ignored, even if they're inconsistent or - // bargage, or duplicates. - - Set argset = new HashSet(tk.countTokens()); - while (tk.hasMoreTokens()) { - argset.add(tk.nextToken()); - } - - int m; - for (m = 0; m < params.length; m++) { - if(!argset.contains(params[m])) - TestLibrary.bomb("Parameter \"" + params[m] + "\" not set"); - } - - for (m = 0; m < props.length; m++) { - if (!argset.contains("-D" + props[m])) { - TestLibrary.bomb("Property binding \"" + props[m] + - "\" not set"); - } - } - - // End doctor - if (doctor instanceof Retireable) - ((Retireable)doctor).retire(); - actsys.unregisterGroup(gid); - - Thread.sleep(5000); - rmid.cleanup(); } public static class DebugExecWatcher @@ -272,75 +253,3 @@ } } } - -/* - code graveyard - - // activation should have proceeded by writing a wrapper.out - // when test.src/actgrpwrapper was run. - - // Read and check wrapper.out - BufferedReader r = new BufferedReader(new FileReader(wrapout)); - String[] realArgs = null; - String line; - - while ( (line = r.readLine()) != null) { - StringTokenizer tkz = new StringTokenizer(line); - if (!tkz.nextToken().equals("actgrpwrapper")) { - // could throw an exception, but let's benignly - // assume that something unrelated is spewing. - continue; - } - String x; // writer's block - x = tkz.nextToken(); - if (x.equals("argc")) { - if (realArgs != null) { - throw new RuntimeException( - "SetChildEnv: two argc lines in wrapper.out"); - } - realArgs = new String[Integer.parseInt(tkz.nextToken())]; - } else if (x.equals("argv")) { - if (realArgs == null) - throw new RuntimeException("SetChildEnv: missing argc"); - int n = Integer.parseInt(tkz.nextToken()); - if (n < 1 || n > realArgs.length) { - throw new RuntimeException("SetChildEnv: argc=" + - realArgs.length + "; argv[" + n + "]"); - } - // Hack: manually skip the "actgrpwrapper argv 5 " - String remainder = line.substring( - 1 + line.indexOf(' ', - 1 + line.indexOf(' ', - 1 + line.indexOf(' ')))); - realArgs[n-1] = remainder; - } else { - throw new RuntimeException("SetChildEnv: bad token \"" + x + "\""); - } - } - r.close(); - - private static void ensureLocalExecutable(String fname) - throws Exception - { - File target = new File(fname); - File source = new File(Dot, fname); - if (!target.exists()) { - // copy from source - System.err.println("Copying " + source.getPath() + - " to " + target.getPath()); - java.io.InputStream in = new java.io.FileInputStream(source); - java.io.OutputStream out = new java.io.FileOutputStream(target); - byte[] buf = new byte[512]; - int n; - while ((n = in.read(buf, 0, 512)) > 0) { - out.write(buf, 0, n); - } - out.close(); - in.close(); - } - // chmod - System.err.println("Doing: /bin/chmod 755 " + fname); - Runtime.getRuntime().exec("/bin/chmod 755 " + fname).waitFor(); - } - -*/ diff -r d1c0a9123f87 -r 814a5ddacddf jdk/test/java/rmi/activation/CommandEnvironment/rmid.security.policy --- a/jdk/test/java/rmi/activation/CommandEnvironment/rmid.security.policy Sun Dec 11 12:20:45 2016 +0100 +++ b/jdk/test/java/rmi/activation/CommandEnvironment/rmid.security.policy Sun Dec 11 17:39:27 2016 -0800 @@ -6,4 +6,9 @@ permission com.sun.rmi.rmid.ExecOptionPermission "-verbosegc"; permission com.sun.rmi.rmid.ExecOptionPermission "-Dparameter.count=zero"; permission com.sun.rmi.rmid.ExecOptionPermission "-Xmx32m"; + permission java.lang.RuntimePermission "selectorProvider"; + permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch"; + permission java.util.PropertyPermission "test.java.rmi.testlibrary.RMIDSelectorProvider.port", "read"; + permission java.util.PropertyPermission "test.java.rmi.testlibrary.RMIDSelectorProvider.timeout", "read"; + permission java.net.SocketPermission "*:1024-", "listen,resolve,connect,accept"; };