Adapt CacheUtils to identify client LOCAL Regions when collecting (getting) all values from the Region in collectValues(:Region).

Add new isProxyRegion(:Region) method to safely determine if the Region is a PROXY.

Add new isRegionWithPool(:Region) method to safely determine if the Region has been configured with a Pool, imply the Region is owned by a client (i.e. ClientCache).

Edit Javadoc.
This commit is contained in:
John Blum
2020-06-08 12:22:49 -07:00
parent 80c34d2198
commit 6fbc40daa8
2 changed files with 292 additions and 13 deletions

View File

@@ -16,9 +16,11 @@
package org.springframework.geode.util;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
@@ -34,6 +36,7 @@ import java.util.TreeSet;
import org.junit.Test;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionAttributes;
@@ -63,6 +66,8 @@ public class CacheUtilsUnitTests {
Region<Object, Object> mockRegion = mock(Region.class);
RegionAttributes<Object, Object> mockRegionAttributes = mock(RegionAttributes.class);
RegionService mockRegionService = mock(ClientCache.class);
Set<?> keySetOnServer = new TreeSet<>(Arrays.asList(1, 2, 3));
@@ -73,17 +78,23 @@ public class CacheUtilsUnitTests {
keysValues.put(2, "two");
keysValues.put(3, "three");
doReturn(mockRegionAttributes).when(mockRegion).getAttributes();
doReturn(mockRegionService).when(mockRegion).getRegionService();
doReturn(keySetOnServer).when(mockRegion).keySetOnServer();
doReturn(keysValues).when(mockRegion).getAll(eq(keySetOnServer));
doReturn(DataPolicy.EMPTY).when(mockRegionAttributes).getDataPolicy();
assertThat(CacheUtils.collectValues(mockRegion)).containsExactlyInAnyOrder(keysValues.values().toArray());
verify(mockRegion, times(2)).getAttributes();
verify(mockRegion, times(1)).getRegionService();
verify(mockRegion, times(1)).keySetOnServer();
verify(mockRegion, times(1)).getAll(eq(keySetOnServer));
verifyNoMoreInteractions(mockRegion);
verify(mockRegion, never()).values();
verify(mockRegionAttributes, times(1)).getDataPolicy();
verify(mockRegionAttributes, never()).getPoolName();
verifyNoInteractions(mockRegionService);
verifyNoMoreInteractions(mockRegion);
}
@Test
@@ -91,24 +102,33 @@ public class CacheUtilsUnitTests {
Region<Object, Object> mockRegion = mock(Region.class);
RegionAttributes<Object, Object> mockRegionAttributes = mock(RegionAttributes.class);
RegionService mockRegionService = mock(ClientCache.class);
Set<Object> keySetOnServer = new TreeSet<>(Arrays.asList(1, 2));
doReturn(mockRegionAttributes).when(mockRegion).getAttributes();
doReturn(mockRegionService).when(mockRegion).getRegionService();
doReturn(keySetOnServer).when(mockRegion).keySetOnServer();
doReturn(null).when(mockRegion).getAll(eq(keySetOnServer));
doReturn(DataPolicy.NORMAL).when(mockRegionAttributes).getDataPolicy();
doReturn("Car").when(mockRegionAttributes).getPoolName();
Collection<Object> values = CacheUtils.collectValues(mockRegion);
assertThat(values).isNotNull();
assertThat(values).isEmpty();
verify(mockRegion, times(3)).getAttributes();
verify(mockRegion, times(1)).getRegionService();
verify(mockRegion, times(1)).keySetOnServer();
verify(mockRegion, times(1)).getAll(eq(keySetOnServer));
verifyNoMoreInteractions(mockRegion);
verify(mockRegion, never()).values();
verify(mockRegionAttributes, times(1)).getDataPolicy();
verify(mockRegionAttributes, times(1)).getPoolName();
verifyNoInteractions(mockRegionService);
verifyNoMoreInteractions(mockRegion);
}
@Test
@@ -116,20 +136,30 @@ public class CacheUtilsUnitTests {
Region<Object, Object> mockRegion = mock(Region.class);
RegionAttributes<Object, Object> mockRegionAttributes = mock(RegionAttributes.class);
RegionService mockRegionService = mock(ClientCache.class);
doReturn(mockRegionAttributes).when(mockRegion).getAttributes();
doReturn(mockRegionService).when(mockRegion).getRegionService();
doReturn(null).when(mockRegion).keySetOnServer();
doReturn(DataPolicy.PARTITION).when(mockRegionAttributes).getDataPolicy();
doReturn("Dead").when(mockRegionAttributes).getPoolName();
Collection<Object> values = CacheUtils.collectValues(mockRegion);
assertThat(values).isNotNull();
assertThat(values).isEmpty();
verify(mockRegion, times(3)).getAttributes();
verify(mockRegion, times(1)).getRegionService();
verify(mockRegion, times(1)).keySetOnServer();
verifyNoMoreInteractions(mockRegion);
verify(mockRegion, never()).getAll(any());
verify(mockRegion, never()).values();
verify(mockRegionAttributes, times(1)).getDataPolicy();
verify(mockRegionAttributes, times(1)).getPoolName();
verifyNoInteractions(mockRegionService);
verifyNoMoreInteractions(mockRegion);
}
@Test
@@ -148,6 +178,36 @@ public class CacheUtilsUnitTests {
verify(mockRegion, times(1)).values();
}
@Test
public void collectValuesFromLocalClientRegion() {
Region<?, String> mockRegion = mock(Region.class);
RegionAttributes<?, String> mockRegionAttributes = mock(RegionAttributes.class);
RegionService mockRegionService = mock(ClientCache.class);
doReturn(mockRegionAttributes).when(mockRegion).getAttributes();
doReturn(mockRegionService).when(mockRegion).getRegionService();
doReturn(DataPolicy.NORMAL).when(mockRegionAttributes).getDataPolicy();
doReturn(" ").when(mockRegionAttributes).getPoolName();
doReturn(Arrays.asList("one", "two")).when(mockRegion).values();
Collection<String> values = CacheUtils.collectValues(mockRegion);
assertThat(values).isNotNull();
assertThat(values).containsExactly("one", "two");
verify(mockRegion, times(1)).getRegionService();
verify(mockRegion, times(3)).getAttributes();
verify(mockRegion, times(1)).values();
verify(mockRegion, never()).keySetOnServer();
verify(mockRegion, never()).getAll(any());
verify(mockRegionAttributes, times(1)).getDataPolicy();
verify(mockRegionAttributes, times(1)).getPoolName();
verifyNoInteractions(mockRegionService);
}
@Test
public void collectValuesFromPeerRegion() {
@@ -370,4 +430,135 @@ public class CacheUtilsUnitTests {
public void isPeerRegionWithNull() {
assertThat(CacheUtils.isPeerRegion(null)).isFalse();
}
@Test
public void isProxyRegionWithProxyRegionBasedOnDataPolicy() {
Region<?, ?> mockRegion = mock(Region.class);
RegionAttributes<?, ?> mockRegionAttributes = mock(RegionAttributes.class);
doReturn(mockRegionAttributes).when(mockRegion).getAttributes();
doReturn(DataPolicy.EMPTY).when(mockRegionAttributes).getDataPolicy();
assertThat(CacheUtils.isProxyRegion(mockRegion)).isTrue();
verify(mockRegion, times(2)).getAttributes();
verify(mockRegionAttributes, times(1)).getDataPolicy();
verify(mockRegionAttributes, never()).getPoolName();
}
@Test
public void isProxyRegionWithProxyRegionBasedOnPoolConfiguration() {
Region<?, ?> mockRegion = mock(Region.class);
RegionAttributes<?, ?> mockRegionAttributes = mock(RegionAttributes.class);
doReturn(mockRegionAttributes).when(mockRegion).getAttributes();
doReturn(DataPolicy.NORMAL).when(mockRegionAttributes).getDataPolicy();
doReturn("TestPool").when(mockRegionAttributes).getPoolName();
assertThat(CacheUtils.isProxyRegion(mockRegion)).isTrue();
verify(mockRegion, times(3)).getAttributes();
verify(mockRegionAttributes, times(1)).getDataPolicy();
verify(mockRegionAttributes, times(1)).getPoolName();
}
@Test
public void isProxyRegionWithNonProxyRegion() {
Region<?, ?> mockRegion = mock(Region.class);
RegionAttributes<?, ?> mockRegionAttributes = mock(RegionAttributes.class);
doReturn(mockRegionAttributes).when(mockRegion).getAttributes();
doReturn(DataPolicy.NORMAL).when(mockRegionAttributes).getDataPolicy();
doReturn(" ").when(mockRegionAttributes).getPoolName();
assertThat(CacheUtils.isProxyRegion(mockRegion)).isFalse();
verify(mockRegion, times(3)).getAttributes();
verify(mockRegionAttributes, times(1)).getDataPolicy();
verify(mockRegionAttributes, times(1)).getPoolName();
}
@Test
public void isProxyRegionWithRegionHavingNoAttributesIsNullSafe() {
Region<?, ?> mockRegion = mock(Region.class);
assertThat(CacheUtils.isProxyRegion(mockRegion)).isFalse();
verify(mockRegion, times(1)).getAttributes();
verifyNoMoreInteractions(mockRegion);
}
@Test
public void isProxyRegionWithNullRegionIsNullSafe() {
assertThat(CacheUtils.isProxyRegion(null)).isFalse();
}
@Test
public void isRegionWithPoolWithPooledRegion() {
Region<?, ?> mockRegion = mock(Region.class);
RegionAttributes<?, ?> mockRegionAttributes = mock(RegionAttributes.class);
doReturn(mockRegionAttributes).when(mockRegion).getAttributes();
doReturn("Swimming").when(mockRegionAttributes).getPoolName();
assertThat(CacheUtils.isRegionWithPool(mockRegion)).isTrue();
verify(mockRegion, times(1)).getAttributes();
verify(mockRegionAttributes, times(1)).getPoolName();
}
@Test
public void isRegionWithPoolUsingRegionHavingNoAttributesIsNullSafe() {
Region<?, ?> mockRegion = mock(Region.class);
assertThat(CacheUtils.isRegionWithPool(mockRegion)).isFalse();
verify(mockRegion, times(1)).getAttributes();
verifyNoMoreInteractions(mockRegion);
}
@Test
public void isRegionWithPoolUsingNullRegionIsNullSafe() {
assertThat(CacheUtils.isRegionWithPool(null)).isFalse();
}
private void testIsRegionWithPoolUsingRegionWithInvalidPoolNameReturnsFalse(String poolName) {
Region<?, ?> mockRegion = mock(Region.class);
RegionAttributes<?, ?> mockRegionAttributes = mock(RegionAttributes.class);
doReturn(mockRegionAttributes).when(mockRegion).getAttributes();
doReturn(poolName).when(mockRegionAttributes).getPoolName();
assertThat(CacheUtils.isRegionWithPool(mockRegion)).isFalse();
verify(mockRegion, times(1)).getAttributes();
verify(mockRegionAttributes, times(1)).getPoolName();
}
@Test
public void isRegionWithPoolUsingRegionConfiguredWithBlankPoolName() {
testIsRegionWithPoolUsingRegionWithInvalidPoolNameReturnsFalse(" ");
}
@Test
public void isRegionWithPoolUsingRegionConfiguredWithEmptyPoolName() {
testIsRegionWithPoolUsingRegionWithInvalidPoolNameReturnsFalse("");
}
@Test
public void isRegionWithPoolUsingRegionConfiguredWithNullPoolName() {
testIsRegionWithPoolUsingRegionWithInvalidPoolNameReturnsFalse(null);
}
}