/*******************************************************************************
* CruiseControl, a Continuous Integration Toolkit Copyright (c) 2001,
* 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.sourcecontrols;
import java.util.Calendar;
import java.util.List;
import java.util.Date;
import junit.framework.TestCase;
import net.sourceforge.cruisecontrol.CruiseControlException;
import net.sourceforge.cruisecontrol.Modification;
/**
* @version $Id$
*/
public class TimeBuildTest extends TestCase {
public void testValidate() {
TimeBuild timeBuild = new TimeBuild();
try {
timeBuild.validate();
fail("TimeBuild should throw exceptions when required attributes are not set.");
} catch (CruiseControlException e) {
assertEquals("the 'time' attribute is mandatory", e.getMessage());
}
}
public void testTimes() {
Calendar calender1400 = Calendar.getInstance();
calender1400.set(2002, Calendar.DECEMBER, 23, 14, 00, 00);
Calendar calender1600 = Calendar.getInstance();
calender1600.set(2002, Calendar.DECEMBER, 23, 16, 00, 00);
Calendar calender1601 = Calendar.getInstance();
calender1601.set(2002, Calendar.DECEMBER, 23, 16, 01, 00);
calender1601.set(Calendar.MILLISECOND, 0);
Calendar calender1602 = Calendar.getInstance();
calender1602.set(2002, Calendar.DECEMBER, 23, 16, 02, 00);
Calendar calender1603 = Calendar.getInstance();
calender1603.set(2002, Calendar.DECEMBER, 23, 16, 03, 00);
String modifierUserName = "epugh";
TimeBuild timeBuild = createTimeBuildForTime(modifierUserName, "1601");
assertSinceLastBuildNoModificationsAtTime(calender1400, calender1600, timeBuild);
assertSinceLastBuildNoModificationsAtTime(calender1400, calender1601, timeBuild);
List modifications = timeBuild.getModifications(calender1400.getTime(), calender1602.getTime());
assertHasSingleModificationThatMatchesNameAndTime(modifications, modifierUserName, calender1601.getTime());
assertSinceLastBuildNoModificationsAtTime(calender1602, calender1603, timeBuild);
}
private void assertSinceLastBuildNoModificationsAtTime(Calendar lastBuild, Calendar now, TimeBuild timeBuild) {
List modifications = timeBuild.getModifications(lastBuild.getTime(), now.getTime());
assertEquals(0, modifications.size());
}
private TimeBuild createTimeBuildForTime(String userName, String buildTime) {
TimeBuild timeBuild = new TimeBuild();
timeBuild.setTime(buildTime);
timeBuild.setUserName(userName);
return timeBuild;
}
public void testTimeBuildWorksAcrossDays() {
Calendar calender2000Previousday = Calendar.getInstance();
calender2000Previousday.set(2002, Calendar.DECEMBER, 22, 20, 00, 00);
Calendar calender1400 = Calendar.getInstance();
calender1400.set(2002, Calendar.DECEMBER, 23, 14, 00, 00);
Calendar calender1600 = Calendar.getInstance();
calender1600.set(2002, Calendar.DECEMBER, 23, 16, 00, 00);
calender1600.set(Calendar.MILLISECOND, 0);
Calendar calender1601 = Calendar.getInstance();
calender1601.set(2002, Calendar.DECEMBER, 23, 16, 01, 00);
Calendar calender1603 = Calendar.getInstance();
calender1603.set(2002, Calendar.DECEMBER, 23, 16, 03, 00);
// Schedule a timed build for 16:00
TimeBuild timeBuild = new TimeBuild();
timeBuild.setTime("1600");
timeBuild.setUserName("epugh");
Date lastBuildEightPMYesterday = calender2000Previousday.getTime();
// No "modifications" at 14:00
List modifications = timeBuild.getModifications(lastBuildEightPMYesterday, calender1400.getTime());
assertEquals(0, modifications.size());
// No "modifications" at 16:00
modifications = timeBuild.getModifications(lastBuildEightPMYesterday, calender1600.getTime());
assertEquals(0, modifications.size());
// Should have one "modification" at 16:01 which is the TimedBuild
// modification for 16:00
modifications = timeBuild.getModifications(lastBuildEightPMYesterday, calender1601.getTime());
assertEquals(1, modifications.size());
assertHasSingleModificationThatMatchesNameAndTime(modifications, "epugh", calender1600.getTime());
// No "modifications" from 16:01 to 16:03
modifications = timeBuild.getModifications(calender1601.getTime(), calender1603.getTime());
assertEquals(0, modifications.size());
Calendar calender1200Previousday = Calendar.getInstance();
calender1200Previousday.set(2002, Calendar.DECEMBER, 22, 12, 00, 00);
Date lastBuildNoonYesterday = calender1200Previousday.getTime();
// Should have one "modification" at 14:00 which is the TimedBuild
modifications = timeBuild.getModifications(lastBuildNoonYesterday, calender1400.getTime());
assertEquals(1, modifications.size());
}
public void testShouldWorkAcrossMultipleDays() {
// Schedule a timed build for 16:00
TimeBuild timeBuild = new TimeBuild();
timeBuild.setTime("1600");
timeBuild.setUserName("epugh");
Calendar calender1400 = Calendar.getInstance();
calender1400.set(2002, Calendar.DECEMBER, 23, 14, 00, 00);
Calendar cal1800TwoDaysAgo = Calendar.getInstance();
cal1800TwoDaysAgo.set(2002, Calendar.DECEMBER, 21, 18, 00, 00);
// Should have one "modification" at 14:00 which is the TimedBuild
List modifications = timeBuild.getModifications(cal1800TwoDaysAgo.getTime(), calender1400.getTime());
assertEquals(1, modifications.size());
}
private void assertHasSingleModificationThatMatchesNameAndTime(List modifications, String userName,
Date expectedModifiedTime) {
assertEquals(1, modifications.size());
Modification modification = (Modification) modifications.get(0);
assertEquals(userName, modification.userName);
assertEquals(expectedModifiedTime, modification.modifiedTime);
}
}