You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by hi...@apache.org on 2016/09/13 22:44:41 UTC

[53/61] [abbrv] incubator-geode git commit: GEODE-37 change package name from com.gemstone.gemfire (for ./geode-web/src/test/java/com/gemstone/gemfire)to org.apache.geode for(to ./geode-web/src/test/java/org/apache/geode)

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/shell/RestHttpOperationInvokerJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/shell/RestHttpOperationInvokerJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/shell/RestHttpOperationInvokerJUnitTest.java
new file mode 100644
index 0000000..b11125c
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/shell/RestHttpOperationInvokerJUnitTest.java
@@ -0,0 +1,453 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.web.shell;
+
+import static org.junit.Assert.*;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.ResourceAccessException;
+
+import com.gemstone.gemfire.internal.lang.StringUtils;
+import com.gemstone.gemfire.management.internal.cli.CommandRequest;
+import com.gemstone.gemfire.management.internal.web.AbstractWebTestCase;
+import com.gemstone.gemfire.management.internal.web.domain.Link;
+import com.gemstone.gemfire.management.internal.web.domain.LinkIndex;
+import com.gemstone.gemfire.management.internal.web.http.ClientHttpRequest;
+import com.gemstone.gemfire.management.internal.web.http.HttpMethod;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+/**
+ * The RestHttpOperationInvokerJUnitTest class is a test suite of test cases testing the contract and functionality of the
+ * RestHttpOperationInvoker class.
+ * <p/>
+ * @see java.net.URI
+ * @see com.gemstone.gemfire.management.internal.cli.CommandRequest
+ * @see com.gemstone.gemfire.management.internal.web.http.HttpMethod
+ * @see com.gemstone.gemfire.management.internal.web.domain.Link
+ * @see com.gemstone.gemfire.management.internal.web.domain.LinkIndex
+ * @see com.gemstone.gemfire.management.internal.web.shell.RestHttpOperationInvoker
+ * @see org.junit.Assert
+ * @see org.junit.Test
+ * @since GemFire 8.0
+ */
+@SuppressWarnings("unused")
+@Category(UnitTest.class)
+public class RestHttpOperationInvokerJUnitTest extends AbstractWebTestCase {
+
+  private LinkIndex linkIndex;
+
+  private RestHttpOperationInvoker operationInvoker;
+
+  @Before
+  public void setUp() throws Exception {
+    final Link listLibraries = new Link("list-libraries", toUri("http://host.domain.com/service/v1/libraries"));
+    final Link getLibrary = new Link("get-library", toUri("http://host.domain.com/service/v1/libraries/{name}"));
+    final Link listBooks = new Link("list-books", toUri("http://host.domain.com/service/v1/libraries/{name}/books"));
+    final Link listBooksByAuthor = new Link("list-books", toUri("http://host.domain.com/service/v1/libraries/{name}/books/{author}"));
+    final Link listBooksByAuthorAndCategory = new Link("list-books", toUri("http://host.domain.com/service/v1/libraries/{name}/books/{author}/{category}"));
+    final Link listBooksByAuthorAndYear = new Link("list-books", toUri("http://host.domain.com/service/v1/libraries/{name}/books/{author}/{year}"));
+    final Link listBooksByAuthorCategoryAndYear = new Link("list-books", toUri("http://host.domain.com/service/v1/libraries/{name}/books/{author}/{category}/{year}"));
+    final Link addBook = new Link("add-book", toUri("http://host.domain.com/service/v1/libraries/{name}/books"), HttpMethod.POST);
+    final Link getBookByIsbn = new Link("get-book", toUri("http://host.domain.com/service/v1/libraries/{name}/books/{isbn}"));
+    final Link getBookByTitle = new Link("get-book", toUri("http://host.domain.com/service/v1/libraries/{name}/books/{title}"));
+    final Link removeBook = new Link("remove-book", toUri("http://host.domain.com/service/v1/libraries/{name}/books/{isbn}"), HttpMethod.DELETE);
+
+    linkIndex = new LinkIndex();
+
+    linkIndex.addAll(
+      listLibraries,
+      getLibrary,
+      listBooks,
+      listBooksByAuthor,
+      listBooksByAuthorAndCategory,
+      listBooksByAuthorAndYear,
+      listBooksByAuthorCategoryAndYear,
+      addBook,
+      getBookByIsbn,
+      getBookByTitle,
+      removeBook
+    );
+
+    assertEquals(11, linkIndex.size());
+
+    operationInvoker = new RestHttpOperationInvoker(linkIndex);
+
+    assertSame(linkIndex, operationInvoker.getLinkIndex());
+  }
+
+  @After
+  public void tearDown() {
+    operationInvoker.stop();
+    operationInvoker = null;
+  }
+
+  private CommandRequest createCommandRequest(final String command, final Map<String, String> options) {
+    return new TestCommandRequest(command, options, Collections.<String, String>emptyMap(), null);
+  }
+
+  private CommandRequest createCommandRequest(final String command, final Map<String, String> options, final Map<String, String> environment) {
+    return new TestCommandRequest(command, options, environment, null);
+  }
+
+  private CommandRequest createCommandRequest(final String command, final Map<String, String> options, final byte[][] fileData) {
+    return new TestCommandRequest(command, options, Collections.<String, String>emptyMap(), fileData);
+  }
+
+  private CommandRequest createCommandRequest(final String command, final Map<String, String> options, final Map<String, String> environment, final byte[][] fileData) {
+    return new TestCommandRequest(command, options, environment, fileData);
+  }
+
+  private LinkIndex getLinkIndex() {
+    assertTrue("The LinkIndex was not property initialized!", linkIndex != null);
+    return linkIndex;
+  }
+
+  private RestHttpOperationInvoker getOperationInvoker() {
+    assertTrue("The RestHttpOperationInvoker was not properly initialized!", operationInvoker != null);
+    return operationInvoker;
+  }
+
+  @Test
+  public void testCreateHttpRequest() {
+    final Map<String, String> commandOptions = new HashMap<String, String>();
+
+    commandOptions.put("author", "Adams");
+    commandOptions.put("blankOption", "  ");
+    commandOptions.put("category", "sci-fi");
+    commandOptions.put("emptyOption", StringUtils.EMPTY_STRING);
+    commandOptions.put("isbn", "0-123456789");
+    commandOptions.put("nullOption", null);
+    commandOptions.put("title", "Hitch Hiker's Guide to the Galaxy");
+    commandOptions.put("year", "1983");
+
+    final CommandRequest command = createCommandRequest("add-book", commandOptions);
+
+    final ClientHttpRequest request = getOperationInvoker().createHttpRequest(command);
+
+    assertNotNull(request);
+    assertEquals("POST http://host.domain.com/service/v1/libraries/{name}/books", request.getLink().toHttpRequestLine());
+    assertEquals("Adams", request.getParameterValue("author"));
+    assertEquals("sci-fi", request.getParameterValue("category"));
+    assertEquals("0-123456789", request.getParameterValue("isbn"));
+    assertEquals("Hitch Hiker's Guide to the Galaxy", request.getParameterValue("title"));
+    assertEquals("1983", request.getParameterValue("year"));
+    assertTrue(request.getParameters().containsKey("blankOption"));
+    assertTrue(request.getParameters().containsKey("emptyOption"));
+    assertFalse(request.getParameters().containsKey("nullOption"));
+
+    for (String requestParameter : request.getParameters().keySet()) {
+      assertFalse(requestParameter.startsWith(RestHttpOperationInvoker.ENVIRONMENT_VARIABLE_REQUEST_PARAMETER_PREFIX));
+    }
+
+    assertNull(request.getParameterValue(RestHttpOperationInvoker.RESOURCES_REQUEST_PARAMETER));
+  }
+
+  @Test
+  public void testCreateHttpRequestWithEnvironmentVariables() {
+    final Map<String, String> commandOptions = new HashMap<String, String>(2);
+
+    commandOptions.put("name", "ElLibreDeCongress");
+    commandOptions.put("isbn", "${ISBN}");
+
+    final Map<String, String> environment = new HashMap<String, String>(2);
+
+    environment.put("ISBN", "0-987654321");
+    environment.put("VAR", "test");
+
+    final CommandRequest command = createCommandRequest("get-book", commandOptions, environment);
+
+    final ClientHttpRequest request = getOperationInvoker().createHttpRequest(command);
+
+    assertNotNull(request);
+    assertEquals("GET http://host.domain.com/service/v1/libraries/{name}/books/{isbn}", request.getLink()
+      .toHttpRequestLine());
+    assertEquals("${ISBN}", request.getParameterValue("isbn"));
+    assertFalse(request.getParameters().containsKey("ISBN"));
+    assertEquals("0-987654321", request.getParameterValue(
+      RestHttpOperationInvoker.ENVIRONMENT_VARIABLE_REQUEST_PARAMETER_PREFIX + "ISBN"));
+    assertFalse(request.getParameters().containsKey("VAR"));
+    assertEquals("test", request.getParameterValue(
+      RestHttpOperationInvoker.ENVIRONMENT_VARIABLE_REQUEST_PARAMETER_PREFIX + "VAR"));
+  }
+
+  @Test
+  public void testCreatHttpRequestWithFileData() {
+    final Map<String, String> commandOptions = Collections.singletonMap("isbn", "0-123456789");
+
+    final byte[][] fileData = {
+      "/path/to/book/content.txt".getBytes(),
+      "Once upon a time in a galaxy far, far away...".getBytes()
+    };
+
+    final CommandRequest command = createCommandRequest("add-book", commandOptions, fileData);
+
+    final ClientHttpRequest request = getOperationInvoker().createHttpRequest(command);
+
+    assertNotNull(request);
+    assertEquals("POST http://host.domain.com/service/v1/libraries/{name}/books", request.getLink().toHttpRequestLine());
+    assertEquals("0-123456789", request.getParameterValue("isbn"));
+    assertTrue(request.getParameters().containsKey(RestHttpOperationInvoker.RESOURCES_REQUEST_PARAMETER));
+    assertTrue(request.getParameterValue(RestHttpOperationInvoker.RESOURCES_REQUEST_PARAMETER) instanceof Resource);
+
+    final List<Object> resources = request.getParameterValues(RestHttpOperationInvoker.RESOURCES_REQUEST_PARAMETER);
+
+    assertNotNull(resources);
+    assertFalse(resources.isEmpty());
+    assertEquals(1, resources.size());
+  }
+
+  @Test
+  public void testFindAndResolveLink() throws Exception {
+    final Map<String, String> commandOptions = new HashMap<String, String>();
+
+    commandOptions.put("name", "BarnesN'Noble");
+
+    Link link = getOperationInvoker().findLink(createCommandRequest("list-libraries", commandOptions));
+
+    assertNotNull(link);
+    assertEquals("http://host.domain.com/service/v1/libraries", toString(link.getHref()));
+
+    link = getOperationInvoker().findLink(createCommandRequest("get-library", commandOptions));
+
+    assertNotNull(link);
+    assertEquals("http://host.domain.com/service/v1/libraries/{name}", toString(link.getHref()));
+
+    commandOptions.put("author", "J.K.Rowlings");
+
+    link = getOperationInvoker().findLink(createCommandRequest("list-books", commandOptions));
+
+    assertNotNull(link);
+    assertEquals("http://host.domain.com/service/v1/libraries/{name}/books/{author}", toString(link.getHref()));
+
+    commandOptions.put("category", "sci-fi");
+    commandOptions.put("year", "1998");
+    commandOptions.put("bogus", "data");
+
+    link = getOperationInvoker().findLink(createCommandRequest("list-books", commandOptions));
+
+    assertNotNull(link);
+    assertEquals("http://host.domain.com/service/v1/libraries/{name}/books/{author}/{category}/{year}",
+      toString(link.getHref()));
+
+    commandOptions.remove("category");
+
+    link = getOperationInvoker().findLink(createCommandRequest("list-books", commandOptions));
+
+    assertNotNull(link);
+    assertEquals("http://host.domain.com/service/v1/libraries/{name}/books/{author}/{year}",
+      toString(link.getHref()));
+
+    commandOptions.put("category", "fantasy");
+    commandOptions.put("isbn", "0-123456789");
+    commandOptions.put("title", "Harry Potter");
+
+    link = getOperationInvoker().findLink(createCommandRequest("add-book", commandOptions));
+
+    assertNotNull(link);
+    assertEquals("http://host.domain.com/service/v1/libraries/{name}/books", toString(link.getHref()));
+
+    commandOptions.remove("isbn");
+
+    link = getOperationInvoker().findLink(createCommandRequest("get-book", commandOptions));
+
+    assertNotNull(link);
+    assertEquals("http://host.domain.com/service/v1/libraries/{name}/books/{title}", toString(link.getHref()));
+
+    link = getOperationInvoker().findLink(createCommandRequest("remove-book", commandOptions));
+
+    assertNotNull(link);
+    assertEquals("http://host.domain.com/service/v1/libraries/{name}/books/{isbn}", toString(link.getHref()));
+  }
+
+  @Test
+  public void testProcessCommand() {
+    final String expectedResult = "{\"libraries\":[{\"library-of\":\"Congress\"}]"; // JSON
+
+    final RestHttpOperationInvoker operationInvoker = new RestHttpOperationInvoker(getLinkIndex()) {
+      @Override
+      public boolean isConnected() {
+        return true;
+      }
+
+      @Override
+      @SuppressWarnings("unchecked")
+      protected <T> ResponseEntity<T> send(final ClientHttpRequest request, final Class<T> responseType, final Map<String, ?> uriVariables) {
+        return new ResponseEntity(expectedResult, HttpStatus.OK);
+      }
+    };
+
+    final String actualResult = operationInvoker.processCommand(createCommandRequest("list-libraries",
+      Collections.<String, String>emptyMap()));
+
+    assertEquals(expectedResult, actualResult);
+  }
+
+  @Test
+  public void testProcessCommandDelegatesToSimpleProcessCommand() {
+    final String expectedResult = "<resources>test</resources>";
+
+    final RestHttpOperationInvoker operationInvoker = new RestHttpOperationInvoker(getLinkIndex()) {
+      @Override
+      public boolean isConnected() {
+        return true;
+      }
+
+      @Override
+      protected HttpOperationInvoker getHttpOperationInvoker() {
+        return new AbstractHttpOperationInvoker(AbstractHttpOperationInvoker.REST_API_URL) {
+          @Override public Object processCommand(final CommandRequest command) {
+            return expectedResult;
+          }
+        };
+      }
+
+      @Override
+      protected void printWarning(final String message, final Object... args) {
+      }
+    };
+
+    final String actualResult = operationInvoker.processCommand(createCommandRequest("get resource",
+      Collections.<String, String>emptyMap()));
+
+    assertEquals(expectedResult, actualResult);
+  }
+
+  @Test
+  public void testProcessCommandHandlesResourceAccessException() {
+    final RestHttpOperationInvoker operationInvoker = new RestHttpOperationInvoker(getLinkIndex()) {
+      private boolean connected = true;
+
+      @Override
+      public boolean isConnected() {
+        return connected;
+      }
+
+      @Override
+      protected void printWarning(final String message, final Object... args) {
+      }
+
+      @Override
+      protected <T> ResponseEntity<T> send(final ClientHttpRequest request, final Class<T> responseType, final Map<String, ?> uriVariables) {
+        throw new ResourceAccessException("test");
+      }
+
+      @Override
+      public void stop() {
+        this.connected = false;
+      }
+    };
+
+    assertTrue(operationInvoker.isConnected());
+
+    final String expectedResult = String.format(
+      "The connection to the GemFire Manager's HTTP service @ %1$s failed with: %2$s. "
+        + "Please try reconnecting or see the GemFire Manager's log file for further details.",
+      operationInvoker.getBaseUrl(), "test");
+
+    final String actualResult = operationInvoker.processCommand(createCommandRequest("list-libraries",
+      Collections.<String, String>emptyMap()));
+
+    assertFalse(operationInvoker.isConnected());
+    assertEquals(expectedResult, actualResult);
+  }
+
+  @Test(expected = RestApiCallForCommandNotFoundException.class)
+  public void testProcessCommandThrowsRestApiCallForCommandNotFoundException() {
+    final RestHttpOperationInvoker operationInvoker = new RestHttpOperationInvoker(getLinkIndex()) {
+      @Override
+      public boolean isConnected() {
+        return true;
+      }
+
+      @Override
+      protected HttpOperationInvoker getHttpOperationInvoker() {
+        return null;
+      }
+    };
+
+    try {
+      operationInvoker.processCommand(createCommandRequest("get resource", Collections.<String, String>emptyMap()));
+    }
+    catch (RestApiCallForCommandNotFoundException e) {
+      assertEquals("No REST API call for command (get resource) was found!", e.getMessage());
+      throw e;
+    }
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void testProcessCommandWhenNotConnected() {
+    try {
+      getOperationInvoker().processCommand(createCommandRequest("get-book", Collections.<String, String>emptyMap()));
+    }
+    catch (IllegalStateException e) {
+      assertEquals("Gfsh must be connected to the GemFire Manager in order to process commands remotely!",
+        e.getMessage());
+      throw e;
+    }
+  }
+
+  private static final class TestCommandRequest extends CommandRequest {
+
+    private final Map<String, String> commandParameters = new TreeMap<String, String>();
+
+    private final String command;
+
+    protected TestCommandRequest(final String command,
+                                 final Map<String, String> commandParameters,
+                                 final Map<String, String> environment,
+                                 final byte[][] fileData)
+    {
+      super(environment, fileData);
+
+      assert command != null : "The command cannot be null!";
+
+      this.command = command;
+
+      if (commandParameters != null) {
+        this.commandParameters.putAll(commandParameters);
+      }
+    }
+
+    @Override
+    public String getInput() {
+      return command;
+    }
+
+    @Override
+    public String getName() {
+      return command;
+    }
+
+    @Override
+    public Map<String, String> getParameters() {
+      return Collections.unmodifiableMap(commandParameters);
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/shell/SimpleHttpOperationInvokerJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/shell/SimpleHttpOperationInvokerJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/shell/SimpleHttpOperationInvokerJUnitTest.java
new file mode 100644
index 0000000..557cc20
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/shell/SimpleHttpOperationInvokerJUnitTest.java
@@ -0,0 +1,198 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.web.shell;
+
+import static org.junit.Assert.*;
+
+import java.util.Collections;
+
+import com.gemstone.gemfire.management.internal.cli.CommandRequest;
+import com.gemstone.gemfire.management.internal.web.AbstractWebTestCase;
+import com.gemstone.gemfire.management.internal.web.domain.Link;
+import com.gemstone.gemfire.management.internal.web.http.ClientHttpRequest;
+import com.gemstone.gemfire.management.internal.web.http.HttpHeader;
+import com.gemstone.gemfire.management.internal.web.http.HttpMethod;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.ResourceAccessException;
+
+/**
+ * The SimpleHttpOperationInvokerJUnitTest class is a test suite of test cases testing the contract and functionality of the
+ * SimpleHttpOperationInvoker class.
+ * <p/>
+ * @see com.gemstone.gemfire.management.internal.web.AbstractWebTestCase
+ * @see com.gemstone.gemfire.management.internal.web.shell.SimpleHttpOperationInvoker
+ * @see org.junit.Assert
+ * @see org.junit.After
+ * @see org.junit.Before
+ * @see org.junit.Test
+ * @since GemFire 8.0
+ */
+@Category(UnitTest.class)
+public class SimpleHttpOperationInvokerJUnitTest extends AbstractWebTestCase {
+
+  private SimpleHttpOperationInvoker operationInvoker;
+
+  @Before
+  public void setUp() {
+    operationInvoker = new SimpleHttpOperationInvoker();
+  }
+
+  @After
+  public void tearDown() {
+    operationInvoker.stop();
+    operationInvoker = null;
+  }
+
+  private CommandRequest createCommandRequest(final String command) {
+    return new TestCommandRequest(command);
+  }
+
+  private String getExpectedHttpRequestUrl(final CommandRequest command) {
+    return SimpleHttpOperationInvoker.REST_API_URL.concat(SimpleHttpOperationInvoker.REST_API_MANAGEMENT_COMMANDS_URI)
+      .concat("?").concat(SimpleHttpOperationInvoker.CMD_QUERY_PARAMETER).concat("=").concat(command.getInput());
+  }
+
+  private SimpleHttpOperationInvoker getOperationInvoker() {
+    return operationInvoker;
+  }
+
+  @Test
+  public void testCreateHttpRequest() throws Exception {
+    final CommandRequest command = createCommandRequest("save resource --path=/path/to/file --size=1024KB");
+
+    final ClientHttpRequest request = getOperationInvoker().createHttpRequest(command);
+
+    assertNotNull(request);
+    assertEquals(SimpleHttpOperationInvoker.USER_AGENT_HTTP_REQUEST_HEADER_VALUE,
+      request.getHeaderValue(HttpHeader.USER_AGENT.getName()));
+
+    final Link requestLink = request.getLink();
+
+    assertNotNull(requestLink);
+    assertTrue(toString(requestLink).startsWith("POST"));
+    assertTrue(toString(requestLink).endsWith(command.getInput()));
+  }
+
+  @Test
+  public void testCreateLink() throws Exception {
+    final CommandRequest command = createCommandRequest("delete resource --id=1");
+
+    final Link actualLink = getOperationInvoker().createLink(command);
+
+    assertNotNull(actualLink);
+    assertEquals(SimpleHttpOperationInvoker.LINK_RELATION, actualLink.getRelation());
+    assertEquals(HttpMethod.POST, actualLink.getMethod());
+    assertTrue(toString(actualLink.getHref()).endsWith(command.getInput()));
+  }
+
+  @Test
+  public void testGetHttpRequestUrl() throws Exception {
+    final CommandRequest command = createCommandRequest("get resource --option=value");
+
+    assertEquals(getExpectedHttpRequestUrl(command), toString(getOperationInvoker().getHttpRequestUrl(command)));
+  }
+
+  @Test
+  public void testProcessCommand() {
+    final String expectedResult = "<resource>test</resource>"; // XML
+
+    final SimpleHttpOperationInvoker operationInvoker = new SimpleHttpOperationInvoker() {
+      @Override
+      public boolean isConnected() {
+        return true;
+      }
+
+      @Override
+      @SuppressWarnings("unchecked")
+      protected <T> ResponseEntity<T> send(final ClientHttpRequest request, final Class<T> responseType) {
+        return new ResponseEntity(expectedResult, HttpStatus.OK);
+      }
+    };
+
+    final String actualResult = operationInvoker.processCommand(createCommandRequest("get resource --id=1"));
+
+    assertEquals(expectedResult, actualResult);
+  }
+
+  @Test
+  public void testProcessCommandHandlesResourceAccessException() {
+    final SimpleHttpOperationInvoker operationInvoker = new SimpleHttpOperationInvoker() {
+      private boolean connected = true;
+      @Override
+      public boolean isConnected() {
+        return connected;
+      }
+
+      @Override
+      protected <T> ResponseEntity<T> send(final ClientHttpRequest request, final Class<T> responseType) {
+        throw new ResourceAccessException("test");
+      }
+
+      @Override public void stop() {
+        this.connected = false;
+      }
+    };
+
+    assertTrue(operationInvoker.isConnected());
+
+    final String expectedResult = String.format(
+      "The connection to the GemFire Manager's HTTP service @ %1$s failed with: %2$s. "
+        + "Please try reconnecting or see the GemFire Manager's log file for further details.",
+          operationInvoker.getBaseUrl(), "test");
+
+    final String actualResult = operationInvoker.processCommand(createCommandRequest("get resource --id=1"));
+
+    assertFalse(operationInvoker.isConnected());
+    assertEquals(expectedResult, actualResult);
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void testProcessCommandWhenNotConnected() {
+    try {
+      getOperationInvoker().processCommand(createCommandRequest("get resource"));
+    }
+    catch (IllegalStateException e) {
+      assertEquals("Gfsh must be connected to the GemFire Manager in order to process commands remotely!",
+        e.getMessage());
+      throw e;
+    }
+  }
+
+  private static final class TestCommandRequest extends CommandRequest {
+
+    private final String command;
+
+    protected TestCommandRequest(final String command) {
+      super(Collections.<String, String>emptyMap());
+      assert command != null : "The command cannot be null!";
+      this.command = command;
+    }
+
+    @Override
+    public String getInput() {
+      return command;
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/util/ConvertUtilsJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/util/ConvertUtilsJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/util/ConvertUtilsJUnitTest.java
new file mode 100644
index 0000000..d9eb8e5
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/util/ConvertUtilsJUnitTest.java
@@ -0,0 +1,170 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.web.util;
+
+import static org.junit.Assert.*;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.gemstone.gemfire.internal.util.IOUtils;
+import com.gemstone.gemfire.management.internal.web.io.MultipartFileAdapter;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.Resource;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * The ConvertUtilsJUnitTest class is a test suite testing the contract and functionality of the ConvertUtilsJUnitTest class.
+ * <p/>
+ * @see com.gemstone.gemfire.management.internal.web.util.ConvertUtils
+ * @see org.junit.Assert
+ * @see org.junit.Test
+ * @since GemFire 8.0
+ */
+@Category(UnitTest.class)
+public class ConvertUtilsJUnitTest {
+
+  private MultipartFile createMultipartFile(final String filename, final byte[] content) {
+    return new MultipartFileAdapter() {
+      @Override public byte[] getBytes() throws IOException {
+        return content;
+      }
+      @Override public InputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream(getBytes());
+      }
+      @Override public String getName() {
+        return filename;
+      }
+      @Override public String getOriginalFilename() {
+        return filename;
+      }
+      @Override public long getSize() {
+        return content.length;
+      }
+    };
+  }
+
+  private Resource createResource(final String filename, final byte[] content) {
+    return new ByteArrayResource(content, String.format("Content of file (%1$s).", filename)) {
+      @Override public String getFilename() {
+        return filename;
+      }
+    };
+  }
+
+  @Test
+  public void testConvertFileData() throws IOException {
+    final String[] filenames = { "/path/to/file1.ext", "/path/to/another/file2.ext" };
+    final String[] fileContent = { "This is the contents of file 1.", "This is the contents of file 2." };
+
+    final List<byte[]> fileData = new ArrayList<byte[]>(2);
+
+    for (int index = 0; index < filenames.length; index++) {
+      fileData.add(filenames[index].getBytes());
+      fileData.add(fileContent[index].getBytes());
+    }
+
+    final Resource[] resources = ConvertUtils.convert(fileData.toArray(new byte[fileData.size()][]));
+
+    assertNotNull(resources);
+    assertEquals(filenames.length, resources.length);
+
+    for (int index = 0; index < resources.length; index++) {
+      assertEquals(filenames[index], resources[index].getFilename());
+      assertEquals(fileContent[index], new String(IOUtils.toByteArray(resources[index].getInputStream())));
+    }
+  }
+
+  @Test
+  public void testConvertFileDataWithNull() {
+    final Resource[] resources = ConvertUtils.convert((byte[][]) null);
+
+    assertNotNull(resources);
+    assertEquals(0, resources.length);
+  }
+
+  @Test
+  public void testConvertMultipartFile() throws IOException {
+    final MultipartFile[] files = {
+      createMultipartFile("/path/to/multi-part/file1.txt", "The contents of multi-part file1.".getBytes()),
+      createMultipartFile("/path/to/multi-part/file2.txt", "The contents of multi-part file2.".getBytes())
+    };
+
+    final byte[][] fileData = ConvertUtils.convert(files);
+
+    assertNotNull(fileData);
+    assertEquals(files.length * 2, fileData.length);
+
+    for (int index = 0; index < fileData.length; index += 2) {
+      assertEquals(files[index / 2].getOriginalFilename(), new String(fileData[index]));
+      assertEquals(new String(files[index / 2].getBytes()), new String(fileData[index + 1]));
+    }
+  }
+
+  @Test
+  public void testConvertResource() throws IOException {
+    final Resource[] resources = {
+      createResource("/path/to/file1.txt", "Contents of file1.".getBytes()),
+      createResource("/path/to/file2.txt", "Contents of file2.".getBytes())
+    };
+
+    final byte[][] fileData = ConvertUtils.convert(resources);
+
+    assertNotNull(fileData);
+    assertEquals(resources.length * 2, fileData.length);
+
+    for (int index = 0; index < fileData.length; index += 2) {
+      assertEquals(resources[index / 2].getFilename(), new String(fileData[index]));
+      assertEquals(new String(IOUtils.toByteArray(resources[index / 2].getInputStream())), new String(fileData[index + 1]));
+    }
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testConvertResourceWithResourceHavingNoFilename() throws IOException {
+    try {
+      ConvertUtils.convert(createResource(null, "test".getBytes()));
+    }
+    catch (IllegalArgumentException expected) {
+      assertEquals("The filename of Resource (Byte array resource [Content of file (null).]) must be specified!", expected.getMessage());
+      throw expected;
+    }
+  }
+
+  @Test
+  public void testConvertResourceWithEmpty() throws IOException {
+    final byte[][] fileData = ConvertUtils.convert(new Resource[0]);
+
+    assertNotNull(fileData);
+    assertEquals(0, fileData.length);
+  }
+
+  @Test
+  public void testConvertResourceWithNull() throws IOException {
+    final byte[][] fileData = ConvertUtils.convert((Resource[]) null);
+
+    assertNotNull(fileData);
+    assertEquals(0, fileData.length);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/util/UriUtilsJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/util/UriUtilsJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/util/UriUtilsJUnitTest.java
new file mode 100644
index 0000000..645133a
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/util/UriUtilsJUnitTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.web.util;
+
+import static org.junit.Assert.*;
+
+import java.util.Map;
+
+import com.gemstone.gemfire.management.internal.web.AbstractWebTestCase;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * The UriUtilsJUnitTest class is a test suite of test cases testing the contract and functionality of the UriUtils class.
+ * <p/>
+ * @see com.gemstone.gemfire.management.internal.web.AbstractWebTestCase
+ * @see com.gemstone.gemfire.management.internal.web.util.UriUtils
+ * @see org.junit.Assert
+ * @see org.junit.Test
+ * @since GemFire 8.0
+ */
+@Category(UnitTest.class)
+public class UriUtilsJUnitTest extends AbstractWebTestCase {
+
+  @Test
+  public void testDecodeNull() {
+    assertNull(UriUtils.decode((String) null));
+  }
+
+  @Test
+  public void testDecodeStringArray() throws Exception {
+    final String[] encodedValues = {
+      null,
+      "123",
+      "test",
+      encode("Path/Subpath"),
+      encode(encode(encode("/Customers/Accounts/Orders/Items")))
+    };
+
+    final String[] decodedValues = UriUtils.decode(encodedValues);
+
+    assertSame(encodedValues, decodedValues);
+    assertEquals(5, decodedValues.length);
+    assertNull(decodedValues[0]);
+    assertEquals("123", decodedValues[1]);
+    assertEquals("test", decodedValues[2]);
+    assertEquals("Path/Subpath", decodedValues[3]);
+    assertEquals("/Customers/Accounts/Orders/Items", decodedValues[4]);
+  }
+
+  @Test
+  public void testDecodeMap() throws Exception {
+    final Map<String, Object> encodedForm = createMap(createArray("0", "1", "2", "3", "4"),
+      (Object[]) createArray(null, "123", "test", encode("Path/Subpath"), encode(encode(encode("/Customers/Accounts/Orders/Items")))));
+
+    final Map<String, Object> decodedForm = UriUtils.decode(encodedForm);
+
+    assertSame(encodedForm, decodedForm);
+    assertEquals(5, decodedForm.size());
+    assertNull(decodedForm.get("0"));
+    assertEquals("123", decodedForm.get("1"));
+    assertEquals("test", decodedForm.get("2"));
+    assertEquals("Path/Subpath", decodedForm.get("3"));
+    assertEquals("/Customers/Accounts/Orders/Items", decodedForm.get("4"));
+  }
+
+  @Test
+  public void testEncodeNull() {
+    assertNull(UriUtils.encode((String) null));
+  }
+
+  @Test
+  public void testEncodeStringArray() throws Exception {
+    final String[] values = { null, "123", "test", "Path/Subpath", "/Customers/Accounts/Orders/Items" };
+    final String[] encodedValues = UriUtils.encode(values);
+
+    assertSame(values, encodedValues);
+    assertEquals(5, encodedValues.length);
+    assertNull(encodedValues[0]);
+    assertEquals("123", encodedValues[1]);
+    assertEquals("test", encodedValues[2]);
+    assertEquals(encode("Path/Subpath"), encodedValues[3]);
+    assertEquals(encode("/Customers/Accounts/Orders/Items"), encodedValues[4]);
+  }
+
+  @Test
+  public void testEncodeMap() throws Exception {
+    final Map<String, Object> form = createMap(createArray("0", "1", "2", "3", "4"),
+      (Object[]) createArray(null, "123", "test", "Path/Subpath", "/Customers/Accounts/Orders/Items"));
+
+    final Map<String, Object> encodedForm = UriUtils.encode(form);
+
+    assertSame(form, encodedForm);
+    assertEquals(5, encodedForm.size());
+    assertNull(encodedForm.get("0"));
+    assertEquals("123", encodedForm.get("1"));
+    assertEquals("test", encodedForm.get("2"));
+    assertEquals(encode("Path/Subpath"), encodedForm.get("3"));
+    assertEquals(encode("/Customers/Accounts/Orders/Items"), encodedForm.get("4"));
+  }
+
+}