Skip to content
This repository has been archived by the owner on Sep 4, 2024. It is now read-only.

Commit

Permalink
Fix DST expected value issue for ScheduleFact.cs
Browse files Browse the repository at this point in the history
  • Loading branch information
wilsonson authored and mathewc committed May 3, 2018
1 parent 2ec9fc7 commit 50c9627
Showing 1 changed file with 28 additions and 21 deletions.
49 changes: 28 additions & 21 deletions Kudu.Core.Test/Jobs/ScheduleFacts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class ScheduleFacts
[InlineData("* * * 3 * *", "00:00:00 1/1/2015", "2.00:00:00", false)]
[InlineData("* * * * 2 *", "00:00:00 1/1/2015", "31.00:00:00", false)]
[InlineData("* * * * 3 *", "00:00:00 1/1/2015", "59.00:00:00", false)]
[InlineData("* * * * 4 *", "00:00:00 1/1/2015", "89.23:00:00", false)] // DST transition on March 11th
[InlineData("* * * * 4 *", "00:00:00 1/1/2015", "90.00:00:00", false)]
[InlineData("10 * * * * *", "00:00:00 1/1/2014", "00:00:10", false)]
[InlineData("0 */5 * * * *", "23:00:00 12/31/2014", "00:05:00", false)]
[InlineData("0 */2 * * * *", "23:57:00 12/31/2014", "00:00:00", false)]
Expand All @@ -28,16 +28,18 @@ public void ScheduleProvidesNextIntervalCorrectly(string cronExpression, string
{
var mockEnvironment = new Mock<IEnvironment>();
mockEnvironment.Setup(p => p.JobsDataPath).Returns(String.Empty);
var triggeredJobSchedulerLoggerMock = new Mock<TriggeredJobSchedulerLogger>(String.Empty , mockEnvironment.Object , null);

var triggeredJobSchedulerLoggerMock = new Mock<TriggeredJobSchedulerLogger>(String.Empty, mockEnvironment.Object, null);
var schedule = Schedule.BuildSchedule(cronExpression, triggeredJobSchedulerLoggerMock.Object);
schedule.SetDateTimeProvider(new TestDateTimeNowProvider(DateTime.Parse("00:00:00 1/1/2015", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal)));

DateTime lastSchedule = DateTime.Parse(lastScheduleStr, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
TimeSpan actualNextSchedule = schedule.GetNextInterval(lastSchedule, ignoreMissed);

// Running on the Friday before the DST switch at 2 AM on 3/11 (Pacific Standard Time)
var schedule = Schedule.BuildSchedule(cronExpression , triggeredJobSchedulerLoggerMock.Object);
var now = DateTime.Parse("00:00:00 1/1/2015" , CultureInfo.InvariantCulture , DateTimeStyles.AssumeLocal);
schedule.SetDateTimeProvider(new TestDateTimeNowProvider(now));
DateTime lastSchedule = DateTime.Parse(lastScheduleStr , CultureInfo.InvariantCulture , DateTimeStyles.AssumeLocal);
TimeSpan actualNextSchedule = schedule.GetNextInterval(lastSchedule , ignoreMissed);
TimeSpan expectedNextInterval = TimeSpan.Parse(expectedNextIntervalStr);
Assert.Equal(expectedNextInterval, actualNextSchedule);
expectedNextInterval = GetTimeZoneAdjustedInterval(expectedNextInterval , now);

Assert.Equal(expectedNextInterval , actualNextSchedule);
}

/// <summary>
Expand All @@ -49,19 +51,19 @@ public void GetNextInterval_NextAfterDST_ReturnsExpectedValue()
{
var mockEnvironment = new Mock<IEnvironment>();
mockEnvironment.Setup(p => p.JobsDataPath).Returns(String.Empty);
var triggeredJobSchedulerLoggerMock = new Mock<TriggeredJobSchedulerLogger>(String.Empty, mockEnvironment.Object, null);
var triggeredJobSchedulerLoggerMock = new Mock<TriggeredJobSchedulerLogger>(String.Empty , mockEnvironment.Object , null);

// Running on the Friday before the DST switch at 2 AM on 3/11 (Pacific Standard Time)
// Note: this test uses Local time, so if you're running in a timezone where
// DST doesn't transition the test might not be valid.
var schedule = Schedule.BuildSchedule("0 0 18 * * 5", triggeredJobSchedulerLoggerMock.Object);
var now = new DateTime(2018, 3, 9, 18, 0, 0, DateTimeKind.Local);
// Running at 1:59 AM, i.e. one minute before the DST switch at 2 AM on 3/11 (Pacific Standard Time)
var schedule = Schedule.BuildSchedule("0 0 18 * * 5" , triggeredJobSchedulerLoggerMock.Object);
var now = new DateTime(2018 , 3 , 9 , 18 , 0 , 0 , DateTimeKind.Local);
schedule.SetDateTimeProvider(new TestDateTimeNowProvider(now));

TimeSpan interval = schedule.GetNextInterval(now, ignoreMissed: true);
TimeSpan interval = schedule.GetNextInterval(now , ignoreMissed: true);
var expectedInterval = new TimeSpan(168 , 0 , 0);

// One week is normally 168 hours, but it's 167 hours across DST
Assert.Equal(167, interval.TotalHours);
expectedInterval = GetTimeZoneAdjustedInterval(expectedInterval , now);

Assert.Equal(expectedInterval , interval);
}

/// <summary>
Expand All @@ -76,9 +78,6 @@ public void GetNextInterval_NextWithinDST_ReturnsExpectedValue()
var triggeredJobSchedulerLoggerMock = new Mock<TriggeredJobSchedulerLogger>(String.Empty, mockEnvironment.Object, null);

// Running at 1:59 AM, i.e. one minute before the DST switch at 2 AM on 3/11 (Pacific Standard Time)
// Note: this test uses Local time, so if you're running in a timezone where
// DST doesn't transition the test might not be valid.
// Configure schedule to run on the 59th minute of every hour
var schedule = Schedule.BuildSchedule("0 59 * * * *", triggeredJobSchedulerLoggerMock.Object);
var now = new DateTime(2018, 3, 11, 1, 59, 0, DateTimeKind.Local);
schedule.SetDateTimeProvider(new TestDateTimeNowProvider(now));
Expand All @@ -90,6 +89,14 @@ public void GetNextInterval_NextWithinDST_ReturnsExpectedValue()
Assert.Equal(1, interval.TotalHours);
}

private static TimeSpan GetTimeZoneAdjustedInterval(TimeSpan interval, DateTime now)
{
var nowTimeOffset = new DateTimeOffset(now).Offset;
var expectedTimeOffset = new DateTimeOffset(now.Add(interval)).Offset;

return interval.Add(nowTimeOffset - expectedTimeOffset);
}

private class TestDateTimeNowProvider : Schedule.IDateTimeNowProvider
{
public TestDateTimeNowProvider(DateTime now)
Expand Down

0 comments on commit 50c9627

Please sign in to comment.