blob: 95d91a8abedf6a9b037bf5bd02ac3cd945d2d1df [file] [log] [blame]
/*
* 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.cache;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.util.Arrays;
import java.util.Set;
import org.junit.Test;
import org.apache.geode.cache.util.CacheListenerAdapter;
import org.apache.geode.cache.util.CacheWriterAdapter;
import org.apache.geode.compression.SnappyCompressor;
/**
* Tests the functionality of the {@link AttributesFactory} class.
*
* @since GemFire 3.0
*/
public class AttributesFactoryJUnitTest {
@Test
public void testCopyConstructor() {
AttributesFactory f1 = new AttributesFactory();
f1.setLockGrantor(true);
RegionAttributes origAttrs = f1.create();
assertEquals(true, origAttrs.isLockGrantor());
AttributesFactory f2 = new AttributesFactory(origAttrs);
RegionAttributes attrs = f2.create();
assertEquals(true, attrs.isLockGrantor());
}
/**
* Tests the {@link AttributesFactory#create} throws the appropriate exception with
* poorly-configured factory.
*/
@Test
public void testInvalidConfigurations() {
AttributesFactory factory;
ExpirationAttributes invalidate =
new ExpirationAttributes(1, ExpirationAction.LOCAL_INVALIDATE);
ExpirationAttributes destroy = new ExpirationAttributes(1, ExpirationAction.LOCAL_DESTROY);
// DataPolicy.REPLICATE is incompatible with
// ExpirationAction.LOCAL_INVALIDATE
factory = new AttributesFactory();
factory.setDataPolicy(DataPolicy.REPLICATE);
factory.setEntryIdleTimeout(invalidate);
factory.setStatisticsEnabled(true);
{
RegionAttributes ra = factory.create();
assertEquals(DataPolicy.PRELOADED, ra.getDataPolicy());
assertEquals(new SubscriptionAttributes(InterestPolicy.ALL), ra.getSubscriptionAttributes());
}
// DataPolicy.REPLICATE is incompatible with
// ExpirationAction.LOCAL_DESTROY.
factory = new AttributesFactory();
factory.setDataPolicy(DataPolicy.REPLICATE);
factory.setEntryIdleTimeout(destroy);
factory.setStatisticsEnabled(true);
{
RegionAttributes ra = factory.create();
assertEquals(DataPolicy.PRELOADED, ra.getDataPolicy());
assertEquals(new SubscriptionAttributes(InterestPolicy.ALL), ra.getSubscriptionAttributes());
}
// MirrorType KEYS is incompatible with
// ExpirationAction.LOCAL_INVALIDATE
factory = new AttributesFactory();
factory.setMirrorType(MirrorType.KEYS);
factory.setEntryIdleTimeout(destroy);
factory.setStatisticsEnabled(true);
{
RegionAttributes ra = factory.create();
assertEquals(DataPolicy.PRELOADED, ra.getDataPolicy());
assertEquals(new SubscriptionAttributes(InterestPolicy.ALL), ra.getSubscriptionAttributes());
}
// MirrorType.KEYS are incompatible with
// ExpirationAction.LOCAL_DESTROY.
factory = new AttributesFactory();
factory.setMirrorType(MirrorType.KEYS);
factory.setEntryIdleTimeout(destroy);
factory.setStatisticsEnabled(true);
{
RegionAttributes ra = factory.create();
assertEquals(DataPolicy.PRELOADED, ra.getDataPolicy());
assertEquals(new SubscriptionAttributes(InterestPolicy.ALL), ra.getSubscriptionAttributes());
}
// Entry idle expiration requires that
// statistics are enabled
factory = new AttributesFactory();
factory.setEntryIdleTimeout(destroy);
factory.setStatisticsEnabled(false);
try {
factory.create();
fail("Should have thrown an IllegalStateException");
} catch (Exception ex) {
assertTrue(ex instanceof IllegalStateException);
// pass...
}
// Entry ttl expiration requires that
// statistics are enabled
factory = new AttributesFactory();
factory.setEntryTimeToLive(destroy);
factory.setStatisticsEnabled(false);
try {
factory.create();
fail("Should have thrown an IllegalStateException");
} catch (Exception ex) {
assertTrue(ex instanceof IllegalStateException);
// pass...
}
// MembershipAttributes (required roles)
// requires distributed scope
factory = new AttributesFactory();
factory.setScope(Scope.LOCAL);
MembershipAttributes ra = new MembershipAttributes(new String[] {"A"});
factory.setMembershipAttributes(ra);
try {
factory.create();
fail("Should have thrown an IllegalStateException");
} catch (Exception ex) {
assertTrue(ex instanceof IllegalStateException);
// pass...
}
// Used mixed mode API for disk store and DWA
factory = new AttributesFactory();
factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
factory.setDiskStoreName("ds1");
DiskWriteAttributesFactory dwaf = new DiskWriteAttributesFactory();
try {
factory.setDiskWriteAttributes(dwaf.create());
fail("Should have thrown an IllegalStateException");
} catch (Exception ex) {
assertTrue(ex instanceof IllegalStateException);
// pass...
}
// Used mixed mode API for disk store and DWA
factory = new AttributesFactory();
factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
DiskWriteAttributesFactory dwaf2 = new DiskWriteAttributesFactory();
factory.setDiskWriteAttributes(dwaf2.create());
try {
factory.setDiskStoreName("ds1");
fail("Should have thrown an IllegalStateException");
} catch (Exception ex) {
assertTrue(ex instanceof IllegalStateException);
// pass...
}
// Used mixed mode API for disk store and DWA
factory = new AttributesFactory();
factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
File[] dirs1 = new File[] {new File("").getAbsoluteFile()};
factory.setDiskStoreName("ds1");
try {
factory.setDiskDirs(dirs1);
fail("Should have thrown an IllegalStateException");
} catch (Exception ex) {
assertTrue(ex instanceof IllegalStateException);
// pass...
}
// Used mixed mode API for disk store and DWA
factory = new AttributesFactory();
factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
File[] dirs2 = new File[] {new File("").getAbsoluteFile()};
factory.setDiskDirs(dirs2);
try {
factory.setDiskStoreName("ds1");
fail("Should have thrown an IllegalStateException");
} catch (Exception ex) {
assertTrue(ex instanceof IllegalStateException);
// pass...
}
// Cloning cannot be disabled when a compressor is set
factory = new AttributesFactory();
factory.setCompressor(SnappyCompressor.getDefaultInstance());
factory.setCloningEnabled(false);
try {
RegionAttributes ccra = factory.create();
fail("Should have thrown an IllegalStateException");
} catch (IllegalStateException expected) {
// Expected
}
}
/**
* Tests that the {@link AttributesFactory#AttributesFactory() default} attributes factory has the
* advertised default configuration.
*/
@Test
public void testDefaultConfiguration() {
AttributesFactory factory = new AttributesFactory();
RegionAttributes attrs = factory.create();
assertNull(attrs.getCacheLoader());
assertNull(attrs.getCacheWriter());
assertNull(attrs.getCacheListener());
assertEquals(Arrays.asList(new CacheListener[0]), Arrays.asList(attrs.getCacheListeners()));
assertEquals(0, attrs.getRegionTimeToLive().getTimeout());
assertEquals(0, attrs.getRegionIdleTimeout().getTimeout());
assertEquals(0, attrs.getEntryTimeToLive().getTimeout());
assertEquals(null, attrs.getCustomEntryTimeToLive());
assertEquals(0, attrs.getEntryIdleTimeout().getTimeout());
assertEquals(null, attrs.getCustomEntryIdleTimeout());
assertEquals(Scope.DISTRIBUTED_NO_ACK, attrs.getScope());
assertEquals(DataPolicy.DEFAULT, attrs.getDataPolicy());
assertEquals(InterestPolicy.DEFAULT, attrs.getSubscriptionAttributes().getInterestPolicy());
assertEquals(MirrorType.NONE, attrs.getMirrorType());
assertEquals(null, attrs.getDiskStoreName());
assertEquals(AttributesFactory.DEFAULT_DISK_SYNCHRONOUS, attrs.isDiskSynchronous());
assertNull(attrs.getKeyConstraint());
assertEquals(16, attrs.getInitialCapacity());
assertEquals(0.75, attrs.getLoadFactor(), 0.0);
assertFalse(attrs.getStatisticsEnabled());
assertFalse(attrs.getPersistBackup());
DiskWriteAttributes dwa = attrs.getDiskWriteAttributes();
assertNotNull(dwa);
{
DiskWriteAttributesFactory dwaf = new DiskWriteAttributesFactory();
dwaf.setSynchronous(AttributesFactory.DEFAULT_DISK_SYNCHRONOUS);
assertEquals(dwaf.create(), dwa);
}
assertNull(attrs.getDiskStoreName());
File[] diskDirs = attrs.getDiskDirs();
assertNotNull(diskDirs);
assertEquals(1, diskDirs.length);
assertEquals(new File("."), diskDirs[0]);
int[] diskSizes = attrs.getDiskDirSizes();
assertNotNull(diskSizes);
assertEquals(1, diskSizes.length);
assertEquals(DiskStoreFactory.DEFAULT_DISK_DIR_SIZE, diskSizes[0]);
assertTrue(attrs.getConcurrencyChecksEnabled());
}
@Test
public void testDiskSynchronous() {
{
AttributesFactory factory = new AttributesFactory();
factory.setDiskSynchronous(true);
RegionAttributes attrs = factory.create();
assertEquals(true, attrs.isDiskSynchronous());
assertEquals(true, attrs.getDiskWriteAttributes().isSynchronous());
}
{
AttributesFactory factory = new AttributesFactory();
factory.setDiskSynchronous(false);
RegionAttributes attrs = factory.create();
assertEquals(false, attrs.isDiskSynchronous());
assertEquals(false, attrs.getDiskWriteAttributes().isSynchronous());
}
// Test backwards compat interaction with diskSync.
// If the old apis are used then we should get the old default of async.
{
DiskWriteAttributesFactory dwaf = new DiskWriteAttributesFactory();
AttributesFactory factory = new AttributesFactory();
factory.setDiskWriteAttributes(dwaf.create());
RegionAttributes attrs = factory.create();
assertEquals(false, attrs.getDiskWriteAttributes().isSynchronous());
assertEquals(false, attrs.isDiskSynchronous());
}
{
AttributesFactory factory = new AttributesFactory();
factory.setDiskDirs(new File[] {new File("").getAbsoluteFile()});
RegionAttributes attrs = factory.create();
assertEquals(false, attrs.getDiskWriteAttributes().isSynchronous());
assertEquals(false, attrs.isDiskSynchronous());
}
{
AttributesFactory factory = new AttributesFactory();
factory.setDiskDirsAndSizes(new File[] {new File("").getAbsoluteFile()}, new int[] {100});
RegionAttributes attrs = factory.create();
assertEquals(false, attrs.getDiskWriteAttributes().isSynchronous());
assertEquals(false, attrs.isDiskSynchronous());
}
}
/**
* Tests the cacheListener functionality
*
* @since GemFire 5.0
*/
@Test
public void testCacheListeners() {
RegionAttributes ra;
CacheListener cl1 = new MyCacheListener();
CacheListener cl2 = new MyCacheListener();
assertFalse(cl1.equals(cl2));
assertFalse((Arrays.asList(new CacheListener[] {cl1, cl2}))
.equals(Arrays.asList(new CacheListener[] {cl2, cl1})));
AttributesFactory factory = new AttributesFactory();
try {
factory.addCacheListener(null);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException expected) {
}
try {
factory.initCacheListeners(new CacheListener[] {null});
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException expected) {
}
ra = factory.create();
assertEquals(null, ra.getCacheListener());
assertEquals(Arrays.asList(new CacheListener[0]), Arrays.asList(ra.getCacheListeners()));
factory.setCacheListener(cl1);
ra = factory.create();
assertEquals(cl1, ra.getCacheListener());
assertEquals(Arrays.asList(new CacheListener[] {cl1}), Arrays.asList(ra.getCacheListeners()));
factory.setCacheListener(cl2);
ra = factory.create();
assertEquals(cl2, ra.getCacheListener());
assertEquals(Arrays.asList(new CacheListener[] {cl2}), Arrays.asList(ra.getCacheListeners()));
factory.setCacheListener(null);
ra = factory.create();
assertEquals(null, ra.getCacheListener());
assertEquals(Arrays.asList(new CacheListener[0]), Arrays.asList(ra.getCacheListeners()));
factory.setCacheListener(cl1);
factory.initCacheListeners(new CacheListener[] {cl1, cl2});
ra = factory.create();
try {
ra.getCacheListener();
fail("expected IllegalStateException");
} catch (IllegalStateException expected) {
}
assertEquals(Arrays.asList(new CacheListener[] {cl1, cl2}),
Arrays.asList(ra.getCacheListeners()));
factory.initCacheListeners(null);
ra = factory.create();
assertEquals(Arrays.asList(new CacheListener[0]), Arrays.asList(ra.getCacheListeners()));
factory.initCacheListeners(new CacheListener[0]);
ra = factory.create();
assertEquals(Arrays.asList(new CacheListener[0]), Arrays.asList(ra.getCacheListeners()));
factory.addCacheListener(cl1);
ra = factory.create();
assertEquals(Arrays.asList(new CacheListener[] {cl1}), Arrays.asList(ra.getCacheListeners()));
factory.addCacheListener(cl2);
ra = factory.create();
assertEquals(Arrays.asList(new CacheListener[] {cl1, cl2}),
Arrays.asList(ra.getCacheListeners()));
factory.initCacheListeners(new CacheListener[] {cl2});
ra = factory.create();
assertEquals(Arrays.asList(new CacheListener[] {cl2}), Arrays.asList(ra.getCacheListeners()));
}
/**
* @since GemFire 5.7
*/
@Test
public void testConnectionPool() {
CacheLoader cl = new CacheLoader() {
@Override
public Object load(LoaderHelper helper) throws CacheLoaderException {
return null;
}
@Override
public void close() {}
};
AttributesFactory factory = new AttributesFactory();
factory.setPoolName("mypool");
factory = new AttributesFactory();
factory.setCacheWriter(new CacheWriterAdapter());
factory.setPoolName("mypool");
factory = new AttributesFactory();
factory.setCacheLoader(cl);
factory.setPoolName("mypool");
}
/**
* Trivial cache listener impl
*
* @since GemFire 5.0
*/
private static class MyCacheListener extends CacheListenerAdapter {
// empty impl
}
@Test
public void addsGatewaySenderId() {
AttributesFactory factory = new AttributesFactory();
factory.addGatewaySenderId("someSenderId");
RegionAttributes regionAttributes = factory.create();
Set gatewaySenderIds = regionAttributes.getGatewaySenderIds();
assertTrue(gatewaySenderIds.contains("someSenderId"));
}
@Test(expected = IllegalArgumentException.class)
public void addingNullGatewaySenderIdThrowsException() {
AttributesFactory factory = new AttributesFactory();
factory.addGatewaySenderId(null);
}
@Test
public void addsAsyncEventQueueId() {
AttributesFactory factory = new AttributesFactory();
factory.addAsyncEventQueueId("someId");
RegionAttributes regionAttributes = factory.create();
Set asyncEventQueueIds = regionAttributes.getAsyncEventQueueIds();
assertTrue(asyncEventQueueIds.contains("someId"));
}
@Test(expected = IllegalArgumentException.class)
public void addingNullAsyncEventQueueIdThrowsException() {
AttributesFactory factory = new AttributesFactory();
factory.addAsyncEventQueueId(null);
}
}