From 00e530042f481d1000be27584cf05be939a42bb0 Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Fri, 19 Jul 2024 09:07:42 -0400 Subject: [PATCH] [LANG-1745] RandomStringUtils.random() with a negative character index should throw IllegalArgumentException (#1247) * Add testLang1641() * Rename some test methods * [LANG-1745] RandomStringUtils.random() with a negative character index should throw IllegalArgumentException --- src/changes/changes.xml | 17 ++++++----- .../commons/lang3/RandomStringUtils.java | 2 ++ .../commons/lang3/RandomStringUtilsTest.java | 30 +++++++++++++++---- .../lang3/time/FastDateFormatTest.java | 23 ++++++++++++-- 4 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index e1d190482..02208f3de 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -46,14 +46,15 @@ The type attribute can be add,update,fix,remove. - - Reimplement StopWatch internals to use java.time. - - Add StopWatch.getSplitDuration() and deprecate getSplitTime(). - Add StopWatch.getStartInstant() and deprecate getStartTime(). - Add StopWatch.getStopInstant() and deprecate getStopTime(). - Add StopWatch.getDuration() and deprecate getTime(). - + + Reimplement StopWatch internals to use java.time. + RandomStringUtils.random() with a negative character index should throw IllegalArgumentException. + + Add StopWatch.getSplitDuration() and deprecate getSplitTime(). + Add StopWatch.getStartInstant() and deprecate getStartTime(). + Add StopWatch.getStopInstant() and deprecate getStopTime(). + Add StopWatch.getDuration() and deprecate getTime(). + diff --git a/src/main/java/org/apache/commons/lang3/RandomStringUtils.java b/src/main/java/org/apache/commons/lang3/RandomStringUtils.java index e30e214eb..eb6615e75 100644 --- a/src/main/java/org/apache/commons/lang3/RandomStringUtils.java +++ b/src/main/java/org/apache/commons/lang3/RandomStringUtils.java @@ -232,6 +232,8 @@ public static String random(int count, int start, int end, final boolean letters } } else if (end <= start) { throw new IllegalArgumentException("Parameter end (" + end + ") must be greater than start (" + start + ")"); + } else if (start < 0 || end < 0) { + throw new IllegalArgumentException("Character positions MUST be >= 0"); } if (end > Character.MAX_CODE_POINT) { diff --git a/src/test/java/org/apache/commons/lang3/RandomStringUtilsTest.java b/src/test/java/org/apache/commons/lang3/RandomStringUtilsTest.java index 876a0d146..2999d8ebc 100644 --- a/src/test/java/org/apache/commons/lang3/RandomStringUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/RandomStringUtilsTest.java @@ -93,23 +93,43 @@ public void testConstructor() { } @Test - public void testExceptions() { - final char[] DUMMY = { 'a' }; // valid char array + public void testExceptionsRandom() { assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1)); assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1, true, true)); - assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1, DUMMY)); + assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1, new char[] { 'a' })); assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(1, new char[0])); assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1, "")); assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1, (String) null)); assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1, 'a', 'z', false, false)); - assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1, 'a', 'z', false, false, DUMMY)); - assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1, 'a', 'z', false, false, DUMMY, new Random())); + assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1, 'a', 'z', false, false, new char[] { 'a' })); + assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(-1, 'a', 'z', false, false, new char[] { 'a' }, new Random())); assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(8, 32, 48, false, true)); assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(8, 32, 65, true, false)); + assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.random(1, Integer.MIN_VALUE, -10, false, false, null)); + } + + @Test + public void testExceptionsRandomAlphabetic() { assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.randomAlphabetic(-1)); + } + + @Test + public void testExceptionsRandomAscii() { assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.randomAscii(-1)); + } + + @Test + public void testExceptionsRandomGraph() { assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.randomGraph(-1)); + } + + @Test + public void testExceptionsRandomNumeric() { assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.randomNumeric(-1)); + } + + @Test + public void testExceptionsRandomPrint() { assertThrows(IllegalArgumentException.class, () -> RandomStringUtils.randomPrint(-1)); } diff --git a/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java b/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java index aa13e2845..698dd1ade 100644 --- a/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java +++ b/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java @@ -47,6 +47,9 @@ * Unit tests {@link org.apache.commons.lang3.time.FastDateFormat}. */ public class FastDateFormatTest extends AbstractLangTest { + + private static final String ISO_8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZZ"; + private static final int NTHREADS = 10; private static final int NROUNDS = 10000; @@ -245,7 +248,7 @@ public void testDateDefaults() { } @Test - public void testLANG_1152() { + public void testLang1152() { final TimeZone utc = FastTimeZone.getGmtTimeZone(); final Date date = new Date(Long.MAX_VALUE); @@ -256,15 +259,29 @@ public void testLANG_1152() { assertEquals("17/08/292278994", dateAsString); } @Test - public void testLANG_1267() { + public void testLang1267() { FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); } + @Test + public void testLang1641() { + assertSame(FastDateFormat.getInstance(ISO_8601_DATE_FORMAT), FastDateFormat.getInstance(ISO_8601_DATE_FORMAT)); + // commons-lang's GMT TimeZone + assertSame(FastDateFormat.getInstance(ISO_8601_DATE_FORMAT, FastTimeZone.getGmtTimeZone()), + FastDateFormat.getInstance(ISO_8601_DATE_FORMAT, FastTimeZone.getGmtTimeZone())); + // default TimeZone + assertSame(FastDateFormat.getInstance(ISO_8601_DATE_FORMAT, TimeZone.getDefault()), + FastDateFormat.getInstance(ISO_8601_DATE_FORMAT, TimeZone.getDefault())); + // TimeZones that are identical in every way except ID + assertNotSame(FastDateFormat.getInstance(ISO_8601_DATE_FORMAT, TimeZone.getTimeZone("Australia/Broken_Hill")), + FastDateFormat.getInstance(ISO_8601_DATE_FORMAT, TimeZone.getTimeZone("Australia/Yancowinna"))); + } + /** * According to LANG-954 (https://issues.apache.org/jira/browse/LANG-954) this is broken in Android 2.1. */ @Test - public void testLANG_954() { + public void testLang954() { final String pattern = "yyyy-MM-dd'T'"; FastDateFormat.getInstance(pattern); }