package hudson.model;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import org.jvnet.hudson.test.Bug;
import org.jvnet.hudson.test.HudsonTestCase;
/**
* @author Kohsuke Kawaguchi
*/
public class ExecutorTest extends HudsonTestCase {
public void testYank() throws Exception {
Computer c = Hudson.getInstance().toComputer();
Executor e = c.getExecutors().get(0);
// kill an executor
kill(e);
// make sure it's dead
assertTrue(c.getExecutors().contains(e));
assertTrue(e.getCauseOfDeath()!=null);
// test the UI
HtmlPage p = createWebClient().goTo("/");
p = p.getAnchorByText("Dead (!)").click();
assertTrue(p.getWebResponse().getContentAsString().contains(ThreadDeath.class.getName()));
submit(p.getFormByName("yank"));
assertFalse(c.getExecutors().contains(e));
waitUntilExecutorSizeIs(c, 2);
}
@Bug(4756)
public void testWhenAnExecuterIsYankedANewExecuterTakesItsPlace() throws Exception {
Computer c = hudson.toComputer();
Executor e = getExecutorByNumber(c, 0);
kill(e);
e.doYank();
waitUntilExecutorSizeIs(c, 2);
assertNotNull(getExecutorByNumber(c, 0));
assertNotNull(getExecutorByNumber(c, 1));
}
private void waitUntilExecutorSizeIs(Computer c, int executorCollectionSize) throws InterruptedException {
int timeOut = 10;
while (c.getExecutors().size() != executorCollectionSize) {
Thread.sleep(10);
if (timeOut-- == 0) fail("executor collection size was not " + executorCollectionSize);
}
}
private void kill(Executor e) throws InterruptedException {
e.killHard();
while (e.isAlive())
Thread.sleep(10);
}
private Executor getExecutorByNumber(Computer c, int executorNumber) {
for (Executor executor : c.getExecutors()) {
if (executor.getNumber() == executorNumber) {
return executor;
}
}
return null;
}
}