package me.prettyprint.cassandra.service; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import me.prettyprint.cassandra.connection.factory.HKerberosSecuredThriftClientFactoryImpl; import me.prettyprint.cassandra.connection.factory.HThriftClientFactoryImpl; import me.prettyprint.hector.api.ClockResolution; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; public class CassandraHostConfiguratorTest { @Before public void setup() { } @Test public void testSimpleCassandraHostSetup() { CassandraHostConfigurator cassandraHostConfigurator = new CassandraHostConfigurator("localhost:9170"); CassandraHost[] cassandraHosts = cassandraHostConfigurator.buildCassandraHosts(); assertEquals(1, cassandraHosts.length); } @Test public void testCassandraHostSetupSplit() { CassandraHostConfigurator cassandraHostConfigurator = new CassandraHostConfigurator("localhost:9170,localhost:9171,localhost:9172"); CassandraHost[] cassandraHosts = cassandraHostConfigurator.buildCassandraHosts(); assertEquals(3, cassandraHosts.length); assertEquals(9172, cassandraHosts[2].getPort()); } @Test public void testConfigValuesPropogated() { CassandraHostConfigurator cassandraHostConfigurator = new CassandraHostConfigurator("localhost:9170,localhost:9171,localhost:9172"); cassandraHostConfigurator.setMaxActive(20); cassandraHostConfigurator.setCassandraThriftSocketTimeout(3000); cassandraHostConfigurator.setMaxWaitTimeWhenExhausted(4000); cassandraHostConfigurator.setMaxExhaustedTimeBeforeMarkingAsDown(5000); CassandraHost[] cassandraHosts = cassandraHostConfigurator.buildCassandraHosts(); // no need to test all, just a smattering assertEquals(20, cassandraHosts[1].getMaxActive()); assertEquals(20, cassandraHosts[0].getMaxActive()); assertEquals(4000, cassandraHosts[1].getMaxWaitTimeWhenExhausted()); assertEquals(5000, cassandraHosts[0].getMaxExhaustedTimeBeforeMarkingAsDown()); assertEquals(3000, cassandraHosts[2].getCassandraThriftSocketTimeout()); assertEquals(3000, cassandraHosts[0].getCassandraThriftSocketTimeout()); } @Test public void testApplyConfig() { CassandraHostConfigurator cassandraHostConfigurator = new CassandraHostConfigurator("localhost:9170"); cassandraHostConfigurator.setMaxActive(15); cassandraHostConfigurator.setMaxConnectTimeMillis(30000); cassandraHostConfigurator.setMaxLastSuccessTimeMillis(40000); CassandraHost extraHost = new CassandraHost("localhost:9171"); cassandraHostConfigurator.applyConfig(extraHost); assertEquals(15, extraHost.getMaxActive()); assertEquals(30000, extraHost.getMaxConnectTimeMillis()); assertEquals(40000, extraHost.getMaxLastSuccessTimeMillis()); } @Test public void testHostnameOnlyDefaultPort() { CassandraHostConfigurator cassandraHostConfigurator = new CassandraHostConfigurator("localhost"); CassandraHost[] cassandraHosts = cassandraHostConfigurator.buildCassandraHosts(); assertEquals(CassandraHost.DEFAULT_PORT, cassandraHosts[0].getPort()); } @Test public void testHostnameOnlyDefaultPortMultipleHosts() { CassandraHostConfigurator cassandraHostConfigurator = new CassandraHostConfigurator("h1,h2,h3:1111"); CassandraHost[] cassandraHosts = cassandraHostConfigurator.buildCassandraHosts(); assertEquals(CassandraHost.DEFAULT_PORT, cassandraHosts[0].getPort()); assertEquals(CassandraHost.DEFAULT_PORT, cassandraHosts[1].getPort()); assertEquals(1111, cassandraHosts[2].getPort()); } @Test public void testConfiguratorPort() { CassandraHostConfigurator cassandraHostConfigurator = new CassandraHostConfigurator("localhost"); cassandraHostConfigurator.setPort(9177); CassandraHost[] cassandraHosts = cassandraHostConfigurator.buildCassandraHosts(); assertEquals(9177, cassandraHosts[0].getPort()); } @Test public void testConfiguratorClockResolution() { // Define my own clock resolution. @SuppressWarnings("serial") class SequentialClockResolution implements ClockResolution { @Override public long createClock() { return System.currentTimeMillis() * -1; } } CassandraHostConfigurator cassandraHostConfigurator = new CassandraHostConfigurator("localhost"); cassandraHostConfigurator.setClockResolution(new SequentialClockResolution()); assertNotSame(CassandraHostConfigurator.DEF_CLOCK_RESOLUTION, cassandraHostConfigurator.getClockResolution()); } @Test public void testSerialization() throws Exception { CassandraHostConfigurator cassandraHostConfigurator = new CassandraHostConfigurator("localhost:9876"); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos); out.writeObject(cassandraHostConfigurator); out.close(); byte[] serializedByteArray = bos.toByteArray(); ByteArrayInputStream bin = new ByteArrayInputStream(serializedByteArray); ObjectInputStream in = new ObjectInputStream(bin); CassandraHostConfigurator cassandraHostConfiguratorDeserialized = (CassandraHostConfigurator) in.readObject(); //TODO: define equality for CassandraHostConfigurator //assertSame(cassandraHostConfigurator, cassandraHostConfiguratorDeserialized); } @Test public void testSettingCorrectClientFactory() { CassandraHostConfigurator chc = new CassandraHostConfigurator("localhost"); chc.setClientFactoryClass(HKerberosSecuredThriftClientFactoryImpl.class.getSimpleName()); assertEquals(chc.getClientFactoryClass(), HKerberosSecuredThriftClientFactoryImpl.class); chc.setClientFactoryClass(HThriftClientFactoryImpl.class.getCanonicalName()); assertEquals(chc.getClientFactoryClass(), HThriftClientFactoryImpl.class); } @Test(expected = IllegalArgumentException.class) public void testSettingNotFoundClientFactory() { CassandraHostConfigurator chc = new CassandraHostConfigurator("localhost"); chc.setClientFactoryClass("NotARealClass"); } @Test(expected = IllegalArgumentException.class) public void testSettingInvalidExistingClassClientFactory() { CassandraHostConfigurator chc = new CassandraHostConfigurator("localhost"); chc.setClientFactoryClass(CassandraHostConfigurator.class.getCanonicalName()); } }