/*
* 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.server;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.doAnswer;
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 java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.InterestRegistrationListener;
import org.apache.geode.cache.server.CacheServer;
import org.apache.geode.cache.server.ClientSubscriptionConfig;
import org.apache.geode.cache.server.ServerLoadProbe;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
/**
* The CacheServerFactoryBeanTest class is a test suite of test cases testing the contract and functionality
* of the CacheServerFactoryBean class.
*
* @author John Blum
* @see org.junit.Test
* @see org.springframework.data.gemfire.server.CacheServerFactoryBean
* @since 1.6.0
*/
public class CacheServerFactoryBeanTest {
@Test
public void testGetObjectUninitialized() {
assertNull(new CacheServerFactoryBean().getObject());
}
@Test
public void testGetObjectType() {
assertEquals(CacheServer.class, new CacheServerFactoryBean().getObjectType());
}
@Test
public void testIsSingleton() {
assertTrue(new CacheServerFactoryBean().isSingleton());
}
@Test
@SuppressWarnings("deprecation")
public void testAfterPropertiesSet() throws IOException {
Cache mockCache = mock(Cache.class, "testAfterPropertiesSet.MockCache");
CacheServer mockCacheServer = mock(CacheServer.class, "testAfterPropertiesSet.MockCacheServer");
ClientSubscriptionConfig mockClientSubscriptionConfig = mock(ClientSubscriptionConfig.class,
"testAfterPropertiesSet.MockClientSubscriptionConfig");
InterestRegistrationListener mockInterestRegistrationListenerOne = mock(InterestRegistrationListener.class,
"testAfterPropertiesSet.MockInterestRegistrationListener.One");
InterestRegistrationListener mockInterestRegistrationListenerTwo = mock(InterestRegistrationListener.class,
"testAfterPropertiesSet.MockInterestRegistrationListener.Two");
ServerLoadProbe mockServerLoadProbe = mock(ServerLoadProbe.class, "testAfterPropertiesSet.MockServerLoadProbe");
when(mockCache.addCacheServer()).thenReturn(mockCacheServer);
when(mockCacheServer.getClientSubscriptionConfig()).thenReturn(mockClientSubscriptionConfig);
CacheServerFactoryBean factoryBean = new CacheServerFactoryBean();
factoryBean.setCache(mockCache);
factoryBean.setBindAddress("10.124.62.5");
factoryBean.setHostNameForClients("skullbox");
factoryBean.setListeners(new HashSet<InterestRegistrationListener>(Arrays.asList(
mockInterestRegistrationListenerOne, mockInterestRegistrationListenerTwo)));
factoryBean.setLoadPollInterval(500l);
factoryBean.setMaxConnections(200);
factoryBean.setMaxMessageCount(1024);
factoryBean.setMaxTimeBetweenPings(2000);
factoryBean.setMaxThreads(50);
factoryBean.setMessageTimeToLive(8192);
factoryBean.setNotifyBySubscription(true);
factoryBean.setPort(54321);
factoryBean.setServerGroups(new String[] { "testGroup" });
factoryBean.setServerLoadProbe(mockServerLoadProbe);
factoryBean.setSocketBufferSize(4096);
factoryBean.setSubscriptionCapacity(8196);
factoryBean.setSubscriptionEvictionPolicy(SubscriptionEvictionPolicy.ENTRY);
factoryBean.setSubscriptionDiskStore("toTheVoid");
factoryBean.afterPropertiesSet();
assertSame(mockCacheServer, factoryBean.getObject());
assertEquals(mockCacheServer.getClass(), factoryBean.getObjectType());
verify(mockCache, times(1)).addCacheServer();
verify(mockCacheServer, times(1)).setBindAddress(eq("10.124.62.5"));
verify(mockCacheServer, times(1)).setGroups(eq(new String[] { "testGroup" }));
verify(mockCacheServer, times(1)).setHostnameForClients(eq("skullbox"));
verify(mockCacheServer, times(1)).setLoadPollInterval(eq(500l));
verify(mockCacheServer, times(1)).setLoadProbe(same(mockServerLoadProbe));
verify(mockCacheServer, times(1)).setMaxConnections(eq(200));
verify(mockCacheServer, times(1)).setMaximumMessageCount(eq(1024));
verify(mockCacheServer, times(1)).setMaximumTimeBetweenPings(eq(2000));
verify(mockCacheServer, times(1)).setMaxThreads(eq(50));
verify(mockCacheServer, times(1)).setMessageTimeToLive(eq(8192));
verify(mockCacheServer, times(1)).setNotifyBySubscription(eq(true));
verify(mockCacheServer, times(1)).setPort(eq(54321));
verify(mockCacheServer, times(1)).setSocketBufferSize(eq(4096));
verify(mockCacheServer, times(1)).registerInterestRegistrationListener(
same(mockInterestRegistrationListenerOne));
verify(mockCacheServer, times(1)).registerInterestRegistrationListener(
same(mockInterestRegistrationListenerTwo));
verify(mockCacheServer, times(1)).getClientSubscriptionConfig();
verify(mockClientSubscriptionConfig, times(1)).setCapacity(eq(8196));
verify(mockClientSubscriptionConfig, times(1)).setDiskStoreName(eq("toTheVoid"));
verify(mockClientSubscriptionConfig, times(1)).setEvictionPolicy("entry");
}
@Test(expected = IllegalArgumentException.class)
public void testAfterPropertiesSetWithNullCache() throws IOException {
try {
new CacheServerFactoryBean().afterPropertiesSet();
}
catch (IllegalArgumentException expected) {
assertEquals("A GemFire Cache is required.", expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetAutoStartup() {
CacheServerFactoryBean factoryBean = new CacheServerFactoryBean();
assertTrue(factoryBean.isAutoStartup());
factoryBean.setAutoStartup(false);
assertFalse(factoryBean.isAutoStartup());
}
@Test
public void testSetAndGetSubscriptionEvictionPolicy() {
CacheServerFactoryBean factoryBean = new CacheServerFactoryBean();
assertEquals(SubscriptionEvictionPolicy.DEFAULT, factoryBean.getSubscriptionEvictionPolicy());
factoryBean.setSubscriptionEvictionPolicy(SubscriptionEvictionPolicy.MEM);
assertEquals(SubscriptionEvictionPolicy.MEM, factoryBean.getSubscriptionEvictionPolicy());
factoryBean.setSubscriptionEvictionPolicy(null);
assertEquals(SubscriptionEvictionPolicy.DEFAULT, factoryBean.getSubscriptionEvictionPolicy());
}
@Test
public void testCacheServerLifecycle() throws Exception {
CacheServer mockCacheServer = mock(CacheServer.class, "testCacheServerLifecycle.MockCacheServer");
final AtomicBoolean running = new AtomicBoolean(false);
final AtomicBoolean called = new AtomicBoolean(false);
doAnswer(new Answer() {
@Override
public Object answer(final InvocationOnMock invocationOnMock) throws Throwable {
running.compareAndSet(false, true);
return null;
}
}).when(mockCacheServer).start();
doAnswer(new Answer() {
@Override
public Object answer(final InvocationOnMock invocationOnMock) throws Throwable {
running.compareAndSet(true, false);
return null;
}
}).when(mockCacheServer).stop();
when(mockCacheServer.isRunning()).then(new Answer<Boolean>() {
@Override
public Boolean answer(final InvocationOnMock invocationOnMock) throws Throwable {
return running.get();
}
});
CacheServerFactoryBean factoryBean = new CacheServerFactoryBean();
factoryBean.setCacheServer(mockCacheServer);
assertSame(mockCacheServer, factoryBean.getObject());
assertFalse(factoryBean.isRunning());
factoryBean.start();
assertTrue(factoryBean.isRunning());
assertFalse(called.get());
factoryBean.stop(new Runnable() {
@Override public void run() {
called.set(true);
}
});
assertFalse(factoryBean.isRunning());
assertTrue(called.get());
}
}