package net.sourceforge.cruisecontrol.listeners;
import java.io.File;
import java.io.IOException;
import junit.framework.TestCase;
import net.sourceforge.cruisecontrol.CruiseControlException;
import net.sourceforge.cruisecontrol.ProjectState;
import net.sourceforge.cruisecontrol.testutil.TestUtil.FilesToDelete;
import net.sourceforge.cruisecontrol.util.IO;
public class LockFileListenerTest extends TestCase {
private LockFileListener listener;
private final FilesToDelete filesToDelete = new FilesToDelete();
private static final ProjectStateChangedEvent BOOTSTRAPPING = new ProjectStateChangedEvent("test",
ProjectState.BOOTSTRAPPING);
private static final ProjectStateChangedEvent MODIFICATIONSET = new ProjectStateChangedEvent("test",
ProjectState.MODIFICATIONSET);
private static final ProjectStateChangedEvent BUILDING = new ProjectStateChangedEvent("test",
ProjectState.BUILDING);
private static final ProjectStateChangedEvent MERGING_LOGS = new ProjectStateChangedEvent("test",
ProjectState.MERGING_LOGS);
private static final ProjectStateChangedEvent PUBLISHING = new ProjectStateChangedEvent("test",
ProjectState.PUBLISHING);
private static final ProjectStateChangedEvent IDLE = new ProjectStateChangedEvent("test", ProjectState.IDLE);
private static final ProjectStateChangedEvent WAITING = new ProjectStateChangedEvent("test", ProjectState.WAITING);
private static final ProjectStateChangedEvent QUEUED = new ProjectStateChangedEvent("test", ProjectState.QUEUED);
private static final ProjectStateChangedEvent PAUSED = new ProjectStateChangedEvent("test", ProjectState.PAUSED);
private static final ProjectStateChangedEvent STOPPED = new ProjectStateChangedEvent("test", ProjectState.STOPPED);
protected void setUp() {
listener = new LockFileListener();
}
protected void tearDown() {
filesToDelete.delete();
listener = null;
}
public void testShouldNotDeleteLockIfContentDoesntMatchProjectName() throws IOException, CruiseControlException {
File lock = createLockFile("project.name");
listener.setLockFile(lock.getAbsolutePath());
listener.setProjectName("different.name");
listener.handleEvent(IDLE);
assertTrue(lock.exists());
}
public void testShouldDeleteLockIfContentMatchesProjectName() throws IOException, CruiseControlException {
File lock = createLockFile("project.name");
listener.setLockFile(lock.getAbsolutePath());
listener.setProjectName("project.name");
listener.handleEvent(IDLE);
assertFalse(lock.exists());
}
private File createLockFile(String projectName) throws IOException, CruiseControlException {
File lock = File.createTempFile("test", ".lck");
filesToDelete.add(lock);
assertTrue(lock.exists());
IO.write(lock, projectName);
return lock;
}
public void testShouldOnlyDeleteLockWhenProjectGoesIdle() throws IOException, CruiseControlException {
File lock = createLockFile("project.name");
listener.setLockFile(lock.getAbsolutePath());
listener.setProjectName("project.name");
listener.handleEvent(BOOTSTRAPPING);
listener.handleEvent(MODIFICATIONSET);
listener.handleEvent(BUILDING);
listener.handleEvent(MERGING_LOGS);
listener.handleEvent(PUBLISHING);
listener.handleEvent(WAITING);
listener.handleEvent(QUEUED);
listener.handleEvent(PAUSED);
listener.handleEvent(STOPPED);
assertTrue(lock.exists());
listener.handleEvent(IDLE);
assertFalse(lock.exists());
}
public void testShouldThrowExceptionWhenFailsToDeleteLock() throws CruiseControlException, IOException {
File lock = createLockFile("project.name");
listener = new LockFileListener() {
boolean attemptToDeleteLock() {
return false;
}
};
listener.setLockFile(lock.getAbsolutePath());
listener.setProjectName("project.name");
listener.handleEvent(MODIFICATIONSET);
try {
listener.handleEvent(IDLE);
fail("should have thrown exception when lock wasn't deleted");
} catch (CruiseControlException expected) {
}
}
public void testValidateShouldThrowExceptionWhenRequiredAttributesNotSet() {
try {
listener.validate();
fail("should throw exception when lock file and project name not set");
} catch (CruiseControlException expected) {
}
}
public void testValidateShouldThrowExceptionWhenLockFileNotSet() {
listener.setProjectName("project.name");
try {
listener.validate();
fail("should throw exception when lock file not set");
} catch (CruiseControlException expected) {
}
}
public void testValidateShouldThrowExceptionWhenProjectNameNotSet() {
listener.setLockFile("delete.me");
try {
listener.validate();
fail("should throw exception when project name not set");
} catch (CruiseControlException expected) {
}
}
public void testValidateShouldNotThrowExceptionWhenRequiredAttributesSet() throws CruiseControlException {
listener.setLockFile("delete.me");
listener.setProjectName("project.name");
listener.validate();
}
}