This is an automated email from the ASF dual-hosted git repository.
tkobayas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git
The following commit(s) were added to refs/heads/main by this push:
new 47a8c09a6bc [incubator-kie-drools#6773] Improve CronExpression
wildcard validation (#6774)
47a8c09a6bc is described below
commit 47a8c09a6bc9399462b91fa685081fb1a9353ff8
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Tue Jun 30 10:02:41 2026 +0900
[incubator-kie-drools#6773] Improve CronExpression wildcard validation
(#6774)
---
.../drools/core/time/impl/KieCronExpression.java | 5 ++-
.../drools/core/time/impl/CronExpressionTest.java | 47 +++++++++++++++++++++-
.../TimerAndCalendarWithPseudoTimeTest.java | 7 ++++
3 files changed, 57 insertions(+), 2 deletions(-)
diff --git
a/drools-core/src/main/java/org/drools/core/time/impl/KieCronExpression.java
b/drools-core/src/main/java/org/drools/core/time/impl/KieCronExpression.java
index faffe9bd46a..785f4753fbe 100644
--- a/drools-core/src/main/java/org/drools/core/time/impl/KieCronExpression.java
+++ b/drools-core/src/main/java/org/drools/core/time/impl/KieCronExpression.java
@@ -510,7 +510,7 @@ public class KieCronExpression implements Serializable {
throw new ParseException("Increment > 12 : " + incr, i);
}
} else {
- incr = 1;
+ throw new ParseException("Unexpected character after '*': " +
c, i);
}
addToSet(ALL_SPEC_INT, -1, incr, type);
@@ -543,6 +543,9 @@ public class KieCronExpression implements Serializable {
val = vs.value;
i = vs.pos;
}
+ if (val == ALL_SPEC_INT || val == NO_SPEC_INT) {
+ throw new ParseException("'" + val + "' is not valid as a
numeric value", i);
+ }
i = checkNext(i, s, val, type);
return i;
}
diff --git
a/drools-core/src/test/java/org/drools/core/time/impl/CronExpressionTest.java
b/drools-core/src/test/java/org/drools/core/time/impl/CronExpressionTest.java
index b1af3e0ab2b..f77a6999b5a 100644
---
a/drools-core/src/test/java/org/drools/core/time/impl/CronExpressionTest.java
+++
b/drools-core/src/test/java/org/drools/core/time/impl/CronExpressionTest.java
@@ -26,11 +26,14 @@ import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.fail;
public class CronExpressionTest extends SerializationTestSupport {
@@ -183,10 +186,52 @@ public class CronExpressionTest extends
SerializationTestSupport {
}
}
- @Test
+ @Test
@Disabled
public void testSerialization() {
// TODO as we don't want to worry about this for now
}
+ @Test
+ @Timeout(value = 5, unit = TimeUnit.SECONDS)
+ public void testLargeRangeValueInMinuteField() {
+ assertThatThrownBy(() -> new CronExpression("0 99-99909990 * * * ?"))
+ .isInstanceOf(ParseException.class);
+ }
+
+ @Test
+ public void testOutOfRangeMinuteValueMatchingSentinel() {
+ assertThatThrownBy(() -> new CronExpression("0 99 * * * ?"))
+ .isInstanceOf(ParseException.class);
+ }
+
+ @Test
+ public void testOutOfRangeRangeStartMatchingSentinel() {
+ assertThatThrownBy(() -> new CronExpression("0 99-5 * * * ?"))
+ .isInstanceOf(ParseException.class);
+ }
+
+ @Test
+ public void testOutOfRangeStepBaseMatchingSentinel() {
+ assertThatThrownBy(() -> new CronExpression("0 99/5 * * * ?"))
+ .isInstanceOf(ParseException.class);
+ }
+
+ @Test
+ public void testWildcardInRange() {
+ assertThatThrownBy(() -> new CronExpression("0 *-5 * * * ?"))
+ .isInstanceOf(ParseException.class);
+ }
+
+ @Test
+ public void testValidWildcard() throws ParseException {
+ CronExpression expr = new CronExpression("0 * * * * ?");
+ assertThat(expr.getCronExpression()).isEqualTo("0 * * * * ?");
+ }
+
+ @Test
+ public void testValidWildcardWithStep() throws ParseException {
+ CronExpression expr = new CronExpression("0 */5 * * * ?");
+ assertThat(expr.getCronExpression()).isEqualTo("0 */5 * * * ?");
+ }
}
diff --git
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/TimerAndCalendarWithPseudoTimeTest.java
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/TimerAndCalendarWithPseudoTimeTest.java
index f954cb1ea7d..69f70601f07 100644
---
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/TimerAndCalendarWithPseudoTimeTest.java
+++
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/TimerAndCalendarWithPseudoTimeTest.java
@@ -298,6 +298,13 @@ public class TimerAndCalendarWithPseudoTimeTest {
wrongTimerExpression(kieBaseTestConfiguration, "cron: 0/30 * * * * *");
}
+ @ParameterizedTest(name = "KieBase type={0}")
+ @MethodSource("parameters")
+ @Timeout(value = 10, unit = TimeUnit.SECONDS)
+ public void testLargeRangeValueInCronExpression(KieBaseTestConfiguration
kieBaseTestConfiguration) {
+ wrongTimerExpression(kieBaseTestConfiguration, "cron: 0 99-99909990 *
* * ?");
+ }
+
private void wrongTimerExpression(KieBaseTestConfiguration
kieBaseTestConfiguration, final String timer) {
final String drl =
"package org.simple \n" +
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]