blob: 50a78faa2ff23aa7db3f431bcb9d7853130a4071 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF 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.apache.geode.management.internal.cli;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.springframework.shell.event.ParseResult;
import org.apache.geode.management.internal.cli.i18n.CliStrings;
import org.apache.geode.test.junit.categories.GfshTest;
import org.apache.geode.test.junit.rules.GfshParserRule;
@Category({GfshTest.class})
public class GfshParserParsingTest {
@ClassRule
public static GfshParserRule parser = new GfshParserRule();
private String buffer;
private GfshParseResult parseParams(String input, String commandMethod) {
ParseResult parseResult = parser.parse(input);
GfshParseResult gfshParseResult = (GfshParseResult) parseResult;
assertThat(gfshParseResult.getMethod().getName()).isEqualTo(commandMethod);
assertThat(gfshParseResult.getUserInput()).isEqualTo(input.trim());
return gfshParseResult;
}
@Test
public void getSimpleParserInputTest() {
buffer = "start locator --J=\"-Dgemfire.http-service-port=8080\" --name=loc1";
assertEquals("start locator --J \"-Dgemfire.http-service-port=8080\" --name loc1",
GfshParser.convertToSimpleParserInput(buffer));
buffer = "start locator --J=-Dgemfire.http-service-port=8080 --name=loc1 --J=-Ddummythinghere";
assertEquals("start locator --J \"-Dgemfire.http-service-port=8080"
+ GfshParser.J_ARGUMENT_DELIMITER + "-Ddummythinghere\" --name loc1",
GfshParser.convertToSimpleParserInput(buffer));
buffer = "start locator --";
assertThat(GfshParser.convertToSimpleParserInput(buffer)).isEqualTo("start locator --");
buffer =
"start locator --J=-Dgemfire.http-service-port=8080 --name=loc1 --J=-Ddummythinghere --";
assertEquals("start locator --J \"-Dgemfire.http-service-port=8080"
+ GfshParser.J_ARGUMENT_DELIMITER + "-Ddummythinghere\" --name loc1 --",
GfshParser.convertToSimpleParserInput(buffer));
buffer = "start server --name=name1 --locators=localhost --J=-Dfoo=bar";
assertEquals("start server --name name1 --locators localhost --J \"-Dfoo=bar\"",
GfshParser.convertToSimpleParserInput(buffer));
}
@Test
public void testStartLocatorJOptionWithComma() throws Exception {
buffer =
"start locator --name=test --J='-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=30000' --J=-Dfoo=bar";
GfshParseResult result = parser.parse(buffer);
assertThat(result).isNotNull();
Object[] arguments = result.getArguments();
int indexOfJvmArgumentsParameterInStartLocator = 18;
String[] jvmArgs = (String[]) arguments[indexOfJvmArgumentsParameterInStartLocator];
assertThat(jvmArgs).hasSize(2);
// make sure the resulting jvm arguments do not have quotes (either single or double) around
// them.
assertThat(jvmArgs[0])
.isEqualTo("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=30000");
assertThat(jvmArgs[1]).isEqualTo("-Dfoo=bar");
}
@Test
public void testStartServerJOptionWithComma() throws Exception {
buffer =
"start server --name=test --J='-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=30000' --J='-Dfoo=bar'";
GfshParseResult result = parser.parse(buffer);
assertThat(result).isNotNull();
Object[] arguments = result.getArguments();
int indexOfJvmArgumentsParameterInStartServer = 19;
String[] jvmArgs = (String[]) arguments[indexOfJvmArgumentsParameterInStartServer];
assertThat(jvmArgs).hasSize(2);
// make sure the resulting jvm arguments do not have quotes (either single or double) around
// them.
assertThat(jvmArgs[0])
.isEqualTo("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=30000");
assertThat(jvmArgs[1]).isEqualTo("-Dfoo=bar");
}
@Test
public void testStartJConsoleJOptionWithComma() throws Exception {
buffer =
"start jconsole --J='-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=30000' --J=-Dfoo=bar";
GfshParseResult result = parser.parse(buffer);
assertThat(result).isNotNull();
Object[] arguments = result.getArguments();
// the 4th argument is the jvmarguments;
String[] jvmArgs = (String[]) arguments[4];
assertThat(jvmArgs).hasSize(2);
// make sure the resulting jvm arguments do not have quotes (either single or double) around
// them.
assertThat(jvmArgs[0])
.isEqualTo("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=30000");
assertThat(jvmArgs[1]).isEqualTo("-Dfoo=bar");
}
@Test
public void testStartJvisulvmOptionWithComma() throws Exception {
buffer =
"start jvisualvm --J=\"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=30000\" --J=-Dfoo=bar";
GfshParseResult result = parser.parse(buffer);
assertThat(result).isNotNull();
Object[] arguments = result.getArguments();
// the 1st argument is the jvmarguments;
String[] jvmArgs = (String[]) arguments[0];
assertThat(jvmArgs).hasSize(2);
// make sure the resulting jvm arguments do not have quotes (either single or double) around
// them.
assertThat(jvmArgs[0])
.isEqualTo("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=30000");
assertThat(jvmArgs[1]).isEqualTo("-Dfoo=bar");
}
@Test
public void testParseOptionStartsWithHyphenWithoutQuotes() throws Exception {
String input =
"rebalance --exclude-region=/GemfireDataCommandsDUnitTestRegion2 --simulate=true --time-out=-1";
GfshParseResult result = parseParams(input, "rebalance");
assertThat(result.getParamValueAsString("exclude-region"))
.isEqualTo("/GemfireDataCommandsDUnitTestRegion2");
assertThat(result.getParamValueAsString("simulate")).isEqualTo("true");
assertThat(result.getParamValueAsString("time-out")).isEqualTo("-1");
}
@Test
public void testParseOptionStartsWithHyphenWithQuotes() throws Exception {
String input =
"rebalance --exclude-region=/GemfireDataCommandsDUnitTestRegion2 --simulate=true --time-out=\"-1\"";
GfshParseResult result = parseParams(input, "rebalance");
assertThat(result.getParamValueAsString("exclude-region"))
.isEqualTo("/GemfireDataCommandsDUnitTestRegion2");
assertThat(result.getParamValueAsString("simulate")).isEqualTo("true");
assertThat(result.getParamValueAsString("time-out")).isEqualTo("-1");
}
@Test
public void testParseOptionContainingHyphen() throws Exception {
String input = "rebalance --exclude-region=/The-Region --simulate=true";
GfshParseResult result = parseParams(input, "rebalance");
assertThat(result.getParamValueAsString("exclude-region")).isEqualTo("/The-Region");
assertThat(result.getParamValueAsString("simulate")).isEqualTo("true");
}
@Test
public void testParseOptionContainingUnderscore() throws Exception {
String input = "rebalance --exclude-region=/The_region --simulate=true";
GfshParseResult result = parseParams(input, "rebalance");
assertThat(result.getParamValueAsString("exclude-region")).isEqualTo("/The_region");
assertThat(result.getParamValueAsString("simulate")).isEqualTo("true");
}
@Test
public void testParseOneJOptionWithQuotes() throws Exception {
String input = "start locator --J=\"-Dgemfire.http-service-port=8080\" --name=loc1";
GfshParseResult result = parseParams(input, "startLocator");
assertThat(result.getParamValueAsString("name")).isEqualTo("loc1");
assertThat(result.getParamValueAsString("J")).isEqualTo("-Dgemfire.http-service-port=8080");
}
@Test
public void testParseOneJOptionWithSpaceInQuotes() throws Exception {
String input = "start locator --J=\"-Dgemfire.http-service-port= 8080\" --name=loc1";
GfshParseResult result = parseParams(input, "startLocator");
assertThat(result.getParamValueAsString("name")).isEqualTo("loc1");
assertThat(result.getParamValueAsString("J")).isEqualTo("-Dgemfire.http-service-port= 8080");
}
@Test
public void testParseOneJOption() throws Exception {
String input = "start locator --J=-Dgemfire.http-service-port=8080 --name=loc1";
GfshParseResult result = parseParams(input, "startLocator");
assertThat(result.getParamValueAsString("name")).isEqualTo("loc1");
assertThat(result.getParamValueAsString("J")).isEqualTo("-Dgemfire.http-service-port=8080");
}
@Test
public void testParseTwoJOptions() throws Exception {
String input =
"start locator --J=-Dgemfire.http-service-port=8080 --name=loc1 --J=-Ddummythinghere";
GfshParseResult result = parseParams(input, "startLocator");
assertThat(result.getParamValueAsString("name")).isEqualTo("loc1");
assertThat(result.getParamValueAsString("J"))
.isEqualTo("-Dgemfire.http-service-port=8080,-Ddummythinghere");
}
@Test
public void testParseTwoJOptionsOneWithQuotesOneWithout() throws Exception {
String input =
"start locator --J=\"-Dgemfire.http-service-port=8080\" --name=loc1 --J=-Ddummythinghere";
GfshParseResult result = parseParams(input, "startLocator");
assertThat(result.getParamValueAsString("name")).isEqualTo("loc1");
assertThat(result.getParamValueAsString("J"))
.isEqualTo("-Dgemfire.http-service-port=8080,-Ddummythinghere");
}
@Test
public void testParseOneJOptionWithQuotesAndLotsOfSpaces() throws Exception {
String input =
"start locator --J=\"-Dgemfire.http-service-port=8080\" --name=loc1 ";
GfshParseResult result = parseParams(input, "startLocator");
assertThat(result.getParamValueAsString("name")).isEqualTo("loc1");
assertThat(result.getParamValueAsString("J")).isEqualTo("-Dgemfire.http-service-port=8080");
}
@Test
public void testObtainHelp() {
String command = CliStrings.START_PULSE;
String helpString = ("NAME\n" + "start pulse\n" + "IS AVAILABLE\n" + "true\n" + "SYNOPSIS\n"
+ "Open a new window in the default Web browser with the URL for the Pulse application.\n"
+ "SYNTAX\n" + "start pulse [--url=value]\n" + "PARAMETERS\n" + "url\n"
+ "URL of the Pulse Web application.\n" + "Required: false\n"
+ "Default (if the parameter is not specified): http://localhost:7070/pulse\n").replace(
"\n", System.lineSeparator());
assertThat(parser.getCommandManager().obtainHelp(command)).isEqualTo(helpString);
}
@Test
public void testDeployCommand() throws Exception {
String command = "deploy --jar=/tmp/junit7552412945092669041/jar1.jar";
GfshParseResult result = parser.parse(command);
assertThat(result).isNotNull();
}
@Test
public void testCommandWithBackSlash() throws Exception {
String command =
"describe offline-disk-store --name=testDiskStore --disk-dirs=R:\\regrResults\\test";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("disk-dirs")).isEqualTo("R:\\regrResults\\test");
}
@Test
public void testCommandWithBackSlashTwo() throws Exception {
String command = "start locator --name=\\test";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("name")).isEqualTo("\\test");
}
@Test
public void testCommandWithBackSlashThree() throws Exception {
String command = "start locator --name=\\myName";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("name")).isEqualTo("\\myName");
}
@Test
public void testCommandWithBackSlashFour() throws Exception {
String command = "start locator --name=\\u0005Name";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("name")).isEqualTo("\\u0005Name");
}
@Test
public void testValueOfJsonWithoutOuterQuoteAndSpace() throws Exception {
String command = "put --key=('name':'id') --value=456 --region=/test";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("key")).isEqualTo("('name':'id')");
}
@Test
public void testValueOfJsonWithSpace() throws Exception {
// this is considerred an invalid command
String command = "put --key=('name' : 'id') --value=456 --region=/test";
GfshParseResult result = parser.parse(command);
assertThat(result).isNull();
}
@Test
public void testValueOfJsonWithSpaceAndOuterQuotes() throws Exception {
String command = "put --key=\"('name' : 'id')\" --value=456 --region=/test";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("key")).isEqualTo("('name' : 'id')");
}
@Test
public void optionValueWillNotBeTrimmedIfInQuotes() throws Exception {
String command = "start locator --name=' test '";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("name")).isEqualTo(" test ");
}
@Test
public void optionValueWithExtraSpaceInBetween() throws Exception {
String command = "start locator --name= test --bind-address=123";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("name")).isEqualTo("test");
assertThat(result.getParamValueAsString("bind-address")).isEqualTo("123");
}
@Test
public void optionValueWithEmptyString() throws Exception {
String command = "start locator --name= --bind-address=123";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("name")).isNull();
assertThat(result.getParamValueAsString("bind-address")).isEqualTo("123");
}
@Test
public void optionValueWithQuotedEmptyString() throws Exception {
String command = "start locator --name='' --bind-address=123";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("name")).isNull();
assertThat(result.getParamValueAsString("bind-address")).isEqualTo("123");
}
@Test
public void testMultiLineCommand() throws Exception {
String command = "start server " + GfshParser.LINE_SEPARATOR + "--name=test";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValueAsString("name")).isEqualTo("test");
assertThat(result.getCommandName()).isEqualTo("start server");
}
@Test
public void testShutdownWithOptionCommand() throws Exception {
String command = "shutdown --include-locators";
GfshParseResult result = parser.parse(command);
assertThat(result.getParamValue("include-locators")).isEqualTo(true);
}
}