1 package com.beust.jcommander.internal; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import org.testng.Assert; 7 import org.testng.annotations.Test; 8 9 @Test 10 public class DefaultConsoleTest { readPasswordCanBeCalledMultipleTimes()11 public void readPasswordCanBeCalledMultipleTimes() { 12 final InputStream inBackup = System.in; 13 try { 14 final StringInputStream in = new StringInputStream(); 15 System.setIn(in); 16 final Console console = new DefaultConsole(); 17 18 in.setData("password1\n"); 19 char[] password = console.readPassword(false); 20 Assert.assertEquals(password, "password1".toCharArray()); 21 Assert.assertFalse(in.isClosedCalled(), "System.in stream shouldn't be closed"); 22 23 in.setData("password2\n"); 24 password = console.readPassword(false); 25 Assert.assertEquals(password, "password2".toCharArray()); 26 Assert.assertFalse(in.isClosedCalled(), "System.in stream shouldn't be closed"); 27 } finally { 28 System.setIn(inBackup); 29 } 30 } 31 32 private static class StringInputStream extends InputStream { 33 private byte[] data = new byte[0]; 34 private int offset = 0; 35 private boolean closedCalled; 36 StringInputStream()37 StringInputStream() { 38 super(); 39 } 40 setData(final String strData)41 void setData(final String strData) { 42 data = strData.getBytes(); 43 offset = 0; 44 } 45 isClosedCalled()46 boolean isClosedCalled() { 47 return closedCalled; 48 } 49 50 @Override read()51 public int read() throws IOException { 52 if (offset >= data.length) { 53 return -1; 54 } 55 return 0xFFFF & data[offset++]; 56 } 57 58 @Override close()59 public void close() throws IOException { 60 closedCalled = true; 61 super.close(); 62 } 63 } 64 } 65