diff --git a/src/main/java/org/apache/nifi/time/DurationFormat.java b/src/main/java/org/apache/nifi/time/DurationFormat.java index 5c7cb33..020867c 100644 --- a/src/main/java/org/apache/nifi/time/DurationFormat.java +++ b/src/main/java/org/apache/nifi/time/DurationFormat.java @@ -37,7 +37,7 @@ public class DurationFormat { private static final String WEEKS = String.join(UNION, "w", "wk", "wks", "week", "weeks"); private static final String VALID_TIME_UNITS = String.join(UNION, NANOS, MILLIS, SECS, MINS, HOURS, DAYS, WEEKS); - public static final String TIME_DURATION_REGEX = "([\\d.]+)\\s*(" + VALID_TIME_UNITS + ")"; + public static final String TIME_DURATION_REGEX = "(\\d*\\.?\\d+)\\s*(" + VALID_TIME_UNITS + ")"; public static final Pattern TIME_DURATION_PATTERN = Pattern.compile(TIME_DURATION_REGEX); private static final List TIME_UNIT_MULTIPLIERS = Arrays.asList(1000L, 1000L, 1000L, 60L, 60L, 24L); diff --git a/src/test/java/org/apache/nifi/time/TestDurationFormat.java b/src/test/java/org/apache/nifi/time/TestDurationFormat.java index 3259de7..b3987ab 100644 --- a/src/test/java/org/apache/nifi/time/TestDurationFormat.java +++ b/src/test/java/org/apache/nifi/time/TestDurationFormat.java @@ -30,6 +30,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -95,6 +96,23 @@ public void testGetTimeDurationWithDecimalNumbers(String decimal) { assertEquals(10L, DurationFormat.getTimeDuration(decimal, TimeUnit.MILLISECONDS)); } + @ParameterizedTest + @MethodSource("getInvalidDurationValues") + void testGetPreciseTimeDurationShouldHandleIllegalCharacters(String invalidDurationValue) { + final IllegalArgumentException iae = assertThrows(IllegalArgumentException.class, () -> DurationFormat.getPreciseTimeDuration(invalidDurationValue, TimeUnit.SECONDS)); + assertFalse(iae instanceof NumberFormatException); + } + + private static Stream getInvalidDurationValues() { + return Stream.of( + Arguments.argumentSet("Duration with too many periods", "10.10.10 seconds"), + Arguments.argumentSet("Duration with letter suffix", "100L seconds"), + Arguments.argumentSet("Duration with letter prefix", "E10 seconds"), + Arguments.argumentSet("Duration with a comma", "1,000 seconds"), + Arguments.argumentSet("Duration with spaces", "1 000 000 seconds") + ); + } + @ParameterizedTest @MethodSource("getOneWeekInOtherUnits") public void testGetPreciseTimeDurationShouldHandleWeeks(TimeUnit timeUnit, long expected) { @@ -135,7 +153,7 @@ public void testGetPreciseTimeDurationWithWholeNumbers(String whole) { } @ParameterizedTest - @ValueSource(strings = {"0.010 s", "0.010 seconds"}) + @ValueSource(strings = {"0.010 s", ".010 s", "0.010 seconds"}) public void testGetPreciseTimeDurationWithDecimalNumbers(String decimal) { assertEquals(10.0, DurationFormat.getPreciseTimeDuration(decimal, TimeUnit.MILLISECONDS)); }