7195382: TEST_BUG: java/rmi/activation/CommandEnvironment/SetChildEnv.java can fail
authormli
Sun, 11 Dec 2016 17:39:27 -0800
changeset 42470 814a5ddacddf
parent 42469 d1c0a9123f87
child 42471 86b1da05a4b0
7195382: TEST_BUG: java/rmi/activation/CommandEnvironment/SetChildEnv.java can fail Reviewed-by: rriggs
jdk/test/java/rmi/activation/CommandEnvironment/SetChildEnv.java
jdk/test/java/rmi/activation/CommandEnvironment/rmid.security.policy
--- 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();
-    }
-
-*/
--- 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";
 };