package net.sourceforge.cruisecontrol.sourcecontrols; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import junit.framework.TestCase; import net.sourceforge.cruisecontrol.CruiseControlException; import net.sourceforge.cruisecontrol.Modification; import net.sourceforge.cruisecontrol.SourceControl; public class VetoTest extends TestCase { public void testValidateFailsWithNoTriggersElement() { Veto veto = new Veto(); String message = "veto requires nested triggers element"; assertValidateFails(veto, message); } public void testValidateFailsWithEmptryTriggersElement() throws CruiseControlException { Veto veto = new Veto(); veto.createTriggers(); String message = "Error: there must be at least one source control in a triggers block."; assertValidateFails(veto, message); } public void testValidateFailsWithNoBuildStatus() throws CruiseControlException { Veto veto = new Veto(); Triggers t = veto.createTriggers(); t.add(new MockSourceControl()); String message = "veto requires a nested buildstatus element"; assertValidateFails(veto, message); } public void testValidateFailsWithBuildStatusUnconfigured() throws CruiseControlException { Veto veto = new Veto(); Triggers t = veto.createTriggers(); t.add(new MockSourceControl()); veto.createBuildStatus(); String message = "'logdir' is required for BuildStatus"; assertValidateFails(veto, message); } private void assertValidateFails(Veto veto, String message) { try { veto.validate(); fail(); } catch (CruiseControlException expected) { assertEquals(message, expected.getMessage()); } } public void testCreateTriggersCanOnlyBeCalledOnce() throws CruiseControlException { Veto veto = new Veto(); veto.createTriggers(); try { veto.createTriggers(); } catch (CruiseControlException expected) { assertEquals("only one nested triggers allowed", expected.getMessage()); } } public void testCreateBuildStatusCanOnlyBeCalledOnce() throws CruiseControlException { Veto veto = new Veto(); veto.createBuildStatus(); try { veto.createBuildStatus(); } catch (CruiseControlException expected) { assertEquals("only one nested buildstatus allowed", expected.getMessage()); } } public void testGetModificationsShouldReturnEmptyListWhenTriggersHaveNoChanges() throws CruiseControlException { MockBuildStatus status = new MockBuildStatus(); Veto veto = new TestVeto(status); veto.createBuildStatus(); SourceControl sc = new MockSourceControl() { public List<Modification> getModifications(final Date lastBuild, final Date now) { return new ArrayList<Modification>(); } }; Triggers triggers = veto.createTriggers(); triggers.add(sc); veto.validate(); Date notUsedInTest = new Date(); assertEquals(0, veto.getModifications(notUsedInTest, notUsedInTest).size()); } public void testGetModificationsShouldThrowExceptionWhenBuildStatusShowsNoBuild() throws CruiseControlException { MockBuildStatus status = new MockBuildStatus(); Veto veto = new TestVeto(status); veto.createBuildStatus(); Triggers triggers = veto.createTriggers(); MockSourceControl sc = new MockSourceControl(); sc.setType(1); triggers.add(sc); veto.validate(); Date notUsedInTest = new Date(); try { veto.getModifications(notUsedInTest, notUsedInTest); fail(); } catch (RuntimeException expected) { assertEquals("trigger changes with no buildstatus changes", expected.getMessage()); } } public void testGetModificationsShouldThrowExceptionWhenBuildStatusOutOfDate() throws CruiseControlException { MockBuildStatus status = new MockBuildStatus(); Veto veto = new TestVeto(status); veto.createBuildStatus(); Triggers triggers = veto.createTriggers(); MockSourceControl sc = new MockSourceControl(); sc.setType(1); triggers.add(sc); veto.validate(); Calendar cal = Calendar.getInstance(); cal.add(Calendar.MINUTE, -1); Modification mod = new Modification(); mod.modifiedTime = cal.getTime(); status.modifications.add(mod); Date notUsedInTest = new Date(); try { veto.getModifications(notUsedInTest, notUsedInTest); fail(); } catch (RuntimeException expected) { assertEquals("buildstatus out of date compared to trigger changes", expected.getMessage()); } } public void testGetModificationsShouldNotThrowExceptionWhenBuildStatusCurrent() throws CruiseControlException { MockBuildStatus status = new MockBuildStatus(); Veto veto = new TestVeto(status); veto.createBuildStatus(); Triggers triggers = veto.createTriggers(); MockSourceControl sc = new MockSourceControl(); sc.setType(1); triggers.add(sc); veto.validate(); Calendar cal = Calendar.getInstance(); cal.add(Calendar.MINUTE, +1); Modification mod = new Modification(); mod.modifiedTime = cal.getTime(); status.modifications.add(mod); Date notUsedInTest = new Date(); assertEquals(0, veto.getModifications(notUsedInTest, notUsedInTest).size()); } private class MockBuildStatus extends BuildStatus { private final ArrayList<Modification> modifications = new ArrayList<Modification>(); public List<Modification> getModifications(final Date lastBuild, final Date unused) { return modifications; } public void validate() throws CruiseControlException { } } private final class TestVeto extends Veto { private final BuildStatus status; private TestVeto(final BuildStatus status) { this.status = status; } protected BuildStatus getBuildStatus() { return status; } } }