summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCedric Beust <cedric@beust.com>2014-03-08 11:12:28 -0800
committerCedric Beust <cedric@beust.com>2014-03-08 11:12:28 -0800
commit65d47c3ae26d8feeda6469f104597c40020446ce (patch)
treedeee824a1858f12a65013f560544cec7309f51ad /src
parent90fc11663190d5c4c6cc2a7ddae3868726fbfb52 (diff)
parentd627b357c2a63b003869de40221c02b04d0eb663 (diff)
downloadplatform_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
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/beust/jcommander/internal/DefaultConsole.java3
-rw-r--r--src/test/java/com/beust/jcommander/internal/DefaultConsoleTest.java64
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();
+ }
+ }
+}