This is an automated email from the ASF dual-hosted git repository. garydgregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-validator.git
commit 7d8b7c3bcb8773250fccb04d15189be10447a481 Author: Gary Gregory <[email protected]> AuthorDate: Fri Jun 19 17:25:48 2026 +0000 Sort members. --- .../validator/GenericTypeValidatorTest.java | 28 ++++---- .../routines/BigDecimalValidatorTest.java | 60 +++++++++--------- .../validator/routines/RegexValidatorTest.java | 22 +++---- .../validator/routines/UrlValidatorTest.java | 74 +++++++++++----------- 4 files changed, 92 insertions(+), 92 deletions(-) diff --git a/src/test/java/org/apache/commons/validator/GenericTypeValidatorTest.java b/src/test/java/org/apache/commons/validator/GenericTypeValidatorTest.java index 00e8f961..1a2be524 100644 --- a/src/test/java/org/apache/commons/validator/GenericTypeValidatorTest.java +++ b/src/test/java/org/apache/commons/validator/GenericTypeValidatorTest.java @@ -119,6 +119,20 @@ class GenericTypeValidatorTest extends AbstractCommonTest { assertEquals(129, ((Double) map.get("double")).intValue(), "double value not correct"); } + /** + * Tests that {@link GenericTypeValidator#formatLong(String, Locale)} rejects values just outside the long range instead of clamping them. + */ + @Test + void testLongLocaleOverflow() { + assertEquals(Long.valueOf(Long.MAX_VALUE), GenericTypeValidator.formatLong(Long.toString(Long.MAX_VALUE), Locale.US)); + assertEquals(Long.valueOf(Long.MIN_VALUE), GenericTypeValidator.formatLong(Long.toString(Long.MIN_VALUE), Locale.US)); + // Long.MAX_VALUE + 1 and Long.MIN_VALUE - 1 round to the long bounds as a double and used to be accepted. + assertNull(GenericTypeValidator.formatLong(BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE).toString(), Locale.US)); + assertNull(GenericTypeValidator.formatLong(BigInteger.valueOf(Long.MIN_VALUE).subtract(BigInteger.ONE).toString(), Locale.US)); + // Trailing characters are only consumed up to the first non-digit, so the whole-string check must reject them. + assertNull(GenericTypeValidator.formatLong("123x", Locale.US)); + } + /** * Tests the byte validation. */ @@ -173,20 +187,6 @@ class GenericTypeValidatorTest extends AbstractCommonTest { } - /** - * Tests that {@link GenericTypeValidator#formatLong(String, Locale)} rejects values just outside the long range instead of clamping them. - */ - @Test - void testLongLocaleOverflow() { - assertEquals(Long.valueOf(Long.MAX_VALUE), GenericTypeValidator.formatLong(Long.toString(Long.MAX_VALUE), Locale.US)); - assertEquals(Long.valueOf(Long.MIN_VALUE), GenericTypeValidator.formatLong(Long.toString(Long.MIN_VALUE), Locale.US)); - // Long.MAX_VALUE + 1 and Long.MIN_VALUE - 1 round to the long bounds as a double and used to be accepted. - assertNull(GenericTypeValidator.formatLong(BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE).toString(), Locale.US)); - assertNull(GenericTypeValidator.formatLong(BigInteger.valueOf(Long.MIN_VALUE).subtract(BigInteger.ONE).toString(), Locale.US)); - // Trailing characters are only consumed up to the first non-digit, so the whole-string check must reject them. - assertNull(GenericTypeValidator.formatLong("123x", Locale.US)); - } - /** * Tests the us locale */ diff --git a/src/test/java/org/apache/commons/validator/routines/BigDecimalValidatorTest.java b/src/test/java/org/apache/commons/validator/routines/BigDecimalValidatorTest.java index 1d09e916..780b0785 100644 --- a/src/test/java/org/apache/commons/validator/routines/BigDecimalValidatorTest.java +++ b/src/test/java/org/apache/commons/validator/routines/BigDecimalValidatorTest.java @@ -72,36 +72,6 @@ class BigDecimalValidatorTest extends AbstractNumberValidatorTest { } - /** - * Test BigDecimal Range/Min/Max - */ - @Test - void testBigDecimalRangeMinMax() { - final BigDecimalValidator validator = new BigDecimalValidator(true, AbstractNumberValidator.STANDARD_FORMAT, true); - final BigDecimal number9 = new BigDecimal("9"); - final BigDecimal number10 = new BigDecimal("10"); - final BigDecimal number11 = new BigDecimal("11"); - final BigDecimal number19 = new BigDecimal("19"); - final BigDecimal number20 = new BigDecimal("20"); - final BigDecimal number21 = new BigDecimal("21"); - final float min = 10; - final float max = 20; - // Test isInRange() - assertFalse(validator.isInRange(number9, min, max), "isInRange(A) < min"); - assertTrue(validator.isInRange(number10, min, max), "isInRange(A) = min"); - assertTrue(validator.isInRange(number11, min, max), "isInRange(A) in range"); - assertTrue(validator.isInRange(number20, min, max), "isInRange(A) = max"); - assertFalse(validator.isInRange(number21, min, max), "isInRange(A) > max"); - // Test minValue() - assertFalse(validator.minValue(number9, min), "minValue(A) < min"); - assertTrue(validator.minValue(number10, min), "minValue(A) = min"); - assertTrue(validator.minValue(number11, min), "minValue(A) > min"); - // Test minValue() - assertTrue(validator.maxValue(number19, max), "maxValue(A) < max"); - assertTrue(validator.maxValue(number20, max), "maxValue(A) = max"); - assertFalse(validator.maxValue(number21, max), "maxValue(A) > max"); - } - /** * Tests isInRange(), minValue(), and maxValue() with BigDecimal values whose magnitude exceeds Double.MAX_VALUE or whose positive magnitude is below * Double.MIN_VALUE (the smallest positive non-zero double). @@ -146,6 +116,36 @@ class BigDecimalValidatorTest extends AbstractNumberValidatorTest { "isInRange: value below Double.MIN_VALUE underflows to 0.0; 0.0 is in [0, Double.MIN_VALUE]"); } + /** + * Test BigDecimal Range/Min/Max + */ + @Test + void testBigDecimalRangeMinMax() { + final BigDecimalValidator validator = new BigDecimalValidator(true, AbstractNumberValidator.STANDARD_FORMAT, true); + final BigDecimal number9 = new BigDecimal("9"); + final BigDecimal number10 = new BigDecimal("10"); + final BigDecimal number11 = new BigDecimal("11"); + final BigDecimal number19 = new BigDecimal("19"); + final BigDecimal number20 = new BigDecimal("20"); + final BigDecimal number21 = new BigDecimal("21"); + final float min = 10; + final float max = 20; + // Test isInRange() + assertFalse(validator.isInRange(number9, min, max), "isInRange(A) < min"); + assertTrue(validator.isInRange(number10, min, max), "isInRange(A) = min"); + assertTrue(validator.isInRange(number11, min, max), "isInRange(A) in range"); + assertTrue(validator.isInRange(number20, min, max), "isInRange(A) = max"); + assertFalse(validator.isInRange(number21, min, max), "isInRange(A) > max"); + // Test minValue() + assertFalse(validator.minValue(number9, min), "minValue(A) < min"); + assertTrue(validator.minValue(number10, min), "minValue(A) = min"); + assertTrue(validator.minValue(number11, min), "minValue(A) > min"); + // Test minValue() + assertTrue(validator.maxValue(number19, max), "maxValue(A) < max"); + assertTrue(validator.maxValue(number20, max), "maxValue(A) = max"); + assertFalse(validator.maxValue(number21, max), "maxValue(A) > max"); + } + /** * Test BigDecimalValidator validate Methods */ diff --git a/src/test/java/org/apache/commons/validator/routines/RegexValidatorTest.java b/src/test/java/org/apache/commons/validator/routines/RegexValidatorTest.java index dc6b3347..16e0f982 100644 --- a/src/test/java/org/apache/commons/validator/routines/RegexValidatorTest.java +++ b/src/test/java/org/apache/commons/validator/routines/RegexValidatorTest.java @@ -222,6 +222,17 @@ class RegexValidatorTest { checkArray("match one", new String[] { "ABC" }, new RegexValidator("^([A-Z]*)$").match("ABC")); } + /** + * Test toString() method + */ + @Test + void testToString() { + final RegexValidator single = new RegexValidator(REGEX); + assertEquals("RegexValidator{" + REGEX + "}", single.toString(), "Single"); + final RegexValidator multiple = new RegexValidator(REGEX, REGEX); + assertEquals("RegexValidator{" + REGEX + "," + REGEX + "}", multiple.toString(), "Multiple"); + } + /** * Test that validate() is consistent with isValid() and match() when the only * capturing group is optional and does not participate in the match. The value @@ -234,15 +245,4 @@ class RegexValidatorTest { checkArray("match()", new String[] { null }, validator.match("def")); assertEquals("", validator.validate("def"), "validate()"); } - - /** - * Test toString() method - */ - @Test - void testToString() { - final RegexValidator single = new RegexValidator(REGEX); - assertEquals("RegexValidator{" + REGEX + "}", single.toString(), "Single"); - final RegexValidator multiple = new RegexValidator(REGEX, REGEX); - assertEquals("RegexValidator{" + REGEX + "," + REGEX + "}", multiple.toString(), "Multiple"); - } } diff --git a/src/test/java/org/apache/commons/validator/routines/UrlValidatorTest.java b/src/test/java/org/apache/commons/validator/routines/UrlValidatorTest.java index 0cb5d9ad..169e17bf 100644 --- a/src/test/java/org/apache/commons/validator/routines/UrlValidatorTest.java +++ b/src/test/java/org/apache/commons/validator/routines/UrlValidatorTest.java @@ -549,6 +549,43 @@ public class UrlValidatorTest { assertTrue(validator.isValid("ftp://username:[email protected]:8042/over/there/index.dtb?type=animal&name=narwhal#nose")); } + @Test + void testValidator383() { + final UrlValidator validator = new UrlValidator(); + + // Literal traversal checks (already rejected) + assertFalse(validator.isValid("http://example.com/../etc/passwd")); + assertFalse(validator.isValid("http://example.com/..")); + assertFalse(validator.isValid("http://example.com/../")); + + // Percent-encoded traversal checks + assertFalse(validator.isValid("http://example.com/..%2fetc/passwd")); + assertFalse(validator.isValid("http://example.com/..%2Fetc/passwd")); + assertFalse(validator.isValid("http://example.com/%2e%2e/world")); + assertFalse(validator.isValid("http://example.com/%2e%2e%2fworld")); + assertFalse(validator.isValid("http://example.com/%2E%2e%2Fworld")); + + // Consecutive slashes via percent encoding + final UrlValidator noDoubleSlashes = new UrlValidator(); + assertFalse(noDoubleSlashes.isValid("http://example.com/foo%2F%2Fbar")); + assertFalse(noDoubleSlashes.isValid("http://example.com/foo%2f%2fbar")); + assertFalse(noDoubleSlashes.isValid("http://example.com/%2F%2Fbar")); + + final UrlValidator allowDoubleSlashes = new UrlValidator(UrlValidator.ALLOW_2_SLASHES); + assertTrue(allowDoubleSlashes.isValid("http://example.com/foo%2F%2Fbar")); + assertTrue(allowDoubleSlashes.isValid("http://example.com/foo%2f%2fbar")); + assertTrue(allowDoubleSlashes.isValid("http://example.com/%2F%2Fbar")); + + // Invalid percent-encoding handling + assertFalse(validator.isValid("http://example.com/foo%2")); + assertFalse(validator.isValid("http://example.com/foo%2G")); + assertFalse(validator.isValid("http://example.com/foo%")); + + // Plus character preservation + assertTrue(validator.isValid("http://example.com/foo+bar")); + assertTrue(validator.isValid("http://example.com/foo+bar/baz+qux")); + } + @Test void testValidator391FAILS() { final String[] schemes = { "file" }; @@ -626,41 +663,4 @@ public class UrlValidatorTest { assertEquals("DomainValidator disagrees with ALLOW_LOCAL_URLS setting", thrown.getMessage()); } - @Test - void testValidator383() { - final UrlValidator validator = new UrlValidator(); - - // Literal traversal checks (already rejected) - assertFalse(validator.isValid("http://example.com/../etc/passwd")); - assertFalse(validator.isValid("http://example.com/..")); - assertFalse(validator.isValid("http://example.com/../")); - - // Percent-encoded traversal checks - assertFalse(validator.isValid("http://example.com/..%2fetc/passwd")); - assertFalse(validator.isValid("http://example.com/..%2Fetc/passwd")); - assertFalse(validator.isValid("http://example.com/%2e%2e/world")); - assertFalse(validator.isValid("http://example.com/%2e%2e%2fworld")); - assertFalse(validator.isValid("http://example.com/%2E%2e%2Fworld")); - - // Consecutive slashes via percent encoding - final UrlValidator noDoubleSlashes = new UrlValidator(); - assertFalse(noDoubleSlashes.isValid("http://example.com/foo%2F%2Fbar")); - assertFalse(noDoubleSlashes.isValid("http://example.com/foo%2f%2fbar")); - assertFalse(noDoubleSlashes.isValid("http://example.com/%2F%2Fbar")); - - final UrlValidator allowDoubleSlashes = new UrlValidator(UrlValidator.ALLOW_2_SLASHES); - assertTrue(allowDoubleSlashes.isValid("http://example.com/foo%2F%2Fbar")); - assertTrue(allowDoubleSlashes.isValid("http://example.com/foo%2f%2fbar")); - assertTrue(allowDoubleSlashes.isValid("http://example.com/%2F%2Fbar")); - - // Invalid percent-encoding handling - assertFalse(validator.isValid("http://example.com/foo%2")); - assertFalse(validator.isValid("http://example.com/foo%2G")); - assertFalse(validator.isValid("http://example.com/foo%")); - - // Plus character preservation - assertTrue(validator.isValid("http://example.com/foo+bar")); - assertTrue(validator.isValid("http://example.com/foo+bar/baz+qux")); - } - }
