package com.youdevise.hudson.slavestatus; import static junit.framework.Assert.assertEquals; import org.junit.Test; import com.youdevise.hudson.slavestatus.Daemon.RunResult; import com.youdevise.hudson.slavestatus.Daemon.RunType; public class DaemonTest { private static final int RUNS_BEFORE_ABORT = 100; @Test public void runsOnceIfRequestedAndReturnsContinueIfRunnerDoes() { MockDaemonRunner runner = new AlwaysContinueRunner(); Daemon daemon = new Daemon(runner); RunResult result = daemon.go(RunType.ONCE_ONLY); assertEquals(RunResult.CONTINUE, result); assertEquals(1, runner.runs); } public void runsOnceIfRequestedAndReturnsAbortIfRunnerDoes() { MockDaemonRunner runner = new AlwaysAbortRunner(); Daemon daemon = new Daemon(runner); RunResult result = daemon.go(RunType.ONCE_ONLY); assertEquals(RunResult.ABORT, result); assertEquals(1, runner.runs); } @Test public void abortsWhenRunnerSaysTo() { MockDaemonRunner runner = new MockDaemonRunner(RUNS_BEFORE_ABORT); Daemon daemon = new Daemon(runner); RunResult result = daemon.go(RunType.FOREVER); assertEquals(RunResult.ABORT, result); assertEquals(RUNS_BEFORE_ABORT, runner.runs); } } class AlwaysContinueRunner extends MockDaemonRunner { public AlwaysContinueRunner() { super(Integer.MAX_VALUE); } } class AlwaysAbortRunner extends MockDaemonRunner { public AlwaysAbortRunner() { super(0); } } class MockDaemonRunner implements DaemonRunner { public int runs; private final int runsBeforeAborting; public MockDaemonRunner(int runsBeforeAborting) { this.runsBeforeAborting = runsBeforeAborting; } public RunResult run() { runs++; if (runs >= runsBeforeAborting) { return RunResult.ABORT; } else { return RunResult.CONTINUE; } } }