/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* 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 com.datastax.driver.core.exceptions;
import com.datastax.driver.core.CCMTestsSupport;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.TestUtils;
import com.datastax.driver.core.WriteType;
import org.testng.annotations.Test;
import java.net.InetSocketAddress;
import static com.datastax.driver.core.ConsistencyLevel.LOCAL_QUORUM;
import static org.assertj.core.api.Assertions.assertThat;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
/**
* Tests Exception classes with separate clusters per test, when applicable
*/
public class ExceptionsTest extends CCMTestsSupport {
private InetSocketAddress address1 = new InetSocketAddress("127.0.0.1", 9042);
private InetSocketAddress address2 = new InetSocketAddress("127.0.0.2", 9042);
/**
* Tests the AlreadyExistsException.
* Create a keyspace twice and a table twice.
* Catch and test all the exception methods.
*/
@Test(groups = "short")
public void alreadyExistsException() throws Throwable {
String keyspace = "TestKeyspace";
String table = "TestTable";
String[] cqlCommands = new String[]{
String.format(TestUtils.CREATE_KEYSPACE_SIMPLE_FORMAT, keyspace, 1),
"USE " + keyspace,
String.format("CREATE TABLE %s (k text PRIMARY KEY, t text, i int, f float)", table)
};
// Create the schema once
session().execute(cqlCommands[0]);
session().execute(cqlCommands[1]);
session().execute(cqlCommands[2]);
// Try creating the keyspace again
try {
session().execute(cqlCommands[0]);
} catch (AlreadyExistsException e) {
String expected = String.format("Keyspace %s already exists", keyspace.toLowerCase());
assertEquals(e.getMessage(), expected);
assertEquals(e.getKeyspace(), keyspace.toLowerCase());
assertEquals(e.getTable(), null);
assertEquals(e.wasTableCreation(), false);
assertEquals(e.getHost(), ccm().addressOfNode(1).getAddress());
assertEquals(e.getAddress(), ccm().addressOfNode(1));
}
session().execute(cqlCommands[1]);
// Try creating the table again
try {
session().execute(cqlCommands[2]);
} catch (AlreadyExistsException e) {
// is released
assertEquals(e.getKeyspace(), keyspace.toLowerCase());
assertEquals(e.getTable(), table.toLowerCase());
assertEquals(e.wasTableCreation(), true);
assertEquals(e.getHost(), ccm().addressOfNode(1).getAddress());
assertEquals(e.getAddress(), ccm().addressOfNode(1));
}
}
/**
* Tests the NoHostAvailableException.
* by attempting to build a cluster using the IP address "255.255.255.255"
* and test all available exception methods.
*/
@Test(groups = "short")
public void noHostAvailableException() throws Exception {
try {
Cluster.builder().addContactPoints("255.255.255.255").build();
} catch (NoHostAvailableException e) {
assertEquals(e.getErrors().size(), 1);
assertTrue(e.getErrors().values().iterator().next().toString().contains("[/255.255.255.255] Cannot connect"));
NoHostAvailableException copy = (NoHostAvailableException) e.copy();
assertEquals(copy.getMessage(), e.getMessage());
assertEquals(copy.getErrors(), e.getErrors());
}
}
/**
* Tests DriverInternalError.
* Tests basic message, rethrow, and copy abilities.
*/
@Test(groups = "unit")
public void driverInternalError() throws Exception {
String errorMessage = "Test Message";
try {
throw new DriverInternalError(errorMessage);
} catch (DriverInternalError e1) {
try {
throw new DriverInternalError(e1);
} catch (DriverInternalError e2) {
assertTrue(e2.getMessage().contains(errorMessage));
DriverInternalError copy = (DriverInternalError) e2.copy();
assertEquals(copy.getMessage(), e2.getMessage());
}
}
}
@Test(groups = "unit")
public void should_create_proper_already_exists_exception_for_keyspaces() {
AlreadyExistsException e = new AlreadyExistsException(address1, "keyspace1", "");
assertThat(e.getMessage()).isEqualTo("Keyspace keyspace1 already exists");
assertThat(e.getKeyspace()).isEqualTo("keyspace1");
assertThat(e.getTable()).isNull();
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = e.copy(address2);
assertThat(e.getMessage()).isEqualTo("Keyspace keyspace1 already exists");
assertThat(e.getKeyspace()).isEqualTo("keyspace1");
assertThat(e.getTable()).isNull();
assertThat(e.getAddress()).isEqualTo(address2);
assertThat(e.getHost()).isEqualTo(address2.getAddress());
}
@Test(groups = "unit")
public void should_create_proper_already_exists_exception_for_tables() {
AlreadyExistsException e = new AlreadyExistsException(address1, "keyspace1", "table1");
assertThat(e.getMessage()).isEqualTo("Table keyspace1.table1 already exists");
assertThat(e.getKeyspace()).isEqualTo("keyspace1");
assertThat(e.getTable()).isEqualTo("table1");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = e.copy(address2);
assertThat(e.getMessage()).isEqualTo("Table keyspace1.table1 already exists");
assertThat(e.getKeyspace()).isEqualTo("keyspace1");
assertThat(e.getTable()).isEqualTo("table1");
assertThat(e.getAddress()).isEqualTo(address2);
assertThat(e.getHost()).isEqualTo(address2.getAddress());
}
@Test(groups = "unit")
public void should_create_proper_bootstrapping_exception() {
BootstrappingException e = new BootstrappingException(address1, "Sorry mate");
assertThat(e.getMessage()).isEqualTo("Queried host (" + address1 + ") was bootstrapping: Sorry mate");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = e.copy();
assertThat(e.getMessage()).isEqualTo("Queried host (" + address1 + ") was bootstrapping: Sorry mate");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
}
@Test(groups = "unit")
public void should_create_proper_invalid_query_exception() {
InvalidQueryException e = new InvalidQueryException("Bad, really bad");
assertThat(e.getMessage()).isEqualTo("Bad, really bad");
e = (InvalidQueryException) e.copy();
assertThat(e.getMessage()).isEqualTo("Bad, really bad");
}
@Test(groups = "unit")
public void should_create_proper_trace_retrieval_exception() {
TraceRetrievalException e = new TraceRetrievalException("Couldn't find any trace of it");
assertThat(e.getMessage()).isEqualTo("Couldn't find any trace of it");
e = (TraceRetrievalException) e.copy();
assertThat(e.getMessage()).isEqualTo("Couldn't find any trace of it");
}
@Test(groups = "unit")
public void should_create_proper_paging_state_exception() {
PagingStateException e = new PagingStateException("Bad, really bad");
assertThat(e.getMessage()).isEqualTo("Bad, really bad");
// no copy method for this exception
}
@Test(groups = "unit")
public void should_create_proper_invalid_configuration_in_query_exception() {
InvalidConfigurationInQueryException e = new InvalidConfigurationInQueryException(address1, "Bad, really bad");
assertThat(e.getMessage()).isEqualTo("Bad, really bad");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
InvalidQueryException e1 = (InvalidQueryException) e.copy();
assertThat(e1.getMessage()).isEqualTo("Bad, really bad");
}
@Test(groups = "unit")
public void should_create_proper_overloaded_exception() {
OverloadedException e = new OverloadedException(address1, "I'm busy");
assertThat(e.getMessage()).isEqualTo("Queried host (" + address1 + ") was overloaded: I'm busy");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = e.copy();
assertThat(e.getMessage()).isEqualTo("Queried host (" + address1 + ") was overloaded: I'm busy");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
}
@Test(groups = "unit")
public void should_create_proper_syntax_error() {
SyntaxError e = new SyntaxError(address1, "Missing ) at EOF");
assertThat(e.getMessage()).isEqualTo("Missing ) at EOF");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = (SyntaxError) e.copy();
assertThat(e.getMessage()).isEqualTo("Missing ) at EOF");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
}
@Test(groups = "unit")
public void should_create_proper_truncate_exception() {
TruncateException e = new TruncateException(address1, "I'm running headless now");
assertThat(e.getMessage()).isEqualTo("I'm running headless now");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = (TruncateException) e.copy();
assertThat(e.getMessage()).isEqualTo("I'm running headless now");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
}
@Test(groups = "unit")
public void should_create_proper_unauthorized_exception() {
UnauthorizedException e = new UnauthorizedException(address1, "You talking to me?");
assertThat(e.getMessage()).isEqualTo("You talking to me?");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = (UnauthorizedException) e.copy();
assertThat(e.getMessage()).isEqualTo("You talking to me?");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
}
@Test(groups = "unit")
public void should_create_proper_unavailable_exception() {
UnavailableException e = new UnavailableException(address1, LOCAL_QUORUM, 3, 2);
assertThat(e.getMessage()).isEqualTo("Not enough replicas available for query at consistency LOCAL_QUORUM (3 required but only 2 alive)");
assertThat(e.getConsistencyLevel()).isEqualTo(LOCAL_QUORUM);
assertThat(e.getAliveReplicas()).isEqualTo(2);
assertThat(e.getRequiredReplicas()).isEqualTo(3);
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = e.copy(address2);
assertThat(e.getMessage()).isEqualTo("Not enough replicas available for query at consistency LOCAL_QUORUM (3 required but only 2 alive)");
assertThat(e.getConsistencyLevel()).isEqualTo(LOCAL_QUORUM);
assertThat(e.getAliveReplicas()).isEqualTo(2);
assertThat(e.getRequiredReplicas()).isEqualTo(3);
assertThat(e.getAddress()).isEqualTo(address2);
assertThat(e.getHost()).isEqualTo(address2.getAddress());
}
@Test(groups = "unit")
public void should_create_proper_unprepared_exception() {
UnpreparedException e = new UnpreparedException(address1, "Caught me unawares");
assertThat(e.getMessage()).isEqualTo("A prepared query was submitted on " + address1 + " but was not known of that node: Caught me unawares");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = e.copy();
assertThat(e.getMessage()).isEqualTo("A prepared query was submitted on " + address1 + " but was not known of that node: Caught me unawares");
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
}
@Test(groups = "unit")
public void should_create_proper_read_timeout_exception() {
ReadTimeoutException e = new ReadTimeoutException(address1, LOCAL_QUORUM, 2, 3, true);
assertThat(e.getMessage()).isEqualTo("Cassandra timeout during read query at consistency LOCAL_QUORUM (3 responses were required but only 2 replica responded)");
assertThat(e.getConsistencyLevel()).isEqualTo(LOCAL_QUORUM);
assertThat(e.getReceivedAcknowledgements()).isEqualTo(2);
assertThat(e.getRequiredAcknowledgements()).isEqualTo(3);
assertThat(e.wasDataRetrieved()).isTrue();
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = e.copy(address2);
assertThat(e.getMessage()).isEqualTo("Cassandra timeout during read query at consistency LOCAL_QUORUM (3 responses were required but only 2 replica responded)");
assertThat(e.getConsistencyLevel()).isEqualTo(LOCAL_QUORUM);
assertThat(e.getReceivedAcknowledgements()).isEqualTo(2);
assertThat(e.getRequiredAcknowledgements()).isEqualTo(3);
assertThat(e.wasDataRetrieved()).isTrue();
assertThat(e.getAddress()).isEqualTo(address2);
assertThat(e.getHost()).isEqualTo(address2.getAddress());
}
@Test(groups = "unit")
public void should_create_proper_write_timeout_exception() {
WriteTimeoutException e = new WriteTimeoutException(address1, LOCAL_QUORUM, WriteType.BATCH, 2, 3);
assertThat(e.getMessage()).isEqualTo("Cassandra timeout during write query at consistency LOCAL_QUORUM (3 replica were required but only 2 acknowledged the write)");
assertThat(e.getConsistencyLevel()).isEqualTo(LOCAL_QUORUM);
assertThat(e.getReceivedAcknowledgements()).isEqualTo(2);
assertThat(e.getRequiredAcknowledgements()).isEqualTo(3);
assertThat(e.getWriteType()).isEqualTo(WriteType.BATCH);
assertThat(e.getAddress()).isEqualTo(address1);
assertThat(e.getHost()).isEqualTo(address1.getAddress());
e = e.copy(address2);
assertThat(e.getMessage()).isEqualTo("Cassandra timeout during write query at consistency LOCAL_QUORUM (3 replica were required but only 2 acknowledged the write)");
assertThat(e.getConsistencyLevel()).isEqualTo(LOCAL_QUORUM);
assertThat(e.getReceivedAcknowledgements()).isEqualTo(2);
assertThat(e.getRequiredAcknowledgements()).isEqualTo(3);
assertThat(e.getWriteType()).isEqualTo(WriteType.BATCH);
assertThat(e.getAddress()).isEqualTo(address2);
assertThat(e.getHost()).isEqualTo(address2.getAddress());
}
}