/* * Copyright 2016-2017 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.cassandra.config.java; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.isA; import static org.mockito.Mockito.*; import java.util.Collections; import java.util.List; import org.junit.Test; import org.springframework.cassandra.config.CassandraCqlClusterFactoryBean; import org.springframework.cassandra.config.ClusterBuilderConfigurer; import org.springframework.cassandra.config.CompressionType; import org.springframework.cassandra.core.keyspace.CreateKeyspaceSpecification; import org.springframework.cassandra.core.keyspace.DropKeyspaceSpecification; import com.datastax.driver.core.*; import com.datastax.driver.core.ProtocolOptions.Compression; import com.datastax.driver.core.policies.AddressTranslator; import com.datastax.driver.core.policies.ExponentialReconnectionPolicy; import com.datastax.driver.core.policies.LoadBalancingPolicy; import com.datastax.driver.core.policies.Policies; import com.datastax.driver.core.policies.ReconnectionPolicy; import com.datastax.driver.core.policies.RoundRobinPolicy; import com.datastax.driver.core.policies.SpeculativeExecutionPolicy; /** * Unit tests for {@link AbstractClusterConfiguration}. * * @author Mark Paluch * @author John Blum * @soundtrack Max Graham Feat Neev Kennedy - So Caught Up (Dns Project Remix) */ public class AbstractClusterConfigurationUnitTests { @Test // DATACASS-226 public void shouldInitializeWithoutAnyOptions() throws Exception { CassandraCqlClusterFactoryBean bean = new CassandraCqlClusterFactoryBean(); bean.afterPropertiesSet(); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() {}; Cluster cluster = getCluster(clusterConfiguration); assertThat(cluster).isNotNull(); assertThat(cluster.isClosed()).isFalse(); assertThat(getConfiguration(cluster).getMetricsOptions()).isNotNull(); assertThat(getConfiguration(cluster).getMetricsOptions().isJMXReportingEnabled()).isTrue(); } @Test // DATACASS-226 public void shouldSetCompressionType() throws Exception { final CompressionType compressionType = CompressionType.SNAPPY; AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected CompressionType getCompressionType() { return compressionType; } }; Cluster cluster = getCluster(clusterConfiguration); assertThat(getConfiguration(cluster).getProtocolOptions().getCompression()).isEqualTo(Compression.SNAPPY); } @Test // DATACASS-226 public void shouldSetPoolingOptions() throws Exception { final PoolingOptions poolingOptions = new PoolingOptions(); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected PoolingOptions getPoolingOptions() { return poolingOptions; } }; Cluster cluster = getCluster(clusterConfiguration); assertThat(getConfiguration(cluster).getPoolingOptions()).isEqualTo(poolingOptions); } @Test // DATACASS-226 public void shouldSetSocketOptions() throws Exception { final SocketOptions socketOptions = new SocketOptions(); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected SocketOptions getSocketOptions() { return socketOptions; } }; Cluster cluster = getCluster(clusterConfiguration); assertThat(getConfiguration(cluster).getSocketOptions()).isEqualTo(socketOptions); } @Test // DATACASS-226 public void shouldSetQueryOptions() throws Exception { final QueryOptions queryOptions = new QueryOptions(); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected QueryOptions getQueryOptions() { return queryOptions; } }; Cluster cluster = getCluster(clusterConfiguration); assertThat(getConfiguration(cluster).getQueryOptions()).isEqualTo(queryOptions); } @Test // DATACASS-226 public void shouldSetAuthProvider() throws Exception { final AuthProvider authProvider = new PlainTextAuthProvider("x", "y"); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected AuthProvider getAuthProvider() { return authProvider; } }; Cluster cluster = getCluster(clusterConfiguration); assertThat(getConfiguration(cluster).getProtocolOptions().getAuthProvider()).isEqualTo(authProvider); } @Test // DATACASS-226 public void shouldSetLoadBalancingPolicy() throws Exception { final LoadBalancingPolicy loadBalancingPolicy = new RoundRobinPolicy(); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected LoadBalancingPolicy getLoadBalancingPolicy() { return loadBalancingPolicy; } }; Cluster cluster = getCluster(clusterConfiguration); assertThat(getConfiguration(cluster).getPolicies().getLoadBalancingPolicy()).isEqualTo(loadBalancingPolicy); } @Test // DATACASS-226 public void shouldSetReconnectionPolicy() throws Exception { final ReconnectionPolicy reconnectionPolicy = new ExponentialReconnectionPolicy(1, 2); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected ReconnectionPolicy getReconnectionPolicy() { return reconnectionPolicy; } }; Cluster cluster = getCluster(clusterConfiguration); assertThat(getConfiguration(cluster).getPolicies().getReconnectionPolicy()).isEqualTo(reconnectionPolicy); } @Test // DATACASS-226 public void shouldSetProtocolVersion() throws Exception { AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected ProtocolVersion getProtocolVersion() { return ProtocolVersion.V2; } }; Cluster cluster = getCluster(clusterConfiguration); assertThat(getConfiguration(cluster).getProtocolOptions()).extracting("initialProtocolVersion") .contains(ProtocolVersion.V2); } @Test // DATACASS-226 public void shouldDisableMetrics() throws Exception { AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected boolean getMetricsEnabled() { return false; } }; Cluster cluster = getCluster(clusterConfiguration); assertThat(getConfiguration(cluster).getMetricsOptions().isEnabled()).isFalse(); } @Test // DATACASS-226 public void shouldSetKeyspaceCreations() { final List<CreateKeyspaceSpecification> specification = Collections .singletonList(CreateKeyspaceSpecification.createKeyspace()); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected List<CreateKeyspaceSpecification> getKeyspaceCreations() { return specification; } }; assertThat(clusterConfiguration.cluster().getKeyspaceCreations()).isEqualTo(specification); } @Test // DATACASS-226 public void shouldSetKeyspaceDrops() { final List<DropKeyspaceSpecification> specification = Collections .singletonList(DropKeyspaceSpecification.dropKeyspace()); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected List<DropKeyspaceSpecification> getKeyspaceDrops() { return specification; } }; assertThat(clusterConfiguration.cluster().getKeyspaceDrops()).isEqualTo(specification); } @Test // DATACASS-226 public void shouldSetStartupScripts() { final List<String> scripts = Collections.singletonList("USE BLUE_METH; CREATE TABLE..."); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected List<String> getStartupScripts() { return scripts; } }; assertThat(clusterConfiguration.cluster().getStartupScripts()).isEqualTo(scripts); } @Test // DATACASS-226 public void shouldSetShutdownScripts() { final List<String> scripts = Collections.singletonList("USE BLUE_METH; DROP TABLE..."); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected List<String> getShutdownScripts() { return scripts; } }; assertThat(clusterConfiguration.cluster().getShutdownScripts()).isEqualTo(scripts); } /** * <a href="https://jira.spring.io/browse/DATACASS-316">DATACASS-316</a> */ @Test public void shouldSetAddressTranslator() throws Exception { final AddressTranslator mockAddressTranslator = mock(AddressTranslator.class); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected AddressTranslator getAddressTranslator() { return mockAddressTranslator; } }; assertThat(getPolicies(getCluster(clusterConfiguration)).getAddressTranslator()).isEqualTo(mockAddressTranslator); } /** * <a href="https://jira.spring.io/browse/DATACASS-325">DATACASS-325</a> */ @Test public void shouldSetAndApplyClusterBuilderConfigurer() throws Exception { final ClusterBuilderConfigurer mockClusterBuilderConfigurer = mock(ClusterBuilderConfigurer.class); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected ClusterBuilderConfigurer getClusterBuilderConfigurer() { return mockClusterBuilderConfigurer; } }; assertThat(getCluster(clusterConfiguration)).isNotNull(); verify(mockClusterBuilderConfigurer, times(1)).configure(isA(Cluster.Builder.class)); } /** * <a href="https://jira.spring.io/browse/DATACASS-120">DATACASS-120</a> * <a href="https://jira.spring.io/browse/DATACASS-317">DATACASS-317</a> */ @Test public void shouldSetClusterName() throws Exception { AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected String getClusterName() { return "testCluster"; } }; assertThat(getCluster(clusterConfiguration).getClusterName()).isEqualTo("testCluster"); } /** * <a href="https://jira.spring.io/browse/DATACASS-319">DATACASS-319</a> */ @Test public void shouldSetMaxSchemaAgreementWaitInSeconds() throws Exception { AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected int getMaxSchemaAgreementWaitSeconds() { return 30; } }; assertThat(getProtocolOptions(getCluster(clusterConfiguration)).getMaxSchemaAgreementWaitSeconds()).isEqualTo(30); } /** * <a href="https://jira.spring.io/browse/DATACASS-320">DATACASS-320</a> */ @Test public void shouldSetSpeculativeExecutionPolicy() throws Exception { final SpeculativeExecutionPolicy mockSpeculativeExecutionPolicy = mock(SpeculativeExecutionPolicy.class); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected SpeculativeExecutionPolicy getSpeculativeExecutionPolicy() { return mockSpeculativeExecutionPolicy; } }; assertThat(getPolicies(getCluster(clusterConfiguration)).getSpeculativeExecutionPolicy()) .isEqualTo(mockSpeculativeExecutionPolicy); } /** * <a href="https://jira.spring.io/browse/DATACASS-238">DATACASS-238</a> */ @Test public void shouldSetTimestampGenerator() throws Exception { final TimestampGenerator mockTimestampGenerator = mock(TimestampGenerator.class); AbstractClusterConfiguration clusterConfiguration = new AbstractClusterConfiguration() { @Override protected TimestampGenerator getTimestampGenerator() { return mockTimestampGenerator; } }; assertThat(getPolicies(getCluster(clusterConfiguration)).getTimestampGenerator()).isEqualTo(mockTimestampGenerator); } private Policies getPolicies(Cluster cluster) { return getConfiguration(cluster).getPolicies(); } private ProtocolOptions getProtocolOptions(Cluster cluster) { return getConfiguration(cluster).getProtocolOptions(); } private Configuration getConfiguration(Cluster cluster) { return cluster.getConfiguration(); } private Cluster getCluster(AbstractClusterConfiguration clusterConfiguration) throws Exception { CassandraCqlClusterFactoryBean cluster = clusterConfiguration.cluster(); cluster.afterPropertiesSet(); return cluster.getObject(); } }