/********************************************************************************
* 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 net.sourceforge.cruisecontrol.Modification;
import net.sourceforge.cruisecontrol.dashboard.BuildDetail;
import net.sourceforge.cruisecontrol.dashboard.BuildTestCase;
import net.sourceforge.cruisecontrol.dashboard.BuildTestCaseResult;
import net.sourceforge.cruisecontrol.dashboard.BuildTestSuite;
import net.sourceforge.cruisecontrol.dashboard.CurrentStatus;
import net.sourceforge.cruisecontrol.dashboard.LogFile;
import net.sourceforge.cruisecontrol.dashboard.ModificationAction;
import net.sourceforge.cruisecontrol.dashboard.utils.CCDateFormatter;
import net.sourceforge.cruisecontrol.dashboard.testhelpers.DataUtils;
import org.jmock.Mock;
import org.jmock.cglib.MockObjectTestCase;
import org.joda.time.DateTime;
import java.util.Collection;
import java.util.List;
public class BuildServiceTest extends MockObjectTestCase {
private BuildService buildFactory;
private Mock mockConfiguration;
private Mock mockQueryService;
protected void setUp() throws Exception {
mockConfiguration = mock(ConfigurationService.class,
new Class[]{EnvironmentService.class, DashboardXmlConfigService.class, BuildLoopQueryService.class},
new Object[]{null, null, null});
mockConfiguration.expects(once())
.method("getArtifactRoot")
.will(returnValue(DataUtils.getProject1ArtifactDirAsFile()));
mockQueryService = mock(BuildLoopQueryService.class);
buildFactory = new BuildService(
(ConfigurationService) mockConfiguration.proxy(),
(BuildLoopQueryService) mockQueryService.proxy());
}
public void testShouldReadSpecficBuild() throws Exception {
BuildDetail expectedBuild = buildFactory.createBuildFromFile(DataUtils.getFailedBuildLbuildAsFile());
assertEquals("project1", expectedBuild.getProjectName());
assertFalse(expectedBuild.hasPassed());
}
public void testCanReadErrorDetailFromTest() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getFailedBuildLbuildAsFile());
List suites = build.getTestSuites();
BuildTestSuite firstSuite = (BuildTestSuite) suites.get(0);
List erroringTestCases = firstSuite.getErrorTestCases();
assertEquals(1, erroringTestCases.size());
BuildTestCase erroredTest = (BuildTestCase) erroringTestCases.get(0);
assertEquals(
"net.sourceforge.cruisecontrol.sampleproject.connectfour.PlayingStandTest", erroredTest
.getClassname());
assertEquals("0.016", erroredTest.getDuration());
assertEquals("testFourConnected", erroredTest.getName());
assertTrue(erroredTest.didError());
assertEquals("org/objectweb/asm/CodeVisitor", erroredTest.getMessage());
assertEquals(
"java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor\n"
+ "\tat net.sf.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:165)",
erroredTest.getMessageBody());
}
public void testCanReadFailureFromTest() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getFailedBuildLbuildAsFile());
List suites = build.getTestSuites();
BuildTestSuite firstSuite = (BuildTestSuite) suites.get(0);
List failingCases = firstSuite.getFailingTestCases();
assertEquals(3, firstSuite.getNumberOfFailures());
assertEquals(3, failingCases.size());
BuildTestCase failingTest = (BuildTestCase) failingCases.get(0);
assertEquals(
"net.sourceforge.cruisecontrol.sampleproject.connectfour.PlayingStandTest", failingTest
.getClassname());
assertEquals("3.807", failingTest.getDuration());
assertEquals("testSomething", failingTest.getName());
assertEquals(BuildTestCaseResult.FAILED, failingTest.getResult());
assertEquals("Not the expected result", failingTest.getMessage());
assertEquals(
"junit.framework.AssertionFailedError: Error during schema validation \n"
+ "\tat junit.framework.Assert.fail(Assert.java:47)", failingTest.getMessageBody());
}
public void testCanReadModificationsFromLogFile() throws Exception {
final BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getPassingBuildLbuildAsFile());
final Collection<Modification> modifications = build.getModifications();
assertEquals(2, modifications.size());
final Modification modification = modifications.iterator().next();
assertEquals("cvs", modification.type);
assertEquals("story123 project name changed to cache", modification.comment);
assertEquals("readcb", modification.userName);
final List<Modification.ModifiedFile> files = modification.getModifiedFiles();
assertEquals(2, files.size());
final Modification.ModifiedFile firstFile = files.get(0);
assertEquals(ModificationAction.MODIFIED, ModificationAction.fromDisplayName(firstFile.action));
assertEquals("build.xml", firstFile.fileName);
assertEquals("1.2", firstFile.revision);
final Modification.ModifiedFile secondFile = files.get(1);
assertEquals(ModificationAction.DELETED, ModificationAction.fromDisplayName(secondFile.action));
assertEquals("blah.txt", secondFile.fileName);
assertEquals("1.2", secondFile.revision);
}
public void testShouldGetDateOfBuild() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getPassingBuildLbuildAsFile());
DateTime expectedDateTime = new DateTime(2005, 12, 9, 12, 21, 3, 0);
assertEquals(expectedDateTime, build.getBuildDate());
}
public void testShouldReadTestSuitesFromFailedBuild() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getFailedBuildLbuildAsFile());
List suites = build.getTestSuites();
assertEquals(1, suites.size());
BuildTestSuite firstTestSuite = (BuildTestSuite) suites.get(0);
assertEquals(1, firstTestSuite.getNumberOfErrors());
assertEquals(3, firstTestSuite.getNumberOfFailures());
assertEquals(
"net.sourceforge.cruisecontrol.sampleproject.connectfour.PlayingStandTest",
firstTestSuite.getName());
assertEquals(12, firstTestSuite.getNumberOfTests());
assertEquals(1000.109, firstTestSuite.getDurationInSeconds(), 0.001);
}
public void testShouldTellIfBuildPassed() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getPassingBuildLbuildAsFile());
assertTrue("Build should have passed", build.hasPassed());
}
public void testShouldTellIfBuildFailed() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getFailedBuildLbuildAsFile());
assertFalse("Build should have passed", build.hasPassed());
}
public void testShouldGetProjectNameFromBuildFile() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getPassingBuildLbuildAsFile());
assertEquals("project1", build.getProjectName());
}
public void testShouldGetLabelFromBuildFile() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getPassingBuildLbuildAsFile());
assertEquals("build.0", build.getLabel());
}
public void testShouldGetBuildDurationFromBuildFile() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getPassingBuildLbuildAsFile());
assertEquals("3 minutes 10 seconds", build.getDuration());
}
public void testShouldStoreLogFileName() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getPassingBuildLbuildAsFile());
assertEquals(DataUtils.PASSING_BUILD_LBUILD_0_XML, build.getLogFileName());
}
public void testShouldBeAbleToParseBigLogFile() throws Exception {
BuildDetail build = buildFactory.createBuildFromFile(DataUtils.getBigLogFile());
assertNotNull(build);
}
public void testShouldReturnBuildDetailOfDiscontinuedStatus() throws Exception {
LogFile logFile = DataUtils.getPassingBuildLbuildAsFile();
mockConfiguration.expects(once()).method("getLogRoot").will(returnValue(logFile.getParentFile()));
mockQueryService.expects(once()).method("isDiscontinued").with(eq("project1")).will(returnValue(true));
BuildDetail build = buildFactory.getBuild("project1",
CCDateFormatter.getBuildDateFromLogFileName(logFile.getName()));
assertEquals(CurrentStatus.DISCONTINUED, build.getCurrentStatus());
}
public void testShouldReturnBuildDetailOfPausedStatus() throws Exception {
String paused = CurrentStatus.PAUSED.getCruiseStatus();
LogFile logFile = DataUtils.getPassingBuildLbuildAsFile();
mockConfiguration.expects(once()).method("getLogRoot").will(returnValue(logFile.getParentFile()));
mockQueryService.expects(once()).method("isDiscontinued").with(eq("project1")).will(returnValue(false));
mockQueryService.expects(once()).method("getProjectStatus").with(eq("project1")).will(returnValue(paused));
BuildDetail build = buildFactory.getBuild("project1",
CCDateFormatter.getBuildDateFromLogFileName(logFile.getName()));
assertEquals(CurrentStatus.PAUSED, build.getCurrentStatus());
}
}