Add Unit Tests for GeodeRegionHealthIndicator.

This commit is contained in:
John Blum
2018-09-19 19:17:10 -07:00
parent b286c5c6f0
commit e048bf202d
2 changed files with 188 additions and 1 deletions

View File

@@ -145,9 +145,10 @@ public class GeodeRegionsHealthIndicator extends AbstractGeodeHealthIndicator {
.map(Region::getAttributes)
.map(RegionAttributes::getPartitionAttributes)
.ifPresent(partitionAttributes -> builder
.withDetail(cachePartitionRegionKey(regionName, "colocated-with"), partitionAttributes.getColocatedWith())
.withDetail(cachePartitionRegionKey(regionName, "collocated-with"), partitionAttributes.getColocatedWith())
.withDetail(cachePartitionRegionKey(regionName, "local-max-memory"), partitionAttributes.getLocalMaxMemory())
.withDetail(cachePartitionRegionKey(regionName, "redundant-copies"), partitionAttributes.getRedundantCopies())
.withDetail(cachePartitionRegionKey(regionName, "total-max-memory"), partitionAttributes.getTotalMaxMemory())
.withDetail(cachePartitionRegionKey(regionName, "total-number-of-buckets"), partitionAttributes.getTotalNumBuckets()));
};
}

View File

@@ -0,0 +1,186 @@
/*
* Copyright 2018 the original author or authors.
*
* Licensed 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.springframework.geode.boot.actuate;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.data.gemfire.util.CollectionUtils.asSet;
import java.util.Arrays;
import java.util.Currency;
import java.util.Map;
import java.util.Set;
import org.apache.geode.cache.CacheStatistics;
import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.PartitionAttributes;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.Scope;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.Status;
import org.springframework.data.gemfire.tests.mock.CacheMockObjects;
/**
* Unit tests for {@link GeodeRegionsHealthIndicator}.
*
* @author John Blum
* @see org.junit.Test
* @see org.mockito.Mock
* @see org.mockito.Mockito
* @see org.mockito.junit.MockitoJUnitRunner
* @see org.apache.geode.cache.GemFireCache
* @see org.apache.geode.cache.Region
* @see org.springframework.boot.actuate.health.Health
* @see org.springframework.boot.actuate.health.HealthIndicator
* @see org.springframework.data.gemfire.tests.mock.CacheMockObjects
* @see org.springframework.geode.boot.actuate.GeodeRegionsHealthIndicator
* @since 1.0.0
*/
@RunWith(MockitoJUnitRunner.class)
public class GeodeRegionsHealthIndicatorUnitTests {
@Mock
private GemFireCache mockGemFireCache;
private GeodeRegionsHealthIndicator regionsHealthIndicator;
@Before
public void setup() {
this.regionsHealthIndicator = new GeodeRegionsHealthIndicator(this.mockGemFireCache);
}
@Test
@SuppressWarnings("unchecked")
public void healthCheckCapturesDetails() throws Exception {
Region<?, ?> mockRegionOne = CacheMockObjects.mockRegion("MockRegionOne", DataPolicy.PARTITION);
when(mockRegionOne.getAttributes().getCloningEnabled()).thenReturn(true);
when(mockRegionOne.getAttributes().getInitialCapacity()).thenReturn(101);
when(mockRegionOne.getAttributes().getLoadFactor()).thenReturn(0.75f);
when(mockRegionOne.getAttributes().getKeyConstraint()).thenReturn((Class) Long.class);
when(mockRegionOne.getAttributes().getOffHeap()).thenReturn(true);
when(mockRegionOne.getAttributes().getPoolName()).thenReturn("");
when(mockRegionOne.getAttributes().getScope()).thenReturn(Scope.DISTRIBUTED_ACK);
when(mockRegionOne.getAttributes().getValueConstraint()).thenReturn((Class) Currency.class);
PartitionAttributes<?, ?> mockRegionOnePartitionAttributes = mock(PartitionAttributes.class);
when(mockRegionOnePartitionAttributes.getColocatedWith()).thenReturn("CollocatedRegion");
when(mockRegionOnePartitionAttributes.getLocalMaxMemory()).thenReturn(10240);
when(mockRegionOnePartitionAttributes.getRedundantCopies()).thenReturn(2);
when(mockRegionOnePartitionAttributes.getTotalMaxMemory()).thenReturn(4096000L);
when(mockRegionOnePartitionAttributes.getTotalNumBuckets()).thenReturn(226);
when(mockRegionOne.getAttributes().getPartitionAttributes()).thenReturn(mockRegionOnePartitionAttributes);
Region<?, ?> mockRegionTwo = CacheMockObjects.mockRegion("MockRegionTwo", DataPolicy.EMPTY);
when(mockRegionTwo.getAttributes().getCloningEnabled()).thenReturn(false);
when(mockRegionTwo.getAttributes().getInitialCapacity()).thenReturn(0);
when(mockRegionTwo.getAttributes().getLoadFactor()).thenReturn(0.0f);
when(mockRegionTwo.getAttributes().getKeyConstraint()).thenReturn((Class) Integer.class);
when(mockRegionTwo.getAttributes().getOffHeap()).thenReturn(false);
when(mockRegionTwo.getAttributes().getPoolName()).thenReturn("TestPool");
when(mockRegionTwo.getAttributes().getScope()).thenReturn(Scope.DISTRIBUTED_NO_ACK);
when(mockRegionTwo.getAttributes().getStatisticsEnabled()).thenReturn(true);
when(mockRegionTwo.getAttributes().getValueConstraint()).thenReturn((Class) String.class);
CacheStatistics mockCacheStatistics = mock(CacheStatistics.class);
when(mockCacheStatistics.getHitCount()).thenReturn(202408L);
when(mockCacheStatistics.getHitRatio()).thenReturn(0.82f);
when(mockCacheStatistics.getLastAccessedTime()).thenReturn(1L);
when(mockCacheStatistics.getLastModifiedTime()).thenReturn(2L);
when(mockCacheStatistics.getMissCount()).thenReturn(767L);
when(mockRegionTwo.getStatistics()).thenReturn(mockCacheStatistics);
Set<Region<?, ?>> mockRegions = asSet(mockRegionOne, mockRegionTwo);
when(mockGemFireCache.rootRegions()).thenReturn(mockRegions);
Health.Builder builder = new Health.Builder();
this.regionsHealthIndicator.doHealthCheck(builder);
Health health = builder.build();
assertThat(health).isNotNull();
assertThat(health.getStatus()).isEqualTo(Status.UP);
Map<String, Object> healthDetails = health.getDetails();
assertThat(healthDetails).isNotNull();
assertThat(healthDetails).isNotEmpty();
assertThat(healthDetails).containsEntry("geode.cache.regions", Arrays.asList("/MockRegionOne", "/MockRegionTwo"));
assertThat(healthDetails).containsEntry("geode.cache.regions.count", (long) mockRegions.size());
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.cloning-enabled", "Yes");
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.data-policy", DataPolicy.PARTITION);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.initial-capacity", 101);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.load-factor", 0.75f);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.key-constraint", Long.class.getName());
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.off-heap", "Yes");
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.partition.collocated-with", "CollocatedRegion");
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.partition.local-max-memory", 10240);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.partition.redundant-copies", 2);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.partition.total-max-memory", 4096000L);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.partition.total-number-of-buckets", 226);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.pool-name", "");
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.scope", Scope.DISTRIBUTED_ACK);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionOne.value-constraint", Currency.class.getName());
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.cloning-enabled", "No");
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.data-policy", DataPolicy.EMPTY);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.initial-capacity", 0);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.load-factor", 0.0f);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.key-constraint", Integer.class.getName());
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.off-heap", "No");
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.pool-name", "TestPool");
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.scope", Scope.DISTRIBUTED_NO_ACK);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.statistics.hit-count", 202408L);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.statistics.hit-ratio", 0.82f);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.statistics.last-accessed-time", 1L);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.statistics.last-modified-time", 2L);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.statistics.miss-count", 767L);
assertThat(healthDetails).containsEntry("geode.cache.regions.MockRegionTwo.value-constraint", String.class.getName());
verify(this.mockGemFireCache, times(1)).rootRegions();
}
@Test
public void healthCheckFailsWhenGemFireCacheIsNotPresent() throws Exception {
GeodeRegionsHealthIndicator healthIndicator = new GeodeRegionsHealthIndicator();
Health.Builder builder = new Health.Builder();
healthIndicator.doHealthCheck(builder);
Health health = builder.build();
assertThat(health).isNotNull();
assertThat(health.getDetails()).isEmpty();
assertThat(health.getStatus()).isEqualTo(Status.UNKNOWN);
}
}