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");
}
}