Reject empty strings in DurationFormatterUtils
See gh-33669
This commit is contained in:
parent
7f7f65cfcb
commit
02c990ca82
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in New Issue