|
|
@@ -11,24 +11,24 @@ func TestActivation(t *testing.T) {
|
|
|
expected bool
|
|
|
}{
|
|
|
// Every fifteen minutes.
|
|
|
- {"Mon Jul 9 15:00 2012", "0 0/15 * * *", true},
|
|
|
- {"Mon Jul 9 15:45 2012", "0 0/15 * * *", true},
|
|
|
- {"Mon Jul 9 15:40 2012", "0 0/15 * * *", false},
|
|
|
+ {"Mon Jul 9 15:00 2012", "0/15 * * * *", true},
|
|
|
+ {"Mon Jul 9 15:45 2012", "0/15 * * * *", true},
|
|
|
+ {"Mon Jul 9 15:40 2012", "0/15 * * * *", false},
|
|
|
|
|
|
// Every fifteen minutes, starting at 5 minutes.
|
|
|
- {"Mon Jul 9 15:05 2012", "0 5/15 * * *", true},
|
|
|
- {"Mon Jul 9 15:20 2012", "0 5/15 * * *", true},
|
|
|
- {"Mon Jul 9 15:50 2012", "0 5/15 * * *", true},
|
|
|
+ {"Mon Jul 9 15:05 2012", "5/15 * * * *", true},
|
|
|
+ {"Mon Jul 9 15:20 2012", "5/15 * * * *", true},
|
|
|
+ {"Mon Jul 9 15:50 2012", "5/15 * * * *", true},
|
|
|
|
|
|
// Named months
|
|
|
- {"Sun Jul 15 15:00 2012", "0 0/15 * * Jul", true},
|
|
|
- {"Sun Jul 15 15:00 2012", "0 0/15 * * Jun", false},
|
|
|
+ {"Sun Jul 15 15:00 2012", "0/15 * * Jul *", true},
|
|
|
+ {"Sun Jul 15 15:00 2012", "0/15 * * Jun *", false},
|
|
|
|
|
|
// Everything set.
|
|
|
- {"Sun Jul 15 08:30 2012", "0 30 08 ? Jul Sun", true},
|
|
|
- {"Sun Jul 15 08:30 2012", "0 30 08 15 Jul ?", true},
|
|
|
- {"Mon Jul 16 08:30 2012", "0 30 08 ? Jul Sun", false},
|
|
|
- {"Mon Jul 16 08:30 2012", "0 30 08 15 Jul ?", false},
|
|
|
+ {"Sun Jul 15 08:30 2012", "30 08 ? Jul Sun", true},
|
|
|
+ {"Sun Jul 15 08:30 2012", "30 08 15 Jul ?", true},
|
|
|
+ {"Mon Jul 16 08:30 2012", "30 08 ? Jul Sun", false},
|
|
|
+ {"Mon Jul 16 08:30 2012", "30 08 15 Jul ?", false},
|
|
|
|
|
|
// Predefined schedules
|
|
|
{"Mon Jul 9 15:00 2012", "@hourly", true},
|
|
|
@@ -43,20 +43,20 @@ func TestActivation(t *testing.T) {
|
|
|
|
|
|
// Test interaction of DOW and DOM.
|
|
|
// If both are specified, then only one needs to match.
|
|
|
- {"Sun Jul 15 00:00 2012", "0 * * 1,15 * Sun", true},
|
|
|
- {"Fri Jun 15 00:00 2012", "0 * * 1,15 * Sun", true},
|
|
|
- {"Wed Aug 1 00:00 2012", "0 * * 1,15 * Sun", true},
|
|
|
+ {"Sun Jul 15 00:00 2012", "* * 1,15 * Sun", true},
|
|
|
+ {"Fri Jun 15 00:00 2012", "* * 1,15 * Sun", true},
|
|
|
+ {"Wed Aug 1 00:00 2012", "* * 1,15 * Sun", true},
|
|
|
|
|
|
// However, if one has a star, then both need to match.
|
|
|
- {"Sun Jul 15 00:00 2012", "0 * * * * Mon", false},
|
|
|
- {"Sun Jul 15 00:00 2012", "0 * * */10 * Sun", false},
|
|
|
- {"Mon Jul 9 00:00 2012", "0 * * 1,15 * *", false},
|
|
|
- {"Sun Jul 15 00:00 2012", "0 * * 1,15 * *", true},
|
|
|
- {"Sun Jul 15 00:00 2012", "0 * * */2 * Sun", true},
|
|
|
+ {"Sun Jul 15 00:00 2012", "* * * * Mon", false},
|
|
|
+ {"Sun Jul 15 00:00 2012", "* * */10 * Sun", false},
|
|
|
+ {"Mon Jul 9 00:00 2012", "* * 1,15 * *", false},
|
|
|
+ {"Sun Jul 15 00:00 2012", "* * 1,15 * *", true},
|
|
|
+ {"Sun Jul 15 00:00 2012", "* * */2 * Sun", true},
|
|
|
}
|
|
|
|
|
|
for _, test := range tests {
|
|
|
- sched, err := Parse(test.spec)
|
|
|
+ sched, err := ParseStandard(test.spec)
|
|
|
if err != nil {
|
|
|
t.Error(err)
|
|
|
continue
|
|
|
@@ -76,19 +76,19 @@ func TestNext(t *testing.T) {
|
|
|
expected string
|
|
|
}{
|
|
|
// Simple cases
|
|
|
- {"Mon Jul 9 14:45 2012", "0 0/15 * * *", "Mon Jul 9 15:00 2012"},
|
|
|
- {"Mon Jul 9 14:59 2012", "0 0/15 * * *", "Mon Jul 9 15:00 2012"},
|
|
|
- {"Mon Jul 9 14:59:59 2012", "0 0/15 * * *", "Mon Jul 9 15:00 2012"},
|
|
|
+ {"Mon Jul 9 14:45 2012", "0 0/15 * * * *", "Mon Jul 9 15:00 2012"},
|
|
|
+ {"Mon Jul 9 14:59 2012", "0 0/15 * * * *", "Mon Jul 9 15:00 2012"},
|
|
|
+ {"Mon Jul 9 14:59:59 2012", "0 0/15 * * * *", "Mon Jul 9 15:00 2012"},
|
|
|
|
|
|
// Wrap around hours
|
|
|
- {"Mon Jul 9 15:45 2012", "0 20-35/15 * * *", "Mon Jul 9 16:20 2012"},
|
|
|
+ {"Mon Jul 9 15:45 2012", "0 20-35/15 * * * *", "Mon Jul 9 16:20 2012"},
|
|
|
|
|
|
// Wrap around days
|
|
|
- {"Mon Jul 9 23:46 2012", "0 */15 * * *", "Tue Jul 10 00:00 2012"},
|
|
|
- {"Mon Jul 9 23:45 2012", "0 20-35/15 * * *", "Tue Jul 10 00:20 2012"},
|
|
|
- {"Mon Jul 9 23:35:51 2012", "15/35 20-35/15 * * *", "Tue Jul 10 00:20:15 2012"},
|
|
|
- {"Mon Jul 9 23:35:51 2012", "15/35 20-35/15 1/2 * *", "Tue Jul 10 01:20:15 2012"},
|
|
|
- {"Mon Jul 9 23:35:51 2012", "15/35 20-35/15 10-12 * *", "Tue Jul 10 10:20:15 2012"},
|
|
|
+ {"Mon Jul 9 23:46 2012", "0 */15 * * * *", "Tue Jul 10 00:00 2012"},
|
|
|
+ {"Mon Jul 9 23:45 2012", "0 20-35/15 * * * *", "Tue Jul 10 00:20 2012"},
|
|
|
+ {"Mon Jul 9 23:35:51 2012", "15/35 20-35/15 * * * *", "Tue Jul 10 00:20:15 2012"},
|
|
|
+ {"Mon Jul 9 23:35:51 2012", "15/35 20-35/15 1/2 * * *", "Tue Jul 10 01:20:15 2012"},
|
|
|
+ {"Mon Jul 9 23:35:51 2012", "15/35 20-35/15 10-12 * * *", "Tue Jul 10 10:20:15 2012"},
|
|
|
|
|
|
{"Mon Jul 9 23:35:51 2012", "15/35 20-35/15 1/2 */2 * *", "Thu Jul 11 01:20:15 2012"},
|
|
|
{"Mon Jul 9 23:35:51 2012", "15/35 20-35/15 * 9-20 * *", "Wed Jul 10 00:20:15 2012"},
|
|
|
@@ -110,24 +110,42 @@ func TestNext(t *testing.T) {
|
|
|
{"Mon Jul 9 23:35 2012", "0 0 0 29 Feb ?", "Mon Feb 29 00:00 2016"},
|
|
|
|
|
|
// Daylight savings time 2am EST (-5) -> 3am EDT (-4)
|
|
|
- {"2012-03-11T00:00:00-0500", "0 30 2 11 Mar ?", "2013-03-11T02:30:00-0400"},
|
|
|
+ {"2012-03-11T00:00:00-0500", "TZ=America/New_York 0 30 2 11 Mar ?", "2013-03-11T02:30:00-0400"},
|
|
|
|
|
|
// hourly job
|
|
|
- {"2012-03-11T00:00:00-0500", "0 0 * * * ?", "2012-03-11T01:00:00-0500"},
|
|
|
- {"2012-03-11T01:00:00-0500", "0 0 * * * ?", "2012-03-11T03:00:00-0400"},
|
|
|
- {"2012-03-11T03:00:00-0400", "0 0 * * * ?", "2012-03-11T04:00:00-0400"},
|
|
|
- {"2012-03-11T04:00:00-0400", "0 0 * * * ?", "2012-03-11T05:00:00-0400"},
|
|
|
+ {"2012-03-11T00:00:00-0500", "TZ=America/New_York 0 0 * * * ?", "2012-03-11T01:00:00-0500"},
|
|
|
+ {"2012-03-11T01:00:00-0500", "TZ=America/New_York 0 0 * * * ?", "2012-03-11T03:00:00-0400"},
|
|
|
+ {"2012-03-11T03:00:00-0400", "TZ=America/New_York 0 0 * * * ?", "2012-03-11T04:00:00-0400"},
|
|
|
+ {"2012-03-11T04:00:00-0400", "TZ=America/New_York 0 0 * * * ?", "2012-03-11T05:00:00-0400"},
|
|
|
|
|
|
// 1am nightly job
|
|
|
- {"2012-03-11T00:00:00-0500", "0 0 1 * * ?", "2012-03-11T01:00:00-0500"},
|
|
|
- {"2012-03-11T01:00:00-0500", "0 0 1 * * ?", "2012-03-12T01:00:00-0400"},
|
|
|
+ {"2012-03-11T00:00:00-0500", "TZ=America/New_York 0 0 1 * * ?", "2012-03-11T01:00:00-0500"},
|
|
|
+ {"2012-03-11T01:00:00-0500", "TZ=America/New_York 0 0 1 * * ?", "2012-03-12T01:00:00-0400"},
|
|
|
|
|
|
// 2am nightly job (skipped)
|
|
|
- {"2012-03-11T00:00:00-0500", "0 0 2 * * ?", "2012-03-12T02:00:00-0400"},
|
|
|
+ {"2012-03-11T00:00:00-0500", "TZ=America/New_York 0 0 2 * * ?", "2012-03-12T02:00:00-0400"},
|
|
|
|
|
|
// Daylight savings time 2am EDT (-4) => 1am EST (-5)
|
|
|
- {"2012-11-04T00:00:00-0400", "0 30 2 04 Nov ?", "2012-11-04T02:30:00-0500"},
|
|
|
- {"2012-11-04T01:45:00-0400", "0 30 1 04 Nov ?", "2012-11-04T01:30:00-0500"},
|
|
|
+ {"2012-11-04T00:00:00-0400", "TZ=America/New_York 0 30 2 04 Nov ?", "2012-11-04T02:30:00-0500"},
|
|
|
+ {"2012-11-04T01:45:00-0400", "TZ=America/New_York 0 30 1 04 Nov ?", "2012-11-04T01:30:00-0500"},
|
|
|
+
|
|
|
+ // hourly job
|
|
|
+ {"2012-11-04T00:00:00-0400", "TZ=America/New_York 0 0 * * * ?", "2012-11-04T01:00:00-0400"},
|
|
|
+ {"2012-11-04T01:00:00-0400", "TZ=America/New_York 0 0 * * * ?", "2012-11-04T01:00:00-0500"},
|
|
|
+ {"2012-11-04T01:00:00-0500", "TZ=America/New_York 0 0 * * * ?", "2012-11-04T02:00:00-0500"},
|
|
|
+
|
|
|
+ // 1am nightly job (runs twice)
|
|
|
+ {"2012-11-04T00:00:00-0400", "TZ=America/New_York 0 0 1 * * ?", "2012-11-04T01:00:00-0400"},
|
|
|
+ {"2012-11-04T01:00:00-0400", "TZ=America/New_York 0 0 1 * * ?", "2012-11-04T01:00:00-0500"},
|
|
|
+ {"2012-11-04T01:00:00-0500", "TZ=America/New_York 0 0 1 * * ?", "2012-11-05T01:00:00-0500"},
|
|
|
+
|
|
|
+ // 2am nightly job
|
|
|
+ {"2012-11-04T00:00:00-0400", "TZ=America/New_York 0 0 2 * * ?", "2012-11-04T02:00:00-0500"},
|
|
|
+ {"2012-11-04T02:00:00-0500", "TZ=America/New_York 0 0 2 * * ?", "2012-11-05T02:00:00-0500"},
|
|
|
+
|
|
|
+ // 3am nightly job
|
|
|
+ {"2012-11-04T00:00:00-0400", "TZ=America/New_York 0 0 3 * * ?", "2012-11-04T03:00:00-0500"},
|
|
|
+ {"2012-11-04T03:00:00-0500", "TZ=America/New_York 0 0 3 * * ?", "2012-11-05T03:00:00-0500"},
|
|
|
|
|
|
// hourly job
|
|
|
{"2012-11-04T00:00:00-0400", "0 0 * * * ?", "2012-11-04T01:00:00-0400"},
|
|
|
@@ -174,7 +192,7 @@ func TestErrors(t *testing.T) {
|
|
|
"0 0 * * XYZ",
|
|
|
}
|
|
|
for _, spec := range invalidSpecs {
|
|
|
- _, err := Parse(spec)
|
|
|
+ _, err := ParseStandard(spec)
|
|
|
if err == nil {
|
|
|
t.Error("expected an error parsing: ", spec)
|
|
|
}
|
|
|
@@ -185,22 +203,20 @@ func getTime(value string) time.Time {
|
|
|
if value == "" {
|
|
|
return time.Time{}
|
|
|
}
|
|
|
- t, err := time.Parse("Mon Jan 2 15:04 2006", value)
|
|
|
- if err != nil {
|
|
|
- t, err = time.Parse("Mon Jan 2 15:04:05 2006", value)
|
|
|
- if err != nil {
|
|
|
- t, err = time.Parse("2006-01-02T15:04:05-0700", value)
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- // Daylight savings time tests require location
|
|
|
- if ny, err := time.LoadLocation("America/New_York"); err == nil {
|
|
|
- t = t.In(ny)
|
|
|
- }
|
|
|
+
|
|
|
+ var layouts = []string{
|
|
|
+ "Mon Jan 2 15:04 2006",
|
|
|
+ "Mon Jan 2 15:04:05 2006",
|
|
|
+ }
|
|
|
+ for _, layout := range layouts {
|
|
|
+ if t, err := time.ParseInLocation(layout, value, time.Local); err == nil {
|
|
|
+ return t
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- return t
|
|
|
+ if t, err := time.Parse("2006-01-02T15:04:05-0700", value); err == nil {
|
|
|
+ return t
|
|
|
+ }
|
|
|
+ panic("could not parse time value " + value)
|
|
|
}
|
|
|
|
|
|
func TestNextWithTz(t *testing.T) {
|
|
|
@@ -209,15 +225,15 @@ func TestNextWithTz(t *testing.T) {
|
|
|
expected string
|
|
|
}{
|
|
|
// Failing tests
|
|
|
- {"2016-01-03T13:09:03+0530", "0 14 14 * * *", "2016-01-03T14:14:00+0530"},
|
|
|
- {"2016-01-03T04:09:03+0530", "0 14 14 * * ?", "2016-01-03T14:14:00+0530"},
|
|
|
+ {"2016-01-03T13:09:03+0530", "14 14 * * *", "2016-01-03T14:14:00+0530"},
|
|
|
+ {"2016-01-03T04:09:03+0530", "14 14 * * ?", "2016-01-03T14:14:00+0530"},
|
|
|
|
|
|
// Passing tests
|
|
|
- {"2016-01-03T14:09:03+0530", "0 14 14 * * *", "2016-01-03T14:14:00+0530"},
|
|
|
- {"2016-01-03T14:00:00+0530", "0 14 14 * * ?", "2016-01-03T14:14:00+0530"},
|
|
|
+ {"2016-01-03T14:09:03+0530", "14 14 * * *", "2016-01-03T14:14:00+0530"},
|
|
|
+ {"2016-01-03T14:00:00+0530", "14 14 * * ?", "2016-01-03T14:14:00+0530"},
|
|
|
}
|
|
|
for _, c := range runs {
|
|
|
- sched, err := Parse(c.spec)
|
|
|
+ sched, err := ParseStandard(c.spec)
|
|
|
if err != nil {
|
|
|
t.Error(err)
|
|
|
continue
|