/* * 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.*; import com.datastax.driver.core.policies.FallthroughRetryPolicy; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import org.scassandra.Scassandra; import org.scassandra.http.client.PrimingRequest; import org.scassandra.http.client.Result; import org.testng.annotations.*; import java.util.List; import java.util.Map; import static com.datastax.driver.core.ConsistencyLevel.LOCAL_ONE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; import static org.scassandra.http.client.PrimingRequest.then; import static org.scassandra.http.client.Result.*; public class ExceptionsScassandraTest { protected ScassandraCluster scassandras; protected Cluster cluster; protected Metrics.Errors errors; protected Host host1; protected Session session; @BeforeClass(groups = "short") public void beforeClass() { scassandras = ScassandraCluster.builder().withNodes(1).build(); scassandras.init(); } @BeforeMethod(groups = "short") public void beforeMethod() { cluster = Cluster.builder() .addContactPoints(scassandras.address(1).getAddress()) .withPort(scassandras.getBinaryPort()) .withRetryPolicy(FallthroughRetryPolicy.INSTANCE) .build(); session = cluster.connect(); host1 = TestUtils.findHost(cluster, 1); errors = cluster.getMetrics().getErrorMetrics(); for (Scassandra node : scassandras.nodes()) { node.primingClient().clearAllPrimes(); node.activityClient().clearAllRecordedActivity(); } } @Test(groups = "short") public void should_throw_proper_unavailable_exception() { simulateError(1, unavailable); try { query(); fail("expected an UnavailableException"); } catch (UnavailableException e) { assertThat(e.getMessage()).isEqualTo("Not enough replicas available for query at consistency LOCAL_ONE (1 required but only 0 alive)"); assertThat(e.getConsistencyLevel()).isEqualTo(LOCAL_ONE); assertThat(e.getAliveReplicas()).isEqualTo(0); assertThat(e.getRequiredReplicas()).isEqualTo(1); assertThat(e.getAddress()).isEqualTo(host1.getSocketAddress()); assertThat(e.getHost()).isEqualTo(host1.getAddress()); } } @Test(groups = "short") public void should_throw_proper_read_timeout_exception() { simulateError(1, read_request_timeout); try { query(); fail("expected a ReadTimeoutException"); } catch (ReadTimeoutException e) { assertThat(e.getMessage()).isEqualTo("Cassandra timeout during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded)"); assertThat(e.getConsistencyLevel()).isEqualTo(LOCAL_ONE); assertThat(e.getReceivedAcknowledgements()).isEqualTo(0); assertThat(e.getRequiredAcknowledgements()).isEqualTo(1); assertThat(e.getAddress()).isEqualTo(host1.getSocketAddress()); assertThat(e.getHost()).isEqualTo(host1.getAddress()); } } @Test(groups = "short") public void should_throw_proper_write_timeout_exception() { simulateError(1, write_request_timeout); try { query(); fail("expected a WriteTimeoutException"); } catch (WriteTimeoutException e) { assertThat(e.getMessage()).isEqualTo("Cassandra timeout during write query at consistency LOCAL_ONE (1 replica were required but only 0 acknowledged the write)"); assertThat(e.getConsistencyLevel()).isEqualTo(LOCAL_ONE); assertThat(e.getReceivedAcknowledgements()).isEqualTo(0); assertThat(e.getRequiredAcknowledgements()).isEqualTo(1); assertThat(e.getWriteType()).isEqualTo(WriteType.SIMPLE); assertThat(e.getAddress()).isEqualTo(host1.getSocketAddress()); assertThat(e.getHost()).isEqualTo(host1.getAddress()); } } protected void simulateError(int hostNumber, Result result) { scassandras.node(hostNumber).primingClient().prime(PrimingRequest.queryBuilder() .withQuery("mock query") .withThen(then().withResult(result)) .build()); } private static List<Map<String, ?>> row(String key, String value) { return ImmutableList.<Map<String, ?>>of(ImmutableMap.of(key, value)); } protected ResultSet query() { return query(session); } protected ResultSet query(Session session) { return session.execute("mock query"); } @AfterMethod(groups = "short", alwaysRun = true) public void afterMethod() { for (Scassandra node : scassandras.nodes()) { node.primingClient().clearAllPrimes(); } if (cluster != null) cluster.close(); } @AfterClass(groups = "short", alwaysRun = true) public void afterClass() { if (scassandras != null) scassandras.stop(); } }