/*
* 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 org.apache.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 org.apache.geode.tools.pulse.internal.PulseAppListener;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.geode.test.junit.categories.UnitTest;
import org.apache.geode.tools.pulse.internal.controllers.PulseController;
import org.apache.geode.tools.pulse.internal.data.Cluster;
import org.apache.geode.tools.pulse.internal.data.PulseConfig;
import org.apache.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 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)")));
}
}