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")));
 }