Reject empty strings in DurationFormatterUtils

See gh-33669
This commit is contained in:
Seungrae 2024-10-09 00:56:59 +09:00 committed by Stéphane Nicoll
parent 7f7f65cfcb
commit 02c990ca82
2 changed files with 31 additions and 1 deletions

View File

@ -35,6 +35,7 @@ import org.springframework.util.StringUtils;
* @author Phillip Webb * @author Phillip Webb
* @author Valentine Wu * @author Valentine Wu
* @author Simon Baslé * @author Simon Baslé
* @author Kim Seungrae
* @since 6.2 * @since 6.2
*/ */
public abstract class DurationFormatterUtils { public abstract class DurationFormatterUtils {
@ -62,6 +63,7 @@ public abstract class DurationFormatterUtils {
* @return a duration * @return a duration
*/ */
public static Duration parse(String value, DurationFormat.Style style, @Nullable DurationFormat.Unit unit) { public static Duration parse(String value, DurationFormat.Style style, @Nullable DurationFormat.Unit unit) {
Assert.hasText(value, () -> "Value must not be empty");
return switch (style) { return switch (style) {
case ISO8601 -> parseIso8601(value); case ISO8601 -> parseIso8601(value);
case SIMPLE -> parseSimple(value, unit); case SIMPLE -> parseSimple(value, unit);
@ -88,6 +90,7 @@ public abstract class DurationFormatterUtils {
* @return the printed result * @return the printed result
*/ */
public static String print(Duration value, DurationFormat.Style style, @Nullable DurationFormat.Unit unit) { public static String print(Duration value, DurationFormat.Style style, @Nullable DurationFormat.Unit unit) {
Assert.notNull(value, "Value must not be null");
return switch (style) { return switch (style) {
case ISO8601 -> value.toString(); case ISO8601 -> value.toString();
case SIMPLE -> printSimple(value, unit); case SIMPLE -> printSimple(value, unit);
@ -149,7 +152,7 @@ public abstract class DurationFormatterUtils {
try { try {
return Duration.parse(value); return Duration.parse(value);
} }
catch (Throwable ex) { catch (Exception ex) {
throw new IllegalArgumentException("'" + value + "' is not a valid ISO-8601 duration", ex); throw new IllegalArgumentException("'" + value + "' is not a valid ISO-8601 duration", ex);
} }
} }

View File

@ -23,7 +23,10 @@ import java.util.Arrays;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
import org.springframework.format.annotation.DurationFormat;
import org.springframework.format.annotation.DurationFormat.Unit; import org.springframework.format.annotation.DurationFormat.Unit;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@ -188,6 +191,22 @@ class DurationFormatterUtilsTests {
.havingCause().withMessage("Does not match composite duration pattern"); .havingCause().withMessage("Does not match composite duration pattern");
} }
@ParameterizedTest
@EnumSource(DurationFormat.Style.class)
void parseEmptyStringThrowsForAllStyles(DurationFormat.Style style) {
assertThatIllegalArgumentException()
.isThrownBy(() -> DurationFormatterUtils.parse("", style))
.withMessage("Value must not be empty");
}
@ParameterizedTest
@EnumSource(DurationFormat.Style.class)
void parseNullStringThrowsForAllStyles(DurationFormat.Style style) {
assertThatIllegalArgumentException()
.isThrownBy(() -> DurationFormatterUtils.parse(null, style))
.withMessage("Value must not be empty");
}
@Test @Test
void printSimple() { void printSimple() {
assertThat(DurationFormatterUtils.print(Duration.ofNanos(12345), SIMPLE, Unit.NANOS)) assertThat(DurationFormatterUtils.print(Duration.ofNanos(12345), SIMPLE, Unit.NANOS))
@ -240,6 +259,14 @@ class DurationFormatterUtilsTests {
.isEqualTo("-1d2h34m57s28ms3us2ns"); .isEqualTo("-1d2h34m57s28ms3us2ns");
} }
@ParameterizedTest
@EnumSource(DurationFormat.Style.class)
void printNullDurationThrowsForAllStyles(DurationFormat.Style style) {
assertThatIllegalArgumentException()
.isThrownBy(() -> DurationFormatterUtils.print(null, style))
.withMessage("Value must not be null");
}
@Test @Test
void detectAndParse() { void detectAndParse() {
assertThat(DurationFormatterUtils.detectAndParse("PT1.234S", Unit.NANOS)) assertThat(DurationFormatterUtils.detectAndParse("PT1.234S", Unit.NANOS))