1 package com.beust.jcommander; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.InputStream; 5 6 import org.testng.Assert; 7 import org.testng.annotations.DataProvider; 8 import org.testng.annotations.Test; 9 10 public class PasswordTest { 11 12 @DataProvider(name = "args") createArgs()13 public Object[][] createArgs() { 14 return new Object[][] { 15 { new PasswordTestingArgs() }, 16 { new OptionalPasswordTestingArgs() }, 17 }; 18 } 19 20 public interface Args { 21 getPassword()22 String getPassword(); 23 getPort()24 int getPort(); 25 26 } 27 28 public static class PasswordTestingArgs implements PasswordTest.Args { 29 @Parameter(names = {"--password", "-p"}, description = "Private key password", 30 password = true, required = true) 31 public String password; 32 33 @Parameter(names = {"--port", "-o"}, description = "Port to bind server to", 34 required = true) 35 public int port; 36 37 @Override getPassword()38 public String getPassword() { 39 return password; 40 } 41 42 @Override getPort()43 public int getPort() { 44 return port; 45 } 46 } 47 48 @Test(dataProvider = "args") passwordNotAsked(Args a)49 public void passwordNotAsked(Args a) { 50 String expectedPassword = "somepassword"; 51 int expectedPort = 7; 52 new JCommander(a, "--password", expectedPassword, "--port", String.valueOf(7)); 53 Assert.assertEquals(a.getPort(), expectedPort); 54 Assert.assertEquals(a.getPassword(), expectedPassword); 55 } 56 57 @Test(dataProvider = "args", expectedExceptions = ParameterException.class) passwordWithExcessiveArity(Args a)58 public void passwordWithExcessiveArity(Args a) { 59 new JCommander(a, "--password", "somepassword", "someotherarg", "--port", String.valueOf(7)); 60 } 61 62 @Test(dataProvider = "args") passwordAsked(Args a)63 public void passwordAsked(Args a) { 64 InputStream stdin = System.in; 65 String password = "password"; 66 int port = 7; 67 try { 68 System.setIn(new ByteArrayInputStream(password.getBytes())); 69 new JCommander(a, "--port", String.valueOf(port), "--password"); 70 Assert.assertEquals(a.getPort(), port); 71 Assert.assertEquals(a.getPassword(), password); 72 } finally { 73 System.setIn(stdin); 74 } 75 } 76 77 public static class OptionalPasswordTestingArgs implements PasswordTest.Args { 78 @Parameter(names = {"--password", "-p"}, description = "Private key password", 79 password = true) 80 public String password; 81 82 @Parameter(names = {"--port", "-o"}, description = "Port to bind server to", 83 required = true) 84 public int port; 85 86 @Override getPassword()87 public String getPassword() { 88 return password; 89 } 90 91 @Override getPort()92 public int getPort() { 93 return port; 94 } 95 } 96 97 @Test passwordOptionalNotProvided()98 public void passwordOptionalNotProvided() { 99 Args a = new OptionalPasswordTestingArgs(); 100 new JCommander(a, "--port", "7"); 101 Assert.assertEquals(a.getPort(), 7); 102 Assert.assertEquals(a.getPassword(), null); 103 } 104 105 @Test(expectedExceptions = ParameterException.class) passwordRequredNotProvided()106 public void passwordRequredNotProvided() { 107 Args a = new PasswordTestingArgs(); 108 new JCommander(a, "--port", "7"); 109 } 110 111 } 112