This is an automated email from the ASF dual-hosted git repository.

prhomberg pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new e8017b5  GEODE-4052: Extract GfshExitCodeStatusCommandsTest to 
multiple acceptance tests for better failure reporting.
e8017b5 is described below

commit e8017b57764bb1a7427fe522803595a08e4b7a4f
Author: Patrick Rhomberg <[email protected]>
AuthorDate: Wed Dec 6 12:36:17 2017 -0800

    GEODE-4052: Extract GfshExitCodeStatusCommandsTest to multiple acceptance 
tests for better failure reporting.
---
 .../cli/shell/GfshExitCodeStatusCommandsTest.java  | 404 ---------------------
 .../shell/StatusLocatorExitCodeAcceptanceTest.java | 267 ++++++++++++++
 .../shell/StatusServerExitCodeAcceptanceTest.java  | 207 +++++++++++
 3 files changed, 474 insertions(+), 404 deletions(-)

diff --git 
a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/GfshExitCodeStatusCommandsTest.java
 
b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/GfshExitCodeStatusCommandsTest.java
deleted file mode 100755
index e833b23..0000000
--- 
a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/GfshExitCodeStatusCommandsTest.java
+++ /dev/null
@@ -1,404 +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.junit.categories.AcceptanceTest;
-import org.apache.geode.test.junit.rules.gfsh.GfshExecution;
-import org.apache.geode.test.junit.rules.gfsh.GfshRule;
-import org.apache.geode.test.junit.rules.gfsh.GfshScript;
-
-// Originally created in response to GEODE-2971
-
-@Category(AcceptanceTest.class)
-@RunWith(JUnitParamsRunner.class)
-public class GfshExitCodeStatusCommandsTest {
-  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 
onlineStatusCommandShouldFailWhenConnectedNonDefaultPort_locator_host() {
-    TestConfiguration config = LOCATOR_ONLINE_AND_CONNECTED;
-    config.startNecessaryMembers(startLocatorCommand(), startServerCommand(), 
gfsh);
-
-    String statusCommand = statusLocatorCommandByHost();
-    executeScriptWithExpectedExitCode(statusCommand, config, ExitCode.FATAL);
-  }
-
-
-
-  @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 statusLocatorCommandByHost() {
-    return new CommandStringBuilder("status locator").addOption("host", 
"localhost").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.");
-      }
-    }
-  }
-}
diff --git 
a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/StatusLocatorExitCodeAcceptanceTest.java
 
b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/StatusLocatorExitCodeAcceptanceTest.java
new file mode 100644
index 0000000..48ecc75
--- /dev/null
+++ 
b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/StatusLocatorExitCodeAcceptanceTest.java
@@ -0,0 +1,267 @@
+/*
+ * 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.BeforeClass;
+import org.junit.ClassRule;
+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.junit.categories.AcceptanceTest;
+import org.apache.geode.test.junit.rules.gfsh.GfshExecution;
+import org.apache.geode.test.junit.rules.gfsh.GfshRule;
+import org.apache.geode.test.junit.rules.gfsh.GfshScript;
+
+/**
+ * See also 
org.apache.geode.management.internal.cli.shell.StatusServerExitCodeAcceptanceTest
+ */
+@Category(AcceptanceTest.class)
+public class StatusLocatorExitCodeAcceptanceTest {
+  private static File toolsJar;
+  private static final ThreePhraseGenerator nameGenerator = new 
ThreePhraseGenerator();
+  private static final String memberControllerName = "member-controller";
+
+  @ClassRule
+  public static GfshRule gfsh = new GfshRule();
+  private static String locatorName;
+
+  private static int locatorPort;
+
+  @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);
+
+    locatorName = "locator-" + nameGenerator.generate('-');
+    locatorPort = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
+
+    GfshExecution exec = 
GfshScript.of(startLocatorCommand()).withName(memberControllerName)
+        .awaitAtMost(4, 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.");
+    }
+  }
+
+  @Test
+  public void statusCommandWithInvalidPortShouldFail() {
+    String commandWithBadPort = "status locator --port=-10";
+    GfshScript.of(commandWithBadPort).withName("test-frame").awaitAtMost(1, 
MINUTES)
+        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
+  }
+
+  @Test
+  public void statusCommandWithInvalidOptionValueShouldFail() {
+    String commandWithBadPid = "status locator --pid=-1";
+    GfshScript.of(commandWithBadPid).withName("test-frame").awaitAtMost(1, 
MINUTES)
+        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
+  }
+
+  @Test
+  public void statusCommandWithIncorrectHostShouldFail() {
+    String commandWithWrongHostname = "status locator 
--host=someIncorrectHostname";
+    
GfshScript.of(commandWithWrongHostname).withName("test-frame").awaitAtMost(1, 
MINUTES)
+        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
+  }
+
+  @Test
+  public void statusCommandWithIncorrectPortShouldFail() {
+    int incorrectPort = 
AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
+    String cmd = "status locator --port=" + incorrectPort;
+    GfshScript.of(cmd).withName("test-frame").awaitAtMost(1, MINUTES)
+        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
+  }
+
+  @Test
+  public void statusCommandWithIncorrectDirShouldFail() {
+    String cmd = "status locator --dir=.";
+    GfshScript.of(cmd).withName("test-frame").awaitAtMost(1, MINUTES)
+        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
+  }
+
+  @Test
+  public void statusCommandWithIncorrectNameShouldFail() {
+    String cmd = "status locator --name=anInvalidMemberName";
+    GfshScript.of(cmd).withName("test-frame").awaitAtMost(1, MINUTES)
+        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
+  }
+
+  @Test
+  public void onlineStatusCommandShouldSucceedWhenConnected_locator_name() {
+    String statusCommand = statusLocatorCommandByName();
+    executeScriptWithExpectedExitCode(true, statusCommand, ExitCode.NORMAL);
+  }
+
+  @Test
+  public void onlineStatusCommandShouldSucceedWhenConnected_locator_port() {
+    String statusCommand = statusLocatorCommandByPort();
+    executeScriptWithExpectedExitCode(true, statusCommand, ExitCode.NORMAL);
+  }
+
+  @Test
+  public void 
onlineStatusCommandShouldSucceedWhenConnected_locator_host_and_port() {
+    String statusCommand = statusLocatorCommandByHostAndPort();
+    executeScriptWithExpectedExitCode(true, statusCommand, ExitCode.NORMAL);
+  }
+
+  @Test
+  public void 
onlineStatusCommandShouldFailWhenConnectedNonDefaultPort_locator_host() {
+    String statusCommand = statusLocatorCommandByHost();
+    executeScriptWithExpectedExitCode(true, statusCommand, ExitCode.FATAL);
+  }
+
+  @Test
+  public void offlineStatusCommandShouldSucceedWhenConnected_locator_dir() {
+    String statusCommand = statusLocatorCommandByDir();
+    executeScriptWithExpectedExitCode(true, statusCommand, ExitCode.NORMAL);
+  }
+
+  @Test
+  public void onlineStatusCommandShouldFailWhenNotConnected_locator_name() {
+    String statusCommand = statusLocatorCommandByName();
+    executeScriptWithExpectedExitCode(false, statusCommand, ExitCode.FATAL);
+  }
+
+  @Test
+  public void offlineStatusCommandShouldSucceedWhenNotConnected_locator_port() 
{
+    // --host defaults to localhost, so `status locator --port=xxx` should 
still succeed.
+    String statusCommand = statusLocatorCommandByPort();
+    executeScriptWithExpectedExitCode(false, statusCommand, ExitCode.NORMAL);
+  }
+
+  @Test
+  public void offlineStatusCommandShouldSucceedWhenConnected_locator_pid() 
throws IOException {
+    Assume.assumeTrue(toolsJar.exists());
+    String statusCommand = statusLocatorCommandByPid();
+    executeScriptWithExpectedExitCode(true, statusCommand, 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
+
+    String statusCommand = statusLocatorCommandByHostAndPort();
+    executeScriptWithExpectedExitCode(false, statusCommand, ExitCode.NORMAL);
+  }
+
+
+  @Test
+  public void 
offlineStatusCommandShouldSucceedEvenWhenNotConnected_locator_dir() {
+    String statusCommand = statusLocatorCommandByDir();
+    executeScriptWithExpectedExitCode(false, statusCommand, ExitCode.NORMAL);
+  }
+
+  @Test
+  public void 
offlineStatusCommandShouldSucceedEvenWhenNotConnected_locator_pid()
+      throws IOException {
+    Assume.assumeTrue(toolsJar.exists());
+
+    String statusCommand = statusLocatorCommandByPid();
+    executeScriptWithExpectedExitCode(false, statusCommand, ExitCode.NORMAL);
+  }
+
+
+  private static String startLocatorCommand() {
+    return new CommandStringBuilder("start locator").addOption("name", 
locatorName)
+        .addOption("port", String.valueOf(locatorPort)).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 statusLocatorCommandByHost() {
+    return new CommandStringBuilder("status locator").addOption("host", 
"localhost").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 String connectCommand() {
+    return new CommandStringBuilder("connect")
+        .addOption("locator", String.format("localhost[%d]", 
locatorPort)).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(boolean connectToLocator, 
String statusCommand,
+      ExitCode expectedExit) {
+
+    String[] gfshScriptCommands = connectToLocator ? 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);
+  }
+
+}
diff --git 
a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/StatusServerExitCodeAcceptanceTest.java
 
b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/StatusServerExitCodeAcceptanceTest.java
new file mode 100755
index 0000000..17d75e6
--- /dev/null
+++ 
b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/shell/StatusServerExitCodeAcceptanceTest.java
@@ -0,0 +1,207 @@
+/*
+ * 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.BeforeClass;
+import org.junit.ClassRule;
+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.junit.categories.AcceptanceTest;
+import org.apache.geode.test.junit.rules.gfsh.GfshExecution;
+import org.apache.geode.test.junit.rules.gfsh.GfshRule;
+import org.apache.geode.test.junit.rules.gfsh.GfshScript;
+
+// Originally created in response to GEODE-2971
+
+/**
+ * See also 
org.apache.geode.management.internal.cli.shell.StatusLocatorExitCodeAcceptanceTest
+ */
+@Category(AcceptanceTest.class)
+public class StatusServerExitCodeAcceptanceTest {
+  private static File toolsJar;
+  private static final ThreePhraseGenerator nameGenerator = new 
ThreePhraseGenerator();
+  private static final String memberControllerName = "member-controller";
+
+  @ClassRule
+  public static GfshRule gfsh = new GfshRule();
+  private static String locatorName;
+  private static String serverName;
+
+  private static int locatorPort;
+
+  @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);
+
+    locatorName = "locator-" + nameGenerator.generate('-');
+    serverName = "server-" + nameGenerator.generate('-');
+    locatorPort = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
+
+    GfshExecution exec = GfshScript.of(startLocatorCommand(), 
startServerCommand())
+        .withName(memberControllerName).awaitAtMost(2, 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.");
+    }
+  }
+
+  @Test
+  public void statusCommandWithInvalidOptionValueShouldFail() {
+    String commandWithBadPid = "status server --pid=-1";
+    GfshScript.of(commandWithBadPid).withName("test-frame").awaitAtMost(1, 
MINUTES)
+        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
+  }
+
+
+  @Test
+  public void statusCommandWithIncorrectDirShouldFail() {
+    String commandWithWrongDir = "status server --dir=.";
+    GfshScript.of(commandWithWrongDir).withName("test-frame").awaitAtMost(1, 
MINUTES)
+        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
+  }
+
+  @Test
+  public void statusCommandWithIncorrectNameShouldFail() {
+    String commandWithWrongName = "status server --name=some-server-name";
+    GfshScript.of(commandWithWrongName).withName("test-frame").awaitAtMost(1, 
MINUTES)
+        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
+  }
+
+  @Test
+  public void statusCommandWithIncorrectPidShouldFail() {
+    String commandWithWrongPid = "status server --pid=100";
+    GfshScript.of(commandWithWrongPid).withName("test-frame").awaitAtMost(1, 
MINUTES)
+        .expectExitCode(ExitCode.FATAL.getValue()).execute(gfsh);
+  }
+
+  @Test
+  public void onlineStatusCommandShouldFailWhenNotConnected_server_name() {
+    String statusCommand = statusServerCommandByName();
+    executeScriptWithExpectedExitCode(false, statusCommand, ExitCode.FATAL);
+  }
+
+  @Test
+  public void onlineStatusCommandShouldSucceedWhenConnected_server_name() {
+    String statusCommand = statusServerCommandByName();
+    executeScriptWithExpectedExitCode(true, statusCommand, ExitCode.NORMAL);
+  }
+
+  @Test
+  public void offlineStatusCommandShouldSucceedWhenConnected_server_dir() {
+    String statusCommand = statusServerCommandByDir();
+    executeScriptWithExpectedExitCode(true, statusCommand, ExitCode.NORMAL);
+  }
+
+  @Test
+  public void offlineStatusCommandShouldSucceedWhenConnected_server_pid() 
throws IOException {
+    Assume.assumeTrue(toolsJar.exists());
+    String statusCommand = statusServerCommandByPid();
+    executeScriptWithExpectedExitCode(true, statusCommand, ExitCode.NORMAL);
+  }
+
+  @Test
+  public void 
offlineStatusCommandShouldSucceedEvenWhenNotConnected_server_dir() {
+
+    String statusCommand = statusServerCommandByDir();
+    executeScriptWithExpectedExitCode(false, statusCommand, ExitCode.NORMAL);
+  }
+
+  @Test
+  public void 
offlineStatusCommandShouldSucceedEvenWhenNotConnected_server_pid()
+      throws IOException {
+    Assume.assumeTrue(toolsJar.exists());
+    String statusCommand = statusServerCommandByPid();
+    executeScriptWithExpectedExitCode(false, statusCommand, ExitCode.NORMAL);
+  }
+
+  private static String startLocatorCommand() {
+    return new CommandStringBuilder("start locator").addOption("name", 
locatorName)
+        .addOption("port", String.valueOf(locatorPort)).toString();
+  }
+
+  private static String startServerCommand() {
+    return new CommandStringBuilder("start server").addOption("name", 
serverName).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 connectCommand() {
+    return new CommandStringBuilder("connect")
+        .addOption("locator", String.format("localhost[%d]", 
locatorPort)).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(boolean connectToLocator, 
String statusCommand,
+      ExitCode expectedExit) {
+
+    String[] gfshScriptCommands = connectToLocator ? 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);
+  }
+}

-- 
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].

Reply via email to