diff options
author | Cedric Beust <cedric@beust.com> | 2014-03-08 11:12:28 -0800 |
---|---|---|
committer | Cedric Beust <cedric@beust.com> | 2014-03-08 11:12:28 -0800 |
commit | 65d47c3ae26d8feeda6469f104597c40020446ce (patch) | |
tree | deee824a1858f12a65013f560544cec7309f51ad | |
parent | 90fc11663190d5c4c6cc2a7ddae3868726fbfb52 (diff) | |
parent | d627b357c2a63b003869de40221c02b04d0eb663 (diff) | |
download | platform_external_jcommander-65d47c3ae26d8feeda6469f104597c40020446ce.tar.gz platform_external_jcommander-65d47c3ae26d8feeda6469f104597c40020446ce.tar.bz2 platform_external_jcommander-65d47c3ae26d8feeda6469f104597c40020446ce.zip |
Merge pull request #161 from jmassenet/issue_console
Do not close System.in when using DefaultConsole
-rw-r--r-- | src/main/java/com/beust/jcommander/internal/DefaultConsole.java | 3 | ||||
-rw-r--r-- | src/test/java/com/beust/jcommander/internal/DefaultConsoleTest.java | 64 |
2 files changed, 65 insertions, 2 deletions
diff --git a/src/main/java/com/beust/jcommander/internal/DefaultConsole.java b/src/main/java/com/beust/jcommander/internal/DefaultConsole.java index 65e87ba..8fd7d6d 100644 --- a/src/main/java/com/beust/jcommander/internal/DefaultConsole.java +++ b/src/main/java/com/beust/jcommander/internal/DefaultConsole.java @@ -18,11 +18,10 @@ public class DefaultConsole implements Console { public char[] readPassword(boolean echoInput) { try { + // Do not close the readers since System.in should not be closed InputStreamReader isr = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(isr); String result = in.readLine(); - in.close(); - isr.close(); return result.toCharArray(); } catch (IOException e) { diff --git a/src/test/java/com/beust/jcommander/internal/DefaultConsoleTest.java b/src/test/java/com/beust/jcommander/internal/DefaultConsoleTest.java new file mode 100644 index 0000000..e101439 --- /dev/null +++ b/src/test/java/com/beust/jcommander/internal/DefaultConsoleTest.java @@ -0,0 +1,64 @@ +package com.beust.jcommander.internal; + +import java.io.IOException; +import java.io.InputStream; + +import org.testng.Assert; +import org.testng.annotations.Test; + +@Test +public class DefaultConsoleTest { + public void readPasswordCanBeCalledMultipleTimes() { + final InputStream inBackup = System.in; + try { + final StringInputStream in = new StringInputStream(); + System.setIn(in); + final Console console = new DefaultConsole(); + + in.setData("password1\n"); + char[] password = console.readPassword(false); + Assert.assertEquals(password, "password1".toCharArray()); + Assert.assertFalse(in.isClosedCalled(), "System.in stream shouldn't be closed"); + + in.setData("password2\n"); + password = console.readPassword(false); + Assert.assertEquals(password, "password2".toCharArray()); + Assert.assertFalse(in.isClosedCalled(), "System.in stream shouldn't be closed"); + } finally { + System.setIn(inBackup); + } + } + + private static class StringInputStream extends InputStream { + private byte[] data = new byte[0]; + private int offset = 0; + private boolean closedCalled; + + StringInputStream() { + super(); + } + + void setData(final String strData) { + data = strData.getBytes(); + offset = 0; + } + + boolean isClosedCalled() { + return closedCalled; + } + + @Override + public int read() throws IOException { + if (offset >= data.length) { + return -1; + } + return 0xFFFF & data[offset++]; + } + + @Override + public void close() throws IOException { + closedCalled = true; + super.close(); + } + } +} |