You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2017/08/13 22:46:11 UTC

[19/19] geode git commit: GEODE-3436: revert recent refactoring of GFSH commands

GEODE-3436: revert recent refactoring of GFSH commands

Revert "GEODE-3264: Refactoring MemberCommands"
This reverts commit d27f8b956de7d9c5d95ebdc68dfc67ee8b2d7b51.

Revert "GEODE-3259: Refactoring DurableClientCommands"
This reverts commit 440c87f81fab96f9ce38a2d53ded75e5fe8390d7.

Revert "GEODE-3254: Refactoring ConfigCommands"
This reverts commit 97c4e9a59f17c7bc914e39dd048b0a4cd96293c4.

Revert "GEODE-3262: Refactoring IndexCommands"
This reverts commit ed293e817e547fb5ecd399bf4ba10d694af51e0a.

Revert "GEODE-3260: Refactoring FunctionCommands"
This reverts commit 90f5440de8ec747f301a309a0a34101e8defcd29.

Revert "GEODE-3258: Refactoring DiskStoreCommands"
This reverts commit 5d6cad7755ec3c4fe931e3d0f8e89fb181038543.

Revert "GEODE-3337: Refactoring LauncherLifecycleCommandsDUnitTest"
This reverts commit 210ff9f15460c993f2bf7fd682d50ee65462cd23.

Revert "GEODE-3265: Refactoring MiscellaneousCommands"
This reverts commit 63169699e933f6e0fdd90b95ed039e4e3c92c32c.

Revert "GEODE-3261: Refactoring GfshHelpCommands"
This reverts commit cf91426692349d0c81ce77394935576d9cc336e8.

Revert "GEODE-3267: Refactoring QueueCommands"
This reverts commit fd47ed660168864a6f81b2a4cd7dbceebc99a282.

Revert "GEODE-3270: Refactoring (renaming) StatusCommands"
This reverts commit 359e3fff6482ecfb375939d387f4dad3a636246b.

Revert "GEODE-3267: Refactoring QueueCommands - updated based on feedback"
This reverts commit 957d583e54dc34c029885f32a54f0b25a3ac1094.

Revert "GEODE-3268: Refactoring RegionCommands"
This reverts commit 64de3b69c2aecb4930bcfd0a1161569b1d5fda89.

Revert "GEODE-3266: Refactoring PDXCommands"
This reverts commit 67185abcdd68b908dea6888cb94286b8aa9ea49f.

Revert "GEODE-3257: Refactoring DeployCommands"
This reverts commit 9d967446a44a78b612f605b6a8f8eedcfc625b3a.

Revert "GEODE-3255: Refactor CreateAlterDestroyRegionCommands and tests"
This reverts commit 756efe77c86bb03ac9984655e7bd040659e85890.

Revert "GEODE-3230: Cleaning up unused (Cli)Strings"
This reverts commit a7f29525df2981c1c99abac96ea83cb965295970.

This closes #711


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

Branch: refs/heads/develop
Commit: 645a32d045958ff859967240416a57f6c570a00f
Parents: 44fb3f2
Author: Kirk Lund <kl...@apache.org>
Authored: Sat Aug 12 09:38:20 2017 -0700
Committer: Kirk Lund <kl...@apache.org>
Committed: Sun Aug 13 15:43:27 2017 -0700

----------------------------------------------------------------------
 .../org/apache/geode/BundledJarsJUnitTest.java  |   44 +-
 .../commands/GfshCommandIntegrationTest.java    |   69 +-
 .../LauncherLifecycleCommandsDUnitTest.java     | 1115 ++++++++++
 .../cli/commands/StartLocatorCommandTest.java   |    4 +-
 .../cli/commands/StartServerCommandTest.java    |    4 +-
 ...deStatusClusterConfigServiceCommandTest.java |  391 ----
 .../shell/GfshExitCodeStatusCommandsTest.java   |  391 ++++
 .../test/dunit/rules/gfsh/ProcessLogger.java    |   10 +-
 .../geode/management/internal/cli/Launcher.java |    1 +
 .../commands/AlterOfflineDiskStoreCommand.java  |  141 --
 .../cli/commands/AlterRegionCommand.java        |  229 ---
 .../cli/commands/AlterRuntimeConfigCommand.java |  246 ---
 .../cli/commands/AlterRuntimeInterceptor.java   |   39 -
 .../cli/commands/BackupDiskStoreCommand.java    |  142 --
 .../cli/commands/ChangeLogLevelCommand.java     |  163 --
 .../commands/ClearDefinedIndexesCommand.java    |   40 -
 .../cli/commands/CloseDurableCQsCommand.java    |   83 -
 .../cli/commands/CloseDurableClientCommand.java |   77 -
 .../cli/commands/CompactDiskStoreCommand.java   |  185 --
 .../CompactOfflineDiskStoreCommand.java         |  176 --
 .../internal/cli/commands/ConfigCommands.java   |  490 +++++
 .../cli/commands/ConfigurePDXCommand.java       |  138 --
 .../commands/CountDurableCQEventsCommand.java   |   88 -
 .../CreateAlterDestroyRegionCommands.java       | 1146 +++++++++++
 .../commands/CreateAsyncEventQueueCommand.java  |  171 --
 .../commands/CreateDefinedIndexesCommand.java   |  154 --
 .../cli/commands/CreateDiskStoreCommand.java    |  166 --
 .../cli/commands/CreateIndexCommand.java        |  196 --
 .../cli/commands/CreateRegionCommand.java       |  741 -------
 .../cli/commands/DefineIndexCommand.java        |   95 -
 .../internal/cli/commands/DeployCommand.java    |  190 --
 .../internal/cli/commands/DeployCommands.java   |  336 +++
 .../cli/commands/DescribeConfigCommand.java     |  153 --
 .../cli/commands/DescribeDiskStoreCommand.java  |  179 --
 .../cli/commands/DescribeMemberCommand.java     |  133 --
 .../DescribeOfflineDiskStoreCommand.java        |   75 -
 .../cli/commands/DescribeRegionCommand.java     |  364 ----
 .../cli/commands/DestroyDiskStoreCommand.java   |  106 -
 .../cli/commands/DestroyFunctionCommand.java    |  163 --
 .../cli/commands/DestroyIndexCommand.java       |  174 --
 .../cli/commands/DestroyRegionCommand.java      |  222 --
 .../cli/commands/DiskStoreCommands.java         | 1433 +++++++++++++
 .../cli/commands/DiskStoreCommandsUtils.java    |   60 -
 .../cli/commands/DurableClientCommands.java     |  420 ++++
 .../DurableClientCommandsResultBuilder.java     |  164 --
 .../cli/commands/ExecuteFunctionCommand.java    |  330 ---
 .../cli/commands/ExportConfigCommand.java       |  159 --
 .../commands/ExportOfflineDiskStoreCommand.java |   68 -
 .../cli/commands/ExportStackTraceCommand.java   |  157 --
 .../internal/cli/commands/FunctionCommands.java |  537 +++++
 .../internal/cli/commands/GCCommand.java        |  131 --
 .../internal/cli/commands/GfshHelpCommand.java  |   51 -
 .../internal/cli/commands/GfshHelpCommands.java |   55 +
 .../internal/cli/commands/GfshHintCommand.java  |   42 -
 .../internal/cli/commands/IndexCommands.java    |  668 ++++++
 .../internal/cli/commands/IndexDefinition.java  |   27 -
 .../commands/IndexStatisticsDetailsAdapter.java |   58 -
 .../commands/ListAsyncEventQueuesCommand.java   |  118 --
 .../cli/commands/ListDeployedCommand.java       |  102 -
 .../cli/commands/ListDiskStoresCommand.java     |  113 -
 .../commands/ListDurableClientCQsCommand.java   |  121 --
 .../cli/commands/ListFunctionCommand.java       |  100 -
 .../internal/cli/commands/ListIndexCommand.java |  119 --
 .../cli/commands/ListMemberCommand.java         |   77 -
 .../cli/commands/ListRegionCommand.java         |   86 -
 .../internal/cli/commands/MemberCommands.java   |  197 ++
 .../cli/commands/MiscellaneousCommands.java     | 1926 ++++++++++++++++++
 .../internal/cli/commands/NetstatCommand.java   |  212 --
 .../internal/cli/commands/PDXCommands.java      |  195 ++
 .../internal/cli/commands/PDXRenameCommand.java |   81 -
 .../internal/cli/commands/QueueCommands.java    |  259 +++
 .../internal/cli/commands/RegionCommands.java   |  474 +++++
 .../cli/commands/RegionCommandsUtils.java       |   59 -
 .../commands/RevokeMissingDiskStoreCommand.java |   61 -
 .../internal/cli/commands/ShellCommands.java    |    5 +-
 .../cli/commands/ShowDeadlockCommand.java       |   92 -
 .../internal/cli/commands/ShowLogCommand.java   |  102 -
 .../cli/commands/ShowMetricsCommand.java        | 1085 ----------
 .../commands/ShowMissingDiskStoreCommand.java   |  150 --
 .../internal/cli/commands/ShutdownCommand.java  |  209 --
 .../cli/commands/StartLocatorCommand.java       |   67 +-
 .../cli/commands/StartMemberCommand.java        |  248 ---
 .../internal/cli/commands/StartMemberUtils.java |  251 +++
 .../cli/commands/StartServerCommand.java        |  117 +-
 .../StatusClusterConfigServiceCommand.java      |   82 -
 .../internal/cli/commands/StatusCommands.java   |   82 +
 .../internal/cli/commands/UndeployCommand.java  |  114 --
 .../UpgradeOfflineDiskStoreCommand.java         |  177 --
 .../cli/commands/ValidateDiskStoreCommand.java  |  105 -
 .../commands/lifecycle/StopLocatorCommand.java  |   16 +-
 .../internal/cli/converters/HelpConverter.java  |   25 +-
 .../functions/CreateDefinedIndexesFunction.java |    3 +-
 .../cli/functions/DataCommandFunction.java      |    8 +-
 .../GetSubscriptionQueueSizeFunction.java       |    2 +-
 .../cli/functions/RegionCreateFunction.java     |    8 +-
 .../management/internal/cli/help/Helper.java    |   20 +-
 .../internal/cli/i18n/CliStrings.java           |  397 +++-
 .../controllers/ConfigCommandsController.java   |   17 +-
 .../controllers/DeployCommandsController.java   |   24 +-
 .../DiskStoreCommandsController.java            |   18 +-
 .../DurableClientCommandsController.java        |   15 +-
 .../controllers/FunctionCommandsController.java |   13 +-
 .../controllers/IndexCommandsController.java    |   13 +-
 .../controllers/MemberCommandsController.java   |   23 +-
 .../MiscellaneousCommandsController.java        |   16 +-
 .../web/controllers/PdxCommandsController.java  |   11 +-
 .../controllers/QueueCommandsController.java    |   10 +-
 .../controllers/RegionCommandsController.java   |   14 +-
 .../geode/redis/internal/RegionProvider.java    |   15 +-
 .../commands/AlterRegionCommandDUnitTest.java   |  641 ------
 ...eateAlterDestroyRegionCommandsDUnitTest.java | 1211 ++++++++++-
 .../CreateAlterDestroyRegionCommandsTest.java   |   53 +
 .../commands/CreateRegionCommandDUnitTest.java  |  318 ---
 .../cli/commands/CreateRegionCommandTest.java   |   58 -
 .../cli/commands/DeployCommandsDUnitTest.java   |    2 +-
 .../commands/DestroyRegionCommandDUnitTest.java |  388 ----
 .../commands/DiskStoreCommandsDUnitTest.java    |   46 +-
 .../commands/DiskStoreCommandsJUnitTest.java    |  112 +-
 .../cli/commands/GfshCommandJUnitTest.java      |  219 +-
 .../cli/commands/IndexCommandsJUnitTest.java    |  223 ++
 ...stAndDescribeDiskStoreCommandsDUnitTest.java |   36 +-
 .../cli/commands/ListIndexCommandDUnitTest.java |   38 +-
 .../cli/commands/ListIndexCommandJUnitTest.java |  223 --
 .../cli/commands/LogLevelInterceptorTest.java   |   21 +-
 .../MiscellaneousCommandsDUnitTest.java         |  136 +-
 .../cli/commands/ShowStackTraceDUnitTest.java   |   23 +-
 .../commands/StartLocatorCommandUnitTest.java   |   59 -
 .../cli/commands/StartMemberCommandTest.java    |  335 ---
 .../commands/StartServerCommandUnitTest.java    |   78 -
 .../commands/StatusLocatorCommandUnitTest.java  |   53 -
 .../lifecycle/StopLocatorCommandUnitTest.java   |   74 -
 .../cli/help/HelperIntegrationTest.java         |   73 +-
 .../internal/security/TestCommand.java          |   27 +-
 .../org/apache/geode/redis/SetsJUnitTest.java   |   21 +-
 .../apache/geode/redis/SortedSetsJUnitTest.java |   34 +-
 .../DurableClientCommandsDUnitTest.java         |    4 +-
 .../rules/RetryRuleLocalWithErrorTest.java      |    2 +-
 137 files changed, 12540 insertions(+), 13212 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-assembly/src/test/java/org/apache/geode/BundledJarsJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-assembly/src/test/java/org/apache/geode/BundledJarsJUnitTest.java b/geode-assembly/src/test/java/org/apache/geode/BundledJarsJUnitTest.java
index 3a5538c..3f0e2c0 100644
--- a/geode-assembly/src/test/java/org/apache/geode/BundledJarsJUnitTest.java
+++ b/geode-assembly/src/test/java/org/apache/geode/BundledJarsJUnitTest.java
@@ -16,6 +16,14 @@ package org.apache.geode;
 
 import static org.junit.Assert.assertTrue;
 
+import org.apache.commons.io.FileUtils;
+import org.apache.geode.test.junit.categories.IntegrationTest;
+import org.apache.geode.test.junit.categories.RestAPITest;
+import org.apache.geode.util.test.TestUtil;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -28,20 +36,11 @@ import java.util.jar.JarFile;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.commons.io.FileUtils;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import org.apache.geode.test.junit.categories.IntegrationTest;
-import org.apache.geode.test.junit.categories.RestAPITest;
-import org.apache.geode.util.test.TestUtil;
-
 @Category({IntegrationTest.class, RestAPITest.class})
 public class BundledJarsJUnitTest {
 
   private static final String VERSION_PATTERN = "[0-9-_.v]{3,}.*\\.jar$";
-  private static final String GEODE_HOME = System.getenv("GEODE_HOME");
+  protected static final String GEODE_HOME = System.getenv("GEODE_HOME");
   private Set<String> expectedJars;
 
   @Before
@@ -66,22 +65,27 @@ public class BundledJarsJUnitTest {
     TreeSet<String> missingJars = new TreeSet<String>(expectedJars);
     missingJars.removeAll(bundledJarNames);
 
-    String message =
-        "The bundled jars have changed. Please make sure you update the licence and notice"
-            + "\nas described in https://cwiki.apache.org/confluence/display/GEODE/License+Guide+for+Contributors"
-            + "\nWhen fixed, copy geode-assembly/build/test/bundled_jars.txt"
-            + "\nto src/test/resources/expected_jars.txt" + "\nRemoved Jars\n--------------\n"
-            + String.join("\n", missingJars) + "\n\nAdded Jars\n--------------\n"
-            + String.join("\n", newJars) + "\n\n";
-
-    assertTrue(message, expectedJars.equals(bundledJarNames));
+    StringBuilder message = new StringBuilder();
+    message.append(
+        "The bundled jars have changed. Please make sure you update the licence and notice");
+    message.append(
+        "\nas described in https://cwiki.apache.org/confluence/display/GEODE/License+Guide+for+Contributors");
+    message.append("\nWhen fixed, copy geode-assembly/build/test/bundled_jars.txt");
+    message.append("\nto src/test/resources/expected_jars.txt");
+    message.append("\nRemoved Jars\n--------------\n");
+    message.append(String.join("\n", missingJars));
+    message.append("\n\nAdded Jars\n--------------\n");
+    message.append(String.join("\n", newJars));
+    message.append("\n\n");
+
+    assertTrue(message.toString(), expectedJars.equals(bundledJarNames));
 
   }
 
   /**
    * Find all of the jars bundled with the project. Key is the name of the jar, value is the path.
    */
-  private TreeMap<String, String> getBundledJars() {
+  protected TreeMap<String, String> getBundledJars() {
     File geodeHomeDirectory = new File(GEODE_HOME);
 
     assertTrue(

http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/GfshCommandIntegrationTest.java
----------------------------------------------------------------------
diff --git a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/GfshCommandIntegrationTest.java b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/GfshCommandIntegrationTest.java
index a191905..263b12c 100644
--- a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/GfshCommandIntegrationTest.java
+++ b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/GfshCommandIntegrationTest.java
@@ -15,11 +15,16 @@
 
 package org.apache.geode.management.internal.cli.commands;
 
+import static org.assertj.core.api.Java6Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.io.FileWriter;
 import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -28,12 +33,14 @@ import java.util.jar.Attributes;
 import java.util.jar.JarFile;
 import java.util.jar.Manifest;
 
+import org.apache.commons.io.FileUtils;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestName;
 
+import org.apache.geode.internal.util.IOUtils;
 import org.apache.geode.test.junit.categories.IntegrationTest;
 
 @Category(IntegrationTest.class)
@@ -45,8 +52,60 @@ public class GfshCommandIntegrationTest {
   public TestName testName = new TestName();
 
   @Test
+  public void workingDirDefaultsToMemberName() {
+    StartServerCommand startServer = new StartServerCommand();
+    String workingDir = StartMemberUtils.resolveWorkingDir(null, "server1");
+    assertThat(new File(workingDir)).exists();
+    assertThat(workingDir).endsWith("server1");
+  }
+
+  @Test
+  public void workingDirGetsCreatedIfNecessary() throws Exception {
+    File workingDir = temporaryFolder.newFolder("foo");
+    FileUtils.deleteQuietly(workingDir);
+    String workingDirString = workingDir.getAbsolutePath();
+
+    StartServerCommand startServer = new StartServerCommand();
+
+    String resolvedWorkingDir = StartMemberUtils.resolveWorkingDir(workingDirString, "server1");
+    assertThat(new File(resolvedWorkingDir)).exists();
+    assertThat(workingDirString).endsWith("foo");
+  }
+
+  @Test
+  public void testWorkingDirWithRelativePath() throws Exception {
+    Path relativePath = Paths.get("some").resolve("relative").resolve("path");
+    assertThat(relativePath.isAbsolute()).isFalse();
+
+    StartServerCommand startServer = new StartServerCommand();
+
+    String resolvedWorkingDir =
+        StartMemberUtils.resolveWorkingDir(relativePath.toString(), "server1");
+
+    assertThat(resolvedWorkingDir).isEqualTo(relativePath.toAbsolutePath().toString());
+  }
+
+  @Test
+  public void testReadPid() throws IOException {
+    final int expectedPid = 12345;
+
+    File folder = temporaryFolder.newFolder();
+    File pidFile =
+        new File(folder, getClass().getSimpleName() + "_" + testName.getMethodName() + ".pid");
+
+    assertTrue(pidFile.createNewFile());
+
+    pidFile.deleteOnExit();
+    writePid(pidFile, expectedPid);
+
+    final int actualPid = StartMemberUtils.readPid(pidFile);
+
+    assertEquals(expectedPid, actualPid);
+  }
+
+  @Test
   public void testGemFireCoreClasspath() throws IOException {
-    File coreDependenciesJar = new File(StartMemberCommand.CORE_DEPENDENCIES_JAR_PATHNAME);
+    File coreDependenciesJar = new File(StartMemberUtils.CORE_DEPENDENCIES_JAR_PATHNAME);
     assertNotNull(coreDependenciesJar);
     assertTrue(coreDependenciesJar + " is not a file", coreDependenciesJar.isFile());
     Collection<String> expectedJarDependencies =
@@ -108,5 +167,11 @@ public class GfshCommandIntegrationTest {
         missingExpectedJarDependenciesList.isEmpty());
   }
 
-
+  private void writePid(final File pidFile, final int pid) throws IOException {
+    final FileWriter fileWriter = new FileWriter(pidFile, false);
+    fileWriter.write(String.valueOf(pid));
+    fileWriter.write("\n");
+    fileWriter.flush();
+    IOUtils.close(fileWriter);
+  }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsDUnitTest.java b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsDUnitTest.java
new file mode 100644
index 0000000..6e5d17c
--- /dev/null
+++ b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsDUnitTest.java
@@ -0,0 +1,1115 @@
+/*
+ * 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.apache.geode.distributed.ConfigurationProperties.DURABLE_CLIENT_ID;
+import static org.apache.geode.distributed.ConfigurationProperties.START_LOCATOR;
+import static org.apache.geode.test.dunit.Assert.assertEquals;
+import static org.apache.geode.test.dunit.Assert.assertFalse;
+import static org.apache.geode.test.dunit.Assert.assertNotNull;
+import static org.apache.geode.test.dunit.Assert.assertTrue;
+import static org.apache.geode.test.dunit.Wait.waitForCriterion;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.lang.management.ManagementFactory;
+import java.net.InetAddress;
+import java.nio.charset.Charset;
+import java.text.DateFormat;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedDeque;
+import java.util.concurrent.TimeUnit;
+
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import javax.management.Query;
+import javax.management.QueryExp;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runners.MethodSorters;
+
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.client.ClientCache;
+import org.apache.geode.cache.client.ClientCacheFactory;
+import org.apache.geode.cache.client.ClientRegionFactory;
+import org.apache.geode.cache.client.ClientRegionShortcut;
+import org.apache.geode.cache.client.Pool;
+import org.apache.geode.cache.client.PoolFactory;
+import org.apache.geode.cache.client.PoolManager;
+import org.apache.geode.distributed.AbstractLauncher.ServiceState;
+import org.apache.geode.distributed.AbstractLauncher.Status;
+import org.apache.geode.distributed.LocatorLauncher;
+import org.apache.geode.distributed.LocatorLauncher.Builder;
+import org.apache.geode.distributed.LocatorLauncher.Command;
+import org.apache.geode.distributed.LocatorLauncher.LocatorState;
+import org.apache.geode.distributed.ServerLauncher;
+import org.apache.geode.distributed.ServerLauncher.ServerState;
+import org.apache.geode.distributed.internal.DistributionConfig;
+import org.apache.geode.internal.AvailablePortHelper;
+import org.apache.geode.internal.lang.ObjectUtils;
+import org.apache.geode.internal.lang.StringUtils;
+import org.apache.geode.internal.lang.SystemUtils;
+import org.apache.geode.internal.process.ProcessType;
+import org.apache.geode.internal.process.ProcessUtils;
+import org.apache.geode.internal.util.IOUtils;
+import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.internal.cli.i18n.CliStrings;
+import org.apache.geode.management.internal.cli.result.CommandResult;
+import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
+import org.apache.geode.test.dunit.WaitCriterion;
+import org.apache.geode.test.junit.categories.DistributedTest;
+
+/**
+ * The LauncherLifecycleCommandsDUnitTest class is a test suite of integration tests testing the
+ * contract and functionality of the GemFire launcher lifecycle commands inside Gfsh.
+ * 
+ * @see javax.management.MBeanServerConnection
+ * @see javax.management.remote.JMXConnector
+ * @see org.apache.geode.distributed.AbstractLauncher
+ * @see org.apache.geode.distributed.LocatorLauncher
+ * @see org.apache.geode.distributed.ServerLauncher
+ * @see org.apache.geode.internal.AvailablePortHelper
+ * @see org.apache.geode.management.internal.cli.shell.Gfsh
+ * @see org.apache.geode.management.internal.cli.commands.CliCommandTestBase
+ * @see org.apache.geode.management.internal.cli.util.CommandStringBuilder
+ * @since GemFire 7.0
+ */
+@Category(DistributedTest.class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class LauncherLifecycleCommandsDUnitTest extends CliCommandTestBase {
+
+  protected static final DateFormat TIMESTAMP = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+
+  private final Queue<Integer> processIds = new ConcurrentLinkedDeque<>();
+
+  protected static String getMemberId(final int jmxManagerPort, final String memberName)
+      throws Exception {
+    return getMemberId(InetAddress.getLocalHost().getHostName(), jmxManagerPort, memberName);
+  }
+
+  protected static String getMemberId(final String jmxManagerHost, final int jmxManagerPort,
+      final String memberName) throws Exception {
+    JMXConnector connector = null;
+
+    try {
+      connector = JMXConnectorFactory.connect(new JMXServiceURL(String.format(
+          "service:jmx:rmi://%1$s/jndi/rmi://%1$s:%2$d/jmxrmi", jmxManagerHost, jmxManagerPort)));
+
+      MBeanServerConnection connection = connector.getMBeanServerConnection();
+
+      ObjectName objectNamePattern = ObjectName.getInstance("GemFire:type=Member,*");
+
+      QueryExp query = Query.eq(Query.attr("Name"), Query.value(memberName));
+
+      Set<ObjectName> objectNames = connection.queryNames(objectNamePattern, query);
+
+      assertNotNull(objectNames);
+      assertFalse(objectNames.isEmpty());
+      assertEquals(1, objectNames.size());
+
+      // final ObjectName objectName = ObjectName.getInstance("GemFire:type=Member,Name=" +
+      // memberName);
+      ObjectName objectName = objectNames.iterator().next();
+
+      // System.err.printf("ObjectName for Member with Name (%1$s) is %2$s%n", memberName,
+      // objectName);
+
+      return ObjectUtils.toString(connection.getAttribute(objectName, "Id"));
+    } finally {
+      IOUtils.close(connector);
+    }
+  }
+
+  @Override
+  public final void postTearDown() throws Exception {
+    Integer pid;
+
+    while ((pid = processIds.poll()) != null) {
+      if (ProcessUtils.isProcessAlive(pid)) {
+        try {
+          String killCommand = String.format("%1$s %2$d",
+              SystemUtils.isWindows() ? "taskkill /F /PID" : "kill -9", pid);
+          Runtime.getRuntime().exec(killCommand);
+        } catch (Throwable ignore) {
+        }
+      }
+    }
+  }
+
+  @SuppressWarnings("unused")
+  protected void assertStatus(final LocatorState expectedStatus, final LocatorState actualStatus) {
+    assertEquals(expectedStatus.getStatus(), actualStatus.getStatus());
+    assertEquals(expectedStatus.getTimestamp(), actualStatus.getTimestamp());
+    assertEquals(expectedStatus.getServiceLocation(), actualStatus.getServiceLocation());
+    assertTrue(ObjectUtils.equalsIgnoreNull(expectedStatus.getPid(), actualStatus.getPid()));
+    assertEquals(expectedStatus.getUptime(), actualStatus.getUptime());
+    assertEquals(expectedStatus.getWorkingDirectory(), actualStatus.getWorkingDirectory());
+    assertEquals(expectedStatus.getJvmArguments(), actualStatus.getJvmArguments());
+    assertEquals(expectedStatus.getClasspath(), actualStatus.getClasspath());
+    assertEquals(expectedStatus.getGemFireVersion(), actualStatus.getGemFireVersion());
+    assertEquals(expectedStatus.getJavaVersion(), actualStatus.getJavaVersion());
+  }
+
+  protected Integer readPid(final File workingDirectory) throws IOException {
+    assertTrue(String.format("The working directory (%1$s) must exist!", workingDirectory),
+        workingDirectory != null && workingDirectory.isDirectory());
+
+    File[] files = workingDirectory.listFiles(pathname -> (pathname != null && pathname.isFile()
+        && pathname.getAbsolutePath().endsWith(".pid")));
+
+    assertNotNull(files);
+    assertTrue(files.length > 0);
+
+    File pidFile = files[0];
+
+    BufferedReader fileReader = null;
+
+    try {
+      fileReader = new BufferedReader(new FileReader(pidFile), 1024);
+      return Integer.parseInt(fileReader.readLine().trim());
+    } catch (Exception ignore) {
+      return null;
+    } finally {
+      IOUtils.close(fileReader);
+    }
+  }
+
+  protected String serviceStateStatusStringNormalized(final ServiceState serviceState) {
+    return serviceStateStatusStringNormalized(serviceState.toString());
+  }
+
+  protected String serviceStateStatusStringNormalized(final String serviceStateStatus) {
+    assertNotNull(serviceStateStatus);
+    assertTrue("serviceStateStatus is missing 'Uptime': " + serviceStateStatus,
+        serviceStateStatus.contains("Uptime"));
+    assertTrue("serviceStateStatus is missing 'JVM Arguments': " + serviceStateStatus,
+        serviceStateStatus.contains("JVM Arguments"));
+
+    return serviceStateStatus.substring(0, serviceStateStatus.indexOf("Uptime"))
+        .concat(serviceStateStatus.substring(serviceStateStatus.indexOf("JVM Arguments")));
+  }
+
+  protected Status stopLocator(final File workingDirectory) {
+    return stopLocator(IOUtils.tryGetCanonicalPathElseGetAbsolutePath(workingDirectory));
+  }
+
+  protected Status stopLocator(final String workingDirectory) {
+    return waitForGemFireProcessToStop(
+        new Builder().setCommand(Command.STOP).setWorkingDirectory(workingDirectory).build().stop(),
+        workingDirectory);
+  }
+
+  protected Status stopServer(final String workingDirectory) {
+    return waitForGemFireProcessToStop(
+        new ServerLauncher.Builder().setCommand(ServerLauncher.Command.STOP)
+            .setWorkingDirectory(workingDirectory).build().stop(),
+        workingDirectory);
+  }
+
+  protected String toString(final Result result) {
+    assert result != null : "The Result object from the command execution cannot be null!";
+
+    StringBuilder buffer = new StringBuilder(StringUtils.LINE_SEPARATOR);
+
+    while (result.hasNextLine()) {
+      buffer.append(result.nextLine());
+      buffer.append(StringUtils.LINE_SEPARATOR);
+    }
+
+    return buffer.toString();
+  }
+
+  protected Status waitForGemFireProcessToStop(final ServiceState serviceState,
+      final String workingDirectory) {
+    if (!Status.STOPPED.equals(serviceState.getStatus())) {
+      try {
+        final Integer pid = readPid(new File(workingDirectory));
+
+        if (pid != null) {
+          WaitCriterion waitCriteria = new WaitCriterion() {
+            @Override
+            public boolean done() {
+              return !ProcessUtils.isProcessAlive(pid);
+            }
+
+            @Override
+            public String description() {
+              return String.format("Waiting for GemFire Process with PID (%1$d) to stop.", pid);
+            }
+          };
+
+          waitForCriterion(waitCriteria, TimeUnit.SECONDS.toMillis(15),
+              TimeUnit.SECONDS.toMillis(5), false);
+
+          if (!waitCriteria.done()) {
+            processIds.offer(pid);
+          }
+        }
+      } catch (IOException ignore) {
+      }
+    }
+
+    return serviceState.getStatus();
+  }
+
+  protected void writePid(final File pidFile, final int pid) throws IOException {
+    assertTrue("The PID file must actually exist!", pidFile != null && pidFile.isFile());
+
+    FileWriter writer = null;
+
+    try {
+      writer = new FileWriter(pidFile, false);
+      writer.write(String.valueOf(pid));
+      writer.write(System.getProperty("line.separator"));
+      writer.flush();
+    } finally {
+      IOUtils.close(writer);
+    }
+  }
+
+  @Test
+  public void test000StartLocatorCapturesOutputOnError() throws IOException {
+    final int locatorPort = AvailablePortHelper.getRandomAvailableTCPPort();
+
+    String pathname = (getClass().getSimpleName() + "_" + getTestMethodName());
+    File workingDirectory = temporaryFolder.newFolder(pathname);
+
+    assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir());
+
+    File pidFile = new File(workingDirectory, ProcessType.LOCATOR.getPidFileName());
+
+    assertTrue(pidFile.createNewFile());
+
+    writePid(pidFile, getPidOrOne());
+    pidFile.deleteOnExit();
+
+    assertTrue(pidFile.isFile());
+
+    CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR);
+
+    command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname);
+    command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath());
+    command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort));
+    command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION,
+        Boolean.FALSE.toString());
+    command.addOption(CliStrings.START_LOCATOR__J,
+        "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0");
+    command.addOption(CliStrings.START_LOCATOR__J, "-D" + DistributionConfig.GEMFIRE_PREFIX
+        + "jmx-manager-port=" + AvailablePortHelper.getRandomAvailableTCPPort());
+
+    CommandResult result = executeCommand(command.toString());
+
+    assertNotNull(result);
+    assertEquals(Result.Status.ERROR, result.getStatus());
+
+    String resultString = toString(result);
+
+    assertTrue(resultString,
+        resultString.contains(
+            "Exception in thread \"main\" java.lang.RuntimeException: A PID file already exists and a Locator may be running in "
+                + IOUtils.tryGetCanonicalFileElseGetAbsoluteFile(workingDirectory)));
+    assertTrue(resultString,
+        resultString.contains(
+            "Caused by: org.apache.geode.internal.process.FileAlreadyExistsException: Pid file already exists: "
+                + IOUtils.tryGetCanonicalFileElseGetAbsoluteFile(pidFile)));
+  }
+
+  /*
+   * This method makes an effort to get the PID of the running process. If it is unable to determine
+   * accurately, it simply returns 1.
+   */
+  private int getPidOrOne() {
+    int pid = 1;
+    String[] name = ManagementFactory.getRuntimeMXBean().getName().split("@");
+    if (name.length > 1) {
+      try {
+        pid = Integer.parseInt(name[0]);
+      } catch (NumberFormatException nex) {
+        // Ignored
+      }
+    }
+
+    return pid;
+  }
+
+  @Test
+  public void test001StartLocatorFailsFastOnMissingGemFirePropertiesFile() throws IOException {
+    String gemfirePropertiesPathname = "/path/to/missing/gemfire.properties";
+
+    CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR);
+    String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName());
+    final File workingDirectory = temporaryFolder.newFolder(pathName);
+
+    command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathName);
+    command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath());
+    command.addOption(CliStrings.START_LOCATOR__PORT, "0");
+    command.addOption(CliStrings.START_LOCATOR__PROPERTIES, gemfirePropertiesPathname);
+    command.addOption(CliStrings.START_LOCATOR__J,
+        "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0");
+    command.addOption(CliStrings.START_LOCATOR__J,
+        "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager=false");
+    command.addOption(CliStrings.START_LOCATOR__J,
+        "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=0");
+    command.addOption(CliStrings.START_LOCATOR__J,
+        "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-start=false");
+
+    CommandResult result = executeCommand(command.toString());
+
+    assertNotNull(result);
+    assertEquals(Result.Status.ERROR, result.getStatus());
+
+    String resultString = toString(result);
+
+    assertTrue(resultString,
+        resultString
+            .contains(MessageFormat.format(CliStrings.GEODE_0_PROPERTIES_1_NOT_FOUND_MESSAGE,
+                StringUtils.EMPTY, gemfirePropertiesPathname)));
+  }
+
+  /**
+   * Test to verify GEODE-2138
+   * 
+   * @throws IOException
+   */
+  @Test
+  public void testVersionTitleForStartServerAndLocator() throws IOException {
+    final int locatorPort = AvailablePortHelper.getRandomAvailableTCPPort();
+
+    String pathname = (getClass().getSimpleName() + "_" + getTestMethodName());
+    String pathnameLoc = pathname + "_loc";
+    String pathnameSer = pathname + "_ser";
+
+    File workingDirectoryLoc = temporaryFolder.newFolder(pathnameLoc);
+    File workingDirectorySer = temporaryFolder.newFolder(pathnameSer);
+
+    assertTrue(workingDirectoryLoc.isDirectory() || workingDirectoryLoc.mkdir());
+    assertTrue(workingDirectorySer.isDirectory() || workingDirectorySer.mkdir());
+
+    try {
+      // verify the start locator output does not contain string "gemfire"
+      CommandStringBuilder locCommand = new CommandStringBuilder(CliStrings.START_LOCATOR);
+      locCommand.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathnameLoc);
+      locCommand.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString());
+      locCommand.addOption(CliStrings.START_LOCATOR__DIR, workingDirectoryLoc.getCanonicalPath());
+      locCommand.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort));
+
+      CommandResult locResult = executeCommand(locCommand.toString());
+      assertNotNull(locResult);
+      assertEquals(Result.Status.OK, locResult.getStatus());
+      String locatorOutput = toString(locResult);
+      assertNotNull(locatorOutput);
+      assertTrue("Locator output was: " + locatorOutput, !locatorOutput.contains("Gemfire"));
+
+      // verify the start server output does not contain string "gemfire"
+      CommandStringBuilder serCommand = new CommandStringBuilder(CliStrings.START_SERVER);
+      serCommand.addOption(CliStrings.START_SERVER__NAME, pathnameSer);
+      serCommand.addOption(CliStrings.START_SERVER__DIR, workingDirectorySer.getCanonicalPath());
+
+      CommandResult serResult = executeCommand(serCommand.toString());
+      assertNotNull(serResult);
+      assertEquals(Result.Status.OK, serResult.getStatus());
+      String serverOutput = toString(serResult);
+
+      assertTrue("Server start output was: " + serverOutput, !serverOutput.contains("Gemfire"));
+    } finally {
+      stopLocator(workingDirectoryLoc);
+      stopServer(IOUtils.tryGetCanonicalPathElseGetAbsolutePath(workingDirectorySer));
+    }
+  }
+
+  @Test
+  public void test002StartLocatorFailsFastOnMissingGemFireSecurityPropertiesFile()
+      throws IOException {
+    String gemfireSecurityPropertiesPathname = "/path/to/missing/gemfire-security.properties";
+    String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName());
+    final File workingDirectory = temporaryFolder.newFolder(pathName);
+
+    CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR);
+
+    command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathName);
+    command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath());
+    command.addOption(CliStrings.START_LOCATOR__PORT, "0");
+    command.addOption(CliStrings.START_LOCATOR__SECURITY_PROPERTIES,
+        gemfireSecurityPropertiesPathname);
+    command.addOption(CliStrings.START_LOCATOR__J,
+        "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0");
+    command.addOption(CliStrings.START_LOCATOR__J,
+        "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager=false");
+    command.addOption(CliStrings.START_LOCATOR__J,
+        "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=0");
+    command.addOption(CliStrings.START_LOCATOR__J,
+        "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-start=false");
+
+    CommandResult result = executeCommand(command.toString());
+
+    assertNotNull(result);
+    assertEquals(Result.Status.ERROR, result.getStatus());
+
+    String resultString = toString(result);
+
+    assertTrue(resultString,
+        resultString
+            .contains(MessageFormat.format(CliStrings.GEODE_0_PROPERTIES_1_NOT_FOUND_MESSAGE,
+                "Security ", gemfireSecurityPropertiesPathname)));
+  }
+
+  @Test
+  public void test003StartServerFailsFastOnMissingCacheXmlFile() throws IOException {
+    String cacheXmlPathname = "/path/to/missing/cache.xml";
+
+    CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_SERVER);
+    String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName());
+    final File workingDirectory = temporaryFolder.newFolder(pathName);
+
+    command.addOption(CliStrings.START_SERVER__NAME, pathName);
+    command.addOption(CliStrings.START_SERVER__DIR, workingDirectory.getCanonicalPath());
+    command.addOption(CliStrings.START_SERVER__CACHE_XML_FILE, cacheXmlPathname);
+
+    CommandResult result = executeCommand(command.toString());
+
+    assertNotNull(result);
+    assertEquals(Result.Status.ERROR, result.getStatus());
+
+    String resultString = toString(result);
+
+    assertTrue(resultString, resultString
+        .contains(MessageFormat.format(CliStrings.CACHE_XML_NOT_FOUND_MESSAGE, cacheXmlPathname)));
+  }
+
+  @Test
+  public void test004StartServerFailsFastOnMissingGemFirePropertiesFile() throws IOException {
+    String gemfirePropertiesFile = "/path/to/missing/gemfire.properties";
+
+    CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_SERVER);
+
+    String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName());
+    final File workingDirectory = temporaryFolder.newFolder(pathName);
+
+    command.addOption(CliStrings.START_SERVER__NAME, pathName);
+    command.addOption(CliStrings.START_SERVER__DIR, workingDirectory.getCanonicalPath());
+    command.addOption(CliStrings.START_SERVER__PROPERTIES, gemfirePropertiesFile);
+
+    CommandResult result = executeCommand(command.toString());
+
+    assertNotNull(result);
+    assertEquals(Result.Status.ERROR, result.getStatus());
+
+    String resultString = toString(result);
+
+    assertTrue(resultString,
+        resultString
+            .contains(MessageFormat.format(CliStrings.GEODE_0_PROPERTIES_1_NOT_FOUND_MESSAGE,
+                StringUtils.EMPTY, gemfirePropertiesFile)));
+  }
+
+  @Test
+  public void testStartServerFailsFastOnMissingPassword() throws IOException {
+
+    CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_SERVER);
+
+    String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName());
+    final File workingDirectory = temporaryFolder.newFolder(pathName);
+
+    command.addOption(CliStrings.START_SERVER__NAME, pathName);
+    command.addOption(CliStrings.START_SERVER__DIR, workingDirectory.getCanonicalPath());
+    command.addOption(CliStrings.START_SERVER__USERNAME, "test");
+
+    CommandResult result = executeCommand(command.toString());
+
+    assertNotNull(result);
+    assertEquals(Result.Status.ERROR, result.getStatus());
+
+    String resultString = toString(result);
+
+    assertTrue(resultString, resultString.contains("password must be specified"));
+  }
+
+  @Test
+  public void test005StartServerFailsFastOnMissingGemFireSecurityPropertiesFile()
+      throws IOException {
+    String gemfireSecuritiesPropertiesFile = "/path/to/missing/gemfire-securities.properties";
+
+    CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_SERVER);
+
+    String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName());
+    final File workingDirectory = temporaryFolder.newFolder(pathName);
+
+    command.addOption(CliStrings.START_SERVER__NAME, pathName);
+    command.addOption(CliStrings.START_SERVER__DIR, workingDirectory.getCanonicalPath());
+    command.addOption(CliStrings.START_SERVER__SECURITY_PROPERTIES,
+        gemfireSecuritiesPropertiesFile);
+
+    CommandResult result = executeCommand(command.toString());
+
+    assertNotNull(result);
+    assertEquals(Result.Status.ERROR, result.getStatus());
+
+    String resultString = toString(result);
+
+    assertTrue(resultString,
+        resultString
+            .contains(MessageFormat.format(CliStrings.GEODE_0_PROPERTIES_1_NOT_FOUND_MESSAGE,
+                "Security ", gemfireSecuritiesPropertiesFile)));
+  }
+
+  @Test
+  public void test006StartLocatorInRelativeDirectory() {
+    final int locatorPort = AvailablePortHelper.getRandomAvailableTCPPort();
+
+    String pathname = (getClass().getSimpleName() + "_" + getTestMethodName());
+    File workingDirectory = new File(pathname);
+
+    assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir());
+
+    try {
+      CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR);
+
+      command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname);
+      command.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString());
+      command.addOption(CliStrings.START_LOCATOR__DIR, pathname);
+      command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort));
+      command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION,
+          Boolean.FALSE.toString());
+      command.addOption(CliStrings.START_LOCATOR__J,
+          "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0");
+      command.addOption(CliStrings.START_LOCATOR__J, "-D" + DistributionConfig.GEMFIRE_PREFIX
+          + "jmx-manager-port=" + AvailablePortHelper.getRandomAvailableTCPPort());
+
+      CommandResult result = executeCommand(command.toString());
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      String locatorOutput = toString(result);
+
+      assertNotNull(locatorOutput);
+      assertTrue("Locator output was: " + locatorOutput, locatorOutput.contains(
+          "Locator in " + IOUtils.tryGetCanonicalFileElseGetAbsoluteFile(workingDirectory)));
+    } finally {
+      stopLocator(workingDirectory);
+    }
+  }
+
+  @Test
+  public void test007StatusLocatorUsingMemberNameIDWhenGfshIsNotConnected() {
+    CommandResult result =
+        executeCommand(CliStrings.STATUS_LOCATOR + " --name=" + getTestMethodName());
+
+    assertNotNull(result);
+    assertEquals(Result.Status.ERROR, result.getStatus());
+    assertEquals(
+        CliStrings.format(CliStrings.STATUS_SERVICE__GFSH_NOT_CONNECTED_ERROR_MESSAGE, "Locator"),
+        StringUtils.trim(toString(result)));
+  }
+
+  @Test
+  public void test008StatusLocatorUsingMemberName() throws IOException {
+    final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2);
+
+    final int jmxManagerPort = ports[0];
+    final int locatorPort = ports[1];
+
+    String pathname = (getClass().getSimpleName() + "_" + getTestMethodName());
+    File workingDirectory = temporaryFolder.newFolder(pathname);
+
+    assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir());
+
+    try {
+      CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR);
+
+      command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname);
+      command.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString());
+      command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath());
+      command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort));
+      command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION,
+          Boolean.FALSE.toString());
+      command.addOption(CliStrings.START_LOCATOR__FORCE, Boolean.TRUE.toString());
+      command.addOption(CliStrings.START_LOCATOR__J,
+          "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0");
+      command.addOption(CliStrings.START_LOCATOR__J,
+          "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=" + jmxManagerPort);
+
+      CommandResult result = executeCommand(command.toString());
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      LocatorLauncher locatorLauncher = new LocatorLauncher.Builder()
+          .setCommand(LocatorLauncher.Command.STATUS).setBindAddress(null).setPort(locatorPort)
+          .setWorkingDirectory(workingDirectory.getPath()).build();
+
+      assertNotNull(locatorLauncher);
+
+      LocatorState expectedLocatorState =
+          locatorLauncher.waitOnStatusResponse(60, 10, TimeUnit.SECONDS);
+
+      assertNotNull(expectedLocatorState);
+      assertEquals(Status.ONLINE, expectedLocatorState.getStatus());
+
+      result = executeCommand(
+          String.format("%1$s --locator=localhost[%2$d]", CliStrings.CONNECT, locatorPort));
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      result = executeCommand(
+          String.format("%1$s --name=invalidLocatorMemberName", CliStrings.STATUS_LOCATOR));
+
+      assertNotNull(result);
+      assertEquals(Result.Status.ERROR, result.getStatus());
+      assertEquals(
+          CliStrings.format(CliStrings.STATUS_LOCATOR__NO_LOCATOR_FOUND_FOR_MEMBER_ERROR_MESSAGE,
+              "invalidLocatorMemberName"),
+          StringUtils.trim(toString(result)));
+
+      result =
+          executeCommand(String.format("%1$s --name=%2$s", CliStrings.STATUS_LOCATOR, pathname));
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+      assertTrue(serviceStateStatusStringNormalized(toString(result))
+          .contains(serviceStateStatusStringNormalized(expectedLocatorState)));
+    } finally {
+      stopLocator(workingDirectory);
+    }
+  }
+
+  @Test
+  public void test009StatusLocatorUsingMemberId() throws Exception {
+    final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2);
+
+    final int jmxManagerPort = ports[0];
+    final int locatorPort = ports[1];
+
+    String pathname = (getClass().getSimpleName() + "_" + getTestMethodName());
+    File workingDirectory = temporaryFolder.newFolder(pathname);
+
+    assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir());
+
+    try {
+      CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR);
+
+      command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname);
+      command.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString());
+      command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath());
+      command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort));
+      command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION,
+          Boolean.FALSE.toString());
+      command.addOption(CliStrings.START_LOCATOR__FORCE, Boolean.TRUE.toString());
+      command.addOption(CliStrings.START_LOCATOR__J,
+          "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0");
+      command.addOption(CliStrings.START_LOCATOR__J,
+          "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=" + jmxManagerPort);
+
+      CommandResult result = executeCommand(command.toString());
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      LocatorLauncher locatorLauncher = new LocatorLauncher.Builder()
+          .setCommand(LocatorLauncher.Command.STATUS).setBindAddress(null).setPort(locatorPort)
+          .setWorkingDirectory(workingDirectory.getPath()).build();
+
+      assertNotNull(locatorLauncher);
+
+      LocatorState expectedLocatorState =
+          locatorLauncher.waitOnStatusResponse(60, 10, TimeUnit.SECONDS);
+
+      assertNotNull(expectedLocatorState);
+      assertEquals(Status.ONLINE, expectedLocatorState.getStatus());
+
+      result = executeCommand(
+          String.format("%1$s --locator=localhost[%2$d]", CliStrings.CONNECT, locatorPort));
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      result = executeCommand(String.format("%1$s --name=%2$s", CliStrings.STATUS_LOCATOR,
+          getMemberId(jmxManagerPort, pathname)));
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+      assertTrue(serviceStateStatusStringNormalized(toString(result))
+          .contains(serviceStateStatusStringNormalized(expectedLocatorState)));
+    } finally {
+      stopLocator(workingDirectory);
+    }
+  }
+
+  @Test
+  public void test010StopLocatorUsingMemberNameIDWhenGfshIsNotConnected() {
+    CommandResult result =
+        executeCommand(CliStrings.STOP_LOCATOR + " --name=" + getTestMethodName());
+
+    assertNotNull(result);
+    assertEquals(Result.Status.ERROR, result.getStatus());
+    assertEquals(
+        CliStrings.format(CliStrings.STOP_SERVICE__GFSH_NOT_CONNECTED_ERROR_MESSAGE, "Locator"),
+        StringUtils.trim(toString(result)));
+  }
+
+  @Test
+  public void test011StopLocatorUsingMemberName() throws IOException {
+    final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2);
+
+    final int jmxManagerPort = ports[0];
+    final int locatorPort = ports[1];
+
+    String pathname = (getClass().getSimpleName() + "_" + getTestMethodName());
+    File workingDirectory = temporaryFolder.newFolder(pathname);
+
+    try {
+      assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir());
+
+      CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR);
+
+      command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname);
+      command.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString());
+      command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath());
+      command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort));
+      command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION,
+          Boolean.FALSE.toString());
+      command.addOption(CliStrings.START_LOCATOR__FORCE, Boolean.TRUE.toString());
+      command.addOption(CliStrings.START_LOCATOR__J,
+          "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0");
+      command.addOption(CliStrings.START_LOCATOR__J,
+          "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=" + jmxManagerPort);
+
+      CommandResult result = executeCommand(command.toString());
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      final LocatorLauncher locatorLauncher =
+          new Builder().setCommand(Command.STOP).setBindAddress(null).setPort(locatorPort)
+              .setWorkingDirectory(workingDirectory.getPath()).build();
+
+      assertNotNull(locatorLauncher);
+
+      LocatorState locatorStatus = locatorLauncher.waitOnStatusResponse(60, 10, TimeUnit.SECONDS);
+
+      assertNotNull(locatorStatus);
+      assertEquals(Status.ONLINE, locatorStatus.getStatus());
+
+      result = executeCommand(
+          String.format("%1$s --locator=localhost[%2$d]", CliStrings.CONNECT, locatorPort));
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      result = executeCommand(
+          String.format("%1$s --name=invalidLocatorMemberName", CliStrings.STOP_LOCATOR));
+
+      assertNotNull(result);
+      assertEquals(Result.Status.ERROR, result.getStatus());
+      assertEquals(
+          CliStrings.format(CliStrings.STOP_LOCATOR__NO_LOCATOR_FOUND_FOR_MEMBER_ERROR_MESSAGE,
+              "invalidLocatorMemberName"),
+          StringUtils.trim(toString(result)));
+
+      locatorStatus = locatorLauncher.status();
+
+      assertNotNull(locatorStatus);
+      assertEquals(Status.ONLINE, locatorStatus.getStatus());
+
+      result = executeCommand(String.format("%1$s --name=%2$s", CliStrings.STOP_LOCATOR, pathname));
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      // TODO figure out what output to assert and validate on now that 'stop locator' uses Gfsh's
+      // logger
+      // and standard err/out...
+      // assertIndexDetailsEquals(CliStrings.format(CliStrings.STOP_LOCATOR__SHUTDOWN_MEMBER_MESSAGE,
+      // pathname),
+      // StringUtils.trim(toString(result)));
+
+      WaitCriterion waitCriteria = new WaitCriterion() {
+        @Override
+        public boolean done() {
+          final LocatorState locatorStatus = locatorLauncher.status();
+          return (locatorStatus != null && Status.NOT_RESPONDING.equals(locatorStatus.getStatus()));
+        }
+
+        @Override
+        public String description() {
+          return "wait for the Locator to stop; the Locator will no longer respond after it stops";
+        }
+      };
+
+      waitForCriterion(waitCriteria, 15 * 1000, 5000, true);
+
+      locatorStatus = locatorLauncher.status();
+
+      assertNotNull(locatorStatus);
+      assertEquals(Status.NOT_RESPONDING, locatorStatus.getStatus());
+    } finally {
+    }
+
+  }
+
+  // @see Trac Bug # 46760
+  @Test
+  public void test012StopLocatorUsingMemberId() throws Exception {
+    final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2);
+
+    final int jmxManagerPort = ports[0];
+    final int locatorPort = ports[1];
+
+    String pathname = (getClass().getSimpleName() + "_" + getTestMethodName());
+    File workingDirectory = temporaryFolder.newFolder(pathname);
+
+    try {
+      assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir());
+
+      CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR);
+
+      command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname);
+      command.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString());
+      command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath());
+      command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort));
+      command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION,
+          Boolean.FALSE.toString());
+      command.addOption(CliStrings.START_LOCATOR__FORCE, Boolean.TRUE.toString());
+      command.addOption(CliStrings.START_LOCATOR__J,
+          "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0");
+      command.addOption(CliStrings.START_LOCATOR__J,
+          "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=" + jmxManagerPort);
+
+      CommandResult result = executeCommand(command.toString());
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      final LocatorLauncher locatorLauncher =
+          new Builder().setCommand(Command.STOP).setBindAddress(null).setPort(locatorPort)
+              .setWorkingDirectory(workingDirectory.getPath()).build();
+
+      assertNotNull(locatorLauncher);
+
+      LocatorState locatorState = locatorLauncher.waitOnStatusResponse(60, 10, TimeUnit.SECONDS);
+
+      assertNotNull(locatorState);
+      assertEquals(Status.ONLINE, locatorState.getStatus());
+
+      result = executeCommand(
+          String.format("%1$s --locator=localhost[%2$d]", CliStrings.CONNECT, locatorPort));
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      String memberId = getMemberId(jmxManagerPort, pathname);
+
+      result = executeCommand(String.format("%1$s --name=%2$s", CliStrings.STOP_LOCATOR, memberId));
+
+      assertNotNull(result);
+      assertEquals(Result.Status.OK, result.getStatus());
+
+      // TODO figure out what output to assert and validate on now that 'stop locator' uses Gfsh's
+      // logger
+      // and standard err/out...
+      // assertIndexDetailsEquals(CliStrings.format(CliStrings.STOP_LOCATOR__SHUTDOWN_MEMBER_MESSAGE,
+      // memberId),
+      // StringUtils.trim(toString(result)));
+
+      WaitCriterion waitCriteria = new WaitCriterion() {
+        @Override
+        public boolean done() {
+          LocatorState locatorState = locatorLauncher.status();
+          return (locatorState != null && Status.NOT_RESPONDING.equals(locatorState.getStatus()));
+        }
+
+        @Override
+        public String description() {
+          return "wait for the Locator to stop; the Locator will no longer respond after it stops";
+        }
+      };
+
+      waitForCriterion(waitCriteria, 15 * 1000, 5000, true);
+
+      locatorState = locatorLauncher.status();
+
+      assertNotNull(locatorState);
+      assertEquals(Status.NOT_RESPONDING, locatorState.getStatus());
+    } finally {
+    }
+  }
+
+  @Test
+  public void test014GemFireServerJvmProcessTerminatesOnOutOfMemoryError() throws Exception {
+    int ports[] = AvailablePortHelper.getRandomAvailableTCPPorts(2);
+    final int serverPort = ports[0];
+    final int locatorPort = ports[1];
+
+    String pathname = getClass().getSimpleName().concat("_").concat(getTestMethodName());
+    File workingDirectory = temporaryFolder.newFolder(pathname);
+
+    assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir());
+
+    CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_SERVER);
+
+    command.addOption(CliStrings.START_SERVER__NAME,
+        pathname + TIMESTAMP.format(Calendar.getInstance().getTime()));
+    command.addOption(CliStrings.START_SERVER__SERVER_PORT, String.valueOf(serverPort));
+    command.addOption(CliStrings.START_SERVER__USE_CLUSTER_CONFIGURATION, Boolean.FALSE.toString());
+    command.addOption(CliStrings.START_SERVER__MAXHEAP, "10M");
+    command.addOption(CliStrings.START_SERVER__LOG_LEVEL, "config");
+    command.addOption(CliStrings.START_SERVER__DIR, workingDirectory.getCanonicalPath());
+    command.addOption(CliStrings.START_SERVER__CACHE_XML_FILE,
+        IOUtils.tryGetCanonicalPathElseGetAbsolutePath(writeAndGetCacheXmlFile(workingDirectory)));
+    command.addOption(CliStrings.START_SERVER__INCLUDE_SYSTEM_CLASSPATH);
+    command.addOption(CliStrings.START_SERVER__J, "-D" + DistributionConfig.GEMFIRE_PREFIX + ""
+        + START_LOCATOR + "=localhost[" + locatorPort + "]");
+
+
+    CommandResult result = executeCommand(command.toString());
+    System.out.println("result=" + result);
+
+    assertNotNull(result);
+    assertEquals(Result.Status.OK, result.getStatus());
+
+    ServerLauncher serverLauncher =
+        new ServerLauncher.Builder().setCommand(ServerLauncher.Command.STATUS)
+            .setWorkingDirectory(IOUtils.tryGetCanonicalPathElseGetAbsolutePath(workingDirectory))
+            .build();
+
+    assertNotNull(serverLauncher);
+
+    ServerState serverState = serverLauncher.status();
+
+    assertNotNull(serverState);
+    assertEquals(Status.ONLINE, serverState.getStatus());
+
+    // Verify our GemFire Server JVM process is running!
+    assertTrue(serverState.isVmWithProcessIdRunning());
+
+    ClientCache clientCache = setupClientCache(pathname + String.valueOf(serverPort), serverPort);
+
+    assertNotNull(clientCache);
+
+    try {
+      Region<Long, String> exampleRegion = clientCache.getRegion("/Example");
+      // run the GemFire Server "out-of-town" with an OutOfMemoryError!
+      for (long index = 0; index < Long.MAX_VALUE; index++) {
+        exampleRegion.put(index, String.valueOf(index));
+      }
+    } catch (Exception ignore) {
+      System.err.printf("%1$s: %2$s%n", ignore.getClass().getName(), ignore.getMessage());
+    } finally {
+      clientCache.close();
+
+      final int serverPid = serverState.getPid();
+
+      WaitCriterion waitCriteria = new WaitCriterion() {
+        @Override
+        public boolean done() {
+          return !ProcessUtils.isProcessAlive(serverPid);
+        }
+
+        @Override
+        public String description() {
+          return "Wait for the GemFire Server JVM process that ran out-of-memory to exit.";
+        }
+      };
+
+      waitForCriterion(waitCriteria, TimeUnit.SECONDS.toMillis(30), TimeUnit.SECONDS.toMillis(10),
+          true);
+
+      // Verify our GemFire Server JVM process is was terminated!
+      assertFalse(serverState.isVmWithProcessIdRunning());
+
+      serverState = serverLauncher.status();
+
+      assertNotNull(serverState);
+      assertEquals(Status.NOT_RESPONDING, serverState.getStatus());
+    }
+  }
+
+  private File writeAndGetCacheXmlFile(final File workingDirectory) throws IOException {
+    File cacheXml = new File(workingDirectory, "cache.xml");
+    StringBuilder buffer = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+
+    buffer.append(StringUtils.LINE_SEPARATOR);
+    buffer.append(
+        "<!DOCTYPE cache PUBLIC  \"-//GemStone Systems, Inc.//GemFire Declarative Caching 7.0//EN\"");
+    buffer.append(StringUtils.LINE_SEPARATOR);
+    buffer.append("  \"http://www.gemstone.com/dtd/cache7_0.dtd\">");
+    buffer.append(StringUtils.LINE_SEPARATOR);
+    buffer.append("<cache>");
+    buffer.append(StringUtils.LINE_SEPARATOR);
+    buffer.append("  <region name=\"Example\" refid=\"REPLICATE\"/>");
+    buffer.append(StringUtils.LINE_SEPARATOR);
+    buffer.append("</cache>");
+
+    BufferedWriter fileWriter = null;
+
+    try {
+      fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(cacheXml, false),
+          Charset.forName("UTF-8").newEncoder()));
+      fileWriter.write(buffer.toString());
+      fileWriter.flush();
+    } finally {
+      IOUtils.close(fileWriter);
+    }
+
+    return cacheXml;
+  }
+
+  private ClientCache setupClientCache(final String durableClientId, final int serverPort) {
+    ClientCache clientCache =
+        new ClientCacheFactory().set(DURABLE_CLIENT_ID, durableClientId).create();
+
+    PoolFactory poolFactory = PoolManager.createFactory();
+
+    poolFactory.setMaxConnections(10);
+    poolFactory.setMinConnections(1);
+    poolFactory.setReadTimeout(5000);
+    poolFactory.addServer("localhost", serverPort);
+
+    Pool pool = poolFactory.create("serverConnectionPool");
+
+    assertNotNull("The 'serverConnectionPool' was not properly configured and initialized!", pool);
+
+    ClientRegionFactory<Long, String> regionFactory =
+        clientCache.createClientRegionFactory(ClientRegionShortcut.PROXY);
+
+    regionFactory.setPoolName(pool.getName());
+    regionFactory.setKeyConstraint(Long.class);
+    regionFactory.setValueConstraint(String.class);
+
+    Region<Long, String> exampleProxy = regionFactory.create("Example");
+
+    assertNotNull("The 'Example' Client Region was not properly configured and initialized",
+        exampleProxy);
+
+    return clientCache;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommandTest.java
----------------------------------------------------------------------
diff --git a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommandTest.java b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommandTest.java
index e9ca6dc..5a7c11c 100644
--- a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommandTest.java
+++ b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommandTest.java
@@ -56,9 +56,9 @@ public class StartLocatorCommandTest {
   public void testLocatorClasspathOrder() {
     String userClasspath = "/path/to/user/lib/app.jar:/path/to/user/classes";
     String expectedClasspath =
-        locatorCommands.getGemFireJarPath().concat(File.pathSeparator).concat(userClasspath)
+        StartMemberUtils.getGemFireJarPath().concat(File.pathSeparator).concat(userClasspath)
             .concat(File.pathSeparator).concat(System.getProperty("java.class.path"))
-            .concat(File.pathSeparator).concat(StartMemberCommand.CORE_DEPENDENCIES_JAR_PATHNAME);
+            .concat(File.pathSeparator).concat(StartMemberUtils.CORE_DEPENDENCIES_JAR_PATHNAME);
     String actualClasspath = locatorCommands.getLocatorClasspath(true, userClasspath);
     assertEquals(expectedClasspath, actualClasspath);
   }

http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartServerCommandTest.java
----------------------------------------------------------------------
diff --git a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartServerCommandTest.java b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartServerCommandTest.java
index a5012f3..e704248 100644
--- a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartServerCommandTest.java
+++ b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartServerCommandTest.java
@@ -54,8 +54,8 @@ public class StartServerCommandTest {
   public void testServerClasspathOrder() {
     String userClasspath = "/path/to/user/lib/app.jar:/path/to/user/classes";
     String expectedClasspath =
-        serverCommands.getGemFireJarPath().concat(File.pathSeparator).concat(userClasspath)
-            .concat(File.pathSeparator).concat(StartMemberCommand.CORE_DEPENDENCIES_JAR_PATHNAME);
+        StartMemberUtils.getGemFireJarPath().concat(File.pathSeparator).concat(userClasspath)
+            .concat(File.pathSeparator).concat(StartMemberUtils.CORE_DEPENDENCIES_JAR_PATHNAME);
     String actualClasspath = serverCommands.getServerClasspath(false, userClasspath);
     assertEquals(expectedClasspath, actualClasspath);
   }

http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/GfshExitCodeStatusClusterConfigServiceCommandTest.java
----------------------------------------------------------------------
diff --git a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/GfshExitCodeStatusClusterConfigServiceCommandTest.java b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/GfshExitCodeStatusClusterConfigServiceCommandTest.java
deleted file mode 100755
index 15b4f8b..0000000
--- a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/GfshExitCodeStatusClusterConfigServiceCommandTest.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * 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.shell;
-
-import static java.util.concurrent.TimeUnit.MINUTES;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import junitparams.JUnitParamsRunner;
-import junitparams.Parameters;
-import org.junit.Assume;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-
-import org.apache.geode.internal.AvailablePort;
-import org.apache.geode.internal.ExitCode;
-import org.apache.geode.internal.process.PidFile;
-import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
-import org.apache.geode.management.internal.cli.util.ThreePhraseGenerator;
-import org.apache.geode.test.dunit.rules.gfsh.GfshExecution;
-import org.apache.geode.test.dunit.rules.gfsh.GfshRule;
-import org.apache.geode.test.dunit.rules.gfsh.GfshScript;
-import org.apache.geode.test.junit.categories.AcceptanceTest;
-
-// Originally created in response to GEODE-2971
-
-@Category(AcceptanceTest.class)
-@RunWith(JUnitParamsRunner.class)
-public class GfshExitCodeStatusClusterConfigServiceCommandTest {
-  private static File toolsJar;
-  private static final ThreePhraseGenerator nameGenerator = new ThreePhraseGenerator();
-  private static final String memberControllerName = "member-controller";
-
-  @Rule
-  public GfshRule gfsh = new GfshRule();
-  private String locatorName;
-  private String serverName;
-
-  private int locatorPort;
-
-  // Some test configuration shorthands
-  private static final TestConfiguration LOCATOR_ONLINE_BUT_NOT_CONNECTED =
-      new TestConfiguration(true, false, false);
-  private static final TestConfiguration LOCATOR_ONLINE_AND_CONNECTED =
-      new TestConfiguration(true, false, true);
-  private static final TestConfiguration BOTH_ONLINE_BUT_NOT_CONNECTED =
-      new TestConfiguration(true, true, false);
-  private static final TestConfiguration BOTH_ONLINE_AND_CONNECTED =
-      new TestConfiguration(true, true, true);
-
-  @BeforeClass
-  public static void classSetup() {
-    File javaHome = new File(System.getProperty("java.home"));
-    String toolsPath =
-        javaHome.getName().equalsIgnoreCase("jre") ? "../lib/tools.jar" : "lib/tools.jar";
-    toolsJar = new File(javaHome, toolsPath);
-  }
-
-  @Before
-  public void setup() {
-    locatorName = "locator-" + nameGenerator.generate('-');
-    serverName = "server-" + nameGenerator.generate('-');
-    locatorPort = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
-  }
-
-  @Test
-  @Parameters(
-      value = {"status locator --port=-10", "status locator --pid=-1", "status server --pid=-1"})
-  public void statusCommandWithInvalidOptionValueShouldFail(String cmd) {
-    GfshScript.of(cmd).withName("test-frame").awaitAtMost(1, MINUTES)
-        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
-  }
-
-
-  @Test
-  @Parameters(value = {"status locator --host=somehostname", "status locator --port=10334",
-      "status locator --dir=.", "status server --dir=.", "status locator --name=some-locator-name",
-      "status server --name=some-server-name", "status locator --pid=100",
-      "status server --pid=100"})
-  public void statusCommandWithValidOptionValueShouldFailWithNoMembers(String cmd) {
-    GfshScript.of(cmd).withName("test-frame").awaitAtMost(1, MINUTES)
-        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
-  }
-
-
-  @Test
-  public void onlineStatusCommandShouldFailWhenNotConnected_locator_name() {
-    TestConfiguration config = LOCATOR_ONLINE_BUT_NOT_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusLocatorCommandByName();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.FATAL);
-  }
-
-
-  @Test
-  public void onlineStatusCommandShouldFailWhenNotConnected_server_name() {
-    TestConfiguration config = BOTH_ONLINE_BUT_NOT_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusServerCommandByName();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.FATAL);
-  }
-
-  @Test
-  public void offlineStatusCommandShouldSucceedWhenNotConnected_locator_port() {
-    // --host defaults to localhost, so `status locator --port=xxx` should still succeed.
-    TestConfiguration config = LOCATOR_ONLINE_BUT_NOT_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusLocatorCommandByPort();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-  @Test
-  public void offlineStatusCommandShouldSucceedWhenNotConnected_locator_host_and_port() {
-    // Since this is still local to the testing VM's machine, `status locator --host=localhost
-    // --port=xxx` should succeed
-    TestConfiguration config = LOCATOR_ONLINE_BUT_NOT_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusLocatorCommandByHostAndPort();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-
-
-  @Test
-  public void onlineStatusCommandShouldSucceedWhenConnected_locator_name() {
-    TestConfiguration config = LOCATOR_ONLINE_AND_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusLocatorCommandByName();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-
-  @Test
-  public void onlineStatusCommandShouldSucceedWhenConnected_server_name() {
-    TestConfiguration config = BOTH_ONLINE_AND_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusServerCommandByName();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-  @Test
-  public void onlineStatusCommandShouldSucceedWhenConnected_locator_port() {
-    TestConfiguration config = LOCATOR_ONLINE_AND_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusLocatorCommandByPort();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-  @Test
-  public void onlineStatusCommandShouldSucceedWhenConnected_locator_host_and_port() {
-    TestConfiguration config = LOCATOR_ONLINE_AND_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusLocatorCommandByHostAndPort();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-
-
-  @Test
-  public void offlineStatusCommandShouldSucceedWhenConnected_locator_dir() {
-    TestConfiguration config = LOCATOR_ONLINE_AND_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusLocatorCommandByDir();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-  @Test
-  public void offlineStatusCommandShouldSucceedWhenConnected_server_dir() {
-    TestConfiguration config = BOTH_ONLINE_AND_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusServerCommandByDir();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-  @Test
-  public void offlineStatusCommandShouldSucceedWhenConnected_locator_pid() throws IOException {
-    Assume.assumeTrue(toolsJar.exists());
-    TestConfiguration config = LOCATOR_ONLINE_AND_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusLocatorCommandByPid();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-  @Test
-  public void offlineStatusCommandShouldSucceedWhenConnected_server_pid() throws IOException {
-    Assume.assumeTrue(toolsJar.exists());
-    TestConfiguration config = BOTH_ONLINE_AND_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusServerCommandByPid();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-
-
-  @Test
-  public void offlineStatusCommandShouldSucceedEvenWhenNotConnected_locator_dir() {
-    TestConfiguration config = LOCATOR_ONLINE_BUT_NOT_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusLocatorCommandByDir();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-  @Test
-  public void offlineStatusCommandShouldSucceedEvenWhenNotConnected_server_dir() {
-    TestConfiguration config = BOTH_ONLINE_BUT_NOT_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusServerCommandByDir();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-  @Test
-  public void offlineStatusCommandShouldSucceedEvenWhenNotConnected_locator_pid()
-      throws IOException {
-    Assume.assumeTrue(toolsJar.exists());
-    TestConfiguration config = LOCATOR_ONLINE_BUT_NOT_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusLocatorCommandByPid();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-  @Test
-  public void offlineStatusCommandShouldSucceedEvenWhenNotConnected_server_pid()
-      throws IOException {
-    Assume.assumeTrue(toolsJar.exists());
-    TestConfiguration config = BOTH_ONLINE_BUT_NOT_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), gfsh);
-
-    String statusCommand = statusServerCommandByPid();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.NORMAL);
-  }
-
-
-
-  private String startLocatorCommand() {
-    return new CommandStringBuilder("start locator").addOption("name", locatorName)
-        .addOption("port", String.valueOf(locatorPort)).toString();
-  }
-
-
-  private String startServerCommand() {
-    return new CommandStringBuilder("start server").addOption("name", serverName).toString();
-  }
-
-
-  private String connectCommand() {
-    return new CommandStringBuilder("connect")
-        .addOption("locator", String.format("localhost[%d]", locatorPort)).toString();
-  }
-
-
-  private String statusServerCommandByName() {
-    return new CommandStringBuilder("status server").addOption("name", serverName).toString();
-  }
-
-  private String statusServerCommandByDir() {
-    String serverDir = gfsh.getTemporaryFolder().getRoot().toPath().resolve(memberControllerName)
-        .resolve(serverName).toAbsolutePath().toString();
-    return new CommandStringBuilder("status server").addOption("dir", serverDir).toString();
-  }
-
-
-  private String statusServerCommandByPid() throws IOException {
-    int serverPid = snoopMemberFile(serverName, "server.pid");
-    return new CommandStringBuilder("status server").addOption("pid", String.valueOf(serverPid))
-        .toString();
-  }
-
-  private String statusLocatorCommandByName() {
-    return new CommandStringBuilder("status locator").addOption("name", locatorName).toString();
-  }
-
-  private String statusLocatorCommandByPort() {
-    return new CommandStringBuilder("status locator").addOption("port", String.valueOf(locatorPort))
-        .toString();
-  }
-
-  private String statusLocatorCommandByHostAndPort() {
-    return new CommandStringBuilder("status locator").addOption("host", "localhost")
-        .addOption("port", String.valueOf(locatorPort)).toString();
-  }
-
-  private String statusLocatorCommandByDir() {
-    String locatorDir = gfsh.getTemporaryFolder().getRoot().toPath().resolve(memberControllerName)
-        .resolve(locatorName).toAbsolutePath().toString();
-    return new CommandStringBuilder("status locator").addOption("dir", locatorDir).toString();
-  }
-
-
-  private String statusLocatorCommandByPid() throws IOException {
-    int locatorPid = snoopMemberFile(locatorName, "locator.pid");
-    return new CommandStringBuilder("status locator").addOption("pid", String.valueOf(locatorPid))
-        .toString();
-  }
-
-  private int snoopMemberFile(String memberName, String pidFileEndsWith) throws IOException {
-    File directory = gfsh.getTemporaryFolder().getRoot().toPath().resolve(memberControllerName)
-        .resolve(memberName).toFile();
-    File[] files = directory.listFiles();
-    if (files == null) {
-      throw new RuntimeException(String.format(
-          "Expected directory ('%s') for member '%s' either does not denote a directory, or an I/O error occurred.",
-          directory.toString(), memberName));
-    }
-    File pidFile = Arrays.stream(files).filter(file -> file.getName().endsWith(pidFileEndsWith))
-        .findFirst().orElseThrow(() -> new RuntimeException(String
-            .format("Expected member '%s' to have pid file but could not find it.", memberName)));
-    return new PidFile(pidFile).readPid();
-  }
-
-  private void executeScriptWithExpectedExitCode(String statusCommand, TestConfiguration config,
-      ExitCode expectedExit) {
-
-    String[] gfshScriptCommands = config.connectedToLocator
-        ? new String[] {connectCommand(), statusCommand} : new String[] {statusCommand};
-    GfshScript gfshScript = GfshScript.of(gfshScriptCommands).withName("test-frame")
-        .awaitAtMost(1, MINUTES).expectExitCode(expectedExit.getValue());
-    if (toolsJar.exists()) {
-      gfshScript.addToClasspath(toolsJar.getAbsolutePath());
-    }
-    gfshScript.execute(gfsh);
-  }
-
-
-  private static class TestConfiguration {
-    TestConfiguration(boolean locatorStarted, boolean serverStarted, boolean connectedToLocator) {
-      this.locatorStarted = locatorStarted;
-      this.serverStarted = serverStarted;
-      this.connectedToLocator = connectedToLocator;
-    }
-
-    private boolean locatorStarted;
-    private boolean serverStarted;
-    private boolean connectedToLocator;
-
-    void startNecessaryMembers(String startLocator, String startServer, GfshRule gfsh) {
-      if (!locatorStarted && !serverStarted) {
-        return;
-      }
-
-      List<String> commands = new ArrayList<>();
-      if (locatorStarted) {
-        commands.add(startLocator);
-      }
-      if (serverStarted) {
-        commands.add(startServer);
-      }
-
-      GfshExecution exec = GfshScript.of(commands.toArray(new String[] {}))
-          .withName(memberControllerName).awaitAtMost(1, MINUTES).execute(gfsh);
-      if (exec.getProcess().exitValue() != 0) {
-        throw new RuntimeException(
-            "The locator and server launcher exited with non-zero exit code.  This failure is beyond the scope of this test.");
-      }
-    }
-  }
-}