diff --git a/echo-scheduler/src/main/java/com/netflix/spinnaker/echo/cron/CronExpressionFuzzer.java b/echo-scheduler/src/main/java/com/netflix/spinnaker/echo/cron/CronExpressionFuzzer.java index 024ec0a03..a12deaf04 100644 --- a/echo-scheduler/src/main/java/com/netflix/spinnaker/echo/cron/CronExpressionFuzzer.java +++ b/echo-scheduler/src/main/java/com/netflix/spinnaker/echo/cron/CronExpressionFuzzer.java @@ -47,7 +47,7 @@ public static boolean isValid(String expression) { } public static boolean hasFuzzyExpression(String expression) { - return expression.contains(TOKEN); + return Tokens.tokenize(expression).hasFuzzyToken(); } private static class Tokens { @@ -81,6 +81,10 @@ static Tokens tokenize(String expression) { return new Tokens(t[0], t[1], t[2], t[3], t[4], t[5], (t.length == 7) ? t[6] : null); } + boolean hasFuzzyToken() { + return seconds.contains(TOKEN) || minutes.contains(TOKEN) || hours.contains(TOKEN); + } + String toFuzzedExpression(String id) { if (seconds.contains(TOKEN)) { seconds = seconds.replace(TOKEN, hash(id, 59)); diff --git a/echo-scheduler/src/test/groovy/com/netflix/spinnaker/echo/cron/CronExpressionFuzzerSpec.groovy b/echo-scheduler/src/test/groovy/com/netflix/spinnaker/echo/cron/CronExpressionFuzzerSpec.groovy index 0027b291d..fe98ffcf1 100644 --- a/echo-scheduler/src/test/groovy/com/netflix/spinnaker/echo/cron/CronExpressionFuzzerSpec.groovy +++ b/echo-scheduler/src/test/groovy/com/netflix/spinnaker/echo/cron/CronExpressionFuzzerSpec.groovy @@ -33,6 +33,24 @@ class CronExpressionFuzzerSpec extends Specification { "abcd" | "H * * * * *" || "34 * * * * *" "abcde" | "* * H * * *" || "* * 3 * * *" "abcd" | "H/5 * * * * *" || "34/5 * * * * *" + "abcd" | "00 05 09 ? * MON-THU" || "00 05 09 ? * MON-THU" + } + + @Unroll + def "should correctly detect fuzz tokens"() { + when: + def result = CronExpressionFuzzer.hasFuzzyExpression(expression) + + then: + result == expected + + where: + expression || expected + "H * * * * *" || true + "* * H * * *" || true + "H/5 * * * * *" || true + "H/5 * * * * THU" || true + "00 05 09 ? * MON-THU" || false } } diff --git a/echo-web/src/test/java/com/netflix/spinnaker/echo/scheduler/ValidationControllerSpec.groovy b/echo-web/src/test/java/com/netflix/spinnaker/echo/scheduler/ValidationControllerSpec.groovy index 9807e2886..6b9d40260 100644 --- a/echo-web/src/test/java/com/netflix/spinnaker/echo/scheduler/ValidationControllerSpec.groovy +++ b/echo-web/src/test/java/com/netflix/spinnaker/echo/scheduler/ValidationControllerSpec.groovy @@ -21,13 +21,13 @@ class ValidationControllerSpec extends Specification { void 'should include description when expression is valid'() { when: - def result = validate("0 0 10 ? * 1") + def result = validate("0 0 10 ? * THU") def responseBody = objectMapper.readValue(result.response.contentAsByteArray, Map) then: responseBody.response == "Cron expression is valid" - responseBody.description == "At 10:00 AM, only on Sunday" + responseBody.description == "At 10:00 AM, only on Thursday" } void 'should include failure message when expression is invalid'() {