package hudson.util;
import hudson.ChannelRule;
import hudson.remoting.VirtualChannel;
import hudson.util.ProcessTree.OSProcess;
import hudson.util.ProcessTree.ProcessCallable;
import java.io.IOException;
import java.io.Serializable;
import jenkins.security.MasterToSlaveCallable;
import static org.junit.Assert.*;
import org.junit.Assume;
import org.junit.Rule;
import org.junit.Test;
/**
* @author Kohsuke Kawaguchi
*/
public class ProcessTreeTest {
@Rule public ChannelRule channels = new ChannelRule();
static class Tag implements Serializable {
ProcessTree tree;
OSProcess p;
int id;
private static final long serialVersionUID = 1L;
}
@Test public void remoting() throws Exception {
Assume.assumeFalse("on some platforms where we fail to list any processes", ProcessTree.get()==ProcessTree.DEFAULT);
Tag t = channels.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 extends MasterToSlaveCallable<Tag, IOException> implements Serializable {
public Tag call() throws IOException {
Tag t = new Tag();
t.tree = ProcessTree.get();
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;
}
}
}