Index: E:/Source/OpenSource/ccnet-svn-trunk/project/core/Triggers/IntervalTrigger.cs =================================================================== --- E:/Source/OpenSource/ccnet-svn-trunk/project/core/Triggers/IntervalTrigger.cs (revision 3607) +++ E:/Source/OpenSource/ccnet-svn-trunk/project/core/Triggers/IntervalTrigger.cs (working copy) @@ -11,7 +11,8 @@ public const double DefaultIntervalSeconds = 60; private readonly DateTimeProvider dateTimeProvider; private string name; - private double intervalSeconds = DefaultIntervalSeconds; + private double intervalSeconds = DefaultIntervalSeconds; + private double initialIntervalSeconds = 0; private DateTime nextBuildTime; @@ -43,18 +44,36 @@ intervalSeconds = value; IncrementNextBuildTime(); } - } + } + [ReflectorProperty("initialSeconds", Required = false)] + public double InitialIntervalSeconds + { + get { return initialIntervalSeconds; } + set + { + initialIntervalSeconds = value; + IncrementNextBuildTime(); + } + } + [ReflectorProperty("buildCondition", Required=false)] public BuildCondition BuildCondition = BuildCondition.IfModificationExists; public virtual void IntegrationCompleted() { + initialIntervalSeconds = 0; + IncrementNextBuildTime(); } protected DateTime IncrementNextBuildTime() { + if (initialIntervalSeconds != 0) + { + return nextBuildTime = dateTimeProvider.Now.AddSeconds(initialIntervalSeconds); + } + return nextBuildTime = dateTimeProvider.Now.AddSeconds(intervalSeconds); } Index: E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/Triggers/IntervalTriggerTest.cs =================================================================== --- E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/Triggers/IntervalTriggerTest.cs (revision 3607) +++ E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/Triggers/IntervalTriggerTest.cs (working copy) @@ -33,9 +33,10 @@ [Test] public void ShouldFullyPopulateFromReflector() { - string xml = string.Format(@""); + string xml = string.Format(@""); trigger = (IntervalTrigger) NetReflector.Read(xml); - Assert.AreEqual(1, trigger.IntervalSeconds); + Assert.AreEqual(2, trigger.IntervalSeconds); + Assert.AreEqual(1, trigger.InitialIntervalSeconds); Assert.AreEqual(BuildCondition.ForceBuild, trigger.BuildCondition); Assert.AreEqual("continuous", trigger.Name); } @@ -46,6 +47,7 @@ string xml = string.Format(@""); trigger = (IntervalTrigger) NetReflector.Read(xml); Assert.AreEqual(IntervalTrigger.DefaultIntervalSeconds, trigger.IntervalSeconds); + Assert.AreEqual(0, trigger.InitialIntervalSeconds); Assert.AreEqual(BuildCondition.IfModificationExists, trigger.BuildCondition); Assert.AreEqual("IntervalTrigger", trigger.Name); } @@ -78,6 +80,41 @@ } [Test] + public void VerifyThatShouldRequestInitialIntegrationAfterTwoSecondsAndSubsequentIntegrationsAfterTenSeconds() + { + trigger.InitialIntervalSeconds = 2; + trigger.IntervalSeconds = 10; + trigger.BuildCondition = BuildCondition.IfModificationExists; + + //initialDateTimeNow = new DateTime(2002, 1, 2, 3, 0, 0, 0); + + mockDateTime.SetupResult("Now", new DateTime(2002, 1, 2, 3, 0, 0, 0)); // now + Assert.IsNull(trigger.Fire()); + + mockDateTime.SetupResult("Now", new DateTime(2002, 1, 2, 3, 0, 1, 0)); // 1 second later + Assert.IsNull(trigger.Fire()); + + mockDateTime.SetupResult("Now", new DateTime(2002, 1, 2, 3, 0, 2, 0)); // 2 seconds later + Assert.AreEqual(ModificationExistRequest(), trigger.Fire()); + trigger.IntegrationCompleted(); + + mockDateTime.SetupResult("Now", new DateTime(2002, 1, 2, 3, 0, 3, 0)); // 1 second later + Assert.IsNull(trigger.Fire()); + + mockDateTime.SetupResult("Now", new DateTime(2002, 1, 2, 3, 0, 11, 0)); // 9 seconds later + + // still before 1sec + Assert.IsNull(trigger.Fire()); + + mockDateTime.SetupResult("Now", new DateTime(2002, 1, 2, 3, 0, 14, 0)); // 2 seconds after trigger + Assert.AreEqual(ModificationExistRequest(), trigger.Fire()); + trigger.IntegrationCompleted(); + Assert.IsNull(trigger.Fire()); + VerifyAll(); + } + + + [Test] public void ProcessTrigger() { trigger.IntervalSeconds = 0.5; @@ -123,6 +160,15 @@ } [Test] + public void ShouldReturnInitialIntervalTimeForNextBuildOnServerStart() + { + trigger.InitialIntervalSeconds = 10; + trigger.IntervalSeconds = 30; + Assert.AreEqual(initialDateTimeNow.AddSeconds(10), trigger.NextBuild); + VerifyAll(); + } + + [Test] public void ShouldReturnIntervalTimeIfLastBuildJustOccured() { trigger.IntervalSeconds = 10; @@ -131,5 +177,17 @@ trigger.IntegrationCompleted(); Assert.AreEqual(stubNow.AddSeconds(10), trigger.NextBuild); } + + [Test] + public void ShouldReturnIntervalTimeIfInitialBuildJustOccured() + { + trigger.InitialIntervalSeconds = 10; + trigger.IntervalSeconds = 30; + DateTime stubNow = new DateTime(2004, 1, 1, 1, 0, 0, 0); + mockDateTime.SetupResult("Now", stubNow); + trigger.IntegrationCompleted(); + Assert.AreEqual(stubNow.AddSeconds(30), trigger.NextBuild); + } + } } \ No newline at end of file