package net.sourceforge.cruisecontrol.listeners; import java.io.File; import java.io.IOException; import java.util.Date; import junit.framework.TestCase; import net.sourceforge.cruisecontrol.CruiseControlException; import net.sourceforge.cruisecontrol.MockProject; import net.sourceforge.cruisecontrol.Progress; import net.sourceforge.cruisecontrol.ProjectConfig; import net.sourceforge.cruisecontrol.ProjectState; import net.sourceforge.cruisecontrol.labelincrementers.DefaultLabelIncrementer; import net.sourceforge.cruisecontrol.testutil.TestUtil.FilesToDelete; import net.sourceforge.cruisecontrol.util.DateUtil; import net.sourceforge.cruisecontrol.util.Util; /** * . * User: jfredrick * Date: Sep 6, 2004 * Time: 10:58:41 PM */ public class CurrentBuildStatusListenerTest extends TestCase { private static final String TEST_DIR = "tmp"; private final FilesToDelete filesToDelete = new FilesToDelete(); private CurrentBuildStatusListener listener; protected void setUp() throws Exception { listener = new CurrentBuildStatusListener(); // listener.handleEvent() will create a file in the test tmp dir, so clean it up filesToDelete.add(new File(TEST_DIR)); } protected void tearDown() { listener = null; filesToDelete.delete(); } public void testValidate() throws CruiseControlException { try { listener.validate(); fail("'file' should be a required attribute"); } catch (CruiseControlException cce) { } listener.setFile("somefile"); listener.validate(); listener.setFile(System.getProperty("java.io.tmpdir") + File.separator + "filename"); listener.validate(); } public void testWritingStatus() throws CruiseControlException, IOException { final String fileName = TEST_DIR + File.separator + "_testCurrentBuildStatus.txt"; listener.setFile(fileName); filesToDelete.add(new File(fileName)); // This should be equivalent to the date used in listener at seconds precision final Date date = new Date(); checkResultForState(fileName, date, ProjectState.WAITING); checkResultForState(fileName, date, ProjectState.IDLE); checkResultForState(fileName, date, ProjectState.QUEUED); checkResultForState(fileName, date, ProjectState.BOOTSTRAPPING); checkResultForState(fileName, date, ProjectState.MODIFICATIONSET); checkResultForState(fileName, date, ProjectState.BUILDING); checkResultForState(fileName, date, ProjectState.MERGING_LOGS); checkResultForState(fileName, date, ProjectState.PUBLISHING); checkResultForState(fileName, date, ProjectState.PAUSED); checkResultForState(fileName, date, ProjectState.STOPPED); } private void checkResultForState(final String fileName, final Date date, final ProjectState state) throws CruiseControlException, IOException { listener.handleEvent(new ProjectStateChangedEvent("projName", state)); final String expected = getExpectedStateText(date, state); assertEquals(expected, Util.readFileToString(fileName)); } private static String getExpectedStateText(Date date, ProjectState state) { final String dateString = DateUtil.formatIso8601(date); final String description = state.getDescription(); return description + " since\n" + dateString; } public void testWritingProgress() throws CruiseControlException, IOException { final String fileName = TEST_DIR + File.separator + "_testCurrentBuildStatus.txt"; listener.setFile(fileName); filesToDelete.add(new File(fileName)); final ProjectConfig projectConfig = new ProjectConfig(); projectConfig.add(new DefaultLabelIncrementer()); final MockProject project = new MockProject(); final Progress progress = project.getProgress(); project.setProjectConfig(projectConfig); // This should be equivalent to the date used in listener at seconds precision final Date date = new Date(); final String expectedProgressMsgPrefix = CurrentBuildStatusListener.MSG_PREFIX_PROGRESS + DateUtil.formatIso8601(date) + " "; checkResultForProgress(fileName, "test msg1", expectedProgressMsgPrefix, project, progress); checkResultForProgress(fileName, null, expectedProgressMsgPrefix, project, progress); // add a ProjectState string to the status text file checkResultForState(fileName, date, ProjectState.BUILDING); final String expectedPrefix = getExpectedStateText(date, ProjectState.BUILDING) + "\n" + expectedProgressMsgPrefix; checkResultForProgress(fileName, "test msg2", expectedPrefix, project, progress); checkResultForProgress(fileName, "", expectedPrefix, project, progress); checkResultForProgress(fileName, null, expectedPrefix, project, progress); } private void checkResultForProgress(final String fileName, final String msgProgress, final String expectedStatusTextPrefix, final MockProject project, final Progress progress) throws CruiseControlException, IOException { progress.setValue(msgProgress); listener.handleEvent(new ProgressChangedEvent(project.getName(), progress)); assertEquals(expectedStatusTextPrefix + msgProgress, Util.readFileToString(fileName)); } }