/*
* 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.client;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.Properties;
import org.apache.geode.cache.client.Pool;
import org.apache.geode.cache.client.PoolFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.data.gemfire.support.ConnectionEndpoint;
import org.springframework.data.gemfire.support.ConnectionEndpointList;
import org.springframework.data.gemfire.util.CollectionUtils;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Assert;
/**
* The PoolsConfiguredWithLocatorsAndServersExpressionsIntegrationTests class is a test suite of test cases testing the use of
* property placeholder values in the nested <gfe:locator> and <gfe:server> sub-elements
* of the <gfe:pool> element as well as the <code>locators</code> and <code>servers</code> attributes.
*
* @author John Blum
* @see org.junit.Test
* @see org.junit.runner.RunWith
* @see org.springframework.test.context.ContextConfiguration
* @see org.springframework.test.context.junit4.SpringJUnit4ClassRunner
* @see org.springframework.data.gemfire.client.PoolFactoryBean
* @see org.springframework.data.gemfire.config.PoolParser
* @see <a href="https://jira.spring.io/browse/SGF-433">SGF-433</a>
* @since 1.6.0
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class PoolsConfiguredWithLocatorsAndServersExpressionsIntegrationTests {
private static ConnectionEndpointList anotherLocators = new ConnectionEndpointList();
private static ConnectionEndpointList anotherServers = new ConnectionEndpointList();
private static ConnectionEndpointList locators = new ConnectionEndpointList();
private static ConnectionEndpointList servers = new ConnectionEndpointList();
@Autowired
@Qualifier("locatorPool")
@SuppressWarnings("unused")
private Pool locatorPool;
@Autowired
@Qualifier("serverPool")
@SuppressWarnings("unused")
private Pool serverPool;
@Autowired
@Qualifier("anotherLocatorPool")
@SuppressWarnings("unused")
private Pool anotherLocatorPool;
@Autowired
@Qualifier("anotherServerPool")
@SuppressWarnings("unused")
private Pool anotherServerPool;
protected static ConnectionEndpoint newConnectionEndpoint(String host, int port) {
return new ConnectionEndpoint(host, port);
}
protected void assertConnectionEndpoints(Iterable<ConnectionEndpoint> connectionEndpoints, String... expected) {
assertThat(connectionEndpoints).isNotNull();
int index = 0;
for (ConnectionEndpoint connectionEndpoint : connectionEndpoints) {
assertThat(connectionEndpoint.toString()).isEqualTo(expected[index++]);
}
assertThat(index).isEqualTo(expected.length);
}
@Test
public void anotherLocatorPoolFactoryConfiguration() {
String[] expected = { "localhost[10335]", "cardboardbox[10334]", "safetydepositbox[10336]", "pobox[10334]" };
assertThat(anotherLocators.size()).isEqualTo(expected.length);
assertConnectionEndpoints(anotherLocators, expected);
}
@Test
public void anotherServerPoolFactoryConfiguration() {
String[] expected = { "boombox[1234]", "jambox[40404]", "toolbox[8181]" };
assertThat(anotherServers.size()).isEqualTo(expected.length);
assertConnectionEndpoints(CollectionUtils.sort(anotherServers), expected);
}
@Test
public void locatorPoolFactoryConfiguration() {
String[] expected = { "backspace[10334]", "jambox[11235]", "mars[30303]", "pluto[20668]", "skullbox[12480]" };
assertThat(locators.size()).isEqualTo(expected.length);
assertConnectionEndpoints(CollectionUtils.sort(locators), expected);
}
@Test
public void serverPoolFactoryConfiguration() {
String[] expected = { "earth[4554]", "jupiter[40404]", "mars[5112]", "mercury[1234]", "neptune[42424]", "saturn[41414]",
"uranis[0]", "venus[9876]" };
assertThat(servers.size()).isEqualTo(expected.length);
assertConnectionEndpoints(CollectionUtils.sort(servers), expected);
}
public static class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition anotherLocatorPoolBeanDefinition = beanFactory.getBeanDefinition("anotherLocatorPool");
anotherLocatorPoolBeanDefinition.setBeanClassName(AnotherLocatorPoolFactoryBean.class.getName());
BeanDefinition anotherServerPoolBeanDefinition = beanFactory.getBeanDefinition("anotherServerPool");
anotherServerPoolBeanDefinition.setBeanClassName(AnotherServerPoolFactoryBean.class.getName());
BeanDefinition locatorPoolBeanDefinition = beanFactory.getBeanDefinition("locatorPool");
locatorPoolBeanDefinition.setBeanClassName(LocatorPoolFactoryBean.class.getName());
BeanDefinition serverPoolBeanDefinition = beanFactory.getBeanDefinition("serverPool");
serverPoolBeanDefinition.setBeanClassName(ServerPoolFactoryBean.class.getName());
}
}
public static class AnotherLocatorPoolFactoryBean extends TestPoolFactoryBean {
@Override ConnectionEndpointList getLocatorList() {
return anotherLocators;
}
}
public static class AnotherServerPoolFactoryBean extends TestPoolFactoryBean {
@Override ConnectionEndpointList getServerList() {
return anotherServers;
}
}
public static class LocatorPoolFactoryBean extends TestPoolFactoryBean {
@Override ConnectionEndpointList getLocatorList() {
return locators;
}
}
public static class ServerPoolFactoryBean extends TestPoolFactoryBean {
@Override ConnectionEndpointList getServerList() {
return servers;
}
}
@SuppressWarnings("unused")
public static class SpELBoundBean {
private final Properties clientProperties;
public SpELBoundBean(Properties clientProperties) {
Assert.notNull(clientProperties, "clientProperties must not be null");
this.clientProperties = clientProperties;
}
public String locatorsHostsPorts() {
return "safetydepositbox[10336], pobox";
}
public String serverTwoHost() {
return clientProperties.getProperty("gemfire.cache.client.server.2.host");
}
public String serverTwoPort() {
return clientProperties.getProperty("gemfire.cache.client.server.2.port");
}
}
public static class TestPoolFactoryBean extends PoolFactoryBean {
ConnectionEndpointList getLocatorList() {
throw new UnsupportedOperationException("Not Implemented");
}
ConnectionEndpointList getServerList() {
throw new UnsupportedOperationException("Not Implemented");
}
@Override
protected PoolFactory createPoolFactory() {
final PoolFactory mockPoolFactory = mock(PoolFactory.class);
when(mockPoolFactory.addLocator(anyString(), anyInt())).thenAnswer(new Answer<PoolFactory>() {
@Override
public PoolFactory answer(InvocationOnMock invocation) throws Throwable {
String host = invocation.getArgument(0);
int port = invocation.getArgument(1);
getLocatorList().add(newConnectionEndpoint(host, port));
return mockPoolFactory;
}
});
when(mockPoolFactory.addServer(anyString(), anyInt())).thenAnswer(new Answer<PoolFactory>() {
@Override
public PoolFactory answer(InvocationOnMock invocation) throws Throwable {
String host = invocation.getArgument(0);
int port = invocation.getArgument(1);
getServerList().add(newConnectionEndpoint(host, port));
return mockPoolFactory;
}
});
return mockPoolFactory;
}
@Override
boolean isDistributedSystemPresent() {
return true;
}
}
}