// InitDelayDuration is used to parsed the iso8601 Schedule notation into its relevent fields in the Job struct. // If checkTime is true, then it will return an error if the Scheduled time has passed. func (j *Job) InitDelayDuration(checkTime bool) error { j.lock.Lock() defer j.lock.Unlock() var err error splitTime := strings.Split(j.Schedule, "/") if len(splitTime) != 3 { return fmt.Errorf( "Schedule not formatted correctly. Should look like: R/2014-03-08T20:00:00Z/PT2H", ) } // Handle Repeat Amount if splitTime[0] == "R" { // Repeat forever j.timesToRepeat = -1 } else { j.timesToRepeat, err = strconv.ParseInt(strings.Split(splitTime[0], "R")[1], 10, 0) if err != nil { log.Error("Error converting timesToRepeat to an int: %s", err) return err } } log.Debug("timesToRepeat: %d", j.timesToRepeat) j.scheduleTime, err = time.Parse(time.RFC3339, splitTime[1]) if err != nil { j.scheduleTime, err = time.Parse(RFC3339WithoutTimezone, splitTime[1]) if err != nil { log.Error("Error converting scheduleTime to a time.Time: %s", err) return err } } if checkTime { if (time.Duration(j.scheduleTime.UnixNano() - time.Now().UnixNano())) < 0 { return fmt.Errorf("Schedule time has passed on Job with id of %s", j.Id) } } log.Debug("Schedule Time: %s", j.scheduleTime) j.delayDuration, err = iso8601.FromString(splitTime[2]) if err != nil { log.Error("Error converting delayDuration to a iso8601.Duration: %s", err) return err } log.Debug("Delay Duration: %s", j.delayDuration.ToDuration()) if j.Epsilon != "" { j.epsilonDuration, err = iso8601.FromString(j.Epsilon) if err != nil { log.Error("Error converting j.Epsilon to iso8601.Duration: %s", err) return err } } return nil }
func TestFromString(t *testing.T) { t.Parallel() // test with bad format _, err := iso8601.FromString("asdf") assert.Equal(t, err, iso8601.ErrBadFormat) // test with good full string dur, err := iso8601.FromString("P1Y2M3DT4H5M6S") assert.Nil(t, err) assert.Equal(t, 1, dur.Years) assert.Equal(t, 2, dur.Months) assert.Equal(t, 3, dur.Days) assert.Equal(t, 4, dur.Hours) assert.Equal(t, 5, dur.Minutes) assert.Equal(t, 6, dur.Seconds) // test with good week string dur, err = iso8601.FromString("P1W") assert.Nil(t, err) assert.Equal(t, 1, dur.Weeks) }