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

jinmeiliao 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 c6e8c21  GEODE-5971: refactor StartJConsoleCommand to use ResultModel 
(#2962)
c6e8c21 is described below

commit c6e8c2133abfb7db6111099f0a1816aae22c76d3
Author: jinmeiliao <[email protected]>
AuthorDate: Thu Dec 6 13:53:33 2018 -0800

    GEODE-5971: refactor StartJConsoleCommand to use ResultModel (#2962)
    
    Co-authored-by: Peter Tran <[email protected]>
---
 .../commands/lifecycle/StartJConsoleCommand.java   | 134 ++++++++++-----------
 .../lifecycle/StartJConsoleCommandTest.java        |  88 +++++++++++---
 2 files changed, 135 insertions(+), 87 deletions(-)

diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/lifecycle/StartJConsoleCommand.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/lifecycle/StartJConsoleCommand.java
index bc7b23c..0aa4b7c 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/lifecycle/StartJConsoleCommand.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/lifecycle/StartJConsoleCommand.java
@@ -23,23 +23,19 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
-import org.apache.geode.GemFireException;
-import org.apache.geode.SystemFailure;
 import org.apache.geode.internal.lang.ObjectUtils;
-import org.apache.geode.internal.lang.StringUtils;
 import org.apache.geode.internal.util.IOUtils;
 import org.apache.geode.management.cli.CliMetaData;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.GfshParser;
 import org.apache.geode.management.internal.cli.commands.InternalGfshCommand;
-import 
org.apache.geode.management.internal.cli.converters.ConnectionEndpointConverter;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
+import org.apache.geode.management.internal.cli.result.model.InfoResultModel;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.cli.shell.JmxOperationInvoker;
-import org.apache.geode.management.internal.cli.util.ConnectionEndpoint;
 import org.apache.geode.management.internal.cli.util.JdkTool;
 
 public class StartJConsoleCommand extends InternalGfshCommand {
@@ -47,7 +43,7 @@ public class StartJConsoleCommand extends InternalGfshCommand 
{
   @CliCommand(value = CliStrings.START_JCONSOLE, help = 
CliStrings.START_JCONSOLE__HELP)
   @CliMetaData(shellOnly = true, relatedTopic = 
{CliStrings.TOPIC_GEODE_MANAGER,
       CliStrings.TOPIC_GEODE_JMX, CliStrings.TOPIC_GEODE_M_AND_M})
-  public Result startJConsole(
+  public ResultModel startJConsole(
       @CliOption(key = CliStrings.START_JCONSOLE__INTERVAL, 
unspecifiedDefaultValue = "4",
           help = CliStrings.START_JCONSOLE__INTERVAL__HELP) final int interval,
       @CliOption(key = CliStrings.START_JCONSOLE__NOTILE, 
specifiedDefaultValue = "true",
@@ -59,61 +55,68 @@ public class StartJConsoleCommand extends 
InternalGfshCommand {
           unspecifiedDefaultValue = "false",
           help = CliStrings.START_JCONSOLE__VERSION__HELP) final boolean 
version,
       @CliOption(key = CliStrings.START_JCONSOLE__J, optionContext = 
GfshParser.J_OPTION_CONTEXT,
-          help = CliStrings.START_JCONSOLE__J__HELP) final String[] jvmArgs) {
-    try {
-      String[] jconsoleCommandLine =
-          createJConsoleCommandLine(null, interval, notile, pluginpath, 
version, jvmArgs);
-
-      if (isDebugging()) {
-        getGfsh().printAsInfo(
-            String.format("JConsole command-line ($1%s)", 
Arrays.toString(jconsoleCommandLine)));
-      }
+          help = CliStrings.START_JCONSOLE__J__HELP) final String[] jvmArgs)
+      throws InterruptedException, IOException {
+    String[] jconsoleCommandLine =
+        createJConsoleCommandLine(interval, notile, pluginpath, version, 
jvmArgs);
+
+    ResultModel resultModel = new ResultModel();
+    InfoResultModel infoResult = resultModel.addInfo();
+    if (isDebugging()) {
+      infoResult.addLine(
+          String.format("JConsole command-line ($1%s)", 
Arrays.toString(jconsoleCommandLine)));
+    }
 
-      Process jconsoleProcess = Runtime.getRuntime().exec(jconsoleCommandLine);
+    Process jconsoleProcess = getProcess(jconsoleCommandLine);
 
-      StringBuilder message = new StringBuilder();
+    StringBuilder message;
 
-      if (version) {
-        jconsoleProcess.waitFor();
+    if (version) {
+      jconsoleProcess.waitFor();
+      message = getErrorStringBuilder(jconsoleProcess);
+    } else {
+      message = new StringBuilder();
+      message.append(CliStrings.START_JCONSOLE__RUN);
 
-        BufferedReader reader =
-            new BufferedReader(new 
InputStreamReader(jconsoleProcess.getErrorStream()));
+      String jconsoleProcessOutput = getProcessOutput(jconsoleProcess);
 
-        for (String line = reader.readLine(); line != null; line = 
reader.readLine()) {
-          message.append(line);
-          message.append(StringUtils.LINE_SEPARATOR);
-        }
+      if (StringUtils.isNotBlank(jconsoleProcessOutput)) {
+        message.append(System.lineSeparator());
+        message.append(jconsoleProcessOutput);
+      }
+    }
 
-        IOUtils.close(reader);
-      } else {
-        getGfsh().printAsInfo(CliStrings.START_JCONSOLE__RUN);
+    infoResult.addLine(message.toString());
 
-        String jconsoleProcessOutput = 
waitAndCaptureProcessStandardErrorStream(jconsoleProcess);
+    return resultModel;
+  }
 
-        if (StringUtils.isNotBlank(jconsoleProcessOutput)) {
-          message.append(StringUtils.LINE_SEPARATOR);
-          message.append(jconsoleProcessOutput);
-        }
-      }
+  StringBuilder getErrorStringBuilder(Process jconsoleProcess) throws 
IOException {
+    StringBuilder message;
+    message = new StringBuilder();
+    BufferedReader reader =
+        new BufferedReader(new 
InputStreamReader(jconsoleProcess.getErrorStream()));
 
-      return ResultBuilder.createInfoResult(message.toString());
-    } catch (GemFireException | IllegalStateException | 
IllegalArgumentException e) {
-      return ResultBuilder.createShellClientErrorResult(e.getMessage());
-    } catch (IOException e) {
-      return ResultBuilder
-          
.createShellClientErrorResult(CliStrings.START_JCONSOLE__IO_EXCEPTION_MESSAGE);
-    } catch (VirtualMachineError e) {
-      SystemFailure.initiateFailure(e);
-      throw e;
-    } catch (Throwable t) {
-      SystemFailure.checkFailure();
-      return ResultBuilder.createShellClientErrorResult(
-          String.format(CliStrings.START_JCONSOLE__CATCH_ALL_ERROR_MESSAGE, 
t.getMessage()));
+    for (String line = reader.readLine(); line != null; line = 
reader.readLine()) {
+      message.append(line);
+      message.append(System.lineSeparator());
     }
+
+    IOUtils.close(reader);
+    return message;
+  }
+
+  String getProcessOutput(Process jconsoleProcess) {
+    return waitAndCaptureProcessStandardErrorStream(jconsoleProcess);
+  }
+
+  Process getProcess(String[] jconsoleCommandLine) throws IOException {
+    return Runtime.getRuntime().exec(jconsoleCommandLine);
   }
 
-  protected String[] createJConsoleCommandLine(final String member, final int 
interval,
-      final boolean notile, final String pluginpath, final boolean version,
+  protected String[] createJConsoleCommandLine(final int interval,
+      final boolean notile, final String pluginpath,
+      final boolean version,
       final String[] jvmArgs) {
     List<String> commandLine = new ArrayList<>();
 
@@ -138,7 +141,7 @@ public class StartJConsoleCommand extends 
InternalGfshCommand {
         }
       }
 
-      String jmxServiceUrl = getJmxServiceUrlAsString(member);
+      String jmxServiceUrl = getJmxServiceUrlAsString();
 
       if (StringUtils.isNotBlank(jmxServiceUrl)) {
         commandLine.add(jmxServiceUrl);
@@ -148,29 +151,14 @@ public class StartJConsoleCommand extends 
InternalGfshCommand {
     return commandLine.toArray(new String[commandLine.size()]);
   }
 
-  protected String getJmxServiceUrlAsString(final String member) {
-    if (StringUtils.isNotBlank(member)) {
-      ConnectionEndpointConverter converter = new 
ConnectionEndpointConverter();
-
-      try {
-        ConnectionEndpoint connectionEndpoint =
-            converter.convertFromText(member, ConnectionEndpoint.class, null);
-        String hostAndPort = connectionEndpoint.getHost() + ":" + 
connectionEndpoint.getPort();
-        return String.format("service:jmx:rmi://%s/jndi/rmi://%s/jmxrmi", 
hostAndPort, hostAndPort);
-      } catch (Exception e) {
-        throw new IllegalArgumentException(
-            
CliStrings.START_JCONSOLE__CONNECT_BY_MEMBER_NAME_ID_ERROR_MESSAGE);
-      }
-    } else {
-      if (isConnectedAndReady()
-          && (getGfsh().getOperationInvoker() instanceof JmxOperationInvoker)) 
{
-        JmxOperationInvoker jmxOperationInvoker =
-            (JmxOperationInvoker) getGfsh().getOperationInvoker();
+  String getJmxServiceUrlAsString() {
+    if (isConnectedAndReady()
+        && (getGfsh().getOperationInvoker() instanceof JmxOperationInvoker)) {
+      JmxOperationInvoker jmxOperationInvoker =
+          (JmxOperationInvoker) getGfsh().getOperationInvoker();
 
-        return ObjectUtils.toString(jmxOperationInvoker.getJmxServiceUrl());
-      }
+      return ObjectUtils.toString(jmxOperationInvoker.getJmxServiceUrl());
     }
-
     return null;
   }
 }
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/lifecycle/StartJConsoleCommandTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/lifecycle/StartJConsoleCommandTest.java
index 9b4733e..c018b13 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/lifecycle/StartJConsoleCommandTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/lifecycle/StartJConsoleCommandTest.java
@@ -12,29 +12,89 @@
  * or implied. See the License for the specific language governing permissions 
and limitations under
  * the License.
  */
+
 package org.apache.geode.management.internal.cli.commands.lifecycle;
 
-import static org.junit.Assert.assertEquals;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
+import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 
-import org.apache.geode.management.internal.cli.i18n.CliStrings;
+import org.apache.geode.management.internal.cli.shell.Gfsh;
+import org.apache.geode.test.junit.rules.GfshParserRule;
 
 public class StartJConsoleCommandTest {
+
+  @Rule
+  public GfshParserRule gfshParser = new GfshParserRule();
+
+  private StartJConsoleCommand command;
+  private Gfsh gfsh;
+  ArgumentCaptor<String[]> argumentCaptor;
+
+  @Before
+  public void setUp() throws Exception {
+    command = spy(StartJConsoleCommand.class);
+    gfsh = mock(Gfsh.class);
+    doReturn(gfsh).when(command).getGfsh();
+
+    Process process = mock(Process.class);
+    doReturn(process).when(command).getProcess(any(String[].class));
+    doReturn("some output").when(command).getProcessOutput(process);
+
+    argumentCaptor = ArgumentCaptor.forClass(String[].class);
+  }
+
   @Test
-  public void testCreateJmxServerUrlWithMemberName() {
-    
assertEquals("service:jmx:rmi://localhost:8192/jndi/rmi://localhost:8192/jmxrmi",
-        new 
StartJConsoleCommand().getJmxServiceUrlAsString("localhost[8192]"));
+  public void succcessOutput() throws Exception {
+    gfshParser.executeAndAssertThat(command, "start jconsole")
+        .containsOutput("some output");
+
+    verify(command, times(1)).getProcess(argumentCaptor.capture());
+
+    String[] commandString = argumentCaptor.getValue();
+    assertThat(commandString).hasSize(2);
+    assertThat(commandString[0]).contains("jconsole");
+    assertThat(commandString[1]).isEqualTo("-interval=4");
   }
 
-  @Test(expected = IllegalArgumentException.class)
-  public void testCreateJmxServiceUrlWithInvalidMemberName() {
-    try {
-      System.err.println(new 
StartJConsoleCommand().getJmxServiceUrlAsString("memberOne[]"));
-    } catch (IllegalArgumentException expected) {
-      
assertEquals(CliStrings.START_JCONSOLE__CONNECT_BY_MEMBER_NAME_ID_ERROR_MESSAGE,
-          expected.getMessage());
-      throw expected;
-    }
+
+  @Test
+  public void succcessOutputWithVersion() throws Exception {
+    StringBuilder builder = new StringBuilder();
+    builder.append("some error message");
+    doReturn(builder).when(command).getErrorStringBuilder(any());
+
+    gfshParser.executeAndAssertThat(command, "start jconsole --version")
+        .containsOutput("some error message");
+
+    verify(command, times(1)).getProcess(argumentCaptor.capture());
+
+    String[] commandString = argumentCaptor.getValue();
+    assertThat(commandString).hasSize(2);
+    assertThat(commandString[0]).contains("jconsole");
+    assertThat(commandString[1]).isEqualTo("-version");
+  }
+
+  @Test
+  public void successWithServiceUrl() throws Exception {
+    doReturn("someUrl.com").when(command).getJmxServiceUrlAsString();
+    gfshParser.executeAndAssertThat(command, "start jconsole")
+        .containsOutput("some output");
+
+    verify(command, times(1)).getProcess(argumentCaptor.capture());
+    String[] commandString = argumentCaptor.getValue();
+    assertThat(commandString).hasSize(3);
+    assertThat(commandString[0]).contains("jconsole");
+    assertThat(commandString[1]).isEqualTo("-interval=4");
+    assertThat(commandString[2]).isEqualTo("someUrl.com");
   }
 }

Reply via email to