/*
* The MIT License
*
* Copyright 2013 Red Hat, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package hudson.cli;
import static hudson.cli.CLICommandInvoker.Matcher.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.text.StringContainsInOrder.stringContainsInOrder;
import java.io.PrintStream;
import java.util.Arrays;
import hudson.cli.CLICommandInvoker.Result;
import hudson.model.AbstractProject;
import org.hamcrest.Matcher;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.JenkinsRule.WebClient;
import org.jvnet.hudson.test.TestExtension;
import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.Option;
public class HelpCommandTest {
@Rule public JenkinsRule j = new JenkinsRule();
@Test public void getHelpRunningCommand() {
CLICommandInvoker command = new CLICommandInvoker(j, new HelpCommand());
String generalHelp = command.invoke().stderr();
assertContainsOverviewOfClassCommand(generalHelp);
assertContainsOverviewOfMethodCommand(generalHelp);
Result result = command.invokeWithArgs(ClassCommand.NAME);
assertThat(result, succeeded());
assertThat(result, hasNoStandardOutput());
assertContainsUsageOfClassCommand(result.stderr());
result = command.invokeWithArgs("offline-node");
assertThat(result, succeeded());
assertThat(result, hasNoStandardOutput());
assertContainsUsageOfMethodCommand(result.stderr());
}
@Test public void getHelpUsingJenkinsUI() throws Exception {
WebClient wc = j.createWebClient();
String generalHelp = wc.goTo("cli").asText();
assertContainsOverviewOfClassCommand(generalHelp);
assertContainsOverviewOfMethodCommand(generalHelp);
assertContainsUsageOfClassCommand(wc.goTo("cli/command/class-command").asText());
assertContainsUsageOfMethodCommand(wc.goTo("cli/command/offline-node").asText());
}
private void assertContainsOverviewOfClassCommand(String text) {
assertThat(text, containsString(ClassCommand.NAME));
assertThat(text, containsString(ClassCommand.SHORT_DESCRIPTION));
}
private void assertContainsUsageOfClassCommand(String text) {
assertThat(text, containsString("class-command [JOB] [-b BUILD]"));
assertThat(text, containsString(ClassCommand.LONG_DESCRIPTION));
assertThat(text, containsStrings("JOB", "Job arg"));
assertThat(text, containsStrings("BUILD", "Build opt"));
}
private void assertContainsOverviewOfMethodCommand(String text) {
assertThat(text, containsString("offline-node"));
}
private void assertContainsUsageOfMethodCommand(String text) {
assertThat(text, containsString("offline-node NAME ... [-m VAL]"));
assertThat(text, containsStrings("NAME", "Agent name, or empty string for master"));
assertThat(text, containsStrings("-m VAL", "Record the reason about why you are disconnecting this node"));
}
private static Matcher<String> containsStrings(String... strings) {
return stringContainsInOrder(Arrays.asList(strings));
}
@TestExtension
public static class ClassCommand extends CLICommand {
private static final String SHORT_DESCRIPTION = "Short description of class-command";
private static final String LONG_DESCRIPTION = "Long description of class-command";
private static final String NAME = "class-command";
@Argument(usage="Job arg")
public AbstractProject<?, ?> job;
@Option(name="-b", metaVar="BUILD", usage="Build opt")
public String build;
@Override
public String getName() {
return NAME;
}
@Override
public String getShortDescription() {
return SHORT_DESCRIPTION;
}
@Override
protected void printUsageSummary(PrintStream stderr) {
stderr.println(LONG_DESCRIPTION);
}
@Override
protected int run() throws Exception {
throw new UnsupportedOperationException();
}
}
}