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