/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
*
* @bug 4105043
* @summary cannot set java.rmi.server.hostname on children of rmid in time
*
* @bug 4097357
* @summary activation group should not overwrite system properties
*
* @bug 4107184
* @summary activation groups should be able to control their JVM properties
*
* @author Adrian Colley
*
* @library ../../testlibrary
* @build TestLibrary RMID ActivationLibrary
* Eliza Retireable Doctor Doctor_Stub
* -Djava.compiler=NONE SetChildEnv
*/
public class SetChildEnv
{
throws Exception
{
// they won't be parsed properly
runwith (
new String[] { "-verbosegc" },
new String[] { "foo.bar=SetChildEnvTest",
"sun.rmi.server.doSomething=true" },
);
runwith (
new String[] { },
new String[] { "parameter.count=zero" },
);
runwith (
new String[] { "-Xmx32m" },
new String[] { },
);
}
private static void runwith(
int port // port on which to communicate
)
throws Exception
{
// make a "watcher" which listens on a pipe and searches for
// the debugExec line while teeing to System.err
true, // debugExec turned on
true, port);
// compile props
Properties p = new Properties();
//p.put("java.rmi.server.logCalls", "true");
int i;
}
// create CommandEnvironment and ActivationGroupDesc
null,
params);
p, cmdenv);
// register group
// create ActivationDesc
"Doctor", // class
null, // codesource
null); // closure data
// register activatable object
// invoke a call with oh-so-humorous sample text
"HELP ME, DOCTOR. I FEEL VIOLENT TOWARDS PEOPLE " +
"WHO INQUIRE ABOUT MY PARENTS.";
//Runtime.getRuntime().traceMethodCalls(true);
//Runtime.getRuntime().traceMethodCalls(false);
// Get debugExec line, allowing 15 seconds for it to flush
// through the buffers and pipes.
int fudge = 15;
}
"recognizable debugExec line");
}
}
// q: first double-quote after debugExec
// qe: last double-quote on debugExec line
if (q <= 1 || qe <= q) {
"mangled debugExec line");
}
// split args by whitespace
// 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.
while (tk.hasMoreTokens()) {
}
int m;
}
"\" not set");
}
}
// End doctor
if (doctor instanceof Retireable)
}
public static class DebugExecWatcher
extends Thread
{
{
super("DebugExecWatcher");
}
throws IOException
{
return embryo;
}
{
return otherEnd;
}
{
found = s;
}
public void run()
{
try {
this.notifyLine(line);
}
} catch (IOException e) {
/* During termination of distant rmid, StreamPipes will be broken when
* distant vm terminates. A "Pipe broken" exception is expected because
* DebugExecWatcher points to the same streams as StreamPipes used by RMID.
* If we get this exception. We just terminate the thread.
*/
try {
} catch (IOException ioe) {}
}
else {
e.printStackTrace();
}
}
}
}
}
/*
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
}
*/