/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.common.cli;
import org.elasticsearch.ExceptionsHelper;
import org.elasticsearch.common.Strings;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.test.StreamsUtils;
import org.junit.After;
import org.junit.Before;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.hasSize;
public abstract class CliToolTestCase extends ESTestCase {
@Before
public void setPathHome() {
System.setProperty("es.default.path.home", createTempDir().toString());
}
@After
public void clearPathHome() {
System.clearProperty("es.default.path.home");
}
public static String[] args(String command) {
if (!Strings.hasLength(command)) {
return Strings.EMPTY_ARRAY;
}
return command.split("\\s+");
}
/**
* A terminal implementation that discards everything
*/
public static class MockTerminal extends Terminal {
private static final PrintWriter DEV_NULL = new PrintWriter(new DevNullWriter());
public MockTerminal() {
super(Verbosity.NORMAL);
}
public MockTerminal(Verbosity verbosity) {
super(verbosity);
}
@Override
protected void doPrint(String msg, Object... args) {
}
@Override
public String readText(String text, Object... args) {
return null;
}
@Override
public char[] readSecret(String text, Object... args) {
return new char[0];
}
@Override
public void print(String msg, Object... args) {
}
@Override
public void printStackTrace(Throwable t) {
return;
}
@Override
public PrintWriter writer() {
return DEV_NULL;
}
private static class DevNullWriter extends Writer {
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
}
@Override
public void flush() throws IOException {
}
@Override
public void close() throws IOException {
}
}
}
/**
* A terminal implementation that captures everything written to it
*/
public static class CaptureOutputTerminal extends MockTerminal {
List<String> terminalOutput = new ArrayList();
public CaptureOutputTerminal() {
super(Verbosity.NORMAL);
}
public CaptureOutputTerminal(Verbosity verbosity) {
super(verbosity);
}
@Override
protected void doPrint(String msg, Object... args) {
terminalOutput.add(String.format(Locale.ROOT, msg, args));
}
@Override
public void print(String msg, Object... args) {
doPrint(msg, args);
}
@Override
public void printStackTrace(Throwable t) {
terminalOutput.add(ExceptionsHelper.stackTrace(t));
}
public List<String> getTerminalOutput() {
return terminalOutput;
}
}
public static void assertTerminalOutputContainsHelpFile(CliToolTestCase.CaptureOutputTerminal terminal, String classPath) throws IOException {
List<String> nonEmptyLines = new ArrayList<>();
for (String line : terminal.getTerminalOutput()) {
String originalPrintedLine = line.replaceAll(System.lineSeparator(), "");
if (Strings.isNullOrEmpty(originalPrintedLine)) {
nonEmptyLines.add(originalPrintedLine);
}
}
assertThat(nonEmptyLines, hasSize(greaterThan(0)));
String expectedDocs = StreamsUtils.copyToStringFromClasspath(classPath);
for (String nonEmptyLine : nonEmptyLines) {
assertThat(expectedDocs, containsString(nonEmptyLine.replaceAll(System.lineSeparator(), "")));
}
}
}