/******************************************************************************** * 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 junitx.util.PrivateAccessor; import net.sourceforge.cruisecontrol.dashboard.BuildSummary; import net.sourceforge.cruisecontrol.dashboard.CurrentStatus; import net.sourceforge.cruisecontrol.dashboard.PreviousResult; import net.sourceforge.cruisecontrol.dashboard.StoryTracker; import net.sourceforge.cruisecontrol.dashboard.testhelpers.DataUtils; import net.sourceforge.cruisecontrol.dashboard.utils.CCDateFormatter; import net.sourceforge.cruisecontrol.dashboard.web.command.BuildCommand; import org.apache.commons.lang.StringUtils; import org.jmock.Mock; import org.jmock.cglib.MockObjectTestCase; import org.joda.time.DateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class BuildSummaryUIServiceTest extends MockObjectTestCase { private static final String THREE_HOURS_AGO_LOG_FILE = "log" + CCDateFormatter.yyyyMMddHHmmss(new DateTime().minusHours(3)) + ".xml"; private static final String THREE_DAYS_AGO_LOG_FILE = "log" + CCDateFormatter.yyyyMMddHHmmss(new DateTime().minusDays(3)) + ".xml"; private Mock mockBuildSummariesService; private HistoricalBuildSummariesService buildSummariesService; private BuildSummaryUIService service; private Mock mockConfigService; private static final String PASSING_LOGFILE = DataUtils.PASSING_BUILD_LBUILD_0_XML; protected void setUp() throws Exception { mockBuildSummariesService = mock( HistoricalBuildSummariesService.class, new Class[]{ConfigurationService.class, BuildSummaryService.class}, new Object[]{null, null}); buildSummariesService = (HistoricalBuildSummariesService) mockBuildSummariesService.proxy(); mockConfigService = mock( DashboardXmlConfigService.class, new Class[]{DashboardConfigFileFactory.class}, new Object[]{null}); service = new BuildSummaryUIService( buildSummariesService, (DashboardXmlConfigService) mockConfigService.proxy()); } public void testShouldBeAbleToPutStoryTrackerIntoBuildSummaryInToCommand() throws Exception { BuildSummary buildSummary = new BuildSummary("project1", PreviousResult.FAILED, DataUtils.FAILING_BUILD_XML); List summaries = new ArrayList(); summaries.add(buildSummary); Map expectedMap = new HashMap(); StoryTracker expectedStoryTracker = new StoryTracker(buildSummary.getProjectName(), "", ""); expectedMap.put(buildSummary.getProjectName(), expectedStoryTracker); mockConfigService.expects(once()).method("getStoryTrackers").will(returnValue(expectedMap)); List commands = service.transform(summaries); BuildCommand buildCommand = (BuildCommand) commands.get(0); assertNotNull(PrivateAccessor.getField(buildCommand, "storyTracker")); assertEquals(expectedStoryTracker, PrivateAccessor.getField(buildCommand, "storyTracker")); } public void testShouldBeAbleIngoreInactiveCaseAndReturnCommand() { mockBuildSummariesService.expects(never()).method("getEaliestFailed").withAnyArguments(); mockBuildSummariesService.expects(never()).method("getLastSucceed").withAnyArguments(); mockConfigService.expects(once()).method("getStoryTrackers").will(returnValue(new HashMap())); BuildSummary buildSummary = new BuildSummary("", PreviousResult.UNKNOWN, PASSING_LOGFILE); buildSummary.updateStatus(CurrentStatus.WAITING.getCruiseStatus()); List summaries = new ArrayList(); summaries.add(buildSummary); List transformed = service.transformWithLevel(summaries); assertEquals(1, transformed.size()); assertTrue(transformed.get(0) instanceof BuildCommand); assertEquals( CurrentStatus.WAITING, ((BuildCommand) transformed.get(0)).getBuild() .getCurrentStatus()); } public void testShouldBeAbleIngoreInactiveBuilding() throws Exception { BuildSummary buildSummary = new BuildSummary("project1", PreviousResult.UNKNOWN, PASSING_LOGFILE); buildSummary.updateStatus(CurrentStatus.BUILDING.getCruiseStatus()); List summaries = new ArrayList(); summaries.add(buildSummary); String transformed = service.toXml(summaries, "", "rss"); assertFalse(StringUtils.contains(transformed, "project1")); } public void testShouldBeAbleToUpdateTheFailedBuildToLongFailedBaseOnLastFailedBuildAndReturn() { BuildSummary earilestFailed = new BuildSummary("", PreviousResult.FAILED, DataUtils.FAILING_BUILD_XML); mockBuildSummariesService.expects(atLeastOnce()).method("getEaliestFailed").withAnyArguments().will( returnValue(earilestFailed)); mockBuildSummariesService.expects(never()).method("getLastSucceed").withAnyArguments(); mockConfigService.expects(once()).method("getStoryTrackers").will(returnValue(new HashMap())); BuildSummary current = new BuildSummary("", PreviousResult.FAILED, DataUtils.FAILING_BUILD_XML); List summaries = new ArrayList(); summaries.add(current); List transformed = service.transformWithLevel(summaries); assertEquals( PreviousResult.FAILED, ((BuildCommand) transformed.get(0)).getBuild() .getPreviousBuildResult()); assertEquals("8", ((BuildCommand) transformed.get(0)).getLevel()); } public void testShouldBeAbleToUpdateTheFailedBuildFailedBaseOnLastFailedBuildAndReturn() { BuildSummary earilestFailed = new BuildSummary("", PreviousResult.FAILED, THREE_HOURS_AGO_LOG_FILE); mockBuildSummariesService.expects(atLeastOnce()).method("getEaliestFailed").withAnyArguments().will( returnValue(earilestFailed)); mockBuildSummariesService.expects(never()).method("getLastSucceed").withAnyArguments(); mockConfigService.expects(once()).method("getStoryTrackers").will(returnValue(new HashMap())); BuildSummary current = new BuildSummary("", PreviousResult.FAILED, DataUtils.FAILING_BUILD_XML); List summaries = new ArrayList(); summaries.add(current); List transformed = service.transformWithLevel(summaries); assertEquals("1", ((BuildCommand) transformed.get(0)).getLevel()); } public void testShouldBeAbleToUpdateThePassedBuildToLongPassedBaseOnLastSucceedBuildAndReturn() { BuildSummary earilestSuccess = new BuildSummary("", PreviousResult.PASSED, THREE_DAYS_AGO_LOG_FILE); mockBuildSummariesService.expects(never()).method("getEaliestFailed").withAnyArguments(); mockBuildSummariesService.expects(atLeastOnce()).method("getEarliestSucceeded").withAnyArguments() .will(returnValue(earilestSuccess)); mockConfigService.expects(once()).method("getStoryTrackers").will(returnValue(new HashMap())); BuildSummary current = new BuildSummary("", PreviousResult.PASSED, PASSING_LOGFILE); List summaries = new ArrayList(); summaries.add(current); List transformed = service.transformWithLevel(summaries); assertEquals( PreviousResult.PASSED, ((BuildCommand) transformed.get(0)).getBuild() .getPreviousBuildResult()); assertEquals("8", ((BuildCommand) transformed.get(0)).getLevel()); } public void testShouldBeAbleToUpdateThePassedBuildToPassedBaseOnLastSucceedBuildAndReturn() { BuildSummary earilestSuccess = new BuildSummary("", PreviousResult.PASSED, THREE_HOURS_AGO_LOG_FILE); mockBuildSummariesService.expects(never()).method("getEaliestFailed").withAnyArguments(); mockBuildSummariesService.expects(atLeastOnce()).method("getEarliestSucceeded").withAnyArguments() .will(returnValue(earilestSuccess)); mockConfigService.expects(once()).method("getStoryTrackers").will(returnValue(new HashMap())); BuildSummary current = new BuildSummary("", PreviousResult.PASSED, PASSING_LOGFILE); List summaries = new ArrayList(); summaries.add(current); List transformed = service.transformWithLevel(summaries); assertEquals("1", ((BuildCommand) transformed.get(0)).getLevel()); } public void testShouldReturnUnknownStatusWhenFailedToFindLastBuild() throws Exception { mockBuildSummariesService.expects(once()).method("getLatest").will(returnValue(null)); PreviousResult status = service.getLastBuildStatus("new_project"); assertEquals(PreviousResult.UNKNOWN, status); } public void testShouldReturnLastBuildStatusWhenLastBuildExist() throws Exception { mockBuildSummariesService.expects(once()).method("getLatest").will( returnValue(new BuildSummary("project1", PreviousResult.FAILED, DataUtils.FAILING_BUILD_XML))); PreviousResult status = service.getLastBuildStatus("project1"); assertEquals(PreviousResult.FAILED, status); } public void testShouldReturn0SecondWhenLastBuildDoestNotExist() throws Exception { mockBuildSummariesService.expects(once()).method("getLatest").will( returnValue(null)); assertEquals("0 second", service.getLastBuildDuration("project1")); } public void testShouldReturnLastBuildDurationWhenLastBuildExist() throws Exception { Mock mockBuildSummary = mock(BuildSummary.class, new Class[]{String.class}, new Object[]{""}); mockBuildSummary.expects(once()).method("getDuration").will(returnValue("1 second")); mockBuildSummariesService.expects(once()).method("getLatest").will( returnValue(mockBuildSummary.proxy())); assertEquals("1 second", service.getLastBuildDuration("project1")); } }