package net.sourceforge.cruisecontrol; import junit.framework.TestCase; import net.sourceforge.cruisecontrol.testutil.TestUtil; import net.sourceforge.cruisecontrol.util.IO; import net.sourceforge.cruisecontrol.util.Util; import java.io.File; /** * @author <a href="mailto:jeffjensen@upstairstechnology.com">Jeff Jensen </a> */ public class BuildStatusTest extends TestCase { private static final boolean MULTIPLE_PROJECT_MODE = false; private static final boolean SINGLE_PROJECT_MODE = true; private static final String PROJECT_NAME = "testProject"; private static final String STATUS_FILENAME = "buildStatus.txt"; private static final String TEXT = "the test status"; private static final String TIME = "12/17/2005 20:11:25"; private static final String XML_LOGGER_DATA = TIME + " [" + PROJECT_NAME + "]\n"; private static final String XML_LOGGER_TEXT = "<br>" + XML_LOGGER_DATA; private static final String PLAIN_TEXT = TEXT + "\n" + TIME + "\n"; private static final String PLAIN_WITH_LOGGER = TEXT + "\n" + TIME + XML_LOGGER_TEXT; private static final String HTML_TEXT = TEXT + "\n<br/>" + TIME + "\n<br/>"; private static final String HTML_WITH_LOGGER = HTML_TEXT + XML_LOGGER_DATA + "<br/>"; private File logDir; private final TestUtil.FilesToDelete filesToDelete = new TestUtil.FilesToDelete(); protected void setUp() throws Exception { // make base log dir logDir = new File("testresults/"); if (!logDir.exists()) { assertTrue("Failed to create test result dir", Util.doMkDirs(logDir)); filesToDelete.add(logDir); } // make multi project log dir File projectLogDir = new File(logDir, PROJECT_NAME + "/"); if (!projectLogDir.exists()) { assertTrue("Failed to create project log dir", Util.doMkDirs(projectLogDir)); filesToDelete.add(logDir); } // for single project File file = new File(logDir, STATUS_FILENAME); prepareFile(file, PLAIN_WITH_LOGGER); // for multi project file = new File(projectLogDir, STATUS_FILENAME); prepareFile(file, PLAIN_WITH_LOGGER); } protected void tearDown() throws Exception { filesToDelete.delete(); } public void testStatusFileNotFound() { String status = BuildStatus.getStatusHtml(SINGLE_PROJECT_MODE, logDir.getAbsolutePath(), PROJECT_NAME, "badfilename.txt", BuildStatus.READ_ALL_LINES); assertEquals("(build status file not found)", status); status = BuildStatus.getStatusHtml(MULTIPLE_PROJECT_MODE, logDir.getAbsolutePath(), PROJECT_NAME, "badfilename.txt", BuildStatus.READ_ALL_LINES); assertEquals("(build status file not found)", status); } public void testShouldThrowExceptionWithDirectory() { try { BuildStatus.getStatusHtml(SINGLE_PROJECT_MODE, logDir.getAbsolutePath(), null, PROJECT_NAME, BuildStatus.READ_ALL_LINES); fail("Expected exception for build status file not found."); } catch (CruiseControlWebAppException expected) { assertTrue(expected.getMessage().indexOf("is a directory") > 0); } } public void testGetCurrentStatusSingleProject() { coreTestPlain("status only: ", SINGLE_PROJECT_MODE, BuildStatus.READ_ONLY_STATUS_LINES, PLAIN_TEXT); coreTestHtml("status only: ", SINGLE_PROJECT_MODE, BuildStatus.READ_ONLY_STATUS_LINES, HTML_TEXT); coreTestPlain("all lines: ", SINGLE_PROJECT_MODE, BuildStatus.READ_ALL_LINES, PLAIN_TEXT + XML_LOGGER_DATA); coreTestHtml("all lines: ", SINGLE_PROJECT_MODE, BuildStatus.READ_ALL_LINES, HTML_WITH_LOGGER); } public void testGetCurrentStatusMultiProject() { coreTestPlain("status only: ", MULTIPLE_PROJECT_MODE, BuildStatus.READ_ONLY_STATUS_LINES, PLAIN_TEXT); coreTestHtml("status only: ", MULTIPLE_PROJECT_MODE, BuildStatus.READ_ONLY_STATUS_LINES, HTML_TEXT); coreTestPlain("all lines: ", MULTIPLE_PROJECT_MODE, BuildStatus.READ_ALL_LINES, PLAIN_TEXT + XML_LOGGER_DATA); coreTestHtml("all lines: ", MULTIPLE_PROJECT_MODE, BuildStatus.READ_ALL_LINES, HTML_WITH_LOGGER); } private void coreTestPlain(String msg, boolean isSingleProject, int readLines, String expected) { String actual = BuildStatus.getStatusPlain(isSingleProject, logDir.getAbsolutePath(), PROJECT_NAME, STATUS_FILENAME, readLines); assertEquals("plain:" + msg, expected, actual); } private void coreTestHtml(String msg, boolean isSingleProject, int readLines, String expected) { String actual = BuildStatus.getStatusHtml(isSingleProject, logDir.getAbsolutePath(), PROJECT_NAME, STATUS_FILENAME, readLines); assertEquals("html:" + msg, expected, actual); } private void prepareFile(File file, String body) throws CruiseControlException { IO.write(file, body); filesToDelete.add(file); } }