/** * Copyright 2015-2016 The OpenZipkin 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 zipkin.storage.cassandra; import com.datastax.driver.core.AuthProvider; import com.datastax.driver.core.Authenticator; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.Host; import com.datastax.driver.core.HostDistance; import com.datastax.driver.core.PoolingOptions; import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy; import com.datastax.driver.core.policies.LatencyAwarePolicy; import com.datastax.driver.core.policies.RoundRobinPolicy; import com.datastax.driver.core.policies.TokenAwarePolicy; import java.net.InetSocketAddress; import org.junit.Test; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static zipkin.storage.cassandra.SessionFactory.Default.buildCluster; import static zipkin.storage.cassandra.SessionFactory.Default.parseContactPoints; public class SessionFactoryTest { @Test public void contactPoints_defaultsToLocalhost() { assertThat(parseContactPoints(CassandraStorage.builder().build())) .containsExactly(new InetSocketAddress("127.0.0.1", 9042)); } @Test public void contactPoints_defaultsToPort9042() { assertThat(parseContactPoints(CassandraStorage.builder().contactPoints("1.1.1.1").build())) .containsExactly(new InetSocketAddress("1.1.1.1", 9042)); } @Test public void contactPoints_defaultsToPort9042_multi() { assertThat(parseContactPoints( CassandraStorage.builder().contactPoints("1.1.1.1:9143,2.2.2.2").build())) .containsExactly( new InetSocketAddress("1.1.1.1", 9143), new InetSocketAddress("2.2.2.2", 9042) ); } @Test public void contactPoints_hostAndPort() { assertThat(parseContactPoints(CassandraStorage.builder().contactPoints("1.1.1.1:9142").build())) .containsExactly(new InetSocketAddress("1.1.1.1", 9142)); } @Test public void connectPort_singleContactPoint() { assertThat(buildCluster(CassandraStorage.builder().contactPoints("1.1.1.1:9142").build()) .getConfiguration().getProtocolOptions().getPort()) .isEqualTo(9142); } @Test public void connectPort_whenContactPointsHaveSamePort() { assertThat(buildCluster(CassandraStorage.builder().contactPoints("1.1.1.1:9143,2.2.2.2:9143").build()) .getConfiguration().getProtocolOptions().getPort()) .isEqualTo(9143); } @Test public void connectPort_whenContactPointsHaveMixedPorts_coercesToDefault() { assertThat(buildCluster(CassandraStorage.builder().contactPoints("1.1.1.1:9143,2.2.2.2").build()) .getConfiguration().getProtocolOptions().getPort()) .isEqualTo(9042); } @Test public void usernamePassword_impliesNullDelimitedUtf8Bytes() { Authenticator authenticator = buildCluster(CassandraStorage.builder().username("bob").password("secret").build()) .getConfiguration().getProtocolOptions().getAuthProvider() .newAuthenticator(new InetSocketAddress("localhost", 8080), null); byte[] SASLhandshake = {0, 'b', 'o', 'b', 0, 's', 'e', 'c', 'r', 'e', 't'}; assertThat(authenticator.initialResponse()) .isEqualTo(SASLhandshake); } @Test public void authProvider_defaultsToNone() { assertThat(buildCluster(CassandraStorage.builder().build()) .getConfiguration().getProtocolOptions().getAuthProvider()) .isEqualTo(AuthProvider.NONE); } @Test public void loadBalancing_defaultsToRoundRobin() { RoundRobinPolicy policy = toRoundRobinPolicy(CassandraStorage.builder().build()); Host foo = mock(Host.class); when(foo.getDatacenter()).thenReturn("foo"); Host bar = mock(Host.class); when(bar.getDatacenter()).thenReturn("bar"); policy.init(mock(Cluster.class), asList(foo, bar)); assertThat(policy.distance(foo)).isEqualTo(HostDistance.LOCAL); assertThat(policy.distance(bar)).isEqualTo(HostDistance.LOCAL); } RoundRobinPolicy toRoundRobinPolicy(CassandraStorage storage) { return (RoundRobinPolicy) ((LatencyAwarePolicy) ((TokenAwarePolicy) buildCluster(storage) .getConfiguration() .getPolicies() .getLoadBalancingPolicy()) .getChildPolicy()).getChildPolicy(); } @Test public void loadBalancing_settingLocalDcIgnoresOtherDatacenters() { DCAwareRoundRobinPolicy policy = toDCAwareRoundRobinPolicy( CassandraStorage.builder().localDc("bar").build()); Host foo = mock(Host.class); when(foo.getDatacenter()).thenReturn("foo"); Host bar = mock(Host.class); when(bar.getDatacenter()).thenReturn("bar"); policy.init(mock(Cluster.class), asList(foo, bar)); assertThat(policy.distance(foo)).isEqualTo(HostDistance.IGNORED); assertThat(policy.distance(bar)).isEqualTo(HostDistance.LOCAL); } DCAwareRoundRobinPolicy toDCAwareRoundRobinPolicy(CassandraStorage storage) { return (DCAwareRoundRobinPolicy) ((LatencyAwarePolicy) ((TokenAwarePolicy) buildCluster(storage) .getConfiguration() .getPolicies() .getLoadBalancingPolicy()) .getChildPolicy()).getChildPolicy(); } @Test public void maxConnections_defaultsTo8() { PoolingOptions poolingOptions = buildCluster(CassandraStorage.builder().build()) .getConfiguration().getPoolingOptions(); assertThat(poolingOptions.getMaxConnectionsPerHost(HostDistance.LOCAL)).isEqualTo(8); } @Test public void maxConnections_setsMaxConnectionsPerDatacenterLocalHost() { PoolingOptions poolingOptions = buildCluster(CassandraStorage.builder().maxConnections(16).build()) .getConfiguration().getPoolingOptions(); assertThat(poolingOptions.getMaxConnectionsPerHost(HostDistance.LOCAL)).isEqualTo(16); } }