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:42 UTC

[54/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/cli/commands/DataCommandsOverHttpDistributedTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/DataCommandsOverHttpDistributedTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/DataCommandsOverHttpDistributedTest.java
new file mode 100644
index 0000000..11b8ab1
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/DataCommandsOverHttpDistributedTest.java
@@ -0,0 +1,151 @@
+/*
+ * 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.cli.commands;
+
+import static com.gemstone.gemfire.test.dunit.LogWriterUtils.*;
+import static com.gemstone.gemfire.test.dunit.Wait.*;
+import static org.junit.Assert.*;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionFactory;
+import com.gemstone.gemfire.cache.RegionShortcut;
+import com.gemstone.gemfire.management.DistributedRegionMXBean;
+import com.gemstone.gemfire.management.ManagementService;
+import com.gemstone.gemfire.management.cli.Result;
+import com.gemstone.gemfire.management.internal.cli.result.CommandResult;
+import com.gemstone.gemfire.test.dunit.Host;
+import com.gemstone.gemfire.test.dunit.SerializableRunnable;
+import com.gemstone.gemfire.test.dunit.VM;
+import com.gemstone.gemfire.test.dunit.WaitCriterion;
+import com.gemstone.gemfire.test.junit.categories.DistributedTest;
+
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.ProvideSystemProperty;
+import org.junit.experimental.categories.Category;
+
+@Category(DistributedTest.class)
+@SuppressWarnings("deprecated")
+public class DataCommandsOverHttpDistributedTest extends CliCommandTestBase {
+
+  private static final String REBALANCE_REGION_NAME = DataCommandsOverHttpDistributedTest.class.getSimpleName() + "Region";
+
+  @ClassRule
+  public static ProvideSystemProperty provideSystemProperty = new ProvideSystemProperty(CliCommandTestBase.USE_HTTP_SYSTEM_PROPERTY, "true");
+
+  @Test
+  public void testSimulateForEntireDSWithTimeout() {
+    setupTestRebalanceForEntireDS();
+    //check if DistributedRegionMXBean is available so that command will not fail
+    final VM manager = Host.getHost(0).getVM(0);
+    manager.invoke(checkRegionMBeans);
+
+    getLogWriter().info("testSimulateForEntireDS verified MBean and executing command");
+
+    String command = "rebalance --simulate=true --time-out=-1";
+
+    CommandResult cmdResult = executeCommand(command);
+
+    getLogWriter().info("testSimulateForEntireDS just after executing " + cmdResult);
+
+    if (cmdResult != null) {
+      String stringResult = commandResultToString(cmdResult);
+      getLogWriter().info("testSimulateForEntireDS stringResult : " + stringResult);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    } else {
+      fail("testRebalanceForIncludeRegionFunction failed as did not get CommandResult");
+    }
+  }
+
+  SerializableRunnable checkRegionMBeans = new SerializableRunnable() {
+    @Override
+    public void run() {
+      final WaitCriterion waitForMaangerMBean = new WaitCriterion() {
+        @Override
+        public boolean done() {
+          final ManagementService service = ManagementService.getManagementService(getCache());
+          final DistributedRegionMXBean bean = service.getDistributedRegionMXBean(
+            Region.SEPARATOR + REBALANCE_REGION_NAME);
+          if (bean == null) {
+            getLogWriter().info("Still probing for checkRegionMBeans ManagerMBean");
+            return false;
+          } else {
+            // verify that bean is proper before executing tests
+            if (bean.getMembers() != null && bean.getMembers().length > 1 && bean.getMemberCount() > 0 && service.getDistributedSystemMXBean().listRegions().length >= 2) {
+              return true;
+            } else {
+              return false;
+            }
+          }
+        }
+
+        @Override
+        public String description() {
+          return "Probing for testRebalanceCommandForSimulateWithNoMember ManagerMBean";
+        }
+      };
+      waitForCriterion(waitForMaangerMBean, 2 * 60 * 1000, 2000, true);
+      DistributedRegionMXBean bean = ManagementService.getManagementService(getCache()).getDistributedRegionMXBean(
+        "/" + REBALANCE_REGION_NAME);
+      assertNotNull(bean);
+    }
+  };
+
+  void setupTestRebalanceForEntireDS() {
+    final VM vm1 = Host.getHost(0).getVM(1);
+    final VM vm2 = Host.getHost(0).getVM(2);
+    setUpJmxManagerOnVm0ThenConnect(null);
+
+    vm1.invoke(new SerializableRunnable() {
+      public void run() {
+
+        // no need to close cache as it will be closed as part of teardown2
+        Cache cache = getCache();
+
+        RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+        Region region = dataRegionFactory.create(REBALANCE_REGION_NAME);
+        for (int i = 0; i < 10; i++) {
+          region.put("key" + (i + 200), "value" + (i + 200));
+        }
+        region = dataRegionFactory.create(REBALANCE_REGION_NAME + "Another1");
+        for (int i = 0; i < 100; i++) {
+          region.put("key" + (i + 200), "value" + (i + 200));
+        }
+      }
+    });
+
+    vm2.invoke(new SerializableRunnable() {
+      public void run() {
+
+        // no need to close cache as it will be closed as part of teardown2
+        Cache cache = getCache();
+
+        RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+        Region region = dataRegionFactory.create(REBALANCE_REGION_NAME);
+        for (int i = 0; i < 100; i++) {
+          region.put("key" + (i + 400), "value" + (i + 400));
+        }
+        region = dataRegionFactory.create(REBALANCE_REGION_NAME + "Another2");
+        for (int i = 0; i < 10; i++) {
+          region.put("key" + (i + 200), "value" + (i + 200));
+        }
+      }
+    });
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/security/GfshCommandsOverHttpSecurityTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/security/GfshCommandsOverHttpSecurityTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/security/GfshCommandsOverHttpSecurityTest.java
new file mode 100644
index 0000000..313f31a
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/security/GfshCommandsOverHttpSecurityTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.security;
+
+import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
+
+import com.gemstone.gemfire.test.junit.categories.SecurityTest;
+import org.junit.experimental.categories.Category;
+
+@Category({ IntegrationTest.class, SecurityTest.class })
+public class GfshCommandsOverHttpSecurityTest extends GfshCommandsSecurityTest {
+  public GfshCommandsOverHttpSecurityTest(){
+    gfshConnection = new GfshShellConnectionRule(jmxPort, httpPort, true);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/AbstractWebTestCase.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/AbstractWebTestCase.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/AbstractWebTestCase.java
new file mode 100644
index 0000000..ae5c749
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/AbstractWebTestCase.java
@@ -0,0 +1,96 @@
+/*
+ * 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;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.gemstone.gemfire.internal.lang.StringUtils;
+import com.gemstone.gemfire.management.internal.web.domain.Link;
+
+/**
+ * The AbstractWebDomainTests class is abstract base class containing functionality common to a test suite classes
+ * in the com.gemstone.gemfire.management.internal.web.domain package.
+ * <p/>
+ * @see java.net.URI
+ * @see java.net.URLDecoder
+ * @see java.net.URLEncoder
+ * @see com.gemstone.gemfire.management.internal.web.domain.Link
+ * @since GemFire 8.0
+ */
+@SuppressWarnings("unused")
+public abstract class AbstractWebTestCase {
+
+  protected <E> E[] createArray(final E... array) {
+    return array;
+  }
+
+  protected <K, V> Map<K, V> createMap(final K[] keys, final V[] values) {
+    assert keys != null : "The Keys for the Map cannot be null!";
+    assert values != null : "The Values for the Map cannot be null!";
+    assert keys.length == values.length;
+
+    final Map<K, V> map = new HashMap<K, V>(keys.length);
+    int index = 0;
+
+    for (final K key : keys) {
+      map.put(key, values[index++]);
+    }
+
+    return map;
+  }
+
+  protected String decode(final String encodedValue) throws UnsupportedEncodingException {
+    return URLDecoder.decode(encodedValue, StringUtils.UTF_8);
+  }
+
+  protected String encode(final String value) throws UnsupportedEncodingException {
+    return URLEncoder.encode(value, StringUtils.UTF_8);
+  }
+
+  protected String toString(final Link... links) throws UnsupportedEncodingException {
+    final StringBuilder buffer = new StringBuilder("[");
+    int count = 0;
+
+    for (final Link link : links) {
+      buffer.append(count++ > 0 ? ", " : StringUtils.EMPTY_STRING).append(toString(link));
+
+    }
+
+    buffer.append("]");
+
+    return buffer.toString();
+  }
+
+  protected String toString(final Link link) throws UnsupportedEncodingException {
+    return link.toHttpRequestLine();
+  }
+
+  protected String toString(final URI uri) throws UnsupportedEncodingException {
+    return decode(uri.toString());
+  }
+
+  protected URI toUri(final String uriString) throws UnsupportedEncodingException, URISyntaxException {
+    return new URI(encode(uriString));
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/controllers/ShellCommandsControllerJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/controllers/ShellCommandsControllerJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/controllers/ShellCommandsControllerJUnitTest.java
new file mode 100644
index 0000000..8fd3127
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/controllers/ShellCommandsControllerJUnitTest.java
@@ -0,0 +1,238 @@
+/*
+ * 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.controllers;
+
+import static org.junit.Assert.*;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.shell.core.CommandMarker;
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.gemstone.gemfire.management.cli.CliMetaData;
+import com.gemstone.gemfire.management.internal.cli.util.ClasspathScanLoadHelper;
+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.util.UriUtils;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+/**
+ * The ShellCommandsControllerJUnitTest class is a test suite of test cases testing the contract and functionality of the
+ * ShellCommandsController class, and specifically ensuring that all GemFire Gfsh commands have a corresponding
+ * Management REST API call and web service endpoint in the GemFire Management REST Interface.
+ * <p/>
+ * @see org.junit.Test
+ * @see com.gemstone.gemfire.management.internal.web.controllers.ShellCommandsController
+ * @since GemFire 8.0
+ */
+@Category(UnitTest.class)
+public class ShellCommandsControllerJUnitTest {
+
+  private static ShellCommandsController controller;
+
+  @BeforeClass
+  public static void setupBeforeClass() {
+    controller = new ShellCommandsController();
+    MockHttpServletRequest request = new MockHttpServletRequest();
+    request.setContextPath("gemfire");
+    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
+  }
+
+  @AfterClass
+  public static void tearDownAfterClass() {
+    controller = null;
+  }
+
+  private List<String> getCliCommands() {
+    try {
+      Set<Class<?>> commandClasses = ClasspathScanLoadHelper.loadAndGet(
+        "com.gemstone.gemfire.management.internal.cli.commands", CommandMarker.class, true);
+
+      List<String> commands = new ArrayList<>(commandClasses.size());
+
+      for (Class<?> commandClass : commandClasses) {
+        for (Method method : commandClass.getMethods()) {
+          if (method.isAnnotationPresent(CliCommand.class)) {
+            if (!(method.isAnnotationPresent(CliMetaData.class)
+              && method.getAnnotation(CliMetaData.class).shellOnly()))
+            {
+              CliCommand commandAnnotation = method.getAnnotation(CliCommand.class);
+              commands.addAll(Arrays.asList(commandAnnotation.value()));
+            }
+          }
+        }
+      }
+
+      return commands;
+    }
+    catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private List<String> getControllerWebServiceEndpoints() {
+    RequestAttributes requestAttrs = RequestContextHolder.getRequestAttributes();
+    HttpServletRequest servletRequest = ((ServletRequestAttributes) requestAttrs).getRequest();
+    String scheme = servletRequest.getScheme();
+
+    try {
+      Set<Class<?>> controllerClasses = ClasspathScanLoadHelper.loadAndGet(
+        "com.gemstone.gemfire.management.internal.web.controllers", AbstractCommandsController.class, true);
+
+      List<String> controllerWebServiceEndpoints = new ArrayList<>(controllerClasses.size());
+
+      for (Class<?> controllerClass : controllerClasses) {
+        if (!AbstractCommandsController.class.equals(controllerClass)) {
+          for (Method method : controllerClass.getMethods()) {
+            if (method.isAnnotationPresent(RequestMapping.class)) {
+              RequestMapping requestMappingAnnotation = method.getAnnotation(RequestMapping.class);
+
+              String webServiceEndpoint = String.format("%1$s %2$s", requestMappingAnnotation.method()[0],
+                UriUtils.decode(controller.toUri(requestMappingAnnotation.value()[0], scheme).toString()));
+
+              String[] requestParameters = requestMappingAnnotation.params();
+
+              if (requestParameters.length > 0) {
+                webServiceEndpoint += "?".concat(
+                  com.gemstone.gemfire.internal.lang.StringUtils.concat(requestParameters, "&amp;"));
+              }
+
+              controllerWebServiceEndpoints.add(webServiceEndpoint);
+            }
+          }
+        }
+      }
+
+      return controllerWebServiceEndpoints;
+    }
+    catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  @Test
+  public void testUniqueIndex() {
+    LinkIndex linkIndex = controller.index("https");
+
+    List<String> conflicts = new ArrayList<>();
+    Map<String, String> uriRelationMapping = new HashMap<>(linkIndex.size());
+
+    for (Link link : linkIndex) {
+      if (uriRelationMapping.containsKey(link.toHttpRequestLine())) {
+        conflicts.add(String.format("REST API endpoint (%1$s) for (%2$s) conflicts with the REST API endpoint for (%3$s)",
+          link.toHttpRequestLine(), link.getRelation(), uriRelationMapping.get(link.toHttpRequestLine())));
+      }
+      else {
+        uriRelationMapping.put(link.toHttpRequestLine(), link.getRelation());
+      }
+    }
+
+    assertTrue(String.format("Conflicts: %1$s!", conflicts), conflicts.isEmpty());
+  }
+
+  @Test
+  public void testIndex() {
+    List<String> commands = getCliCommands();
+
+    assertNotNull(commands);
+    assertFalse(commands.isEmpty());
+
+    LinkIndex linkIndex = controller.index("https");
+
+    assertNotNull(linkIndex);
+    assertFalse(linkIndex.isEmpty());
+
+    List<String> linkCommands = new ArrayList<>(linkIndex.size());
+
+    for (Link link : linkIndex) {
+      linkCommands.add(link.getRelation());
+    }
+
+    assertEquals(linkIndex.size(), linkCommands.size());
+
+    List<String> missingLinkCommands = new ArrayList<>(commands);
+
+    missingLinkCommands.removeAll(linkCommands);
+
+    assertTrue(String.format(
+      "The GemFire Management REST API Link Index is missing Link(s) for the following command(s): %1$s",
+        missingLinkCommands), missingLinkCommands.isEmpty());
+  }
+
+  @Test
+  public void testCommandHasRestApiControllerWebServiceEndpoint() {
+    List<String> controllerWebServiceEndpoints = getControllerWebServiceEndpoints();
+
+    assertNotNull(controllerWebServiceEndpoints);
+    assertFalse(controllerWebServiceEndpoints.isEmpty());
+
+    LinkIndex linkIndex = controller.index("http");
+
+    assertNotNull(linkIndex);
+    assertFalse(linkIndex.isEmpty());
+
+    List<String> linkWebServiceEndpoints = new ArrayList<>(linkIndex.size());
+
+    for (Link link : linkIndex) {
+      linkWebServiceEndpoints.add(link.toHttpRequestLine());
+    }
+
+    assertEquals(linkIndex.size(), linkWebServiceEndpoints.size());
+
+    List<String> missingControllerWebServiceEndpoints = new ArrayList<>(linkWebServiceEndpoints);
+
+    missingControllerWebServiceEndpoints.removeAll(controllerWebServiceEndpoints);
+
+    assertTrue(String.format(
+        "The Management REST API Web Service Controllers in (%1$s) are missing the following REST API Web Service Endpoint(s): %2$s!",
+        getClass().getPackage().getName(), missingControllerWebServiceEndpoints), missingControllerWebServiceEndpoints.isEmpty());
+  }
+
+  @Test
+  public void testIndexUrisHaveCorrectScheme() {
+    String versionCmd = "version";
+    List<String> controllerWebServiceEndpoints = getControllerWebServiceEndpoints();
+
+    assertNotNull(controllerWebServiceEndpoints);
+    assertFalse(controllerWebServiceEndpoints.isEmpty());
+
+    String testScheme = "xyz";
+    LinkIndex linkIndex = controller.index(testScheme);
+
+    assertNotNull(linkIndex);
+    assertFalse(linkIndex.isEmpty());
+
+    assertTrue(String.format("Link does not have correct scheme %1$s", linkIndex.find(versionCmd)),
+        testScheme.equals(linkIndex.find(versionCmd).getHref().getScheme()));
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/controllers/support/LoginHandlerInterceptorJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/controllers/support/LoginHandlerInterceptorJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/controllers/support/LoginHandlerInterceptorJUnitTest.java
new file mode 100644
index 0000000..0037a48
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/controllers/support/LoginHandlerInterceptorJUnitTest.java
@@ -0,0 +1,273 @@
+/*
+ * 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.controllers.support;
+
+import static org.junit.Assert.*;
+
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+
+import edu.umd.cs.mtc.MultithreadedTestCase;
+import edu.umd.cs.mtc.TestFramework;
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.jmock.lib.concurrent.Synchroniser;
+import org.jmock.lib.legacy.ClassImposteriser;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+/**
+ * The LoginHandlerInterceptorJUnitTest class is a test suite of test cases to test the contract
+ * and functionality of the Spring HandlerInterceptor, LoginHandlerInterceptor class.
+ * 
+ * @see org.jmock.Mockery
+ * @see org.junit.Assert
+ * @see org.junit.Test
+ * @since GemFire 8.0
+ */
+@Category(UnitTest.class)
+public class LoginHandlerInterceptorJUnitTest {
+
+  private Mockery mockContext;
+
+  @Before
+  public void setUp() {
+    mockContext = new Mockery();
+    mockContext.setImposteriser(ClassImposteriser.INSTANCE);
+    mockContext.setThreadingPolicy(new Synchroniser());
+  }
+
+  @After
+  public void tearDown() {
+    mockContext.assertIsSatisfied();
+    mockContext = null;
+  }
+
+  private String createEnvironmentVariable(final String name) {
+    return (LoginHandlerInterceptor.ENVIRONMENT_VARIABLE_REQUEST_PARAMETER_PREFIX + name);
+  }
+
+  private <T> Enumeration<T> enumeration(final Iterator<T> iterator) {
+    return new Enumeration<T>() {
+      public boolean hasMoreElements() {
+        return iterator.hasNext();
+      }
+      public T nextElement() {
+        return iterator.next();
+      }
+    };
+  }
+
+  @Test
+  public void testPreHandleAfterCompletion() throws Exception {
+    final Map<String, String> requestParameters = new HashMap<>(2);
+    final Map<String, String> requestHeaders = new HashMap<>();
+
+    requestParameters.put("parameter", "one");
+    requestParameters.put(createEnvironmentVariable("variable"), "two");
+
+    final HttpServletRequest mockHttpRequest = mockContext.mock(HttpServletRequest.class, "testPreHandleAfterCompletion.HttpServletRequest");
+
+    mockContext.checking(new Expectations() {{
+      oneOf(mockHttpRequest).getParameterNames();
+      will(returnValue(enumeration(requestParameters.keySet().iterator())));
+      oneOf(mockHttpRequest).getHeaderNames();
+      will(returnValue(enumeration(requestHeaders.keySet().iterator())));
+      oneOf(mockHttpRequest).getParameter(with(equal(createEnvironmentVariable("variable"))));
+      will(returnValue(requestParameters.get(createEnvironmentVariable("variable"))));
+    }});
+
+    LoginHandlerInterceptor handlerInterceptor = new LoginHandlerInterceptor();
+
+    Map<String, String> envBefore = LoginHandlerInterceptor.getEnvironment();
+
+    assertNotNull(envBefore);
+    assertTrue(envBefore.isEmpty());
+    assertTrue(handlerInterceptor.preHandle(mockHttpRequest, null, null));
+
+    Map<String, String> envSet = LoginHandlerInterceptor.getEnvironment();
+
+    assertNotNull(envSet);
+    assertNotSame(envBefore, envSet);
+    assertEquals(1, envSet.size());
+    assertTrue(envSet.containsKey("variable"));
+    assertEquals("two", envSet.get("variable"));
+
+    handlerInterceptor.afterCompletion(mockHttpRequest, null, null, null);
+
+    Map<String, String> envAfter = LoginHandlerInterceptor.getEnvironment();
+
+    assertNotNull(envAfter);
+    assertTrue(envAfter.isEmpty());
+  }
+
+  @Test
+  public void testHandlerInterceptorThreadSafety() throws Throwable {
+    TestFramework.runOnce(new HandlerInterceptorThreadSafetyMultiThreadedTestCase());
+  }
+
+  private final class HandlerInterceptorThreadSafetyMultiThreadedTestCase extends MultithreadedTestCase {
+
+    private LoginHandlerInterceptor handlerInterceptor;
+
+    private HttpServletRequest mockHttpRequestOne;
+    private HttpServletRequest mockHttpRequestTwo;
+
+    @Override
+    public void initialize() {
+      super.initialize();
+
+      final Map<String, String> requestParametersOne = new HashMap<>(3);
+      final Map<String, String> requestHeaders = new HashMap<>();
+
+      requestParametersOne.put("param", "one");
+      requestParametersOne.put(createEnvironmentVariable("STAGE"), "test");
+      requestParametersOne.put(createEnvironmentVariable("GEMFIRE"), "/path/to/gemfire/700");
+
+      mockHttpRequestOne = mockContext.mock(HttpServletRequest.class, "testHandlerInterceptorThreadSafety.HttpServletRequest.1");
+
+      mockContext.checking(new Expectations() {{
+        oneOf(mockHttpRequestOne).getParameterNames();
+        will(returnValue(enumeration(requestParametersOne.keySet().iterator())));
+        oneOf(mockHttpRequestOne).getHeaderNames();
+        will(returnValue(enumeration(requestHeaders.keySet().iterator())));
+        oneOf(mockHttpRequestOne).getParameter(with(equal(createEnvironmentVariable("STAGE"))));
+        will(returnValue(requestParametersOne.get(createEnvironmentVariable("STAGE"))));
+        oneOf(mockHttpRequestOne).getParameter(with(equal(createEnvironmentVariable("GEMFIRE"))));
+        will(returnValue(requestParametersOne.get(createEnvironmentVariable("GEMFIRE"))));
+      }});
+
+      mockHttpRequestTwo = mockContext.mock(HttpServletRequest.class, "testHandlerInterceptorThreadSafety.HttpServletRequest.2");
+
+      final Map<String, String> requestParametersTwo = new HashMap<>(3);
+
+      requestParametersTwo.put("parameter", "two");
+      requestParametersTwo.put(createEnvironmentVariable("HOST"), "localhost");
+      requestParametersTwo.put(createEnvironmentVariable("GEMFIRE"), "/path/to/gemfire/75");
+
+      mockContext.checking(new Expectations() {{
+        oneOf(mockHttpRequestTwo).getParameterNames();
+        will(returnValue(enumeration(requestParametersTwo.keySet().iterator())));
+        oneOf(mockHttpRequestTwo).getHeaderNames();
+        will(returnValue(enumeration(requestHeaders.keySet().iterator())));
+        oneOf(mockHttpRequestTwo).getParameter(with(equal(createEnvironmentVariable("HOST"))));
+        will(returnValue(requestParametersTwo.get(createEnvironmentVariable("HOST"))));
+        oneOf(mockHttpRequestTwo).getParameter(with(equal(createEnvironmentVariable("GEMFIRE"))));
+        will(returnValue(requestParametersTwo.get(createEnvironmentVariable("GEMFIRE"))));
+      }});
+
+      handlerInterceptor =  new LoginHandlerInterceptor();
+    }
+
+    public void thread1() throws Exception {
+      assertTick(0);
+      Thread.currentThread().setName("HTTP Request Processing Thread 1");
+
+      Map<String, String> env = LoginHandlerInterceptor.getEnvironment();
+
+      assertNotNull(env);
+      assertTrue(env.isEmpty());
+      assertTrue(handlerInterceptor.preHandle(mockHttpRequestOne, null, null));
+
+      env = LoginHandlerInterceptor.getEnvironment();
+
+      assertNotNull(env);
+      assertEquals(2, env.size());
+      assertFalse(env.containsKey("param"));
+      assertFalse(env.containsKey("parameter"));
+      assertFalse(env.containsKey("HOST"));
+      assertEquals("test", env.get("STAGE"));
+      assertEquals("/path/to/gemfire/700", env.get("GEMFIRE"));
+
+      waitForTick(2);
+
+      env = LoginHandlerInterceptor.getEnvironment();
+
+      assertNotNull(env);
+      assertEquals(2, env.size());
+      assertFalse(env.containsKey("param"));
+      assertFalse(env.containsKey("parameter"));
+      assertFalse(env.containsKey("HOST"));
+      assertEquals("test", env.get("STAGE"));
+      assertEquals("/path/to/gemfire/700", env.get("GEMFIRE"));
+
+      waitForTick(4);
+
+      env = LoginHandlerInterceptor.getEnvironment();
+
+      assertNotNull(env);
+      assertEquals(2, env.size());
+      assertFalse(env.containsKey("param"));
+      assertFalse(env.containsKey("parameter"));
+      assertFalse(env.containsKey("HOST"));
+      assertEquals("test", env.get("STAGE"));
+      assertEquals("/path/to/gemfire/700", env.get("GEMFIRE"));
+
+      handlerInterceptor.afterCompletion(mockHttpRequestOne, null, null, null);
+
+      env = LoginHandlerInterceptor.getEnvironment();
+
+      assertNotNull(env);
+      assertTrue(env.isEmpty());
+    }
+
+    public void thread2() throws Exception {
+      assertTick(0);
+      Thread.currentThread().setName("HTTP Request Processing Thread 2");
+      waitForTick(1);
+
+      Map<String, String> env = LoginHandlerInterceptor.getEnvironment();
+
+      assertNotNull(env);
+      assertTrue(env.isEmpty());
+      assertTrue(handlerInterceptor.preHandle(mockHttpRequestTwo, null, null));
+
+      env = LoginHandlerInterceptor.getEnvironment();
+
+      assertNotNull(env);
+      assertEquals(2, env.size());
+      assertFalse(env.containsKey("parameter"));
+      assertFalse(env.containsKey("param"));
+      assertFalse(env.containsKey("STAGE"));
+      assertEquals("localhost", env.get("HOST"));
+      assertEquals("/path/to/gemfire/75", env.get("GEMFIRE"));
+
+      waitForTick(3);
+
+      handlerInterceptor.afterCompletion(mockHttpRequestTwo, null, null, null);
+
+      env = LoginHandlerInterceptor.getEnvironment();
+
+      assertNotNull(env);
+      assertTrue(env.isEmpty());
+    }
+
+    @Override
+    public void finish() {
+      super.finish();
+      handlerInterceptor = null;
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/LinkIndexJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/LinkIndexJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/LinkIndexJUnitTest.java
new file mode 100644
index 0000000..61a9736
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/LinkIndexJUnitTest.java
@@ -0,0 +1,236 @@
+/*
+ * 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.domain;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.gemstone.gemfire.internal.util.CollectionUtils;
+import com.gemstone.gemfire.management.internal.web.AbstractWebTestCase;
+import com.gemstone.gemfire.management.internal.web.http.HttpMethod;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * The LinkIndexJUnitTest class is a test suite of test cases testing the contract and functionality of the LinkIndex class.
+ * <p/>
+ * @see java.net.URI
+ * @see com.gemstone.gemfire.management.internal.web.AbstractWebTestCase
+ * @see com.gemstone.gemfire.management.internal.web.domain.LinkIndex
+ * @see org.junit.Assert
+ * @see org.junit.Test
+ * @since GemFire 8.0
+ */
+@Category(UnitTest.class)
+public class LinkIndexJUnitTest extends AbstractWebTestCase {
+
+  @Test
+  public void testAdd() throws Exception {
+    final Link link = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"));
+
+    final LinkIndex linkIndex = new LinkIndex();
+
+    assertTrue(linkIndex.isEmpty());
+    assertEquals(0, linkIndex.size());
+    assertEquals(linkIndex, linkIndex.add(link));
+    assertFalse(linkIndex.isEmpty());
+    assertEquals(1, linkIndex.size());
+    assertEquals(linkIndex, linkIndex.add(link)); // test duplicate addition
+    assertFalse(linkIndex.isEmpty());
+    assertEquals(1, linkIndex.size());
+  }
+
+  @Test(expected = AssertionError.class)
+  public void testAddNullLink() {
+    final LinkIndex linkIndex = new LinkIndex();
+
+    assertTrue(linkIndex.isEmpty());
+
+    try {
+      linkIndex.add(null);
+    }
+    finally {
+      assertTrue(linkIndex.isEmpty());
+    }
+  }
+
+  @Test
+  public void testAddAll() throws Exception {
+    final Link create = new Link("create-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.POST);
+    final Link retrieve = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"));
+    final Link update = new Link("update-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.PUT);
+    final Link delete = new Link("delete-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"), HttpMethod.DELETE);
+
+    final LinkIndex linkIndex = new LinkIndex();
+
+    assertTrue(linkIndex.isEmpty());
+    assertEquals(linkIndex, linkIndex.addAll(create, retrieve, update, delete));
+    assertFalse(linkIndex.isEmpty());
+    assertEquals(4, linkIndex.size());
+  }
+
+  @Test(expected = AssertionError.class)
+  public void testAddAllWithNullLinks() {
+    final LinkIndex linkIndex = new LinkIndex();
+
+    assertTrue(linkIndex.isEmpty());
+
+    try {
+      linkIndex.addAll((Iterable<Link>) null);
+    }
+    finally {
+      assertTrue(linkIndex.isEmpty());
+    }
+  }
+
+  @Test
+  public void testFind() throws Exception {
+    final Link list = new Link("get-resources", toUri("http://host.domain.com:port/service/v1/resources"));
+    final Link create = new Link("create-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.POST);
+    final Link retrieve = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"));
+    final Link update = new Link("update-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.PUT);
+    final Link delete = new Link("delete-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"), HttpMethod.DELETE);
+
+    final LinkIndex linkIndex = new LinkIndex();
+
+    assertTrue(linkIndex.isEmpty());
+    assertEquals(linkIndex, linkIndex.addAll(list, create, retrieve, update, delete));
+    assertFalse(linkIndex.isEmpty());
+    assertEquals(5, linkIndex.size());
+    assertEquals(list, linkIndex.find("get-resources"));
+    assertEquals(retrieve, linkIndex.find("get-resource"));
+    assertEquals(update, linkIndex.find("UPDATE-RESOURCE"));
+    assertEquals(delete, linkIndex.find("Delete-Resource"));
+    assertNull(linkIndex.find("destroy-resource"));
+    assertNull(linkIndex.find("save-resource"));
+  }
+
+  @Test
+  public void testFindAll() throws Exception {
+    final Link list = new Link("get-resources", toUri("http://host.domain.com:port/service/v1/resources"));
+    final Link create = new Link("create-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.POST);
+    final Link retrieveById = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"));
+    final Link retrieveByName = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{name}"));
+    final Link update = new Link("update-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.PUT);
+    final Link delete = new Link("delete-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"), HttpMethod.DELETE);
+
+    final LinkIndex linkIndex = new LinkIndex();
+
+    assertTrue(linkIndex.isEmpty());
+    assertEquals(linkIndex, linkIndex.addAll(list, create, retrieveById, retrieveByName, update, delete));
+    assertFalse(linkIndex.isEmpty());
+    assertEquals(6, linkIndex.size());
+
+    final Link[] retrieveLinks = linkIndex.findAll("get-resource");
+
+    assertNotNull(retrieveLinks);
+    assertEquals(2, retrieveLinks.length);
+    assertTrue(Arrays.asList(retrieveLinks).containsAll(Arrays.asList(retrieveById, retrieveByName)));
+
+    final Link[] saveLinks = linkIndex.findAll("save-resource");
+
+    assertNotNull(saveLinks);
+    assertEquals(0, saveLinks.length);
+  }
+
+  @Test
+  public void testIterator() throws Exception {
+    final Link list = new Link("get-resources", toUri("http://host.domain.com:port/service/v1/resources"));
+    final Link create = new Link("create-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.POST);
+    final Link retrieveById = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"));
+    final Link retrieveByName = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{name}"));
+    final Link update = new Link("update-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.PUT);
+    final Link delete = new Link("delete-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"), HttpMethod.DELETE);
+
+    final LinkIndex linkIndex = new LinkIndex();
+
+    assertTrue(linkIndex.isEmpty());
+    assertEquals(linkIndex, linkIndex.addAll(list, create, retrieveById, retrieveByName, update, delete));
+    assertFalse(linkIndex.isEmpty());
+    assertEquals(6, linkIndex.size());
+
+    final Collection<Link> expectedLinks = Arrays.asList(list, create, retrieveById, retrieveByName, update, delete);
+
+    final Collection<Link> actualLinks = new ArrayList<Link>(linkIndex.size());
+
+    for (final Link link : linkIndex) {
+      actualLinks.add(link);
+    }
+
+    assertTrue(actualLinks.containsAll(expectedLinks));
+  }
+
+  @Test
+  public void testToList() throws Exception {
+    final Link list = new Link("get-resources", toUri("http://host.domain.com:port/service/v1/resources"));
+    final Link create = new Link("create-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.POST);
+    final Link retrieveById = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"));
+    final Link retrieveByName = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{name}"));
+    final Link update = new Link("update-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.PUT);
+    final Link delete = new Link("delete-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"), HttpMethod.DELETE);
+
+    final LinkIndex linkIndex = new LinkIndex();
+
+    assertTrue(linkIndex.isEmpty());
+    assertEquals(linkIndex, linkIndex.addAll(list, create, retrieveById, retrieveByName, update, delete));
+    assertFalse(linkIndex.isEmpty());
+    assertEquals(6, linkIndex.size());
+
+    final List<Link> expectedList = CollectionUtils.asList(list, create, retrieveById, retrieveByName, update, delete);
+
+    Collections.sort(expectedList);
+
+    assertEquals(expectedList, linkIndex.toList());
+  }
+
+  @Test
+  public void testToMap() throws Exception {
+    final Link list = new Link("get-resources", toUri("http://host.domain.com:port/service/v1/resources"));
+    final Link create = new Link("create-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.POST);
+    final Link retrieveById = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"));
+    final Link retrieveByName = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{name}"));
+    final Link update = new Link("update-resource", toUri("http://host.domain.com:port/service/v1/resources"), HttpMethod.PUT);
+    final Link delete = new Link("delete-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"), HttpMethod.DELETE);
+
+    final LinkIndex linkIndex = new LinkIndex();
+
+    assertTrue(linkIndex.isEmpty());
+    assertEquals(linkIndex, linkIndex.addAll(list, create, retrieveById, retrieveByName, update, delete));
+    assertFalse(linkIndex.isEmpty());
+    assertEquals(6, linkIndex.size());
+
+    final Map<String, List<Link>> expectedMap = new HashMap<String, List<Link>>(5);
+
+    expectedMap.put("get-resources", Arrays.asList(list));
+    expectedMap.put("create-resource", Arrays.asList(create));
+    expectedMap.put("get-resource", Arrays.asList(retrieveById, retrieveByName));
+    expectedMap.put("update-resource", Arrays.asList(update));
+    expectedMap.put("delete-resource", Arrays.asList(delete));
+
+    assertEquals(expectedMap, linkIndex.toMap());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/LinkJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/LinkJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/LinkJUnitTest.java
new file mode 100644
index 0000000..c0b1620
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/LinkJUnitTest.java
@@ -0,0 +1,123 @@
+/*
+ * 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.domain;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import com.gemstone.gemfire.internal.util.CollectionUtils;
+import com.gemstone.gemfire.management.internal.web.AbstractWebTestCase;
+import com.gemstone.gemfire.management.internal.web.http.HttpMethod;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * The LinkJUnitTest class is a test suite of test cases testing the contract and functionality of the Link class.
+ * <p/>
+ * @see java.net.URI
+ * @see com.gemstone.gemfire.management.internal.web.AbstractWebTestCase
+ * @see com.gemstone.gemfire.management.internal.web.domain.Link
+ * @see org.junit.Assert
+ * @see org.junit.Test
+ * @since GemFire 8.0
+ */
+@Category(UnitTest.class)
+public class LinkJUnitTest extends AbstractWebTestCase {
+
+  @Test
+  public void testConstructDefaultLink() {
+    final Link link = new Link();
+
+    assertNotNull(link);
+    assertNull(link.getHref());
+    assertNull(link.getMethod());
+    assertNull(link.getRelation());
+  }
+
+  @Test
+  public void testConstructLinkWithRelationAndHref() throws Exception {
+    final Link link = new Link("get-resource", toUri("http://host:port/service/v1/resources/{id}"));
+
+    assertNotNull(link);
+    assertEquals("http://host:port/service/v1/resources/{id}", toString(link.getHref()));
+    assertEquals(HttpMethod.GET, link.getMethod());
+    assertEquals("get-resource", link.getRelation());
+  }
+
+  @Test
+  public void testConstructLinkWithRelationHrefAndMethod() throws Exception {
+    final Link link = new Link("create-resource", toUri("http://host:port/service/v1/resources"), HttpMethod.POST);
+
+    assertNotNull(link);
+    assertEquals("http://host:port/service/v1/resources", toString(link.getHref()));
+    assertEquals(HttpMethod.POST, link.getMethod());
+    assertEquals("create-resource", link.getRelation());
+  }
+
+  @Test
+  public void testSetAndGetMethod() {
+    final Link link = new Link();
+
+    assertNotNull(link);
+    assertNull(link.getMethod());
+
+    link.setMethod(HttpMethod.POST);
+
+    assertEquals(HttpMethod.POST, link.getMethod());
+
+    link.setMethod(null);
+
+    assertEquals(HttpMethod.GET, link.getMethod());
+  }
+
+  @Test
+  public void testCompareTo() throws Exception {
+    final Link link0 = new Link("resources", toUri("http://host:port/service/v1/resources"));
+    final Link link1 = new Link("resource", toUri("http://host:port/service/v1/resources"), HttpMethod.POST);
+    final Link link2 = new Link("resource", toUri("http://host:port/service/v1/resources/{id}"));
+    final Link link3 = new Link("resource", toUri("http://host:port/service/v1/resources/{name}"));
+    final Link link4 = new Link("resource", toUri("http://host:port/service/v1/resources/{id}"), HttpMethod.DELETE);
+
+    final List<Link> expectedList = new ArrayList<Link>(Arrays.asList(link1, link4, link2, link3, link0));
+
+    final List<Link> actualList = CollectionUtils.asList(link0, link1, link2, link3, link4);
+
+    Collections.sort(actualList);
+
+    System.out.println(toString(expectedList.toArray(new Link[expectedList.size()])));
+    System.out.println(toString(actualList.toArray(new Link[actualList.size()])));
+
+    assertEquals(expectedList, actualList);
+  }
+
+  @Test
+  public void testToHttpRequestLine() throws Exception {
+    final Link link = new Link("get-resource", toUri("http://host.domain.com:port/service/v1/resources/{id}"));
+
+    assertNotNull(link);
+    assertEquals(HttpMethod.GET, link.getMethod());
+    assertEquals("http://host.domain.com:port/service/v1/resources/{id}", toString(link.getHref()));
+    assertEquals("GET ".concat("http://host.domain.com:port/service/v1/resources/{id}"), link.toHttpRequestLine());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/QueryParameterSourceJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/QueryParameterSourceJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/QueryParameterSourceJUnitTest.java
new file mode 100644
index 0000000..ae2f87b
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/domain/QueryParameterSourceJUnitTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.domain;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.Query;
+import javax.management.QueryExp;
+
+import com.gemstone.gemfire.internal.util.IOUtils;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * The QueryParameterSourceJUnitTest class is a test suite of test cases testing the contract and functionality of the
+ * QueryParameterSource class.
+ * <p/>
+ * @see com.gemstone.gemfire.management.internal.web.domain.QueryParameterSource
+ * @see org.junit.Assert
+ * @see org.junit.Test
+ * @since GemFire 8.0
+ */
+@Category(UnitTest.class)
+public class QueryParameterSourceJUnitTest {
+
+  @Test
+  public void testCreateQueryParameterSource() throws MalformedObjectNameException {
+    final ObjectName expectedObjectName = ObjectName.getInstance("GemFire:type=Member,*");
+    
+    final QueryExp expectedQueryExpression = Query.eq(Query.attr("id"), Query.value("12345"));
+
+    final QueryParameterSource query = new QueryParameterSource(expectedObjectName, expectedQueryExpression);
+
+    assertNotNull(query);
+    assertSame(expectedObjectName, query.getObjectName());
+    assertSame(expectedQueryExpression, query.getQueryExpression());
+  }
+
+  @Test
+  public void testSerialization() throws ClassNotFoundException, IOException, MalformedObjectNameException {
+    final ObjectName expectedObjectName = ObjectName.getInstance("GemFire:type=Member,*");
+    
+    final QueryExp expectedQueryExpression = Query.or(
+      Query.eq(Query.attr("name"), Query.value("myName")),
+      Query.eq(Query.attr("id"), Query.value("myId"))
+    );
+
+    final QueryParameterSource expectedQuery = new QueryParameterSource(expectedObjectName, expectedQueryExpression);
+
+    assertNotNull(expectedQuery);
+    assertSame(expectedObjectName, expectedQuery.getObjectName());
+    assertSame(expectedQueryExpression, expectedQuery.getQueryExpression());
+
+    final byte[] queryBytes = IOUtils.serializeObject(expectedQuery);
+
+    assertNotNull(queryBytes);
+    assertTrue(queryBytes.length != 0);
+
+    final Object queryObj = IOUtils.deserializeObject(queryBytes);
+
+    assertTrue(queryObj instanceof QueryParameterSource);
+
+    final QueryParameterSource actualQuery = (QueryParameterSource) queryObj;
+
+    assertNotSame(expectedQuery, actualQuery);
+    assertNotNull(actualQuery.getObjectName());
+    assertEquals(expectedQuery.getObjectName().toString(), actualQuery.getObjectName().toString());
+    assertNotNull(actualQuery.getQueryExpression());
+    assertEquals(expectedQuery.getQueryExpression().toString(), actualQuery.getQueryExpression().toString());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/http/ClientHttpRequestJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/http/ClientHttpRequestJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/http/ClientHttpRequestJUnitTest.java
new file mode 100644
index 0000000..bbe961b
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/http/ClientHttpRequestJUnitTest.java
@@ -0,0 +1,509 @@
+/*
+ * 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.http;
+
+import static org.junit.Assert.*;
+
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.jmock.Mockery;
+import org.jmock.lib.legacy.ClassImposteriser;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.MediaType;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+
+import com.gemstone.gemfire.management.internal.web.AbstractWebTestCase;
+import com.gemstone.gemfire.management.internal.web.domain.Link;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+/**
+ * The ClientHttpRequestJUnitTest class is a test suite of test cases testing the contract and functionality of the
+ * ClientHttpRequest class.
+ * <p/>
+ * @see com.gemstone.gemfire.management.internal.web.AbstractWebTestCase
+ * @see com.gemstone.gemfire.management.internal.web.http.ClientHttpRequest
+ * @see org.jmock.Mockery
+ * @see org.junit.Assert
+ * @see org.junit.Test
+ * @since GemFire 8.0
+ */
+@Category(UnitTest.class)
+public class ClientHttpRequestJUnitTest extends AbstractWebTestCase {
+
+  private Mockery mockContext;
+
+  @Before
+  public void setUp() {
+    mockContext = new Mockery();
+    mockContext.setImposteriser(ClassImposteriser.INSTANCE);
+  }
+
+  @After
+  public void tearDown() {
+    mockContext.assertIsSatisfied();
+    mockContext = null;
+  }
+
+  @Test
+  public void testCreateClientHttpRequest() throws Exception {
+    final Link expectedLink = new Link("test", toUri("http://host.domain.com:8080/app/service"));
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertNotNull(request);
+    assertEquals(expectedLink, request.getLink());
+  }
+
+  @Test(expected = AssertionError.class)
+  public void testCreateClientHttpRequestWithNullLink() {
+    new ClientHttpRequest(null);
+  }
+
+  @Test
+  public void testGetMethod() throws Exception {
+    Link link = new Link("get-resource", toUri("http://host.domain.com:8080/app/resources/{id}"));
+    ClientHttpRequest request = new ClientHttpRequest(link);
+
+    assertEquals(link, request.getLink());
+    assertEquals(org.springframework.http.HttpMethod.GET, request.getMethod());
+
+    link = new Link("delete-resource", toUri("http://host.domain.com:8080/app/resources/{id}"), HttpMethod.DELETE);
+    request = new ClientHttpRequest(link);
+
+    assertEquals(link, request.getLink());
+    assertEquals(org.springframework.http.HttpMethod.DELETE, request.getMethod());
+
+    link = new Link("delete-resource", toUri("http://host.domain.com:8080/app/service"), HttpMethod.HEAD);
+    request = new ClientHttpRequest(link);
+
+    assertEquals(link, request.getLink());
+    assertEquals(org.springframework.http.HttpMethod.HEAD, request.getMethod());
+
+    link = new Link("delete-resource", toUri("http://host.domain.com:8080/app/service"), HttpMethod.OPTIONS);
+    request = new ClientHttpRequest(link);
+
+    assertEquals(link, request.getLink());
+    assertEquals(org.springframework.http.HttpMethod.OPTIONS, request.getMethod());
+
+    link = new Link("delete-resource", toUri("http://host.domain.com:8080/app/resources"), HttpMethod.POST);
+    request = new ClientHttpRequest(link);
+
+    assertEquals(link, request.getLink());
+    assertEquals(org.springframework.http.HttpMethod.POST, request.getMethod());
+
+    link = new Link("delete-resource", toUri("http://host.domain.com:8080/app/resources"), HttpMethod.PUT);
+    request = new ClientHttpRequest(link);
+
+    assertEquals(link, request.getLink());
+    assertEquals(org.springframework.http.HttpMethod.PUT, request.getMethod());
+
+    link = new Link("delete-resource", toUri("http://host.domain.com:8080/app"), HttpMethod.TRACE);
+    request = new ClientHttpRequest(link);
+
+    assertEquals(link, request.getLink());
+    assertEquals(org.springframework.http.HttpMethod.TRACE, request.getMethod());
+  }
+
+  @Test
+  public void testIsDelete() throws Exception {
+    final Link expectedLink = new Link("delete", toUri("http://host.domain.com:8080/app/resources/{id}"), HttpMethod.DELETE);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+    assertTrue(request.isDelete());
+    assertFalse(request.isGet());
+    assertFalse(request.isPost());
+    assertFalse(request.isPut());
+  }
+
+  @Test
+  public void testIsGet() throws Exception {
+    final Link expectedLink = new Link("get", toUri("http://host.domain.com:8080/app/resources/{id}"), HttpMethod.GET);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+    assertFalse(request.isDelete());
+    assertTrue(request.isGet());
+    assertFalse(request.isPost());
+    assertFalse(request.isPut());
+  }
+
+  @Test
+  public void testIsPost() throws Exception {
+    final Link expectedLink = new Link("post", toUri("http://host.domain.com:8080/app/resources"), HttpMethod.POST);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+    assertFalse(request.isDelete());
+    assertFalse(request.isGet());
+    assertTrue(request.isPost());
+    assertFalse(request.isPut());
+  }
+
+  @Test
+  public void testIsPut() throws Exception {
+    final Link expectedLink = new Link("put", toUri("http://host.domain.com:8080/app/resources/{id}"), HttpMethod.PUT);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+    assertFalse(request.isDelete());
+    assertFalse(request.isGet());
+    assertFalse(request.isPost());
+    assertTrue(request.isPut());
+  }
+
+  @Test
+  public void testGetPathVariables() throws Exception {
+    final Link expectedLink = new Link("test", toUri("http://host.domain.com:8080/app/libraries/{name}/books/{author}/{title}"));
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+    assertEquals(Arrays.asList("name", "author", "title"), request.getPathVariables());
+  }
+
+  @Test
+  public void testGetPathVariablesWithUriHavingNoPathVariables() throws Exception {
+    final Link expectedLink = new Link("test", toUri("http://host.domain.com:8080/app/service"));
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+
+    final List<String> actualPathVariables = request.getPathVariables();
+
+    assertNotNull(actualPathVariables);
+    assertTrue(actualPathVariables.isEmpty());
+  }
+
+  @Test
+  public void testGetURI() throws Exception {
+    final URI expectedURI = toUri("http://host.domain.com:8080/app/service");
+    final Link expectedLink = new Link("test", expectedURI);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+    assertEquals(expectedURI, request.getURI());
+  }
+
+  @Test
+  public void testGetURLForGet() throws Exception {
+    final Link expectedLink = new Link("find", toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.GET);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    request.addParameterValues("author", "Rowling");
+    request.addParameterValues("category", "science-fiction");
+
+    assertEquals(expectedLink, request.getLink());
+    assertEquals("http://host.domain.com:8080/app/libraries/amazon/books?author=Rowling&category=science-fiction",
+      toString(request.getURL(Collections.singletonMap("name", "amazon"))));
+  }
+
+  @Test
+  public void testGetURLForGetEncoded() throws Exception {
+    final Link expectedLink = new Link("readValue4Key", toUri("http://host.domain.com:8080/app/regions/{region}/keys/{key}"), HttpMethod.GET);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    final Map<String, Object> uriVariables = new HashMap<String, Object>(4);
+
+    uriVariables.put("region", "Customers/Accounts/Orders");
+    uriVariables.put("key", "123");
+    uriVariables.put("item", "456");
+
+    assertEquals(expectedLink, request.getLink());
+    assertEquals("http://host.domain.com:8080/app/regions/Customers%2FAccounts%2FOrders/keys/123",
+      toString(request.getURL(uriVariables)));
+  }
+
+  @Test
+  public void testGetURLForGetWithQueryParametersNoBody() throws Exception {
+    final Link expectedLink = new Link("find", toUri("http://host.domain.com:8080/app/libraries/{name}/books/{author}"), HttpMethod.GET);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    request.addParameterValues("author", "Rowling");
+    request.addParameterValues("category", "science-fiction");
+    request.addParameterValues("name", "Boston");
+    request.addParameterValues("year", "2007");
+
+    final Map<String, Object> uriVariables = new HashMap<String, Object>(4);
+
+    uriVariables.put("author", "Rowling");
+    uriVariables.put("category", "mystery");
+    uriVariables.put("isbn", "0-123456789");
+    uriVariables.put("name", "Amazon");
+
+    assertEquals(expectedLink, request.getLink());
+    assertEquals("http://host.domain.com:8080/app/libraries/Amazon/books/Rowling?category=science-fiction&year=2007",
+      toString(request.getURL(uriVariables)));
+  }
+
+  @Test
+  public void testGetURLForDelete() throws Exception {
+    final Link expectedLink = new Link("delete-all", toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.DELETE);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    request.addParameterValues("category", "romance");
+
+    assertEquals(expectedLink, request.getLink());
+    assertEquals("http://host.domain.com:8080/app/libraries/congress/books?category=romance",
+      toString(request.getURL(Collections.singletonMap("name", "congress"))));
+  }
+
+  @Test
+  public void testGetURLForPost() throws Exception {
+    final Link expectedLink = new Link("post", toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.POST);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    request.addParameterValues("author", "Douglas Adams");
+    request.addParameterValues("title", "The Hitchhiker's Guide to the Galaxy");
+    request.addParameterValues("year", "1979");
+    request.addParameterValues("isbn", "0345453743");
+
+    assertEquals(expectedLink, request.getLink());
+    assertEquals("http://host.domain.com:8080/app/libraries/royal/books",
+      toString(request.getURL(Collections.singletonMap("name", "royal"))));
+  }
+
+  @Test
+  public void testGetURLForPut() throws Exception {
+    final Link expectedLink = new Link("put", toUri("http://host.domain.com:8080/app/libraries/{name}/books/{isbn}"), HttpMethod.PUT);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    request.addParameterValues("year", "1983");
+
+    final Map<String, String> uriVariables = new HashMap<String, String>(2);
+
+    uriVariables.put("name", "royal");
+    uriVariables.put("isbn", "0345453743");
+
+    assertEquals(expectedLink, request.getLink());
+    assertEquals("http://host.domain.com:8080/app/libraries/royal/books/0345453743",
+      toString(request.getURL(uriVariables)));
+  }
+
+  @Test
+  public void testCreateRequestEntityForGet() throws Exception {
+    final Link expectedLink = new Link("find", toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.GET);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+
+    request.addHeaderValues(HttpHeader.CONTENT_TYPE.getName(), MediaType.TEXT_PLAIN_VALUE);
+    request.addParameterValues("author", "Rowling");
+    request.addParameterValues("category", "science-fiction");
+
+    final HttpEntity<?> requestEntity = request.createRequestEntity();
+
+    assertNotNull(requestEntity);
+    assertNotNull(requestEntity.getHeaders());
+    assertEquals(MediaType.TEXT_PLAIN, requestEntity.getHeaders().getContentType());
+    assertNull(requestEntity.getBody());
+  }
+
+  @Test
+  public void testCreateRequestEntityForDelete() throws Exception {
+    final Link expectedLink = new Link("delete-all", toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.DELETE);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+
+    request.addHeaderValues(HttpHeader.ACCEPT.getName(), MediaType.APPLICATION_JSON_VALUE);
+    request.addParameterValues("category", "romance");
+
+    final HttpEntity<?> requestEntity = request.createRequestEntity();
+
+    assertNotNull(requestEntity);
+    assertNotNull(requestEntity.getHeaders());
+    assertEquals(Collections.singletonList(MediaType.APPLICATION_JSON), requestEntity.getHeaders().getAccept());
+    assertNull(requestEntity.getBody());
+  }
+
+  @Test
+  @SuppressWarnings("unchecked")
+  public void testCreateRequestEntityForPost() throws Exception {
+    final Link expectedLink = new Link("post", toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.POST);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+
+    final MultiValueMap<String, Object> expectedRequestParameters = new LinkedMultiValueMap<String, Object>(4);
+
+    expectedRequestParameters.add("author", "Douglas Adams");
+    expectedRequestParameters.add("title", "The Hitchhiker's Guide to the Galaxy");
+    expectedRequestParameters.add("year", "1979");
+    expectedRequestParameters.add("isbn", "0345453743");
+
+    request.addHeaderValues(HttpHeader.CONTENT_TYPE.getName(), MediaType.APPLICATION_FORM_URLENCODED_VALUE);
+    request.addParameterValues("author", expectedRequestParameters.getFirst("author"));
+    request.addParameterValues("title", expectedRequestParameters.getFirst("title"));
+    request.addParameterValues("year", expectedRequestParameters.getFirst("year"));
+    request.addParameterValues("isbn", expectedRequestParameters.getFirst("isbn"));
+
+    final HttpEntity<MultiValueMap<String, Object>> requestEntity = (HttpEntity<MultiValueMap<String, Object>>)
+      request.createRequestEntity();
+
+    assertNotNull(requestEntity);
+    assertNotNull(requestEntity.getHeaders());
+    assertEquals(MediaType.APPLICATION_FORM_URLENCODED, requestEntity.getHeaders().getContentType());
+    assertEquals(expectedRequestParameters, requestEntity.getBody());
+  }
+
+  @Test
+  @SuppressWarnings("unchecked")
+  public void testCreateRequestEntityForPut() throws Exception {
+    final Link expectedLink = new Link("put", toUri("http://host.domain.com:8080/app/libraries/{name}/books/{isbn}"), HttpMethod.PUT);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+
+    final MultiValueMap<String, Object> expectedRequestParameters = new LinkedMultiValueMap<String, Object>(4);
+
+    expectedRequestParameters.add("year", "1979");
+
+    request.addHeaderValues(HttpHeader.ACCEPT.getName(), MediaType.TEXT_XML_VALUE);
+    request.addHeaderValues(HttpHeader.CONTENT_TYPE.getName(), MediaType.APPLICATION_FORM_URLENCODED_VALUE);
+    request.addParameterValues("year", expectedRequestParameters.getFirst("year"));
+
+    final HttpEntity<MultiValueMap<String, Object>> requestEntity = (HttpEntity<MultiValueMap<String, Object>>)
+      request.createRequestEntity();
+
+    assertNotNull(requestEntity);
+    assertNotNull(requestEntity.getHeaders());
+    assertEquals(Collections.singletonList(MediaType.TEXT_XML), requestEntity.getHeaders().getAccept());
+    assertEquals(MediaType.APPLICATION_FORM_URLENCODED, requestEntity.getHeaders().getContentType());
+    assertEquals(expectedRequestParameters, requestEntity.getBody());
+  }
+
+  @Test
+  public void testCreateRequestEntityOnPost() throws Exception {
+    final Library mockLibrary = mockContext.mock(Library.class, "testCreateRequestEntityOnPost.Library");
+    final Link expectedLink = new Link("post", toUri("http://host.domain.com:8080/app/libraries"), HttpMethod.POST);
+
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+    assertTrue(request.isPost());
+    assertNull(request.getContent());
+
+    request.setContent(mockLibrary);
+
+    assertSame(mockLibrary, request.getContent());
+
+    final HttpEntity<?> requestEntity = request.createRequestEntity();
+
+    assertNotNull(requestEntity);
+    assertTrue(requestEntity.getBody() instanceof Library);
+  }
+
+  @Test
+  public void testCreateRequestEntityOnPut() throws Exception {
+    final Book mockBook = mockContext.mock(Book.class, "testCreateRequestEntityOnPut.Book");
+    final Link expectedLink = new Link("put", toUri("http://host.domain.com:8080/app/libraries/{name}/books/{id}"), HttpMethod.PUT);
+
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+    assertTrue(request.isPut());
+    assertNull(request.getContent());
+
+    request.setContent(mockBook);
+    request.addParameterValues("isbn", "0-123456789");
+    request.addParameterValues("category", "science-fiction", "sci-fi", "fiction");
+
+    assertSame(mockBook, request.getContent());
+    assertEquals("0-123456789", request.getParameterValue("isbn"));
+    assertTrue(request.getParameterValues("category").containsAll(Arrays.asList("science-fiction", "sci-fi", "fiction")));
+
+    final HttpEntity<?> requestEntity = request.createRequestEntity();
+
+    assertNotNull(requestEntity);
+    assertTrue(requestEntity.getBody() instanceof MultiValueMap);
+    assertEquals(MediaType.APPLICATION_FORM_URLENCODED, requestEntity.getHeaders().getContentType());
+  }
+
+  @Test
+  public void testSetAndGetHeaderValues() throws Exception {
+    final Link expectedLink = new Link("put", toUri("http://host.domain.com:8080/app/libraries"), HttpMethod.PUT);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+    assertTrue(request.getHeaders().isEmpty());
+
+    request.addHeaderValues(HttpHeader.CONTENT_TYPE.getName(), MediaType.APPLICATION_JSON_VALUE);
+    request.addHeaderValues(HttpHeader.ACCEPT.getName(), MediaType.APPLICATION_JSON_VALUE,
+      MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_PLAIN_VALUE);
+
+    assertEquals(MediaType.APPLICATION_JSON_VALUE, request.getHeaderValue(HttpHeader.CONTENT_TYPE.getName()));
+    assertEquals(1, request.getHeaderValues(HttpHeader.CONTENT_TYPE.getName()).size());
+    assertEquals(MediaType.APPLICATION_JSON_VALUE, request.getHeaderValue(HttpHeader.ACCEPT.getName()));
+    assertEquals(3, request.getHeaderValues(HttpHeader.ACCEPT.getName()).size());
+    assertTrue(request.getHeaderValues(HttpHeader.ACCEPT.getName()).containsAll(Arrays.asList(
+      MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_PLAIN_VALUE)));
+
+    request.setHeader(HttpHeader.ACCEPT.getName(), MediaType.APPLICATION_OCTET_STREAM_VALUE);
+
+    assertEquals(MediaType.APPLICATION_OCTET_STREAM_VALUE, request.getHeaderValue(HttpHeader.ACCEPT.getName()));
+    assertEquals(1, request.getHeaderValues(HttpHeader.ACCEPT.getName()).size());
+    assertTrue(request.getHeaderValues(HttpHeader.ACCEPT.getName()).containsAll(Arrays.asList(
+      MediaType.APPLICATION_OCTET_STREAM_VALUE)));
+  }
+
+  @Test
+  public void testSetAndGetParameterValues() throws Exception {
+    final Link expectedLink = new Link("put", toUri("http://host.domain.com:8080/app/libraries"), HttpMethod.PUT);
+    final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
+
+    assertEquals(expectedLink, request.getLink());
+    assertTrue(request.getParameters().isEmpty());
+
+    request.addParameterValues("parameterOne", "value");
+    request.addParameterValues("parameterTwo", "test", "testing", "tested");
+
+    assertEquals("value", request.getParameterValue("parameterOne"));
+    assertEquals(1, request.getParameterValues("parameterOne").size());
+    assertEquals("test", request.getParameterValue("parameterTwo"));
+    assertEquals(3, request.getParameterValues("parameterTwo").size());
+    assertTrue(request.getParameterValues("parameterTwo").containsAll(Arrays.asList("test", "testing", "tested")));
+
+    request.setParameter("parameterTwo", "development");
+
+    assertEquals("development", request.getParameterValue("parameterTwo"));
+    assertEquals(1, request.getParameterValues("parameterTwo").size());
+    assertTrue(request.getParameterValues("parameterTwo").containsAll(Arrays.asList("development")));
+  }
+
+  @SuppressWarnings("unused")
+  private static interface Library {
+    public String getName();
+  }
+
+  @SuppressWarnings("unused")
+  private static interface Book {
+    public String getAuthor();
+    public String getIsbn();
+    public String getTitle();
+    public Integer getYear();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7c20e693/geode-web/src/test/java/org/apache/geode/management/internal/web/http/converter/SerializableObjectHttpMessageConverterJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/web/http/converter/SerializableObjectHttpMessageConverterJUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/web/http/converter/SerializableObjectHttpMessageConverterJUnitTest.java
new file mode 100644
index 0000000..9ecf645
--- /dev/null
+++ b/geode-web/src/test/java/org/apache/geode/management/internal/web/http/converter/SerializableObjectHttpMessageConverterJUnitTest.java
@@ -0,0 +1,165 @@
+/*
+ * 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.http.converter;
+
+import static org.junit.Assert.*;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Calendar;
+
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.jmock.lib.legacy.ClassImposteriser;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpInputMessage;
+import org.springframework.http.HttpOutputMessage;
+import org.springframework.http.MediaType;
+
+import com.gemstone.gemfire.internal.util.IOUtils;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+/**
+ * The SerializableObjectHttpMessageConverterJUnitTest class is a test suite of test cases testing the contract
+ * and functionality of the SerializableObjectHttpMessageConverter class.
+ * <p/>
+ * @see com.gemstone.gemfire.management.internal.web.http.converter.SerializableObjectHttpMessageConverter
+ * @see org.jmock.Mockery
+ * @see org.junit.Assert
+ * @see org.junit.Test
+ * @since GemFire 8.0
+ */
+@Category(UnitTest.class)
+public class SerializableObjectHttpMessageConverterJUnitTest {
+
+  private Mockery mockContext;
+
+  @Before
+  public void setUp() {
+    mockContext = new Mockery();
+    mockContext.setImposteriser(ClassImposteriser.INSTANCE);
+  }
+
+  @After
+  public void tearDown() {
+    mockContext.assertIsSatisfied();
+    mockContext = null;
+  }
+
+  @Test
+  public void testCreateSerializableObjectHttpMessageConverter() {
+    final SerializableObjectHttpMessageConverter converter = new SerializableObjectHttpMessageConverter();
+
+    assertNotNull(converter);
+    assertTrue(converter.getSupportedMediaTypes().contains(MediaType.APPLICATION_OCTET_STREAM));
+    assertTrue(converter.getSupportedMediaTypes().contains(MediaType.ALL));
+  }
+
+  @Test
+  public void testSupport() {
+    final SerializableObjectHttpMessageConverter converter = new SerializableObjectHttpMessageConverter();
+
+    assertTrue(converter.supports(Boolean.class));
+    assertTrue(converter.supports(Calendar.class));
+    assertTrue(converter.supports(Character.class));
+    assertTrue(converter.supports(Integer.class));
+    assertTrue(converter.supports(Double.class));
+    assertTrue(converter.supports(String.class));
+    assertTrue(converter.supports(Serializable.class));
+    assertFalse(converter.supports(Object.class));
+    assertFalse(converter.supports(null));
+  }
+
+  @Test
+  public void testReadInternal() throws IOException {
+    final String expectedInputMessageBody = "Expected content of the HTTP input message body!";
+
+    final HttpInputMessage mockInputMessage = mockContext.mock(HttpInputMessage.class, "HttpInputMessage");
+
+    mockContext.checking(new Expectations() {{
+      oneOf(mockInputMessage).getBody();
+      will(returnValue(new ByteArrayInputStream(IOUtils.serializeObject(expectedInputMessageBody))));
+    }});
+
+    final SerializableObjectHttpMessageConverter converter = new SerializableObjectHttpMessageConverter();
+
+    final Serializable obj = converter.readInternal(String.class, mockInputMessage);
+
+    assertTrue(obj instanceof String);
+    assertEquals(expectedInputMessageBody, obj);
+  }
+
+  @Test
+  public void testSetContentLength() {
+    final byte[] bytes = { (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE };
+
+    final HttpHeaders headers = new HttpHeaders();
+
+    final HttpOutputMessage mockOutputMessage = mockContext.mock(HttpOutputMessage.class, "HttpOutputMessage");
+
+    mockContext.checking(new Expectations() {{
+      oneOf(mockOutputMessage).getHeaders();
+      will(returnValue(headers));
+    }});
+
+    final SerializableObjectHttpMessageConverter converter = new SerializableObjectHttpMessageConverter();
+
+    converter.setContentLength(mockOutputMessage, bytes);
+
+    assertEquals(bytes.length, headers.getContentLength());
+  }
+
+  @Test
+  public void testWriteInternal() throws IOException {
+    final String expectedOutputMessageBody = "Expected media of the HTTP output message body!";
+
+    final byte[] expectedOutputMessageBodyBytes = IOUtils.serializeObject(expectedOutputMessageBody);
+
+    final ByteArrayOutputStream out = new ByteArrayOutputStream(expectedOutputMessageBodyBytes.length);
+
+    final HttpHeaders headers = new HttpHeaders();
+
+    final HttpOutputMessage mockOutputMessage = mockContext.mock(HttpOutputMessage.class, "HttpOutputMessage");
+
+    mockContext.checking(new Expectations() {{
+      oneOf(mockOutputMessage).getHeaders();
+      will(returnValue(headers));
+      oneOf(mockOutputMessage).getBody();
+      will(returnValue(out));
+    }});
+
+    final SerializableObjectHttpMessageConverter converter = new SerializableObjectHttpMessageConverter();
+
+    converter.writeInternal(expectedOutputMessageBody, mockOutputMessage);
+
+    final byte[] actualOutputMessageBodyBytes = out.toByteArray();
+
+    assertEquals(expectedOutputMessageBodyBytes.length, headers.getContentLength());
+    assertEquals(expectedOutputMessageBodyBytes.length, actualOutputMessageBodyBytes.length);
+
+    for (int index = 0; index < actualOutputMessageBodyBytes.length; index++) {
+      assertEquals(expectedOutputMessageBodyBytes[index], actualOutputMessageBodyBytes[index]);
+    }
+  }
+
+}