Add GfshParserRule to facilitate command unit tests

Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/0ef7f56b
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/0ef7f56b
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/0ef7f56b

Branch: refs/heads/feature/GEM-1483
Commit: 0ef7f56bd7a82afbd2af1e6968aaaed4303905c7
Parents: 8a10c1a
Author: Jinmei Liao <jil...@pivotal.io>
Authored: Sun Jun 4 23:51:42 2017 -0700
Committer: Jared Stewart <jstew...@pivotal.io>
Committed: Fri Jun 9 15:17:11 2017 -0700

----------------------------------------------------------------------
 .../management/internal/cli/GfshParser.java     |  33 +--
 .../internal/cli/remote/CommandProcessor.java   |   3 +-
 .../management/internal/cli/shell/Gfsh.java     |   3 +-
 .../cli/GfshParserAutoCompletionTest.java       | 222 +++++++++----------
 .../internal/cli/GfshParserConverterTest.java   |  95 +++-----
 .../internal/cli/GfshParserParsingTest.java     |  10 +-
 .../commands/LauncherLifecycleCommandsTest.java |  51 +++++
 .../geode/test/dunit/rules/GfshParserRule.java  | 126 +++++++++++
 8 files changed, 321 insertions(+), 222 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/0ef7f56b/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
index b5c24cb..c31c50d 100755
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
@@ -53,34 +53,20 @@ public class GfshParser extends SimpleParser {
   private static Pattern PATTERN =
       
Pattern.compile("\\s*([^\\s']*)'([^']*)'\\s+|\\s*([^\\s\"]*)\"([^\"]*)\"\\s+|\\S+");
 
-
-  private CommandManager commandManager = null;
-
-  public GfshParser() {
-    this(null);
-  }
-
-  public GfshParser(Properties cacheProperties) {
-    this.commandManager = new CommandManager(cacheProperties);
-
+  public GfshParser(CommandManager commandManager) {
     for (CommandMarker command : commandManager.getCommandMarkers()) {
       add(command);
     }
 
-    List<Converter<?>> converters = commandManager.getConverters();
-    for (Converter<?> converter : converters) {
+    for (Converter<?> converter : commandManager.getConverters()) {
       if (converter.getClass().isAssignableFrom(ArrayConverter.class)) {
         ArrayConverter arrayConverter = (ArrayConverter) converter;
-        arrayConverter.setConverters(new HashSet<>(converters));
+        arrayConverter.setConverters(new 
HashSet<>(commandManager.getConverters()));
       }
       add(converter);
     }
   }
 
-  public CommandManager getCommandManager() {
-    return commandManager;
-  }
-
   static String convertToSimpleParserInput(String userInput) {
     List<String> inputTokens = splitUserInput(userInput);
     return getSimpleParserInputFromTokens(inputTokens);
@@ -294,19 +280,6 @@ public class GfshParser extends SimpleParser {
     return cursor;
   }
 
-  // convenience method for testing
-  int completeAdvanced(String userInput, final List<Completion> candidates) {
-    return completeAdvanced(userInput, userInput.length(), candidates);
-  }
-
-  /**
-   * test only used to demonstrate what's the super class's completeAdvanced 
behavior
-   *
-   */
-  int completeSuperAdvanced(String userInput, final List<Completion> 
candidates) {
-    return super.completeAdvanced(userInput, userInput.length(), candidates);
-  }
-
   /**
    * @param buffer use the buffer to find the completion candidates
    *

http://git-wip-us.apache.org/repos/asf/geode/blob/0ef7f56b/geode-core/src/main/java/org/apache/geode/management/internal/cli/remote/CommandProcessor.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/remote/CommandProcessor.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/remote/CommandProcessor.java
index 7ec7699..6e5b650 100755
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/remote/CommandProcessor.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/remote/CommandProcessor.java
@@ -19,6 +19,7 @@ import 
org.apache.geode.internal.security.SecurityServiceFactory;
 import org.apache.geode.management.cli.CommandProcessingException;
 import org.apache.geode.management.cli.CommandStatement;
 import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.internal.cli.CommandManager;
 import org.apache.geode.management.internal.cli.GfshParser;
 import org.apache.geode.management.internal.cli.LogWrapper;
 import org.apache.geode.management.internal.cli.result.ResultBuilder;
@@ -55,7 +56,7 @@ public class CommandProcessor {
 
   public CommandProcessor(Properties cacheProperties, SecurityService 
securityService)
       throws ClassNotFoundException, IOException {
-    this.gfshParser = new GfshParser(cacheProperties);
+    this.gfshParser = new GfshParser(new CommandManager(cacheProperties));
     this.executionStrategy = new RemoteExecutionStrategy();
     this.logWrapper = LogWrapper.getInstance();
     this.securityService = securityService;

http://git-wip-us.apache.org/repos/asf/geode/blob/0ef7f56b/geode-core/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java
index c5ff6b6..74387d6 100755
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java
@@ -26,6 +26,7 @@ import org.apache.geode.internal.util.SunAPINotFoundException;
 import org.apache.geode.management.cli.CommandProcessingException;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.CliUtil;
+import org.apache.geode.management.internal.cli.CommandManager;
 import org.apache.geode.management.internal.cli.GfshParser;
 import org.apache.geode.management.internal.cli.LogWrapper;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
@@ -210,7 +211,7 @@ public class Gfsh extends JLineShell {
     initializeEnvironment();
     // 7. Create Roo/SpringShell framework objects
     this.executionStrategy = new GfshExecutionStrategy(this);
-    this.parser = new GfshParser();
+    this.parser = new GfshParser(new CommandManager());
     // 8. Set max History file size
     setHistorySize(gfshConfig.getHistorySize());
 

http://git-wip-us.apache.org/repos/asf/geode/blob/0ef7f56b/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserAutoCompletionTest.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserAutoCompletionTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserAutoCompletionTest.java
index a122de0..aa97795 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserAutoCompletionTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserAutoCompletionTest.java
@@ -18,268 +18,250 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertTrue;
 
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
+import org.apache.geode.test.dunit.rules.GfshParserRule;
 import org.apache.geode.test.junit.categories.IntegrationTest;
-import org.junit.Before;
-import org.junit.BeforeClass;
+import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.springframework.shell.core.Completion;
 
-import java.util.ArrayList;
-import java.util.List;
-
 @Category(IntegrationTest.class)
 public class GfshParserAutoCompletionTest {
-  private static GfshParser parser;
-  private List<Completion> candidates;
-  private String buffer;
-  private int cursor;
-
-  @BeforeClass
-  public static void setUpClass() throws Exception {
-    parser = new GfshParser();
-  }
+  @ClassRule
+  public static GfshParserRule parser = new GfshParserRule();
 
-  @Before
-  public void setUp() throws Exception {
-    this.candidates = new ArrayList<>();
-  }
+  private String buffer;
+  private GfshParserRule.CommandCandidate candidate;
 
   @Test
   public void testCompletionDescibe() throws Exception {
     buffer = "describe";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(7);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo("describe client");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(7);
+    assertThat(candidate.getFirstCandidate()).isEqualTo("describe client");
   }
 
   @Test
   public void testCompletionDescibeWithSpace() throws Exception {
     buffer = "describe ";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(7);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo("describe client");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(7);
+    assertThat(candidate.getFirstCandidate()).isEqualTo("describe client");
   }
 
   @Test
   public void testCompletionDeploy() throws Exception {
     buffer = "deploy";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(3);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + " --dir");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(3);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + " --dir");
   }
 
   @Test
   public void testCompletionDeployWithSpace() throws Exception {
     buffer = "deploy ";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(3);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + "--dir");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(3);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + "--dir");
   }
 
   @Test
   public void testCompleteWithRequiredOption() throws Exception {
     buffer = "describe config";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(1);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + " --member");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(1);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + " --member");
   }
 
   @Test
   public void testCompleteWithRequiredOptionWithSpace() throws Exception {
     buffer = "describe config ";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(1);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + "--member");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(1);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + "--member");
   }
 
   @Test
   public void testCompleteCommand() throws Exception {
     buffer = "start ser";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(1);
-    assertThat("start server").isEqualTo(getCompleted(buffer, cursor, 
candidates.get(0)));
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(1);
+    assertThat("start server").isEqualTo(candidate.getFirstCandidate());
   }
 
   @Test
   public void testCompleteOptionWithOnlyOneCandidate() throws Exception {
     buffer = "start server --nam";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(1);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + "e");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(1);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + "e");
   }
 
   @Test
   public void testCompleteOptionWithMultipleCandidates() throws Exception {
     buffer = "start server --name=jinmei --loc";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(3);
-    assertThat(getCompleted(buffer, cursor, candidates.get(0)))
-        .isEqualTo(buffer + "ator-wait-time");
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(1))).isEqualTo(buffer + "ators");
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(2))).isEqualTo(buffer + "k-memory");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(3);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + 
"ator-wait-time");
+    assertThat(candidate.getCandidate(1)).isEqualTo(buffer + "ators");
+    assertThat(candidate.getCandidate(2)).isEqualTo(buffer + "k-memory");
   }
 
   @Test
   public void testCompleteWithExtraSpace() throws Exception {
     buffer = "start server --name=name1  --se";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo("start server --name=name1  ".length());
-    assertThat(candidates.size()).isEqualTo(3);
-    assertTrue(candidates.contains(new Completion("--server-port")));
-    assertThat(getCompleted(buffer, cursor, candidates.get(0)))
-        .isEqualTo(buffer + "curity-properties-file");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor()).isEqualTo("start server --name=name1  
".length());
+    assertThat(candidate.size()).isEqualTo(3);
+    assertTrue(candidate.getCandidates().contains(new 
Completion("--server-port")));
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + 
"curity-properties-file");
   }
 
   @Test
   public void testCompleteWithDashInTheEnd() throws Exception {
     buffer = "start server --name=name1 --";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo(buffer.length() - 2);
-    assertThat(candidates.size()).isEqualTo(50);
-    assertTrue(candidates.contains(new Completion("--properties-file")));
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + "J");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor()).isEqualTo(buffer.length() - 2);
+    assertThat(candidate.size()).isEqualTo(50);
+    assertTrue(candidate.getCandidates().contains(new 
Completion("--properties-file")));
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + "J");
   }
 
   @Test
   public void testCompleteWithSpace() throws Exception {
     buffer = "start server --name=name1 ";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo(buffer.length() - 1);
-    assertThat(candidates.size()).isEqualTo(50);
-    assertTrue(candidates.contains(new Completion(" --properties-file")));
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + "--J");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor()).isEqualTo(buffer.length() - 1);
+    assertThat(candidate.size()).isEqualTo(50);
+    assertTrue(candidate.getCandidates().contains(new Completion(" 
--properties-file")));
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + "--J");
   }
 
   @Test
   public void testCompleteWithOutSpace() throws Exception {
     buffer = "start server --name=name1";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo(buffer.length());
-    assertThat(candidates.size()).isEqualTo(50);
-    assertTrue(candidates.contains(new Completion(" --properties-file")));
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + " --J");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor()).isEqualTo(buffer.length());
+    assertThat(candidate.size()).isEqualTo(50);
+    assertTrue(candidate.getCandidates().contains(new Completion(" 
--properties-file")));
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + " --J");
   }
 
   @Test
   public void testCompleteJ() throws Exception {
     buffer = "start server --name=name1 --J=";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo(buffer.length());
-    assertThat(candidates.size()).isEqualTo(0);
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor()).isEqualTo(buffer.length());
+    assertThat(candidate.size()).isEqualTo(0);
   }
 
   @Test
   public void testCompleteWithValue() throws Exception {
     buffer = "start server --name=name1 --J";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo(buffer.length());
-    assertThat(candidates.size()).isEqualTo(0);
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor()).isEqualTo(buffer.length());
+    assertThat(candidate.size()).isEqualTo(0);
   }
 
   @Test
   public void testCompleteWithDash() throws Exception {
     buffer = "start server --name=name1 --J=-Dfoo.bar --";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(49);
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(49);
   }
 
   @Test
   public void testCompleteWithMultipleJ() throws Exception {
     buffer = "start server --name=name1 --J=-Dme=her --J=-Dfoo=bar --l";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo("start server --name=name1 --J=-Dme=her 
--J=-Dfoo=bar ".length());
-    assertThat(candidates.size()).isEqualTo(4);
-    assertTrue(candidates.contains(new Completion("--locators")));
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor())
+        .isEqualTo("start server --name=name1 --J=-Dme=her --J=-Dfoo=bar 
".length());
+    assertThat(candidate.size()).isEqualTo(4);
+    assertTrue(candidate.getCandidates().contains(new 
Completion("--locators")));
   }
 
   @Test
   public void testMultiJComplete() throws Exception {
     buffer = "start server --name=name1 --J=-Dtest=test1 --J=-Dfoo=bar";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo(buffer.length());
-    assertThat(candidates.size()).isEqualTo(49);
-    assertThat(getCompleted(buffer, cursor, candidates.get(0)))
-        .isEqualTo(buffer + " --assign-buckets");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor()).isEqualTo(buffer.length());
+    assertThat(candidate.size()).isEqualTo(49);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + " 
--assign-buckets");
   }
 
   @Test
   public void testMultiJCompleteWithDifferentOrder() throws Exception {
     buffer = "start server --J=-Dtest=test1 --J=-Dfoo=bar --name=name1";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo(buffer.length());
-    assertThat(candidates.size()).isEqualTo(49);
-    assertThat(getCompleted(buffer, cursor, candidates.get(0)))
-        .isEqualTo(buffer + " --assign-buckets");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor()).isEqualTo(buffer.length());
+    assertThat(candidate.size()).isEqualTo(49);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + " 
--assign-buckets");
   }
 
   @Test
   public void testJComplete3() throws Exception {
     buffer = "start server --name=name1 --locators=localhost --J=-Dfoo=bar";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo(buffer.length());
-    assertThat(candidates.size()).isEqualTo(48);
-    assertThat(getCompleted(buffer, cursor, candidates.get(0)))
-        .isEqualTo(buffer + " --assign-buckets");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor()).isEqualTo(buffer.length());
+    assertThat(candidate.size()).isEqualTo(48);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + " 
--assign-buckets");
   }
 
   @Test
   public void testJComplete4() throws Exception {
     buffer = "start server --name=name1 --locators=localhost  --J=-Dfoo=bar 
--";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(cursor).isEqualTo(buffer.length() - 2);
-    assertThat(candidates.size()).isEqualTo(48);
-    assertThat(getCompleted(buffer, cursor, candidates.get(0)))
-        .isEqualTo(buffer + "assign-buckets");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.getCursor()).isEqualTo(buffer.length() - 2);
+    assertThat(candidate.size()).isEqualTo(48);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + 
"assign-buckets");
   }
 
   @Test
   public void testCompletRegionType() throws Exception {
     buffer = "create region --name=test --type";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(23);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + "=LOCAL");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(23);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + "=LOCAL");
   }
 
   @Test
   public void testCompletPartialRegionType() throws Exception {
     buffer = "create region --name=test --type=LO";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(5);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + "CAL");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(5);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + "CAL");
   }
 
   @Test
   public void testCompletWithRegionTypeWithNoSpace() throws Exception {
     buffer = "create region --name=test --type=REPLICATE";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(5);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + "_HEAP_LRU");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(5);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + "_HEAP_LRU");
   }
 
   @Test
   public void testCompletWithRegionTypeWithSpace() throws Exception {
     buffer = "create region --name=test --type=REPLICATE ";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(37);
-    assertThat(getCompleted(buffer, cursor, candidates.get(0)))
-        .isEqualTo(buffer + "--async-event-queue-id");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(37);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + 
"--async-event-queue-id");
   }
 
   @Test
   public void testCompletLogLevel() throws Exception {
     buffer = "change loglevel --loglevel";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(8);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + "=ALL");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(8);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + "=ALL");
   }
 
   @Test
   public void testCompletLogLevelWithEqualSign() throws Exception {
     buffer = "change loglevel --loglevel=";
-    cursor = parser.completeAdvanced(buffer, candidates);
-    assertThat(candidates.size()).isEqualTo(8);
-    assertThat(getCompleted(buffer, cursor, 
candidates.get(0))).isEqualTo(buffer + "ALL");
+    candidate = parser.complete(buffer);
+    assertThat(candidate.size()).isEqualTo(8);
+    assertThat(candidate.getFirstCandidate()).isEqualTo(buffer + "ALL");
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/geode/blob/0ef7f56b/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserConverterTest.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserConverterTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserConverterTest.java
index 1ff60d6..3c42e0b 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserConverterTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserConverterTest.java
@@ -23,16 +23,13 @@ import 
org.apache.geode.management.internal.cli.converters.DiskStoreNameConverte
 import org.apache.geode.management.internal.cli.converters.FilePathConverter;
 import 
org.apache.geode.management.internal.cli.converters.FilePathStringConverter;
 import org.apache.geode.management.internal.cli.converters.RegionPathConverter;
+import org.apache.geode.test.dunit.rules.GfshParserRule;
 import org.apache.geode.test.junit.categories.IntegrationTest;
-import org.junit.Before;
-import org.junit.BeforeClass;
+import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
-import org.springframework.shell.core.Completion;
-import org.springframework.shell.core.Converter;
 import org.springframework.shell.event.ParseResult;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
@@ -40,19 +37,11 @@ import java.util.stream.Collectors;
 
 @Category(IntegrationTest.class)
 public class GfshParserConverterTest {
-  private static GfshParser parser;
-  private List<Completion> candidates;
-  private int cursor;
 
-  @BeforeClass
-  public static void setUpClass() throws Exception {
-    parser = new GfshParser();
-  }
+  private GfshParserRule.CommandCandidate commandCandidate;
 
-  @Before
-  public void setUp() throws Exception {
-    this.candidates = new ArrayList<>();
-  }
+  @ClassRule
+  public static GfshParserRule parser = new GfshParserRule();
 
   @Test
   public void testStringArrayConverter() {
@@ -118,45 +107,45 @@ public class GfshParserConverterTest {
   @Test
   public void testHelpConverterWithNo() {
     String command = "help --command=";
-    cursor = parser.completeAdvanced(command, candidates);
+    commandCandidate = parser.complete(command);
     Set<String> commands = 
parser.getCommandManager().getHelper().getCommands();
-    assertThat(candidates.size()).isEqualTo(commands.size());
+    assertThat(commandCandidate.size()).isEqualTo(commands.size());
   }
 
   @Test
   public void testHelpConverter() {
     String command = "help --command=conn";
-    cursor = parser.completeAdvanced(command, candidates);
-    assertThat(candidates.size()).isEqualTo(1);
-    assertThat(getCompleted(command, cursor, 
candidates.get(0))).isEqualTo(command + "ect");
+    commandCandidate = parser.complete(command);
+    assertThat(commandCandidate.size()).isEqualTo(1);
+    assertThat(commandCandidate.getFirstCandidate()).isEqualTo(command + 
"ect");
   }
 
   @Test
   public void testHintConverter() {
     String command = "hint --topic=";
-    cursor = parser.completeAdvanced(command, candidates);
+    commandCandidate = parser.complete(command);
     Set<String> topics = 
parser.getCommandManager().getHelper().getTopicNames();
-    assertThat(candidates.size()).isEqualTo(topics.size());
-    assertThat(getCompleted(command, cursor, 
candidates.get(0))).isEqualTo("hint --topic=Client");
+    assertThat(commandCandidate.size()).isEqualTo(topics.size());
+    assertThat(commandCandidate.getFirstCandidate()).isEqualTo("hint 
--topic=Client");
   }
 
   @Test
   public void testDiskStoreNameConverter() throws Exception {
     // spy the DiskStoreNameConverter
-    DiskStoreNameConverter spy = spyConverter(DiskStoreNameConverter.class);
+    DiskStoreNameConverter spy = 
parser.spyConverter(DiskStoreNameConverter.class);
 
     Set<String> diskStores = 
Arrays.stream("name1,name2".split(",")).collect(Collectors.toSet());
     doReturn(diskStores).when(spy).getDiskStoreNames();
 
     String command = "compact disk-store --name=";
-    cursor = parser.completeAdvanced(command, candidates);
-    assertThat(candidates).hasSize(2);
+    commandCandidate = parser.complete(command);
+    assertThat(commandCandidate.size()).isEqualTo(2);
 
   }
 
   @Test
   public void testFilePathConverter() throws Exception {
-    FilePathStringConverter spy = spyConverter(FilePathStringConverter.class);
+    FilePathStringConverter spy = 
parser.spyConverter(FilePathStringConverter.class);
     List<String> roots = 
Arrays.stream("/vol,/logs".split(",")).collect(Collectors.toList());
     List<String> siblings =
         
Arrays.stream("sibling1,sibling11,test1".split(",")).collect(Collectors.toList());
@@ -164,55 +153,33 @@ public class GfshParserConverterTest {
     doReturn(siblings).when(spy).getSiblings(any());
 
     String command = "start server --properties-file=";
-    cursor = parser.completeAdvanced(command, candidates);
-    assertThat(candidates).hasSize(2);
-    assertThat(getCompleted(command, cursor, 
candidates.get(0))).isEqualTo(command + "/logs");
-    candidates.clear();
+    commandCandidate = parser.complete(command);
+    assertThat(commandCandidate.size()).isEqualTo(2);
+    assertThat(commandCandidate.getFirstCandidate()).isEqualTo(command + 
"/logs");
 
     command = "start server --properties-file=sibling";
-    cursor = parser.completeAdvanced(command, candidates);
-    assertThat(candidates).hasSize(2);
-    assertThat(getCompleted(command, cursor, 
candidates.get(0))).isEqualTo(command + "1");
-    candidates.clear();
+    commandCandidate = parser.complete(command);
+    assertThat(commandCandidate.size()).isEqualTo(2);
+    assertThat(commandCandidate.getFirstCandidate()).isEqualTo(command + "1");
 
-    FilePathConverter spyFilePathConverter = 
spyConverter(FilePathConverter.class);
+    FilePathConverter spyFilePathConverter = 
parser.spyConverter(FilePathConverter.class);
     spyFilePathConverter.setDelegate(spy);
     command = "run --file=test";
-    cursor = parser.completeAdvanced(command, candidates);
-    assertThat(candidates).hasSize(1);
-    assertThat(getCompleted(command, cursor, 
candidates.get(0))).isEqualTo(command + "1");
+    commandCandidate = parser.complete(command);
+    assertThat(commandCandidate.size()).isEqualTo(1);
+    assertThat(commandCandidate.getFirstCandidate()).isEqualTo(command + "1");
   }
 
   @Test
   public void testRegionPathConverter() throws Exception {
-    RegionPathConverter spy = spyConverter(RegionPathConverter.class);
+    RegionPathConverter spy = parser.spyConverter(RegionPathConverter.class);
     Set<String> regions = 
Arrays.stream("/regionA,/regionB".split(",")).collect(Collectors.toSet());
     doReturn(regions).when(spy).getAllRegionPaths();
 
     String command = "describe region --name=";
-    cursor = parser.completeAdvanced(command, candidates);
-    assertThat(candidates).hasSize(regions.size());
-    assertThat(getCompleted(command, cursor, 
candidates.get(0))).isEqualTo(command + "/regionA");
+    commandCandidate = parser.complete(command);
+    assertThat(commandCandidate.size()).isEqualTo(regions.size());
+    assertThat(commandCandidate.getFirstCandidate()).isEqualTo(command + 
"/regionA");
   }
 
-  private String getCompleted(String buffer, int cursor, Completion completed) 
{
-    return buffer.substring(0, cursor) + completed.getValue();
-  }
-
-  private static <T extends Converter> T spyConverter(Class<T> klass) {
-    Set<Converter<?>> converters = parser.getConverters();
-    T foundConverter = null, spy = null;
-    for (Converter converter : converters) {
-      if (klass.isAssignableFrom(converter.getClass())) {
-        foundConverter = (T) converter;
-        break;
-      }
-    }
-    if (foundConverter != null) {
-      parser.remove(foundConverter);
-      spy = spy(foundConverter);
-      parser.add(spy);
-    }
-    return spy;
-  }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/0ef7f56b/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserParsingTest.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserParsingTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserParsingTest.java
index a2efb36..0c2af1d 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserParsingTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/GfshParserParsingTest.java
@@ -18,8 +18,9 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
+import org.apache.geode.test.dunit.rules.GfshParserRule;
 import org.apache.geode.test.junit.categories.IntegrationTest;
-import org.junit.BeforeClass;
+import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.springframework.shell.event.ParseResult;
@@ -28,13 +29,10 @@ import java.util.Map;
 
 @Category(IntegrationTest.class)
 public class GfshParserParsingTest {
-  private static GfshParser parser;
+  @ClassRule
+  public static GfshParserRule parser = new GfshParserRule();
   private String buffer;
 
-  @BeforeClass
-  public static void setUpClass() throws Exception {
-    parser = new GfshParser();
-  }
 
   private Map<String, String> parseParams(String input, String commandMethod) {
     ParseResult parseResult = parser.parse(input);

http://git-wip-us.apache.org/repos/asf/geode/blob/0ef7f56b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsTest.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsTest.java
new file mode 100644
index 0000000..9b38d86
--- /dev/null
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.commands;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import org.apache.geode.management.internal.cli.GfshParseResult;
+import org.apache.geode.management.internal.cli.shell.Gfsh;
+import org.apache.geode.test.dunit.rules.GfshParserRule;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.springframework.util.ReflectionUtils;
+
+import java.util.Properties;
+
+public class LauncherLifecycleCommandsTest {
+  @ClassRule
+  public static GfshParserRule commandRule = new GfshParserRule();
+
+  @Test
+  public void getLauncherLifecycleCommand() throws Exception {
+    LauncherLifecycleCommands spy = commandRule.spyCommand("start locator");
+    doReturn(mock(Gfsh.class)).when(spy).getGfsh();
+    commandRule.executeLastCommandWithInstance(spy);
+
+    ArgumentCaptor<Properties> propsCaptor = 
ArgumentCaptor.forClass(Properties.class);
+    verify(spy).createStartLocatorCommandLine(any(), any(), any(), 
propsCaptor.capture(), any(),
+        any(), any(), any(), any());
+
+    Properties properties = propsCaptor.getValue();
+    System.out.println();
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/0ef7f56b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/GfshParserRule.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/GfshParserRule.java
 
b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/GfshParserRule.java
new file mode 100644
index 0000000..b1bc7aa
--- /dev/null
+++ 
b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/GfshParserRule.java
@@ -0,0 +1,126 @@
+/*
+ * 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.test.dunit.rules;
+
+import static org.mockito.Mockito.spy;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.internal.cli.CommandManager;
+import org.apache.geode.management.internal.cli.GfshParseResult;
+import org.apache.geode.management.internal.cli.GfshParser;
+import org.apache.geode.management.internal.cli.remote.RemoteExecutionStrategy;
+import org.junit.rules.ExternalResource;
+import org.springframework.shell.core.CommandMarker;
+import org.springframework.shell.core.Completion;
+import org.springframework.shell.core.Converter;
+import org.springframework.util.ReflectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+public class GfshParserRule extends ExternalResource {
+
+  private GfshParser parser;
+  private CommandManager commandManager;
+  private GfshParseResult parseResult;
+
+  @Override
+  public void before() {
+    commandManager = new CommandManager();
+    parser = new GfshParser(commandManager);
+    parseResult = null;
+  }
+
+  public GfshParseResult parse(String command) {
+    return parser.parse(command);
+  }
+
+  public <T> T spyCommand(String command) {
+    parseResult = parse(command);
+    T spy = (T) spy(parseResult.getInstance());
+    return spy;
+  }
+
+  public <T> Result executeLastCommandWithInstance(T instance) {
+    return (Result) ReflectionUtils.invokeMethod(parseResult.getMethod(), 
instance,
+        parseResult.getArguments());
+  }
+
+  public CommandCandidate complete(String command) {
+    List<Completion> candidates = new ArrayList<>();
+    int cursor = parser.completeAdvanced(command, command.length(), 
candidates);
+    return new CommandCandidate(command, cursor, candidates);
+  }
+
+  public <T extends Converter> T spyConverter(Class<T> klass) {
+    Set<Converter<?>> converters = parser.getConverters();
+    T foundConverter = null, spy = null;
+    for (Converter converter : converters) {
+      if (klass.isAssignableFrom(converter.getClass())) {
+        foundConverter = (T) converter;
+        break;
+      }
+    }
+    if (foundConverter != null) {
+      parser.remove(foundConverter);
+      spy = spy(foundConverter);
+      parser.add(spy);
+    }
+    return spy;
+  }
+
+  public GfshParser getParser() {
+    return parser;
+  }
+
+  public CommandManager getCommandManager() {
+    return commandManager;
+  }
+
+  public static class CommandCandidate {
+    private String command;
+    private int cursor;
+    private List<Completion> candidates;
+
+    public CommandCandidate(String command, int cursor, List<Completion> 
candidates) {
+      this.command = command;
+      this.cursor = cursor;
+      this.candidates = candidates;
+    }
+
+    public String getCandidate(int index) {
+      return command.substring(0, cursor) + candidates.get(index).getValue();
+    }
+
+    public String getFirstCandidate() {
+      return getCandidate(0);
+    }
+
+    public int size() {
+      return candidates.size();
+    }
+
+    public int getCursor() {
+      return cursor;
+    }
+
+    public List<Completion> getCandidates() {
+      return candidates;
+    }
+  }
+}

Reply via email to