diff options
author | Julien Massenet <bobafeth2000@yahoo.fr> | 2013-08-05 14:41:43 +0200 |
---|---|---|
committer | Julien Massenet <bobafeth2000@yahoo.fr> | 2013-08-05 14:41:43 +0200 |
commit | d627b357c2a63b003869de40221c02b04d0eb663 (patch) | |
tree | 8c29b27b9f9b65aa6ebfc1b406e3a9fd828df716 | |
parent | 33dcbc6fdca9e9318a37b9f3b8e4f821c69b0f7b (diff) | |
download | platform_external_jcommander-d627b357c2a63b003869de40221c02b04d0eb663.tar.gz platform_external_jcommander-d627b357c2a63b003869de40221c02b04d0eb663.tar.bz2 platform_external_jcommander-d627b357c2a63b003869de40221c02b04d0eb663.zip |
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(); + } + } +} |