You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Ruiqi Dong (Jira)" <ji...@apache.org> on 2025/06/23 08:34:00 UTC

[jira] [Created] (CLI-345) OptionBuilder.create(String) does not validate short option length

Ruiqi Dong created CLI-345:
------------------------------

             Summary: OptionBuilder.create(String) does not validate short option length
                 Key: CLI-345
                 URL: https://issues.apache.org/jira/browse/CLI-345
             Project: Commons CLI
          Issue Type: Bug
          Components: Options definition
    Affects Versions: 1.10.0
            Reporter: Ruiqi Dong
             Fix For: 1.10.0


The {{OptionBuilder.create(String opt)}} method does not validate that the provided string is a single character, which violates the command-line convention that short options should be single characters (e.g., {{{}-a{}}}, {{{}-b{}}}). This allows creation of invalid multi-character short options like {{-ab}} or {{{}-abc{}}}.

 

*Steps to Reproduce:*

// This should throw IllegalArgumentException but doesn't
Option opt = OptionBuilder.withDescription("test option").create("ab");

 

*Expected Behavior:* According to command-line conventions and API consistency, short options should be single characters only. {{OptionBuilder.create(String)}} should throw {{IllegalArgumentException}} when the string length is not 1. This would be consistent with {{OptionBuilder.create(char)}} which naturally enforces single character.

*Actual Behavior:* The method accepts multi-character strings without validation, allowing creation of non-standard short options.

 

*Test Case:*
@Test
voidtestCreateWithMultiCharacterShortOptionShouldThrowException(){
// This test reveals the bug: multi-character short options should not be allowed
 
// Test with 2-character string
assertThrows(IllegalArgumentException.class, () -> {
OptionBuilder.withDescription("test option")
.create("ab");
}, "Creating short option with 2 characters should throw IllegalArgumentException");
 
// Test with 3-character string
assertThrows(IllegalArgumentException.class, () -> {
OptionBuilder.withDescription("test option")
.create("abc");
}, "Creating short option with 3 characters should throw IllegalArgumentException");
 
// Test with empty string
assertThrows(IllegalArgumentException.class, () -> {
OptionBuilder.withDescription("test option")
.create("");
}, "Creating short option with empty string should throw IllegalArgumentException");
 
// This should work - single character
assertDoesNotThrow(() -> {
Optionopt = OptionBuilder.withDescription("valid option")
.create("a");
assertEquals("a", opt.getOpt());
}, "Creating short option with single character should not throw exception");
 
// This should also work - using char overload
assertDoesNotThrow(() -> {
Optionopt = OptionBuilder.withDescription("valid option")
.create('b');
assertEquals("b", opt.getOpt());
}, "Creating short option with char should not throw exception");
}
 
*Test Results:*
[*INFO*] Running org.apache.commons.cli.{*}OptionBuilderTest{*}{*}{*}

[*ERROR*] *Tests* {*}run: 1{*}, *Failures: 1*, Errors: 0, Skipped: 0, Time elapsed: 0.001 s *<<< FAILURE!* -- in org.apache.commons.cli.{*}OptionBuilderTest{*}{*}{*}

[*ERROR*] org.apache.commons.cli.OptionBuilderTest.testCreateWithMultiCharacterShortOptionShouldThrowException -- Time elapsed: 0.001 s <<< FAILURE!

org.opentest4j.AssertionFailedError: Creating short option with 2 characters should throw IllegalArgumentException ==> Expected java.lang.IllegalArgumentException to be thrown, but nothing was thrown.

 at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:152)

 at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:73)

 at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:39)

 at org.junit.jupiter.api.Assertions.assertThrows(Assertions.java:3153)

 at org.apache.commons.cli.OptionBuilderTest.testCreateWithMultiCharacterShortOptionShouldThrowException(OptionBuilderTest.java:30)

 at java.lang.reflect.Method.invoke(Method.java:498)

 at java.util.ArrayList.forEach(ArrayList.java:1259)

 at java.util.ArrayList.forEach(ArrayList.java:1259)
 
*Suggested Fix:*
Add validation in {{{}OptionBuilder.create(String opt){}}}:
public static Option create(final String opt) throws IllegalArgumentException {
    if (opt != null && opt.length() != 1) {
        throw new IllegalArgumentException("Short option must be a single character");
    }
    // ... rest of the method
}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)