LANG-807 RandomStringUtils throws confusing IAE when end <= start


git-svn-id: https://svn.apache.org/repos/asf/commons/proper/lang/branches/LANG_2_X@1348582 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/commons/lang/RandomStringUtils.java b/src/main/java/org/apache/commons/lang/RandomStringUtils.java
index f7e2a4e..9576f3e 100644
--- a/src/main/java/org/apache/commons/lang/RandomStringUtils.java
+++ b/src/main/java/org/apache/commons/lang/RandomStringUtils.java
@@ -242,6 +242,10 @@
                     start = ' ';                
                 }
             }
+        } else {
+            if (end <= start) {
+                throw new IllegalArgumentException("Parameter end (" + end + ") must be greater than start (" + start + ")");
+            }
         }
 
         char[] buffer = new char[count];
diff --git a/src/site/changes/changes.xml b/src/site/changes/changes.xml
index be5bf49..e47a2b9 100644
--- a/src/site/changes/changes.xml
+++ b/src/site/changes/changes.xml
@@ -21,6 +21,7 @@
   </properties>
   <body>
   <release version="2.7" date="TBA" description="TBA (requires minimum of Java 1.3)">
+    <action issue="LANG-807" type="fix">RandomStringUtils throws confusing IAE when end &lt;= start</action>
     <action issue="LANG-805" type="fix">RandomStringUtils.random(count, 0, 0, false, false, universe, random) always throws java.lang.ArrayIndexOutOfBoundsException</action>
     <action issue="LANG-803" type="fix">LocaleUtils - DCL idiom is not thread-safe.</action>
     <action issue="LANG-677" type="fix">DateUtils isSameLocalTime() compares the hour using 12hour Calendar.HOUR instead of 24hour Calendar.HOUR_OF_DAY</action>
diff --git a/src/test/java/org/apache/commons/lang/RandomStringUtilsTest.java b/src/test/java/org/apache/commons/lang/RandomStringUtilsTest.java
index 1172b1a..4aaa3cf 100644
--- a/src/test/java/org/apache/commons/lang/RandomStringUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang/RandomStringUtilsTest.java
@@ -130,6 +130,17 @@
         assertEquals("aaa", RandomStringUtils.random(3,0,0,false,false,new char[]{'a'},new Random(seed)));
     }
 
+    public void testLANG807() {
+        try {
+            RandomStringUtils.random(3,5,5,false,false);
+            fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException ex) { // distinguish from Random#nextInt message
+            final String msg = ex.getMessage();
+            assertTrue("Message (" + msg + ") must contain 'start'", msg.contains("start"));
+            assertTrue("Message (" + msg + ") must contain 'end'", msg.contains("end"));
+        }
+    }
+
     public void testExceptions() {
         final char[] DUMMY = new char[]{'a'}; // valid char array
         try {