/********************************************************************************
* CruiseControl, a Continuous Integration Toolkit
* Copyright (c) 2007, ThoughtWorks, Inc.
* 200 E. Randolph, 25th Floor
* Chicago, IL 60601 USA
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* + Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* + Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
********************************************************************************/
package net.sourceforge.cruisecontrol.dashboard.service;
import java.io.File;
import java.util.List;
import net.sourceforge.cruisecontrol.dashboard.Build;
import net.sourceforge.cruisecontrol.dashboard.BuildSummary;
import net.sourceforge.cruisecontrol.dashboard.testhelpers.FilesystemUtils;
import net.sourceforge.cruisecontrol.dashboard.utils.CCDateFormatter;
import org.apache.commons.io.FileUtils;
import org.jmock.Mock;
import org.jmock.cglib.MockObjectTestCase;
import org.joda.time.DateTime;
public class HistoricalBuildSummariesServiceTest extends MockObjectTestCase {
private HistoricalBuildSummariesService buildSummariesSevice;
private String projectName;
private File projectDirectory;
private Mock configurationMock;
private static final String NONMATCHING_FILE = "nonmatching_file.xml";
protected void setUp() throws Exception {
projectName = "listingProject";
projectDirectory = FilesystemUtils.createDirectory(projectName);
createLogFiles(projectDirectory);
configurationMock =
mock(
ConfigurationService.class, new Class[]{EnvironmentService.class,
DashboardXmlConfigService.class, BuildLoopQueryService.class}, new Object[]{null,
null, null});
ConfigurationService configuration = (ConfigurationService) configurationMock.proxy();
buildSummariesSevice =
new HistoricalBuildSummariesService(configuration, new BuildSummaryService());
}
private void setUpConfigurationMock() {
configurationMock.expects(atLeastOnce()).method("getLogRoot").will(returnValue(projectDirectory));
}
public void createLogFiles(File directory) throws Exception {
long base = 20060704155710L;
int label = 489;
final int count = 26;
for (int i = 0; i < count; i++) {
String fileName = "log" + (base + i) + "";
if (i % 7 == 0) {
fileName += "Lbuild." + (label + i);
}
fileName += (i < count / 2) ? ".xml.gz" : ".xml";
FilesystemUtils.createFile(fileName, projectDirectory);
}
FilesystemUtils.createFile(NONMATCHING_FILE, projectDirectory);
}
public void tearDown() throws Exception {
FileUtils.deleteDirectory(projectDirectory);
}
public void testShouldBeAbleToReturnLastest25BuildOfSpecificProject() {
setUpConfigurationMock();
List lastest25 = buildSummariesSevice.getLastest25(projectName);
assertEquals(25, lastest25.size());
assertEquals("log20060704155735.xml", ((Build) lastest25.get(0)).getBuildLogFilename());
assertEquals("log20060704155711.xml.gz", ((Build) lastest25.get(24)).getBuildLogFilename());
}
public void testShouldBeAbleToReturnLastSuccessfulBuild() {
setUpConfigurationMock();
DateTime time = CCDateFormatter.formatLogName("log20060704155710Lbuild.489.xml");
Build lastSucceed = buildSummariesSevice.getLastSucceed(projectName, time);
assertNull(lastSucceed);
}
public void testShouldReturnTheTopSucceedWhenCurrentTimeIsNew() {
setUpConfigurationMock();
DateTime time = CCDateFormatter.formatLogName("log20060704155759Lbuild.503.xml");
Build lastSucceed = buildSummariesSevice.getLastSucceed(projectName, time);
assertEquals("log20060704155731Lbuild.510.xml", lastSucceed.getBuildLogFilename());
}
public void testShouldReturnTheBottomSucceedWhenCurrentTimeIsNew() {
setUpConfigurationMock();
DateTime time = CCDateFormatter.formatLogName("log20060704155730.xml");
Build lastSucceed = buildSummariesSevice.getLastSucceed(projectName, time);
assertEquals("log20060704155724Lbuild.503.xml", lastSucceed.getBuildLogFilename());
}
public void testShouldBeAbleToReturnEarilestFailedBuild() {
setUpConfigurationMock();
Build earilestFailed = buildSummariesSevice.getEaliestFailed(projectName, new DateTime());
assertEquals("log20060704155732.xml", earilestFailed.getBuildLogFilename());
}
public void testShouldBeAbleToReturnAllSuccessfulBuildOfSpecificProject() {
setUpConfigurationMock();
List allSuccessful = buildSummariesSevice.getAllSucceed(projectName);
assertEquals(4, allSuccessful.size());
assertEquals("log20060704155731Lbuild.510.xml", ((Build) allSuccessful.get(0)).getBuildLogFilename());
assertEquals("log20060704155724Lbuild.503.xml", ((Build) allSuccessful.get(1)).getBuildLogFilename());
assertEquals(
"log20060704155717Lbuild.496.xml.gz", ((Build) allSuccessful.get(2))
.getBuildLogFilename());
assertEquals(
"log20060704155710Lbuild.489.xml.gz", ((Build) allSuccessful.get(3))
.getBuildLogFilename());
}
public void testShouldBeAbleToReturnAllBuildOfSpecificProject() {
setUpConfigurationMock();
List all = buildSummariesSevice.getAll(projectName);
assertEquals(26, all.size());
assertEquals("log20060704155735.xml", ((Build) all.get(0)).getBuildLogFilename());
assertEquals("log20060704155710Lbuild.489.xml.gz", ((Build) all.get(25)).getBuildLogFilename());
}
public void testShouldBeAbleToReturnLatestBuildSpecificProject() {
setUpConfigurationMock();
Build summary = buildSummariesSevice.getLatest(projectName);
assertNotNull(summary);
assertEquals("log20060704155735.xml", summary.getBuildLogFilename());
}
public void testShouldReturnNotApplicableWhenNoSuccessfulBuildOccured() {
setUpConfigurationMock();
String lastSuccessfulBuild =
buildSummariesSevice.getDurationFromLastSuccessfulBuild(
projectName, new DateTime(
2005, 12,
9, 11, 21, 3, 0));
assertEquals("N/A", lastSuccessfulBuild);
}
public void testShouldReturnTimeSinceLastSucceeded() {
setUpConfigurationMock();
String lastSuccessfulBuild =
buildSummariesSevice.getDurationFromLastSuccessfulBuild(
projectName, new DateTime(
2006, 7, 6,
16, 58, 32, 0));
assertEquals("2 days ago", lastSuccessfulBuild);
}
public void testShouldReturnTimeSinceLastSucceededOmittingUnnecessaryParts() {
setUpConfigurationMock();
String lastSuccessfulBuild =
buildSummariesSevice.getDurationFromLastSuccessfulBuild(
projectName, new DateTime(
2006, 7, 4,
15, 58, 31, 0));
assertEquals("1 minute ago", lastSuccessfulBuild);
}
public void testGetLatestShouldReturnInactiveBuildForNewProject() throws Exception {
configurationMock.expects(atLeastOnce()).method("getLogRoot").will(
returnValue(new File(projectDirectory, "new_project")));
BuildSummary latest = buildSummariesSevice.getLatest("new_project");
assertTrue(latest.isInactive());
}
}