mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-03 04:30:06 +00:00
7195382: TEST_BUG: java/rmi/activation/CommandEnvironment/SetChildEnv.java can fail
Reviewed-by: rriggs
This commit is contained in:
parent
f39eef3ab6
commit
0fcdac454d
@ -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 @@ import java.rmi.activation.*;
|
||||
|
||||
public class SetChildEnv
|
||||
{
|
||||
public static void main(String argv[])
|
||||
throws Exception
|
||||
{
|
||||
int runningPort = TestLibrary.getUnusedRandomPort();
|
||||
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);
|
||||
|
||||
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);
|
||||
TestLibrary.suggestSecurityManager(TestParams.defaultSecurityManager);
|
||||
|
||||
runwith (
|
||||
new String[] { "-verbosegc" },
|
||||
new String[] { "foo.bar=SetChildEnvTest",
|
||||
"sun.rmi.server.doSomething=true" },
|
||||
runningPort
|
||||
);
|
||||
// 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);
|
||||
|
||||
runwith (
|
||||
new String[] { "-Xmx32m" },
|
||||
new String[] { },
|
||||
runningPort
|
||||
);
|
||||
}
|
||||
rmid.start();
|
||||
|
||||
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);
|
||||
|
||||
// make a "watcher" which listens on a pipe and searches for
|
||||
// the debugExec line while teeing to System.err
|
||||
DebugExecWatcher watcher = DebugExecWatcher.makeWithPipe();
|
||||
|
||||
RMID.removeLog();
|
||||
RMID rmid = RMID.createRMID(watcher.otherEnd(), watcher.otherEnd(),
|
||||
true, // debugExec turned on
|
||||
true, port);
|
||||
|
||||
rmid.start();
|
||||
|
||||
// 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);
|
||||
|
||||
ActivationGroupDesc gdesc = new ActivationGroupDesc(
|
||||
p, cmdenv);
|
||||
|
||||
// register group
|
||||
ActivationSystem actsys = ActivationGroup.getSystem();
|
||||
ActivationGroupID gid = actsys.registerGroup(gdesc);
|
||||
|
||||
// create ActivationDesc
|
||||
ActivationDesc odesc = new ActivationDesc(gid, // group
|
||||
"Doctor", // class
|
||||
null, // codesource
|
||||
null); // closure data
|
||||
|
||||
// register activatable object
|
||||
Eliza doctor = (Eliza)Activatable.register(odesc);
|
||||
|
||||
// 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.";
|
||||
|
||||
System.out.println(complaint);
|
||||
//Runtime.getRuntime().traceMethodCalls(true);
|
||||
String res = doctor.complain(complaint);
|
||||
//Runtime.getRuntime().traceMethodCalls(false);
|
||||
System.out.println (" => " + res);
|
||||
|
||||
// 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;
|
||||
// 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);
|
||||
|
||||
ActivationGroupDesc gdesc = new ActivationGroupDesc(
|
||||
p, cmdenv);
|
||||
|
||||
// register group
|
||||
ActivationSystem actsys = ActivationGroup.getSystem();
|
||||
ActivationGroupID gid = actsys.registerGroup(gdesc);
|
||||
|
||||
// create ActivationDesc
|
||||
ActivationDesc odesc = new ActivationDesc(gid, // group
|
||||
"Doctor", // class
|
||||
null, // codesource
|
||||
null); // closure data
|
||||
|
||||
// register activatable object
|
||||
Eliza doctor = (Eliza)Activatable.register(odesc);
|
||||
|
||||
// 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.";
|
||||
|
||||
System.out.println(complaint);
|
||||
//Runtime.getRuntime().traceMethodCalls(true);
|
||||
String res = doctor.complain(complaint);
|
||||
//Runtime.getRuntime().traceMethodCalls(false);
|
||||
System.out.println (" => " + res);
|
||||
|
||||
// Get debugExec line, allowing 15 seconds for it to flush
|
||||
// through the buffers and pipes.
|
||||
String found = watcher.found;
|
||||
if (found == null) {
|
||||
TestLibrary.bomb("rmid subprocess produced no " +
|
||||
"recognizable debugExec line");
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
} 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 @@ public class SetChildEnv
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
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();
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
@ -6,4 +6,9 @@ grant {
|
||||
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";
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user