package org.jvnet.hudson.test;
import hudson.Extension;
import hudson.Launcher;
import hudson.Launcher.LocalLauncher;
import hudson.Proc;
import hudson.model.Descriptor.FormException;
import hudson.model.Slave;
import hudson.model.TaskListener;
import hudson.slaves.ComputerLauncher;
import hudson.slaves.NodeProperty;
import hudson.slaves.RetentionStrategy;
import java.io.IOException;
import java.util.Collections;
/**
* Slave that pretends to fork processes.
*
* @author Kohsuke Kawaguchi
* @see HudsonTestCase#createPretendSlave(FakeLauncher)
*/
public class PretendSlave extends Slave {
private transient FakeLauncher faker;
/**
* Number of processed that are launched.
*/
public int numLaunch;
public PretendSlave(String name, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, FakeLauncher faker) throws IOException, FormException {
super(name, "pretending a slave", remoteFS, String.valueOf(numExecutors), mode, labelString, launcher, RetentionStrategy.NOOP, Collections.<NodeProperty<?>>emptyList());
this.faker = faker;
}
public PretendSlave(String name, String remoteFS, String labelString, ComputerLauncher launcher, FakeLauncher faker) throws IOException, FormException {
this(name, remoteFS, 1, Mode.NORMAL, labelString, launcher, faker);
}
@Override
public Launcher createLauncher(TaskListener listener) {
return new LocalLauncher(listener) {
public Proc launch(ProcStarter starter) throws IOException {
synchronized (PretendSlave.this) {
numLaunch++;
}
Proc p = faker.onLaunch(starter);
if (p!=null) return p;
return super.launch(starter);
}
};
}
@Extension
public static final class DescriptorImpl extends SlaveDescriptor {
public String getDisplayName() {
return "Test mock up slave";
}
}
}