/*******************************************************************************
*
* Copyright (c) 2004-2010 Oracle Corporation.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*
*
*******************************************************************************/
package hudson.util;
import hudson.ChannelTestCase;
import hudson.Functions;
import hudson.remoting.Callable;
import hudson.remoting.VirtualChannel;
import hudson.util.ProcessTree.OSProcess;
import hudson.util.ProcessTree.ProcessCallable;
import java.io.IOException;
import java.io.Serializable;
/**
* @author Kohsuke Kawaguchi
*/
public class ProcessTreeTest extends ChannelTestCase {
static class Tag implements Serializable {
ProcessTree tree;
OSProcess p;
int id;
private static final long serialVersionUID = 1L;
}
//Disabled until JNA issue is fixed
public void testRemoting() throws Exception {
// disabled under Win because of errors like:
// org.jvnet.winp.WinpException: Failed to open process error=5 at .\envvar-cmdline.cpp:53
// org.jvnet.winp.WinpException: Failed to read environment variable table error=299 at .\envvar-cmdline.cpp:114
// It seems it's impossible to call getEnvironmentVariables on "privileged" processes which can vary on different Win versions.
// we can use something like
// if (pid == 0 || pid == 4 || pid == 1100 || pid == 5980 || pid == 5496 || pid == 1500) continue;
// to exclude these pids, but it's not excellent solution
// if (Functions.isWindows()) return;
//
// Tag t = french.call(new MyCallable());
//
// // make sure the serialization preserved the reference graph
// assertSame(t.p.getTree(), t.tree);
//
// // verify that some remote call works
// t.p.getEnvironmentVariables();
//
// // it should point to the same object
// assertEquals(t.id,t.p.getPid());
//
// t.p.act(new ProcessCallableImpl());
}
private static class MyCallable implements Callable<Tag, IOException>, Serializable {
public Tag call() throws IOException {
Tag t = new Tag();
t.tree = ProcessTree.get();
if (t.tree.iterator().hasNext()) {
t.p = t.tree.iterator().next();
t.id = t.p.getPid();
}
return t;
}
private static final long serialVersionUID = 1L;
}
private static class ProcessCallableImpl implements ProcessCallable<Void> {
public Void invoke(OSProcess process, VirtualChannel channel) throws IOException {
assertNotNull(process);
assertNotNull(channel);
return null;
}
}
}