http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/9a2b5d7b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/controllers/PulseControllerJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/controllers/PulseControllerJUnitTest.java
 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/controllers/PulseControllerJUnitTest.java
new file mode 100644
index 0000000..06d7f3d
--- /dev/null
+++ 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/controllers/PulseControllerJUnitTest.java
@@ -0,0 +1,816 @@
+/*
+ * 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.vmware.geode.tools.pulse.controllers;
+
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.powermock.api.mockito.PowerMockito.spy;
+import static org.powermock.api.mockito.PowerMockito.when;
+import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+import java.io.File;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.UUID;
+import javax.servlet.ServletContextListener;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.vmware.geode.tools.pulse.internal.PulseAppListener;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.geode.test.junit.categories.UnitTest;
+import com.vmware.geode.tools.pulse.internal.controllers.PulseController;
+import com.vmware.geode.tools.pulse.internal.data.Cluster;
+import com.vmware.geode.tools.pulse.internal.data.PulseConfig;
+import com.vmware.geode.tools.pulse.internal.data.Repository;
+
+import org.apache.commons.collections.buffer.CircularFifoBuffer;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.powermock.modules.junit4.PowerMockRunnerDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import org.apache.geode.test.junit.categories.IntegrationTest;
+
+@Category(IntegrationTest.class)
+@PrepareForTest(Repository.class)
+@RunWith(PowerMockRunner.class)
+@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration("classpath*:mvc-dispatcher-servlet.xml")
+@PowerMockIgnore("*.IntegrationTest")
+public class PulseControllerJUnitTest {
+
+  private static final String PRINCIPAL_USER = "test-user";
+
+  private static final String MEMBER_ID = "member1";
+  private static final String MEMBER_NAME = "localhost-server";
+  private static final String CLUSTER_NAME = "mock-cluster";
+  private static final String REGION_NAME = "mock-region";
+  private static final String REGION_PATH = "/" + REGION_NAME;
+  private static final String REGION_TYPE = "PARTITION";
+  private static final String AEQ_LISTENER = "async-event-listener";
+  private static final String CLIENT_NAME = "client-1";
+  private static final String PHYSICAL_HOST_NAME = "physical-host-1";
+  private static final String GEMFIRE_VERSION = "1.0.0";
+
+  private static final Principal principal;
+
+  static {
+    principal = () -> PRINCIPAL_USER;
+  }
+
+  @Rule
+  public TemporaryFolder tempFolder = new TemporaryFolder();
+
+  @Autowired
+  private WebApplicationContext wac;
+
+  private MockMvc mockMvc;
+
+  private Cluster cluster;
+
+  private final ObjectMapper mapper = new ObjectMapper();
+
+  @Before
+  public void setup() throws Exception {
+    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
+
+
+    cluster = Mockito.spy(Cluster.class);
+
+    Cluster.Region region = new Cluster.Region();
+    region.setName(REGION_NAME);
+    region.setFullPath(REGION_PATH);
+    region.setRegionType(REGION_TYPE);
+    region.setMemberCount(1);
+    region.setMemberName(new ArrayList<String>() {{
+      add(MEMBER_NAME);
+    }});
+    region.setPutsRate(12.31D);
+    region.setGetsRate(27.99D);
+    Cluster.RegionOnMember regionOnMember = new Cluster.RegionOnMember();
+    regionOnMember.setRegionFullPath(REGION_PATH);
+    regionOnMember.setMemberName(MEMBER_NAME);
+    region.setRegionOnMembers(new ArrayList<Cluster.RegionOnMember>() {{
+      add(regionOnMember);
+    }});
+    cluster.addClusterRegion(REGION_PATH, region);
+
+    Cluster.Member member = new Cluster.Member();
+    member.setId(MEMBER_ID);
+    member.setName(MEMBER_NAME);
+    member.setUptime(1L);
+    member.setHost(PHYSICAL_HOST_NAME);
+    member.setGemfireVersion(GEMFIRE_VERSION);
+    member.setCpuUsage(55.77123D);
+
+    member.setMemberRegions(new HashMap<String, Cluster.Region>() {{
+      put(REGION_NAME, region);
+    }});
+
+    Cluster.AsyncEventQueue aeq = new Cluster.AsyncEventQueue();
+    aeq.setAsyncEventListener(AEQ_LISTENER);
+    member.setAsyncEventQueueList(new ArrayList() {{
+      add(aeq);
+    }});
+
+    Cluster.Client client = new Cluster.Client();
+    client.setId("100");
+    client.setName(CLIENT_NAME);
+    client.setUptime(1L);
+    member.setMemberClientsHMap(new HashMap<String, Cluster.Client>() {{
+      put(CLIENT_NAME, client);
+    }});
+
+    cluster.setMembersHMap(new HashMap() {{
+      put(MEMBER_NAME, member);
+    }});
+    cluster.setPhysicalToMember(new HashMap() {{
+      put(PHYSICAL_HOST_NAME, new ArrayList() {{
+        add(member);
+      }});
+    }});
+    cluster.setServerName(CLUSTER_NAME);
+    cluster.setMemoryUsageTrend(new CircularFifoBuffer() {{
+      add(1);
+      add(2);
+      add(3);
+    }});
+    cluster.setWritePerSecTrend(new CircularFifoBuffer() {{
+      add(1.29);
+      add(2.3);
+      add(3.0);
+    }});
+    cluster.setThroughoutReadsTrend(new CircularFifoBuffer() {{
+      add(1);
+      add(2);
+      add(3);
+    }});
+    cluster.setThroughoutWritesTrend(new CircularFifoBuffer() {{
+      add(4);
+      add(5);
+      add(6);
+    }});
+
+    Repository repo = Mockito.spy(Repository.class);
+
+    // Set up a partial mock for some static methods
+    spy(Repository.class);
+    when(Repository.class, "get").thenReturn(repo);
+    doReturn(cluster).when(repo).getCluster();
+
+    PulseConfig config = new PulseConfig();
+    File tempQueryLog = tempFolder.newFile("query_history.log");
+    config.setQueryHistoryFileName(tempQueryLog.toString());
+    doReturn(config).when(repo).getPulseConfig();
+
+    PulseController.pulseVersion.setPulseVersion("not empty");
+    PulseController.pulseVersion.setPulseBuildId("not empty");
+    PulseController.pulseVersion.setPulseBuildDate("not empty");
+    PulseController.pulseVersion.setPulseSourceDate("not empty");
+    PulseController.pulseVersion.setPulseSourceRevision("not empty");
+    PulseController.pulseVersion.setPulseSourceRepository("not empty");
+  }
+
+  @Test
+  public void pulseUpdateForClusterDetails() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"ClusterDetails\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.ClusterDetails.userName").value(PRINCIPAL_USER))
+        .andExpect(jsonPath("$.ClusterDetails.totalHeap").value(0D))
+        
.andExpect(jsonPath("$.ClusterDetails.clusterName").value(CLUSTER_NAME))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterDiskThroughput() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"ClusterDiskThroughput\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.ClusterDiskThroughput.currentThroughputWrites").value(0D))
+        .andExpect(jsonPath("$.ClusterDiskThroughput.throughputReads", 
contains(1, 2, 3)))
+        
.andExpect(jsonPath("$.ClusterDiskThroughput.currentThroughputReads").value(0D))
+        .andExpect(jsonPath("$.ClusterDiskThroughput.throughputWrites", 
contains(4, 5, 6)))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterGCPauses() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"ClusterJVMPauses\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.ClusterJVMPauses.currentGCPauses").value(0))
+        .andExpect(jsonPath("$.ClusterJVMPauses.gCPausesTrend").isEmpty())
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterKeyStatistics() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"ClusterKeyStatistics\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.ClusterKeyStatistics.readPerSecTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterKeyStatistics.queriesPerSecTrend").isEmpty())
+        .andExpect(jsonPath("$.ClusterKeyStatistics.writePerSecTrend", 
contains(1.29, 2.3, 3.0)))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterMember() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"ClusterMembers\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.ClusterMembers.members[0].serverGroups[0]").value("Default"))
+        
.andExpect(jsonPath("$.ClusterMembers.members[0].cpuUsage").value(55.77D))
+        .andExpect(jsonPath("$.ClusterMembers.members[0].clients").value(1))
+        .andExpect(jsonPath("$.ClusterMembers.members[0].heapUsage").value(0))
+        
.andExpect(jsonPath("$.ClusterMembers.members[0].name").value(MEMBER_NAME))
+        
.andExpect(jsonPath("$.ClusterMembers.members[0].currentHeapUsage").value(0))
+        
.andExpect(jsonPath("$.ClusterMembers.members[0].isManager").value(false))
+        .andExpect(jsonPath("$.ClusterMembers.members[0].threads").value(0))
+        
.andExpect(jsonPath("$.ClusterMembers.members[0].memberId").value(MEMBER_ID))
+        
.andExpect(jsonPath("$.ClusterMembers.members[0].redundancyZones[0]").value("Default"))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterMembersRGraph() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"ClusterMembersRGraph\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.ClusterMembersRGraph.memberCount").value(0))
+        .andExpect(jsonPath("$.ClusterMembersRGraph.clustor.data").isEmpty())
+        .andExpect(jsonPath("$.ClusterMembersRGraph.clustor.name").value(0))
+        .andExpect(jsonPath("$.ClusterMembersRGraph.clustor.id").value(0))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].id").value(PHYSICAL_HOST_NAME))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].name").value(PHYSICAL_HOST_NAME))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].data.loadAvg").value(0D))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].data.sockets").value(0))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].data.threads").value(0))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].data.cpuUsage").value(0D))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].data.memoryUsage").value(0))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].data.hostStatus").value("Normal"))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].data.$type").value("hostNormalNode"))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].id").value(MEMBER_ID))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].name").value(MEMBER_NAME))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.gemfireVersion").value(GEMFIRE_VERSION))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.memoryUsage").value(0))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.cpuUsage").value(55.77D))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.regions").value(1))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.host").value(PHYSICAL_HOST_NAME))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.port").value("-"))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.clients").value(1))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.gcPauses").value(0))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.numThreads").value(0))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.nodeType").value("memberNormalNode"))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.$type").value("memberNormalNode"))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.gatewaySender").value(0))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].data.gatewayReceiver").value(0))
+        
.andExpect(jsonPath("$.ClusterMembersRGraph.clustor.children[0].children[0].children").isEmpty())
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterMemoryUsage() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"ClusterMemoryUsage\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.ClusterMemoryUsage.currentMemoryUsage").value(0))
+        .andExpect(jsonPath("$.ClusterMemoryUsage.memoryUsageTrend", 
containsInAnyOrder(1, 2, 3)))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterRegion() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"ClusterRegion\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.ClusterRegion.clusterName").value(CLUSTER_NAME))
+        .andExpect(jsonPath("$.ClusterRegion.userName").value(PRINCIPAL_USER))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].regionPath").value(REGION_PATH))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].diskReadsTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].memoryUsage").value("0.0000"))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].getsRate").value(27.99D))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].wanEnabled").value(false))
+        .andExpect(jsonPath("$.ClusterRegion.region[0].memberCount").value(1))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].memberNames[0].name").value(MEMBER_NAME))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].memberNames[0].id").value(MEMBER_ID))
+        .andExpect(jsonPath("$.ClusterRegion.region[0].emptyNodes").value(0))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].type").value(REGION_TYPE))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].isEnableOffHeapMemory").value("OFF"))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].putsRate").value(12.31D))
+        .andExpect(jsonPath("$.ClusterRegion.region[0].totalMemory").value(0))
+        .andExpect(jsonPath("$.ClusterRegion.region[0].entryCount").value(0))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].compressionCodec").value("NA"))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].name").value(REGION_NAME))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].systemRegionEntryCount").value(0))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].persistence").value("OFF"))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].memoryReadsTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].diskWritesTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].memoryWritesTrend").isEmpty())
+        .andExpect(jsonPath("$.ClusterRegion.region[0].dataUsage").value(0))
+        
.andExpect(jsonPath("$.ClusterRegion.region[0].entrySize").value("0.0000"))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterRegions() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"ClusterRegions\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].regionPath").value(REGION_PATH))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].diskReadsTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].memoryUsage").value("0.0000"))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].getsRate").value(27.99D))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].wanEnabled").value(false))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].memberCount").value(1))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].memberNames[0].name").value(MEMBER_NAME))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].memberNames[0].id").value(MEMBER_ID))
+        .andExpect(jsonPath("$.ClusterRegions.regions[0].emptyNodes").value(0))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].type").value(REGION_TYPE))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].isEnableOffHeapMemory").value("OFF"))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].putsRate").value(12.31D))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].totalMemory").value(0))
+        .andExpect(jsonPath("$.ClusterRegions.regions[0].entryCount").value(0))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].compressionCodec").value("NA"))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].name").value(REGION_NAME))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].systemRegionEntryCount").value(0))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].persistence").value("OFF"))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].memoryReadsTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].diskWritesTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].memoryWritesTrend").isEmpty())
+        .andExpect(jsonPath("$.ClusterRegions.regions[0].dataUsage").value(0))
+        
.andExpect(jsonPath("$.ClusterRegions.regions[0].entrySize").value("0.0000"))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterSelectedRegion() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", 
"{\"ClusterSelectedRegion\":{\"regionFullPath\":\"" + REGION_PATH + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.lruEvictionRate").value(0D))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.getsRate").value(27.99D))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.emptyNodes").value(0))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.type").value(REGION_TYPE))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.isEnableOffHeapMemory").value("OFF"))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.path").value(REGION_PATH))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.members[0].cpuUsage").value(55.77D))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.members[0].clients").value(1))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.members[0].heapUsage").value(0))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.members[0].name").value(MEMBER_NAME))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.members[0].currentHeapUsage").value(0))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.members[0].isManager").value(false))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.members[0].threads").value(0))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.members[0].memberId").value(MEMBER_ID))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.members[0].uptime").value("0
 Hours 0 Mins 1 Secs"))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.memoryReadsTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.diskWritesTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.dataUsage").value(0))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.regionPath").value(REGION_PATH))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.diskReadsTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.memoryUsage").value("0.0000"))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.wanEnabled").value(false))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.memberCount").value(1))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.putsRate").value(12.31D))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.totalMemory").value(0))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.entryCount").value(0))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.compressionCodec").value("NA"))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.name").value(REGION_NAME))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.systemRegionEntryCount").value(0))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.persistence").value("OFF"))
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.memoryWritesTrend").isEmpty())
+        
.andExpect(jsonPath("$.ClusterSelectedRegion.selectedRegion.entrySize").value("0.0000"))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterSelectedRegionsMember() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", 
"{\"ClusterSelectedRegionsMember\":{\"regionFullPath\":\"" + REGION_PATH + 
"\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.selectedRegionsMembers.%s.diskReadsTrend",
 MEMBER_NAME).isEmpty())
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.selectedRegionsMembers.%s.regionFullPath",
 MEMBER_NAME).value(REGION_PATH))
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.selectedRegionsMembers.%s.entryCount",
 MEMBER_NAME).value(0))
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.selectedRegionsMembers.%s.accessor",
 MEMBER_NAME).value("True"))
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.selectedRegionsMembers.%s.memberName",
 MEMBER_NAME).value(MEMBER_NAME))
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.selectedRegionsMembers.%s.memoryReadsTrend",
 MEMBER_NAME).isEmpty())
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.selectedRegionsMembers.%s.diskWritesTrend",
 MEMBER_NAME).isEmpty())
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.selectedRegionsMembers.%s.memoryWritesTrend",
 MEMBER_NAME).isEmpty())
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.selectedRegionsMembers.%s.entrySize",
 MEMBER_NAME).value(0))
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.clusterName").value(CLUSTER_NAME))
+        
.andExpect(jsonPath("$.ClusterSelectedRegionsMember.userName").value(PRINCIPAL_USER))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForClusterWANInfo() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"ClusterWANInfo\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.ClusterWANInfo.connectedClusters").isEmpty())
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForMemberAsynchEventQueues() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"MemberAsynchEventQueues\":{\"memberName\":\"" 
+ MEMBER_NAME + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.MemberAsynchEventQueues.isAsyncEventQueuesPresent").value(true))
+        
.andExpect(jsonPath("$.MemberAsynchEventQueues.asyncEventQueues[0].batchTimeInterval").value(0))
+        
.andExpect(jsonPath("$.MemberAsynchEventQueues.asyncEventQueues[0].batchConflationEnabled").value(false))
+        
.andExpect(jsonPath("$.MemberAsynchEventQueues.asyncEventQueues[0].queueSize").value(0))
+        
.andExpect(jsonPath("$.MemberAsynchEventQueues.asyncEventQueues[0].senderType").value(false))
+        
.andExpect(jsonPath("$.MemberAsynchEventQueues.asyncEventQueues[0].asyncEventListener").value(AEQ_LISTENER))
+        
.andExpect(jsonPath("$.MemberAsynchEventQueues.asyncEventQueues[0].batchSize").value(0))
+        
.andExpect(jsonPath("$.MemberAsynchEventQueues.asyncEventQueues[0].primary").value(false))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForMemberClients() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"MemberClients\":{\"memberName\":\"" + 
MEMBER_NAME + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.MemberClients.name").value(MEMBER_NAME))
+        .andExpect(jsonPath("$.MemberClients.memberClients[0].puts").value(0))
+        
.andExpect(jsonPath("$.MemberClients.memberClients[0].cpuUsage").value("0.0000"))
+        
.andExpect(jsonPath("$.MemberClients.memberClients[0].clientId").value("100"))
+        
.andExpect(jsonPath("$.MemberClients.memberClients[0].queueSize").value(0))
+        
.andExpect(jsonPath("$.MemberClients.memberClients[0].clientCQCount").value(0))
+        
.andExpect(jsonPath("$.MemberClients.memberClients[0].name").value(CLIENT_NAME))
+        
.andExpect(jsonPath("$.MemberClients.memberClients[0].isConnected").value("No"))
+        
.andExpect(jsonPath("$.MemberClients.memberClients[0].threads").value(0))
+        
.andExpect(jsonPath("$.MemberClients.memberClients[0].isSubscriptionEnabled").value("No"))
+        .andExpect(jsonPath("$.MemberClients.memberClients[0].gets").value(0))
+        
.andExpect(jsonPath("$.MemberClients.memberClients[0].uptime").value("0 Hours 0 
Mins 1 Secs"))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForMemberDetails() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"MemberDetails\":{\"memberName\":\"" + 
MEMBER_NAME + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.MemberDetails.name").value(MEMBER_NAME))
+        .andExpect(jsonPath("$.MemberDetails.offHeapUsedSize").value(0))
+        .andExpect(jsonPath("$.MemberDetails.diskStorageUsed").value(0D))
+        .andExpect(jsonPath("$.MemberDetails.regionsCount").value(1))
+        .andExpect(jsonPath("$.MemberDetails.clusterName").value(CLUSTER_NAME))
+        .andExpect(jsonPath("$.MemberDetails.name").value(MEMBER_NAME))
+        .andExpect(jsonPath("$.MemberDetails.threads").value(0))
+        .andExpect(jsonPath("$.MemberDetails.clusterId").isNotEmpty())
+        .andExpect(jsonPath("$.MemberDetails.numClients").value(1))
+        .andExpect(jsonPath("$.MemberDetails.userName").value(PRINCIPAL_USER))
+        .andExpect(jsonPath("$.MemberDetails.offHeapFreeSize").value(0))
+        .andExpect(jsonPath("$.MemberDetails.memberId").value(MEMBER_ID))
+        .andExpect(jsonPath("$.MemberDetails.status").value("Normal"))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForMemberDiskThroughput() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"MemberDiskThroughput\":{\"memberName\":\"" + 
MEMBER_NAME + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.MemberDiskThroughput.throughputWritesTrend").isEmpty())
+        
.andExpect(jsonPath("$.MemberDiskThroughput.throughputReadsTrend").isEmpty())
+        
.andExpect(jsonPath("$.MemberDiskThroughput.throughputWrites").value(0D))
+        
.andExpect(jsonPath("$.MemberDiskThroughput.throughputReads").value(0D))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForMemberGatewayHub() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"MemberGatewayHub\":{\"memberName\":\"" + 
MEMBER_NAME + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.MemberGatewayHub.isGatewayReceiver").value(false))
+        
.andExpect(jsonPath("$.MemberGatewayHub.asyncEventQueues[0].batchTimeInterval").value(0))
+        
.andExpect(jsonPath("$.MemberGatewayHub.asyncEventQueues[0].batchConflationEnabled").value(false))
+        
.andExpect(jsonPath("$.MemberGatewayHub.asyncEventQueues[0].queueSize").value(0))
+        
.andExpect(jsonPath("$.MemberGatewayHub.asyncEventQueues[0].senderType").value(false))
+        
.andExpect(jsonPath("$.MemberGatewayHub.asyncEventQueues[0].asyncEventListener").value(AEQ_LISTENER))
+        
.andExpect(jsonPath("$.MemberGatewayHub.asyncEventQueues[0].batchSize").value(0))
+        
.andExpect(jsonPath("$.MemberGatewayHub.asyncEventQueues[0].primary").value(false))
+        .andExpect(jsonPath("$.MemberGatewayHub.isGatewaySender").value(false))
+        .andExpect(jsonPath("$.MemberGatewayHub.regionsInvolved").isEmpty())
+        .andExpect(jsonPath("$.MemberGatewayHub.gatewaySenders").isEmpty())
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForMemberGCPauses() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"MemberGCPauses\":{\"memberName\":\"" + 
MEMBER_NAME + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.MemberGCPauses.gcPausesCount").value(0))
+        .andExpect(jsonPath("$.MemberGCPauses.gcPausesTrend").isEmpty())
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForMemberHeapUsage() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"MemberHeapUsage\":{\"memberName\":\"" + 
MEMBER_NAME + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.MemberHeapUsage.heapUsageTrend").isEmpty())
+        .andExpect(jsonPath("$.MemberHeapUsage.currentHeapUsage").value(0))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForMemberKeyStatistics() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"MemberKeyStatistics\":{\"memberName\":\"" + 
MEMBER_NAME + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.MemberKeyStatistics.readPerSecTrend").isEmpty())
+        .andExpect(jsonPath("$.MemberKeyStatistics.cpuUsageTrend").isEmpty())
+        
.andExpect(jsonPath("$.MemberKeyStatistics.memoryUsageTrend").isEmpty())
+        
.andExpect(jsonPath("$.MemberKeyStatistics.writePerSecTrend").isEmpty())
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForMemberRegions() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"MemberRegions\":{\"memberName\":\"" + 
MEMBER_NAME + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.MemberRegions.name").value(MEMBER_NAME))
+        
.andExpect(jsonPath("$.MemberRegions.memberRegions[0].fullPath").value(REGION_PATH))
+        
.andExpect(jsonPath("$.MemberRegions.memberRegions[0].entryCount").value(0))
+        
.andExpect(jsonPath("$.MemberRegions.memberRegions[0].name").value(REGION_NAME))
+        
.andExpect(jsonPath("$.MemberRegions.memberRegions[0].diskStoreName").value(""))
+        
.andExpect(jsonPath("$.MemberRegions.memberRegions[0].gatewayEnabled").value(false))
+        
.andExpect(jsonPath("$.MemberRegions.memberRegions[0].entrySize").value("0.0000"))
+        .andExpect(jsonPath("$.MemberRegions.memberId").value(MEMBER_ID))
+        .andExpect(jsonPath("$.MemberRegions.status").value("Normal"))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForMembersList() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"MembersList\":{\"memberName\":\"" + 
MEMBER_NAME + "\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        
.andExpect(jsonPath("$.MembersList.clusterMembers[0].name").value(MEMBER_NAME))
+        
.andExpect(jsonPath("$.MembersList.clusterMembers[0].memberId").value(MEMBER_ID))
+        .andExpect(jsonPath("$.MembersList.clusterName").value(CLUSTER_NAME))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForPulseVersion() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"PulseVersion\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.PulseVersion.sourceDate").value("not empty"))
+        .andExpect(jsonPath("$.PulseVersion.sourceRepository").value("not 
empty"))
+        .andExpect(jsonPath("$.PulseVersion.pulseVersion").value("not empty"))
+        .andExpect(jsonPath("$.PulseVersion.sourceRevision").value("not 
empty"))
+        .andExpect(jsonPath("$.PulseVersion.buildId").value("not empty"))
+        .andExpect(jsonPath("$.PulseVersion.buildDate").value("not empty"))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForQueryStatistics() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"QueryStatistics\":\"{}\"}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.QueryStatistics.queriesList").isEmpty())
+        .andExpect(jsonPath("$.QueryStatistics.connectedFlag").value(false))
+        .andExpect(jsonPath("$.QueryStatistics.connectedErrorMsg").value(""))
+    ;
+  }
+
+  @Test
+  public void pulseUpdateForSystemAlerts() throws Exception {
+    this.mockMvc.perform(post("/pulseUpdate")
+        .param("pulseData", "{\"SystemAlerts\":{\"pageNumber\":\"1\"}}")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.SystemAlerts.pageNumber").value(1))
+        .andExpect(jsonPath("$.SystemAlerts.connectedFlag").value(false))
+        .andExpect(jsonPath("$.SystemAlerts.connectedErrorMsg").value(""))
+        .andExpect(jsonPath("$.SystemAlerts.systemAlerts").isEmpty())
+    ;
+  }
+
+  @Test
+  public void authenticateUserNotLoggedIn() throws Exception {
+    this.mockMvc.perform(get("/authenticateUser")
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.isUserLoggedIn").value(false));
+  }
+
+  @Test
+  public void authenticateUserLoggedIn() throws Exception {
+    this.mockMvc.perform(get("/authenticateUser")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.isUserLoggedIn").value(true));
+  }
+
+  @Test
+  public void pulseVersion() throws Exception {
+    this.mockMvc.perform(get("/pulseVersion")
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.pulseVersion").isNotEmpty())
+        .andExpect(jsonPath("$.buildId").isNotEmpty())
+        .andExpect(jsonPath("$.buildDate").isNotEmpty())
+        .andExpect(jsonPath("$.sourceDate").isNotEmpty())
+        .andExpect(jsonPath("$.sourceRevision").isNotEmpty())
+        .andExpect(jsonPath("$.sourceRepository").isNotEmpty())
+    ;
+  }
+
+  @Test
+  public void clearAlerts() throws Exception {
+    this.mockMvc.perform(get("/clearAlerts")
+        .param("alertType", "1")
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.pageNumber").value(1))
+        .andExpect(jsonPath("$.systemAlerts").isEmpty())
+        .andExpect(jsonPath("$.connectedFlag").value(false))
+        .andExpect(jsonPath("$.status").value("deleted"))
+    ;
+  }
+
+  @Test
+  public void acknowledgeAlert() throws Exception {
+    this.mockMvc.perform(get("/acknowledgeAlert")
+        .param("alertId", "1")
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.status").value("deleted"));
+  }
+
+  @Test
+  public void dataBrowserRegions() throws Exception {
+    this.mockMvc.perform(get("/dataBrowserRegions")
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.clusterName").value(CLUSTER_NAME))
+        .andExpect(jsonPath("$.connectedFlag").value(false))
+        .andExpect(jsonPath("$.clusterRegions[0].fullPath").value(REGION_PATH))
+        
.andExpect(jsonPath("$.clusterRegions[0].regionType").value(REGION_TYPE))
+    ;
+  }
+
+  @Test
+  public void dataBrowserQuery() throws Exception {
+    doReturn(mapper.createObjectNode().put("foo", 
"bar")).when(cluster).executeQuery(anyString(), anyString(), anyInt());
+
+    this.mockMvc.perform(get("/dataBrowserQuery")
+        .param("query", "SELECT * FROM " + REGION_PATH)
+        .param("members", MEMBER_NAME)
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.foo").value("bar"))
+    ;
+  }
+
+  @Test
+  public void dataBrowserQueryHistory() throws Exception {
+    dataBrowserQuery();
+
+    this.mockMvc.perform(get("/dataBrowserQueryHistory")
+        .param("action", "view")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.queryHistory[0].queryText").value("\"SELECT * 
FROM " + REGION_PATH + "\""))
+    ;
+  }
+
+  @Test
+  public void pulseProductSupport() throws Exception {
+    this.mockMvc.perform(get("/pulseProductSupport")
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.product").value("gemfire"))
+    ;
+  }
+
+  @Test
+  public void getQueryStatisticsGridModel() throws Exception {
+    this.mockMvc.perform(get("/getQueryStatisticsGridModel")
+        .principal(principal)
+        
.accept(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE)))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.columnNames", containsInAnyOrder("Query",
+            "NumExecution",
+            "TotalExecutionTime(ns)",
+            "NumExecutionsInProgress",
+            "NumTimesCompiled",
+            "NumTimesGlobalIndexLookup",
+            "NumRowsModified",
+            "ParseTime(ms)",
+            "BindTime(ms)",
+            "OptimizeTime(ms)",
+            "RoutingInfoTime(ms)",
+            "GenerateTime(ms)",
+            "TotalCompilationTime(ms)",
+            "ExecutionTime(ns)",
+            "ProjectionTime(ns)",
+            "RowsModificationTime(ns)",
+            "QNNumRowsSeen",
+            "QNMsgSendTime(ns)",
+            "QNMsgSerTime(ns)",
+            "QNRespDeSerTime(ns)")))
+    ;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/9a2b5d7b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/GemFireDistributedSystem.java
----------------------------------------------------------------------
diff --git 
a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/GemFireDistributedSystem.java
 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/GemFireDistributedSystem.java
new file mode 100644
index 0000000..4b25a8d
--- /dev/null
+++ 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/GemFireDistributedSystem.java
@@ -0,0 +1,324 @@
+/*
+ *
+ * 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.vmware.geode.tools.pulse.testbed;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
+
+
+/**
+ * 
+ * TODO
+ * 0. SystemAlerts
+ * 1. Operations like member-up/down/crash, region create/destroy [7.5 scope]
+ * 2. Read events like member-up/down/crash, region create/destroy [7.5 scope]
+ * 3. PropFile Writing
+ * 4. Link to other remote systems, topology - multi-cluster [7.5] 
+ * 
+ *
+ */
+public class GemFireDistributedSystem {
+  
+  private static final String SERVERS = "servers";
+  private static final String LOCATORS_NAME = LOCATORS;
+  private static final String PEERS = "peers";
+  private static final String HOSTS = "hosts";
+  private static final String REGIONS = "regions";
+  private static final String CLIENTS = "clients";
+  private static final String SEP = ".";
+  private static final String FUNCTIONS = null;
+  private static final String CQS = null;
+  
+  
+  List<Server> servers = new ArrayList<Server>();
+  List<Client> clients = new ArrayList<Client>();
+  List<Locator> locators = new ArrayList<Locator>();
+  List<Peer> peers = new ArrayList<Peer>();
+  List<Host> hosts = new ArrayList<Host>();
+  List<Region> regions = new ArrayList<Region>();
+  List<Function> functions = new ArrayList<Function>();
+  List<CQ> cqs = new ArrayList<CQ>();
+  String dsName = null;
+  
+  public GemFireDistributedSystem(String name,Properties pr){
+    PropFileHelper propertiesFile = new PropFileHelper(pr);
+    this.dsName = name;
+    readGemfireDS(propertiesFile);
+  }
+  
+  public GemFireDistributedSystem(String name,String fileName) throws 
IOException{
+    PropFileHelper propertiesFile = new PropFileHelper(fileName);
+    this.dsName = name;
+    readGemfireDS(propertiesFile);
+  }
+  
+  private void readGemfireDS(PropFileHelper propertiesFile) {
+    String serverStrings[] = propertiesFile.readValues(dsName + SEP + SERVERS);
+    System.out.println("Servers = " + serverStrings.length);
+    for(String serverName : serverStrings){
+      Server server = new Server();
+      server.init(propertiesFile,dsName,serverName);
+      servers.add(server);
+    }  
+    
+    String clientStrings[] = propertiesFile.readValues(dsName + SEP + CLIENTS);
+    System.out.println("Clients = " + clientStrings.length);
+    for(String clientName : clientStrings){
+      Client client = new Client();
+      client.init(propertiesFile,dsName,clientName);
+      clients.add(client);
+    }  
+    
+    String locatorStrings[] = propertiesFile.readValues(dsName + SEP + 
LOCATORS);
+    System.out.println("Locators = " + locatorStrings.length);
+    for(String locatorName : locatorStrings){
+      Locator locator = new Locator();
+      locator.init(propertiesFile,dsName,locatorName);
+      locators.add(locator);
+    }
+    
+    String peerStrings[] = propertiesFile.readValues(dsName + SEP + PEERS);
+    System.out.println("Peers = " + peerStrings.length);
+    for(String peerName : peerStrings){
+      Peer peer = new Peer();
+      peer.init(propertiesFile,dsName,peerName);
+      peers.add(peer);
+    }
+    
+    String hostsStrings[] = propertiesFile.readValues(dsName + SEP + HOSTS);
+    for(String hostName : hostsStrings){
+      Host host = new Host();
+      host.init(propertiesFile,dsName,hostName);
+      hosts.add(host);
+    }
+    
+    String regionsStrings[] = propertiesFile.readValues(dsName + SEP + 
REGIONS);
+    for(String regionName : regionsStrings){
+      Region region = new Region();
+      region.init(propertiesFile,dsName,regionName);
+      regions.add(region);
+    }
+    
+    String functionStrings[] = propertiesFile.readValues(dsName + SEP + 
FUNCTIONS);
+    for(String functionName : functionStrings){
+      Function function = new Function();
+      function.init(propertiesFile,dsName,functionName);
+      functions.add(function);
+    }    
+    
+    String cqStrings[] = propertiesFile.readValues(dsName + SEP + CQS);
+    for(String cqName : cqStrings){
+      CQ cq = new CQ();
+      cq.init(propertiesFile,dsName,cqName);
+      cqs.add(cq);
+    }
+    
+  }
+  
+  public List<Region> getRegions(String memberName) {    
+    List<Region> list = new ArrayList<Region>();
+    for(Region r : regions){
+      if(r.getMembers().contains(memberName))
+          list.add(r);
+    }
+    return list;
+   }
+  
+  public Region getRegion(String regionName) {
+    Region r = null;
+    for (Region rn : getRegions()) {
+      if (rn.getName().equals(regionName)) {
+        r = rn;
+        break;
+      }
+    }
+    return r;
+  }
+
+  public List<Region> getRegions() {
+   return regions;
+  }
+  
+  public List<Function> getFunction() {
+    return functions;
+  }
+  
+  public List<CQ> getCQs() {
+    return cqs;
+  }
+  
+  public List<Server> getServers(){
+    return servers;    
+  }
+  
+  public List<Client> getClients(){
+    return clients;
+  }
+  
+  public List<Peer> getPeers(){
+    return peers;    
+  }
+  
+  public List<Locator> getLocators(){
+    return locators;    
+  }
+  
+  public List<Host> getPhysicalHosts(){
+    return hosts;    
+  }
+  
+  public static class Base{
+    protected Map<String,String> properties=null;
+    protected String name;
+    
+    public void init(PropFileHelper propertiesFile, String dsName, String 
name) {
+      this.name = name;      
+      String leadingkey = dsName + SEP + name;
+      Map<String,String> map = propertiesFile.readObject(leadingkey);
+      map.put("name",name);
+      this.properties = map;
+    }
+    
+    public String getName(){
+      return properties.get("name");
+    }
+    
+    public String key(String string) {
+      return properties.get(string);
+    }
+    
+    public int keyInt(String string) {
+      String str = properties.get(string);
+      try{
+        int index = Integer.parseInt(str);
+        return index;
+      }catch(Exception e){
+        return -1;
+      }
+    }
+    
+    public List<String> values(String string) {
+      String values= properties.get(string);
+      String array[] = values.split(",");
+      List<String> list = new ArrayList<String>();
+      for(String s:array)
+        list.add(s);
+      return list;
+    }
+    
+  }
+  
+  public static class Host extends Base{
+    
+  }
+  
+  public static class Server extends Base{
+    public String toString(){
+      return properties.get("name") + "[on host=" + properties.get("host");
+    }
+    
+    public String getHost(){
+      return properties.get("host");
+    }
+  }
+  
+  public static class Client extends Base{
+    public String toString(){
+      return properties.get("name") ;//+ "[on host=" + properties.get("host");
+    }
+    
+    public String getHost(){
+      return properties.get("host");
+    }
+  }
+  
+  public static class Locator extends Base{
+    public String getHost(){
+      return properties.get("host");
+    }
+  }
+  
+  public static class Peer extends Base{
+
+    public String getHost(){
+      return properties.get("host");
+    }
+  }
+  
+  public static class Region extends Base{
+    public String toString(){
+      return properties.get("name") + "[type=" + properties.get("type");
+    }
+    
+    public String getType(){
+      return key("type");
+    }
+    
+    public int getEntryCount(){
+      return keyInt("entryCount");
+    }
+    
+    public List<String> getWanSenders(){
+      return values("wanSenders");
+    }
+    
+    public List<String> getMembers(){
+      return values("members");
+    }
+    
+  }
+  
+  public static class WanSender extends Base{
+    
+  }
+
+  public static class Function extends Base{
+    public String getMemberId(){
+      return key("memberId");
+    }    
+  }
+  
+  public static class CQ extends Base{
+    public String getQuery(){
+      return key("query");
+    }    
+    
+    public String getClient(){
+      return key("client");
+    }
+  }
+  
+  public static class SystemAlert extends Base{
+    //TODO
+  }
+  
+  public static void main(String[] args) throws IOException {
+    
+    GemFireDistributedSystem ds = new GemFireDistributedSystem("t1", 
"config/testbed.properties");
+    System.out.println("Servers = " + ds.getServers());    
+    System.out.println("Regions = " + ds.getRegions());
+    System.out.println("Clients = " + ds.getClients());
+  } 
+  
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/9a2b5d7b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/GemfireTopology.java
----------------------------------------------------------------------
diff --git 
a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/GemfireTopology.java
 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/GemfireTopology.java
new file mode 100644
index 0000000..6470195
--- /dev/null
+++ 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/GemfireTopology.java
@@ -0,0 +1,24 @@
+/*
+ *
+ * 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.vmware.geode.tools.pulse.testbed;
+
+public class GemfireTopology {
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/9a2b5d7b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/PropFileHelper.java
----------------------------------------------------------------------
diff --git 
a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/PropFileHelper.java
 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/PropFileHelper.java
new file mode 100644
index 0000000..1892292
--- /dev/null
+++ 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/PropFileHelper.java
@@ -0,0 +1,115 @@
+/*
+ *
+ * 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.vmware.geode.tools.pulse.testbed;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+public class PropFileHelper {
+  
+  private String filePath=null;
+  private Properties pr=null;
+  
+  public PropFileHelper(String filePath) throws FileNotFoundException, 
IOException{
+    this.filePath = filePath;
+    pr = new Properties();
+    pr.load(new FileInputStream(new File(this.filePath)));
+  }
+  
+  public PropFileHelper(Properties pr2) {
+    this.pr =pr2;
+  }
+
+  public String[] readValues(String property){
+    return readValues(property,",");
+  }
+  
+  public String[] readValues(String property, String separator){
+    String value = readKey(property);
+    if(value!=null){
+      String[] array = value.split(separator);
+      return array;
+    }else{
+      return new String[0];
+    }
+  }
+  
+  public String readKey(String key){
+    String value = pr.getProperty(key);
+    if(value!=null)
+      return value.trim();
+    else return value;
+  }
+  
+  public Map<String,String> readObject(String leadingkey){
+    Map<String,String> map = new HashMap<String,String>();
+    String leadingKeyString = leadingkey+"."; 
+    for(Object keyObject : pr.keySet()){
+      String key = (String)keyObject;
+      String value = readKey(key);
+      if(key.startsWith(leadingKeyString)){
+        String innerProp = key.substring(leadingKeyString.length());
+        /* inner object stuff
+        if(checkForMultipleValues){
+          if(innerProp.contains(separator)){
+            String array[] = readValues(key);
+          }
+        }else*/
+        {
+          //System.out.println("Adding prop with key " + innerProp + " k=" + 
leadingkey);
+          map.put(innerProp, value);
+        }      
+      }
+    }    
+    return map;
+  }
+  
+  public static void main(String[] args) {
+    
+    Properties pr = new Properties();
+    pr.put("topologies", "t1,t2");
+    pr.put("t1.id", "1");
+    pr.put("t2.id", "2");
+    
+    pr.put("t1.prop1", "prop11");
+    pr.put("t1.prop2", "prop12");
+    pr.put("t1.prop3", "prop13");
+    pr.put("t2.prop1", "1");
+    pr.put("t2.prop2", "2");
+    pr.put("t2.prop3", "3");
+    
+    PropFileHelper helper = new PropFileHelper(pr);
+    String topologies[] = helper.readValues("topologies");
+    for(String topology : topologies){
+      Map<String,String> topologyMap = helper.readObject(topology);
+      System.out.println(topologyMap);
+    }
+    
+  }
+
+  public Properties getProperties() {
+    return pr;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/9a2b5d7b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/PropMockDataUpdater.java
----------------------------------------------------------------------
diff --git 
a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/PropMockDataUpdater.java
 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/PropMockDataUpdater.java
new file mode 100644
index 0000000..007be75
--- /dev/null
+++ 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/PropMockDataUpdater.java
@@ -0,0 +1,513 @@
+/*
+ *
+ * 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.vmware.geode.tools.pulse.testbed;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.vmware.geode.tools.pulse.internal.data.Cluster;
+import com.vmware.geode.tools.pulse.internal.data.Cluster.Alert;
+import com.vmware.geode.tools.pulse.internal.data.Cluster.Client;
+import com.vmware.geode.tools.pulse.internal.data.Cluster.GatewayReceiver;
+import com.vmware.geode.tools.pulse.internal.data.Cluster.GatewaySender;
+import com.vmware.geode.tools.pulse.internal.data.Cluster.Member;
+import com.vmware.geode.tools.pulse.internal.data.Cluster.Region;
+import com.vmware.geode.tools.pulse.internal.data.IClusterUpdater;
+import com.vmware.geode.tools.pulse.internal.data.PulseConstants;
+import com.vmware.geode.tools.pulse.internal.data.Repository;
+import com.vmware.geode.tools.pulse.internal.log.PulseLogWriter;
+import com.vmware.geode.tools.pulse.testbed.GemFireDistributedSystem.Locator;
+import com.vmware.geode.tools.pulse.testbed.GemFireDistributedSystem.Peer;
+import com.vmware.geode.tools.pulse.testbed.GemFireDistributedSystem.Server;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Random;
+import java.util.ResourceBundle;
+
+public class PropMockDataUpdater implements IClusterUpdater {
+  private static final int MAX_HOSTS = 40;
+  private static final PulseLogWriter LOGGER = PulseLogWriter.getLogger();
+  private final ResourceBundle resourceBundle = 
Repository.get().getResourceBundle();
+  private static final int POLL_INTERVAL = 5000;
+  public static final int MAX_SAMPLE_SIZE = 180;
+  public static final int ALERTS_MAX_SIZE = 1000;
+  public static final int PAGE_ALERTS_MAX_SIZE = 100;
+
+  private Cluster cluster= null;
+  private TestBed testbed;
+  private final String testbedFile = 
System.getProperty("pulse.propMockDataUpdaterFile");;
+
+  private final ObjectMapper mapper = new ObjectMapper();
+
+  public PropMockDataUpdater(Cluster cluster) {
+    this.cluster = cluster;
+    try {
+      loadPropertiesFile();
+    } catch (FileNotFoundException e) {
+      throw new RuntimeException(e);
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private void loadPropertiesFile() throws FileNotFoundException, IOException{
+    this.testbed = new TestBed(testbedFile,true);
+  }
+
+  /**
+   * function used for updating Cluster data
+   * for Mock
+   */
+  @Override
+  public boolean updateData() {
+    cluster.setConnectedFlag(true);
+    Random r = new Random(System.currentTimeMillis());
+    long totalHeapSize = Math.abs(r.nextInt(3200 - 2048) + 2048);
+    cluster.setTotalHeapSize(totalHeapSize);
+    long usedHeapSize  = Math.abs(r.nextInt(2048));
+    cluster.setUsedHeapSize(usedHeapSize);
+    double writePerSec = Math.abs(r.nextInt(100));
+    cluster.setWritePerSec(writePerSec);
+
+    //propfile
+    cluster.setSubscriptionCount(testbed.getRootDs().getClients().size());
+    cluster.setRegisteredCQCount((long) testbed.getRootDs().getCQs().size());
+    cluster.setRunningFunctionCount(testbed.getRootDs().getFunction().size());
+
+
+    cluster.setClusterId( Math.abs(r.nextInt(100)));
+    cluster.getWritePerSecTrend().add(writePerSec);
+    cluster.setDiskWritesRate(writePerSec);
+
+    long garbageCollectionCount = Math.abs(r.nextInt(100));
+    cluster.setGarbageCollectionCount(garbageCollectionCount);
+    cluster.getGarbageCollectionTrend().add(garbageCollectionCount);
+
+    long readPerSec = Math.abs(r.nextInt(100));
+    cluster.setReadPerSec(readPerSec);
+    cluster.getReadPerSecTrend().add(readPerSec);
+
+    long diskReadsRate = readPerSec;cluster.setDiskReadsRate(diskReadsRate);
+    cluster.setDiskReadsRate(readPerSec);
+    long queriesPerSec = Math.abs(r.nextInt(100));
+    cluster.setQueriesPerSec(queriesPerSec);
+    cluster.getQueriesPerSecTrend().add(queriesPerSec);
+
+    long loadPerSec = Math.abs(r.nextInt(100));
+    cluster.setLoadPerSec(loadPerSec);
+    cluster.setTotalHeapSize(totalHeapSize);
+    long totalBytesOnDisk = totalHeapSize;
+    cluster.setTotalBytesOnDisk(totalBytesOnDisk);
+
+    cluster.getTotalBytesOnDiskTrend().add(totalBytesOnDisk);
+
+    cluster.getMemoryUsageTrend().add(usedHeapSize);
+    cluster.getThroughoutWritesTrend().add(writePerSec);
+
+    cluster.setMemberCount(0);
+
+    Map<String,Cluster.Member>  membersHMap = cluster.getMembersHMap();
+    List<Cluster.Region> regionsList = 
(List<Cluster.Region>)cluster.getClusterRegions().values();
+    Map<String, Boolean> wanInformation = cluster.getWanInformation();
+
+    // Create 3 members first time around
+    int locatorCount=0;
+    if (membersHMap.size() == 0) {
+      for(Locator locator : testbed.getRootDs().getLocators()){
+        String id = "(Launcher_Locator-1099-13-40-24-5368)-"+locatorCount++;
+        String name = locator.getName();
+        membersHMap.put(id+name, initializeMember(id,name, true, true, true, 
false, locator.getHost()));
+      }
+      cluster.setLocatorCount(testbed.getRootDs().getLocators().size());
+
+      int serverCount=0;
+      for(Server server : testbed.getRootDs().getServers()){
+        String id = "(Launcher_Server-1099-13-40-24-5368)-"+serverCount++;
+        String name = server.getName();
+        membersHMap.put(id+name, initializeMember(id,name, false, true, false, 
true, server.getHost()));
+      }
+      cluster.setServerCount(testbed.getRootDs().getServers().size());
+
+      int peerCount=0;
+      for(Peer peer : testbed.getRootDs().getPeers()){
+        String id = "(Launcher_Peer-1099-13-40-24-5368)-"+peerCount++;
+        String name = peer.getName();
+        membersHMap.put( id+name, initializeMember(id,name, false, true, 
false, false, peer.getHost()));
+      }
+
+      for(Entry<String, Member> memberSet : membersHMap.entrySet())
+      {
+        HashMap<String,Cluster.Region> memberRegions = new 
HashMap<String,Cluster.Region>();
+        HashMap<String,Cluster.Client> memberClientsHM = new 
HashMap<String,Cluster.Client>();
+
+        Random randomGenerator = new Random();
+
+        //Read from property file
+        int randomInt = (randomGenerator.nextInt(5)) + 1;
+        
List<com.vmware.geode.tools.pulse.testbed.GemFireDistributedSystem.Region> 
thisMemberRegions = 
testbed.getRootDs().getRegions(memberSet.getValue().getName());
+
+        int regionExists = 0;
+        int index=0;
+        for 
(com.vmware.geode.tools.pulse.testbed.GemFireDistributedSystem.Region 
thisMemberRegion : thisMemberRegions) {
+          Region region = 
initMemberRegion(index++,thisMemberRegion.getName(),memberSet.getValue().getName(),
+              thisMemberRegion.getEntryCount(),thisMemberRegion.getType(), 
thisMemberRegion.getMembers().size()); //read from property file
+          if (regionsList.size() > 0) {
+            for (Region clusterRegion : regionsList) {
+              if ((region.getName()).equals(clusterRegion.getName())) {
+                
clusterRegion.getMemberName().add(memberSet.getValue().getName());
+                //clusterRegion.memberCount = clusterRegion.memberCount + 1;
+                //int mcount = clusterRegion.getMemberCount() + 1;
+                //clusterRegion.setMemberCount(mcount);
+                regionExists = 1;
+                break;
+              }
+            }
+            if (regionExists == 0){
+              regionsList.add(region);
+            }
+          } else{
+            regionsList.add(region);
+          }
+          memberRegions.put(region.getFullPath(),region);
+          //totalRegionCount = regionsList.size();
+          cluster.setTotalRegionCount(regionsList.size());
+        }
+        membersHMap.get(memberSet.getKey()).setMemberRegions(memberRegions);
+
+        if (memberSet.getValue().isCache()) {
+          Client client = initMemberClient(0, memberSet.getValue().getHost()); 
//read from prop File
+          memberClientsHM.put(client.getId(), client);
+          randomInt = randomGenerator.nextInt(10);
+          for (int y = 1; y < randomInt; y++) {
+            Client newClient = initMemberClient(y, memberSet.getValue()
+                .getHost());
+            memberClientsHM.put(newClient.getId(), newClient);
+          }
+          
membersHMap.get(memberSet.getKey()).updateMemberClientsHMap(memberClientsHM);
+          /*clientConnectionCount = clientConnectionCount
+              + 
membersHMap.get(memberSet.getKey()).getMemberClientsHMap().size();*/
+          long clientConnectionCount = cluster.getClientConnectionCount() + 
membersHMap.get(memberSet.getKey()).getMemberClientsHMap().size();
+          cluster.setClientConnectionCount(clientConnectionCount);
+        }
+
+      }
+    }
+    wanInformation.clear(); //read from property file
+    int wanInfoSize = Math.abs(r.nextInt(10));
+    wanInfoSize++;
+    for (int i = 0; i < wanInfoSize; i++) {
+      String name = "Mock Cluster" + i;
+      Boolean value = false;
+      if (i % 2 == 0){
+        value = true;
+      }
+      wanInformation.put(name, value);
+    }
+    //memberCount = membersHMap.size();
+    cluster.setMemberCount(membersHMap.size());
+
+    totalHeapSize = 0;
+    for(Entry<String, Member> memberSet : membersHMap.entrySet())
+    {
+      refresh(membersHMap.get(memberSet.getKey()));
+      Member member = membersHMap.get(memberSet.getKey());
+      totalHeapSize += member.getCurrentHeapSize();
+    }
+
+    for (Region region : regionsList) {
+      region.setGetsRate((Math.abs(r.nextInt(100))) + 1);
+      region.setPutsRate((Math.abs(r.nextInt(100))) +1);
+      region.getGetsPerSecTrend().add(region.getGetsRate());
+      region.getPutsPerSecTrend().add(region.getPutsRate());
+    }
+
+    return true;
+  }
+
+
+  private Region initMemberRegion(int count, String regionName, String 
memName, int entryCount, String type, int memberCount) {
+    Region memberRegion = new Region();
+    memberRegion.setName(regionName);
+    memberRegion.setFullPath("/"+regionName);
+    Random randomGenerator = new Random();
+    memberRegion.setSystemRegionEntryCount(entryCount);
+    // memberRegion.setEntrySize("N/A");
+    memberRegion.setEntrySize(Math.abs(randomGenerator.nextInt(10)));
+    memberRegion.setDiskStoreName("ABC");
+    memberRegion.setScope("DISTRIBUTED_NO_ACK");
+    memberRegion.setDiskSynchronous(true);
+    memberRegion.setRegionType(type);
+    if(type.contains("PERSISTENT"))
+      memberRegion.setPersistentEnabled(true);
+    else
+      memberRegion.setPersistentEnabled(false);
+    if (count % 2 == 0){
+      memberRegion.setWanEnabled(true);
+    }
+    else{
+      memberRegion.setWanEnabled(false);
+    }
+    memberRegion.setWanEnabled(true);
+    /*memberRegion.setSystemRegionEntryCount(Long.valueOf(String.valueOf(Math
+        .abs(randomGenerator.nextInt(100)))));*/
+    memberRegion.getMemberName().add(memName);
+    memberRegion.setMemberCount(memberCount);
+    return memberRegion;
+  }
+
+
+  private Client initMemberClient(int count, String host) {
+
+    Client memberClient = new Client();
+    Random r = new Random(System.currentTimeMillis());
+    memberClient.setName("Name_" + count);
+    long processCpuTime = (long) (r.nextDouble() * 100);
+    memberClient.setProcessCpuTime(processCpuTime);
+    memberClient.setCpuUsage(0);
+    memberClient.setGets(Math.abs(r.nextInt(100)));
+    memberClient.setHost(host);
+    memberClient.setId(String.valueOf(1000 + count));
+    memberClient.setPuts(Math.abs(r.nextInt(100)));
+    memberClient.setCpus(Math.abs(r.nextInt(20)));
+    memberClient.setQueueSize(Math.abs(r.nextInt(100)));
+    if ((count % 2) == 0){
+      memberClient.setStatus("up");
+    }
+    else{
+      memberClient.setStatus("down");
+    }
+    memberClient.setThreads(Math.abs(r.nextInt(100)));
+    memberClient
+        .setUptime(Math.abs(System.currentTimeMillis() - r.nextLong()));
+
+    return memberClient;
+  }
+
+  private Member initializeMember(String id, String name, boolean manager,
+      boolean isCache, boolean isLocator, boolean isServer, String host) {
+    Member m = new Member();
+
+    m.setId(id);
+    m.setName(name);
+
+    //m.setHost(getHostName(System.currentTimeMillis()));
+    m.setHost(host);
+
+    m.setMaxHeapSize(247);
+
+    Random r = new Random(System.currentTimeMillis());
+
+    m.setCache(isCache);
+    m.setLocator(isLocator);
+    m.setServer(isServer);
+    m.setManager(manager);
+
+    m.setLoadAverage((double) Math.abs(r.nextInt(100)));
+    m.setNumThreads(Math.abs(r.nextInt(100)));
+    m.setGarbageCollectionCount((long) Math.abs(r.nextInt(100)));
+    m.getGarbageCollectionSamples().add(m.getGarbageCollectionCount());
+
+    m.setTotalFileDescriptorOpen((long) Math.abs(r.nextInt(100)));
+    m.setTotalDiskUsage(Math.abs(r.nextInt(100)));
+
+
+    m.setThroughputWrites(Math.abs(r.nextInt(10)));
+    m.getThroughputWritesTrend().add(m.getThroughputWrites());
+
+    GatewayReceiver gatewayReceiver = m.getGatewayReceiver();
+    String port  = cluster.getPort();
+    if(port==null || "".equals(port))
+      port = "1099";
+    gatewayReceiver.setListeningPort(Integer.parseInt(port));
+    gatewayReceiver.setLinkThroughput(Math.abs(r.nextInt(10)));
+    gatewayReceiver.setAvgBatchProcessingTime((long) Math.abs(r.nextInt(10)));
+    gatewayReceiver.setId(String.valueOf(Math.abs(r.nextInt(10))));
+    gatewayReceiver.setQueueSize(Math.abs(r.nextInt(10)));
+    gatewayReceiver.setStatus(true);
+    gatewayReceiver.setBatchSize(Math.abs(r.nextInt(10)));
+
+    int gatewaySenderCount = Math.abs(r.nextInt(10));
+
+    List<GatewaySender> list = m.getGatewaySenderList();
+
+    for (int i = 0; i < gatewaySenderCount; i++) {
+      list.add(createGatewaySenderCount(r));
+    }
+
+    Map<String, List<Member>> physicalToMember = cluster.getPhysicalToMember();
+
+    List<Cluster.Member> memberArrList = physicalToMember.get(m.getHost());
+    if (memberArrList != null){
+      memberArrList.add(m);
+    }
+    else {
+      ArrayList<Cluster.Member> memberList = new ArrayList<Cluster.Member>();
+      memberList.add(m);
+      physicalToMember.put(m.getHost(), memberList);
+    }
+    int memberCount = 
cluster.getMemberCount();memberCount++;cluster.setMemberCount(memberCount);
+    return m;
+  }
+
+  private GatewaySender createGatewaySenderCount(Random r) {
+
+    GatewaySender gatewaySender = new GatewaySender();
+
+    gatewaySender.setBatchSize(Math.abs(r.nextInt(10)));
+    gatewaySender.setId(String.valueOf(Math.abs(r.nextInt(10))));
+    gatewaySender.setLinkThroughput(Math.abs(r.nextInt(10)));
+    gatewaySender.setPersistenceEnabled(true);
+    gatewaySender.setPrimary(true);
+    gatewaySender.setQueueSize(Math.abs(r.nextInt(10)));
+    gatewaySender.setSenderType(false);
+    gatewaySender.setStatus(true);
+
+    return gatewaySender;
+  }
+
+  /*
+  private String getHostName(long rndSeed) {
+    Random rnd = new Random(rndSeed);
+    String hName = null;
+
+    int index = Math.abs(rnd.nextInt(MAX_HOSTS));
+
+    ArrayList<String> hostNames = cluster.getHostNames();
+
+    if (hostNames.size() <= index) {
+      hName = "host" + hostNames.size();
+      hostNames.add(hName);
+    } else {
+      hName = hostNames.get(index);
+    }
+
+    Map<String, ArrayList<Member>> physicalToMember = 
cluster.getPhysicalToMember();
+
+    ArrayList<Member> memberArrList = physicalToMember.get(hName);
+    if (memberArrList != null) {
+      if (memberArrList.size() > 4){
+        hName = getHostName(rndSeed + rnd.nextLong());
+      }
+    }
+    return hName;
+  }*/
+
+  private void refresh(Member m) {
+    if(LOGGER.infoEnabled()){
+      LOGGER.info(resourceBundle.getString("LOG_MSG_REFRESHING_MEMBER_DATA")+" 
: " + m.getName());
+    }
+
+    Random r = new Random(System.currentTimeMillis());
+
+    m.setUptime(System.currentTimeMillis());
+    m.setQueueBacklog("" + Math.abs(r.nextInt(500)));
+    m.setCurrentHeapSize(Math.abs(r.nextInt(Math.abs((int) 
m.getMaxHeapSize()))));
+    m.setTotalDiskUsage(Math.abs(r.nextInt(100)));
+
+    double cpuUsage = r.nextDouble() * 100;
+    m.getCpuUsageSamples().add(cpuUsage);
+    m.setCpuUsage(cpuUsage);
+
+    m.getHeapUsageSamples().add(m.getCurrentHeapSize());
+    m.setLoadAverage((double) Math.abs(r.nextInt(100)));
+    m.setNumThreads(Math.abs(r.nextInt(100)));
+    m.setGarbageCollectionCount((long) Math.abs(r.nextInt(100)));
+    m.getGarbageCollectionSamples().add(m.getGarbageCollectionCount());
+
+    m.setTotalFileDescriptorOpen((long) Math.abs(r.nextInt(100)));
+
+    m.setThroughputWrites(Math.abs(r.nextInt(10)));
+    m.getThroughputWritesTrend().add(m.getThroughputWrites());
+
+    m.setGetsRate(Math.abs(r.nextInt(5000)));
+    m.getGetsPerSecond().add(m.getGetsRate());
+
+    m.setPutsRate(Math.abs(r.nextInt(5000)));
+    m.getPutsPerSecond().add(m.getPutsRate());
+
+    Alert[] alerts = cluster.getAlertsList();
+    List<Alert> alertsList = Arrays.asList(alerts);
+
+    if (r.nextBoolean()) {
+      // Generate alerts
+      if (r.nextBoolean()) {
+        if (r.nextInt(10) > 5) {
+          alertsList.add(createAlert(Alert.SEVERE, m.getName(), 
alertsList.size()));
+          if(alertsList.size() > ALERTS_MAX_SIZE){
+            alertsList.remove(0);
+          }
+        }
+      }
+
+      if (r.nextBoolean()) {
+        if (r.nextInt(10) > 5) {
+          alertsList.add(createAlert(Alert.ERROR, m.getName(), 
alertsList.size()));
+          if(alertsList.size() > ALERTS_MAX_SIZE){
+            alertsList.remove(0);
+          }
+        }
+      }
+
+      if (r.nextBoolean()) {
+        if (r.nextInt(10) > 5) {
+          alertsList.add(createAlert(Alert.WARNING, m.getName(), 
alertsList.size()));
+          if(alertsList.size() > ALERTS_MAX_SIZE){
+            alertsList.remove(0);
+          }
+        }
+      }
+    }
+  }
+
+  private Alert createAlert(int sev, String memberName, int index) {
+
+    Alert alert = new Alert();
+    alert.setSeverity(sev);
+    alert.setId(index);
+    alert.setMemberName(memberName);
+    alert.setTimestamp(new Date());
+
+    switch (sev) {
+    case Alert.SEVERE:
+      alert.setDescription(PulseConstants.ALERT_DESC_SEVERE);
+      break;
+    case Alert.ERROR:
+      alert.setDescription(PulseConstants.ALERT_DESC_ERROR);
+      break;
+    case Alert.WARNING:
+      alert.setDescription(PulseConstants.ALERT_DESC_WARNING);
+      break;
+    }
+    return alert;
+  }
+
+  @Override
+  public ObjectNode executeQuery(String queryText, String members, int limit) {
+    // TODO for Sushant/Sachin - Add implementation for MockUpdater for 
Automation
+    return null;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/9a2b5d7b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/TestBed.java
----------------------------------------------------------------------
diff --git 
a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/TestBed.java 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/TestBed.java
new file mode 100644
index 0000000..ba04c32
--- /dev/null
+++ 
b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/testbed/TestBed.java
@@ -0,0 +1,84 @@
+/*
+ *
+ * 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.vmware.geode.tools.pulse.testbed;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+public class TestBed {
+  
+  private String fileName=null;
+  PropFileHelper propertiesFile =null;
+  GemFireDistributedSystem ds = null;
+
+  public TestBed(){
+    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+    InputStream inputStream = 
classLoader.getResourceAsStream("testbed.properties");
+    Properties properties = new Properties();
+    try {
+      properties.load(inputStream);
+    } catch (IOException e) {
+      e.printStackTrace();
+      throw new RuntimeException(e);
+    }
+    propertiesFile = new PropFileHelper(properties);
+    ds = new GemFireDistributedSystem("t1", propertiesFile.getProperties());
+  }
+
+  public TestBed(String fileName) throws FileNotFoundException, IOException{
+    this.fileName = fileName;
+    propertiesFile = new PropFileHelper(fileName);
+    ds = new GemFireDistributedSystem("t1", propertiesFile.getProperties());
+  }
+  
+  
+  public TestBed(String fileName,boolean flag) throws FileNotFoundException, 
IOException{    
+//    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+//    InputStream inputStream = 
classLoader.getResourceAsStream("testbed.properties");
+//    System.out.println("Inputstream : " + inputStream);
+    Properties properties = new Properties();
+    try {
+      properties.load(new FileInputStream(new File(fileName)));
+    } catch (IOException e) {
+      e.printStackTrace();
+      throw new RuntimeException(e);
+    }    
+    this.fileName = fileName;
+    propertiesFile = new PropFileHelper(properties);
+    ds = new GemFireDistributedSystem("t1", propertiesFile.getProperties());
+  }
+  
+  
+  public String getBrowserForDriver(){
+    return propertiesFile.readKey("browser");
+  }
+  
+  public String getBrowserVersionForDriver(String browser){
+    return propertiesFile.readKey("browserVersion");
+  }
+  
+  public GemFireDistributedSystem getRootDs(){
+    return ds;
+  }  
+
+}
\ No newline at end of file

Reply via email to