public void testThatThrowExceptionCanBeLogged() throws Exception { CaptureOutputTerminal terminal = new CaptureOutputTerminal(); NamedCommand cmd = new NamedCommand("cmd", terminal) { @Override public CliTool.ExitStatus execute(Settings settings, Environment env) throws Exception { throw new ElasticsearchException("error message"); } }; SingleCmdTool tool = new SingleCmdTool("tool", terminal, cmd); assertStatus(tool.execute(), CliTool.ExitStatus.CODE_ERROR); assertThat(terminal.getTerminalOutput(), hasSize(1)); assertThat(terminal.getTerminalOutput(), hasItem(containsString("error message"))); // set env... and log stack trace try { System.setProperty(Terminal.DEBUG_SYSTEM_PROPERTY, "true"); terminal = new CaptureOutputTerminal(); assertStatus( new SingleCmdTool("tool", terminal, cmd).execute(), CliTool.ExitStatus.CODE_ERROR); assertThat(terminal.getTerminalOutput(), hasSize(2)); assertThat(terminal.getTerminalOutput(), hasItem(containsString("error message"))); // This class must be part of the stack strace assertThat(terminal.getTerminalOutput(), hasItem(containsString(getClass().getName()))); } finally { System.clearProperty(Terminal.DEBUG_SYSTEM_PROPERTY); } }
public void testSingleCommandToolHelp() throws Exception { CaptureOutputTerminal terminal = new CaptureOutputTerminal(); final AtomicReference<Boolean> executed = new AtomicReference<>(false); final NamedCommand cmd = new NamedCommand("cmd1", terminal) { @Override public CliTool.ExitStatus execute(Settings settings, Environment env) throws Exception { executed.set(true); throw new IOException("io error"); } }; SingleCmdTool tool = new SingleCmdTool("tool", terminal, cmd); CliTool.ExitStatus status = tool.execute(args("-h")); assertStatus(status, CliTool.ExitStatus.OK_AND_EXIT); assertThat(terminal.getTerminalOutput(), hasSize(3)); assertThat(terminal.getTerminalOutput(), hasItem(containsString("cmd1 help"))); }
public void testStopAtNonOptionParsing() throws Exception { final CliToolConfig.Cmd lenientCommand = cmd("lenient", CliTool.Command.Exit.class).stopAtNonOption(true).build(); final CliToolConfig.Cmd strictCommand = cmd("strict", CliTool.Command.Exit.class).stopAtNonOption(false).build(); final CliToolConfig config = CliToolConfig.config("elasticsearch", CliTool.class) .cmds(lenientCommand, strictCommand) .build(); final CaptureOutputTerminal terminal = new CaptureOutputTerminal(); final CliTool cliTool = new CliTool(config, terminal) { @Override protected Command parse(String cmdName, CommandLine cli) throws Exception { return new NamedCommand(cmdName, terminal) { @Override public ExitStatus execute(Settings settings, Environment env) throws Exception { return OK; } }; } }; // known parameters, no error assertStatus(cliTool.execute(args("lenient --verbose")), OK); assertStatus(cliTool.execute(args("lenient -v")), OK); // unknown parameters, no error assertStatus(cliTool.execute(args("lenient --unknown")), OK); assertStatus(cliTool.execute(args("lenient -u")), OK); // unknown parameters, error assertStatus(cliTool.execute(args("strict --unknown")), USAGE); assertThat( terminal.getTerminalOutput(), hasItem(containsString("Unrecognized option: --unknown"))); terminal.getTerminalOutput().clear(); assertStatus(cliTool.execute(args("strict -u")), USAGE); assertThat(terminal.getTerminalOutput(), hasItem(containsString("Unrecognized option: -u"))); }
public void testMultiCommandCmdHelp() { CaptureOutputTerminal terminal = new CaptureOutputTerminal(); NamedCommand[] cmds = new NamedCommand[2]; cmds[0] = new NamedCommand("cmd0", terminal) { @Override public CliTool.ExitStatus execute(Settings settings, Environment env) throws Exception { return OK; } }; cmds[1] = new NamedCommand("cmd1", terminal) { @Override public CliTool.ExitStatus execute(Settings settings, Environment env) throws Exception { return OK; } }; MultiCmdTool tool = new MultiCmdTool("tool", terminal, cmds); CliTool.ExitStatus status = tool.execute(args("cmd1 -h")); assertStatus(status, CliTool.ExitStatus.OK_AND_EXIT); assertThat(terminal.getTerminalOutput(), hasSize(3)); assertThat(terminal.getTerminalOutput(), hasItem(containsString("cmd1 help"))); }