/*
* Copyright 2010-2013 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.data.gemfire;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.same;
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.when;
import org.apache.geode.cache.AttributesMutator;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.CacheListener;
import org.apache.geode.cache.CacheLoader;
import org.apache.geode.cache.CacheWriter;
import org.apache.geode.cache.CustomExpiry;
import org.apache.geode.cache.EvictionAttributesMutator;
import org.apache.geode.cache.ExpirationAttributes;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionAttributes;
import org.apache.geode.cache.asyncqueue.AsyncEventQueue;
import org.apache.geode.cache.wan.GatewaySender;
import org.junit.Test;
/**
* The LookupRegionFactoryBeanTest class is a test suite of test cases testing the contract and functionality
* of the LookupRegionFactoryBean class.
*
* @author John Blum
* @see org.junit.Test
* @see org.mockito.Mockito
* @see org.springframework.data.gemfire.LookupRegionFactoryBean
* @see org.apache.geode.cache.AttributesMutator
* @see org.apache.geode.cache.Cache
* @see org.apache.geode.cache.EvictionAttributesMutator
* @see org.apache.geode.cache.Region
* @since 1.7.0
*/
public class LookupRegionFactoryBeanTest {
protected AsyncEventQueue mockAsyncEventQueue(final String id) {
AsyncEventQueue mockQueue = mock(AsyncEventQueue.class, String.format("MockAsyncEventQueue.%1$s", id));
when(mockQueue.getId()).thenReturn(id);
return mockQueue;
}
protected GatewaySender mockGatewaySender(final String id) {
GatewaySender mockGatewaySender = mock(GatewaySender.class, String.format("MockGatewaySender.%1$s", id));
when(mockGatewaySender.getId()).thenReturn(id);
return mockGatewaySender;
}
@Test
@SuppressWarnings("unchecked")
public void testAfterPropertiesSet() throws Exception {
Cache mockCache = mock(Cache.class, "testAfterPropertiesSet.MockCache");
Region<Object, Object> mockRegion = mock(Region.class, "testAfterPropertiesSet.MockRegion");
RegionAttributes<Object, Object> mockRegionAttributes = mock(RegionAttributes.class,
"testAfterPropertiesSet.MockRegionAttributes");
EvictionAttributesMutator mockEvictionAttributesMutator = mock(EvictionAttributesMutator.class,
"testAfterPropertiesSet.EvictionAttributesMutator");
AttributesMutator<Object, Object> mockAttributesMutator = mock(AttributesMutator.class,
"testAfterPropertiesSet.MockAttributesMutator");
when(mockCache.getRegion(eq("Example"))).thenReturn(mockRegion);
when(mockRegion.getFullPath()).thenReturn("/Example");
when(mockRegion.getName()).thenReturn("Example");
when(mockRegion.getAttributes()).thenReturn(mockRegionAttributes);
when(mockRegionAttributes.getStatisticsEnabled()).thenReturn(true);
when(mockRegion.getAttributesMutator()).thenReturn(mockAttributesMutator);
when(mockAttributesMutator.getEvictionAttributesMutator()).thenReturn(mockEvictionAttributesMutator);
AsyncEventQueue mockAsyncEventQueueOne = mockAsyncEventQueue("AEQ1");
AsyncEventQueue mockAsyncEventQueueTwo = mockAsyncEventQueue("AEQ2");
CacheListener mockCacheListenerZero = mock(CacheListener.class, "testAfterPropertiesSet.MockCacheListener.0");
CacheListener mockCacheListenerOne = mock(CacheListener.class, "testAfterPropertiesSet.MockCacheListener.1");
CacheListener mockCacheListenerTwo = mock(CacheListener.class, "testAfterPropertiesSet.MockCacheListener.2");
CacheLoader mockCacheLoader = mock(CacheLoader.class, "testAfterPropertiesSet.MockCacheLoader");
CacheWriter mockCacheWriter = mock(CacheWriter.class, "testAfterPropertiesSet.MockCacheWriter");
CustomExpiry mockCustomExpiryTti = mock(CustomExpiry.class, "testAfterPropertiesSet.MockCustomExpiry.TTI");
CustomExpiry mockCustomExpiryTtl = mock(CustomExpiry.class, "testAfterPropertiesSet.MockCustomExpiry.TTL");
ExpirationAttributes mockExpirationAttributesEntryTti = mock(ExpirationAttributes.class,
"testAfterPropertiesSet.MockExpirationAttributes.Entry.TTI");
ExpirationAttributes mockExpirationAttributesEntryTtl = mock(ExpirationAttributes.class,
"testAfterPropertiesSet.MockExpirationAttributes.Entry.TTL");
ExpirationAttributes mockExpirationAttributesRegionTti = mock(ExpirationAttributes.class,
"testAfterPropertiesSet.MockExpirationAttributes.Region.TTI");
ExpirationAttributes mockExpirationAttributesRegionTtl = mock(ExpirationAttributes.class,
"testAfterPropertiesSet.MockExpirationAttributes.Region.TTL");
GatewaySender mockGatewaySender = mockGatewaySender("GWS1");
LookupRegionFactoryBean factoryBean = new LookupRegionFactoryBean();
factoryBean.setAsyncEventQueues(new AsyncEventQueue[] { mockAsyncEventQueueOne, mockAsyncEventQueueTwo });
factoryBean.setBeanName("Example");
factoryBean.setCache(mockCache);
factoryBean.setCacheLoader(mockCacheLoader);
factoryBean.setCacheWriter(mockCacheWriter);
factoryBean.setCloningEnabled(true);
factoryBean.setCustomEntryIdleTimeout(mockCustomExpiryTti);
factoryBean.setCustomEntryTimeToLive(mockCustomExpiryTtl);
factoryBean.setEntryIdleTimeout(mockExpirationAttributesEntryTti);
factoryBean.setEntryTimeToLive(mockExpirationAttributesEntryTtl);
factoryBean.setGatewaySenders(new GatewaySender[] { mockGatewaySender });
factoryBean.setEvictionMaximum(1000);
factoryBean.setRegionIdleTimeout(mockExpirationAttributesRegionTti);
factoryBean.setRegionTimeToLive(mockExpirationAttributesRegionTtl);
factoryBean.setStatisticsEnabled(true);
factoryBean.setCacheListeners(new CacheListener[] {
mockCacheListenerZero, mockCacheListenerOne, mockCacheListenerTwo
});
factoryBean.afterPropertiesSet();
verify(mockAttributesMutator, times(1)).addAsyncEventQueueId(eq("AEQ1"));
verify(mockAttributesMutator, times(1)).addAsyncEventQueueId(eq("AEQ2"));
verify(mockAttributesMutator, times(1)).addCacheListener(same(mockCacheListenerZero));
verify(mockAttributesMutator, times(1)).addCacheListener(same(mockCacheListenerOne));
verify(mockAttributesMutator, times(1)).addCacheListener(same(mockCacheListenerTwo));
verify(mockAttributesMutator, times(1)).setCacheLoader(same(mockCacheLoader));
verify(mockAttributesMutator, times(1)).setCacheWriter(same(mockCacheWriter));
verify(mockAttributesMutator, times(1)).setCloningEnabled(eq(true));
verify(mockAttributesMutator, times(1)).setCustomEntryIdleTimeout(same(mockCustomExpiryTti));
verify(mockAttributesMutator, times(1)).setCustomEntryTimeToLive(same(mockCustomExpiryTtl));
verify(mockAttributesMutator, times(1)).setEntryIdleTimeout(same(mockExpirationAttributesEntryTti));
verify(mockAttributesMutator, times(1)).setEntryTimeToLive(same(mockExpirationAttributesEntryTtl));
verify(mockAttributesMutator, times(1)).addGatewaySenderId(eq("GWS1"));
verify(mockEvictionAttributesMutator, times(1)).setMaximum(eq(1000));
verify(mockAttributesMutator, times(1)).setRegionIdleTimeout(same(mockExpirationAttributesRegionTti));
verify(mockAttributesMutator, times(1)).setRegionTimeToLive(same(mockExpirationAttributesRegionTtl));
}
@Test(expected = IllegalStateException.class)
@SuppressWarnings("unchecked")
public void testAfterPropertiesSetWhenRegionStatisticsDisabledAndExpirationSpecified() throws Exception {
Cache mockCache = mock(Cache.class, "testAfterPropertiesSetWhenRegionStatisticsDisabledAndExpirationSpecified.MockCache");
Region<Object, Object> mockRegion = mock(Region.class, "testAfterPropertiesSetWhenRegionStatisticsDisabledAndExpirationSpecified.MockRegion");
RegionAttributes<Object, Object> mockRegionAttributes = mock(RegionAttributes.class,
"testAfterPropertiesSetWhenRegionStatisticsDisabledAndExpirationSpecified.MockRegionAttributes");
AttributesMutator mockAttributesMutator = mock(AttributesMutator.class,
"testAfterPropertiesSetWhenRegionStatisticsDisabledAndExpirationSpecified.MockAttributesMutator");
ExpirationAttributes mockExpirationAttributesEntryTtl = mock(ExpirationAttributes.class,
"testAfterPropertiesSetWhenRegionStatisticsDisabledAndExpirationSpecified.MockExpirationAttributes.Entry.TTL");
when(mockCache.getRegion(eq("Example"))).thenReturn(mockRegion);
when(mockRegion.getFullPath()).thenReturn("/Example");
when(mockRegion.getName()).thenReturn("Example");
when(mockRegion.getAttributes()).thenReturn(mockRegionAttributes);
when(mockRegion.getAttributesMutator()).thenReturn(mockAttributesMutator);
when(mockRegionAttributes.getStatisticsEnabled()).thenReturn(false);
LookupRegionFactoryBean factoryBean = new LookupRegionFactoryBean();
factoryBean.setBeanName("Example");
factoryBean.setCache(mockCache);
factoryBean.setEntryTimeToLive(mockExpirationAttributesEntryTtl);
//factoryBean.setStatisticsEnabled(true);
assertTrue(factoryBean.isStatisticsEnabled());
try {
factoryBean.afterPropertiesSet();
}
catch (IllegalStateException expected) {
assertEquals("Statistics for Region '/Example' must be enabled to change Entry & Region TTL/TTI Expiration settings",
expected.getMessage());
throw expected;
}
finally {
verify(mockAttributesMutator, never()).setEntryTimeToLive(any(ExpirationAttributes.class));
}
}
@Test
public void testIsLookupEnabledAlways() {
LookupRegionFactoryBean factoryBean = new LookupRegionFactoryBean();
assertTrue(factoryBean.isLookupEnabled());
factoryBean.setLookupEnabled(false);
assertTrue(factoryBean.isLookupEnabled());
}
}