summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJulien Massenet <bobafeth2000@yahoo.fr>2013-08-05 14:41:43 +0200
committerJulien Massenet <bobafeth2000@yahoo.fr>2013-08-05 14:41:43 +0200
commitd627b357c2a63b003869de40221c02b04d0eb663 (patch)
tree8c29b27b9f9b65aa6ebfc1b406e3a9fd828df716 /src
parent33dcbc6fdca9e9318a37b9f3b8e4f821c69b0f7b (diff)
downloadplatform_external_jcommander-d627b357c2a63b003869de40221c02b04d0eb663.tar.gz
platform_external_jcommander-d627b357c2a63b003869de40221c02b04d0eb663.tar.bz2
platform_external_jcommander-d627b357c2a63b003869de40221c02b04d0eb663.zip
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();
+ }
+ }
+}