/* * 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.policies; import com.datastax.driver.core.*; import com.datastax.driver.core.exceptions.NoHostAvailableException; import com.google.common.collect.Lists; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.net.InetSocketAddress; import java.util.List; import static com.datastax.driver.core.TestUtils.nonQuietClusterCloseOptions; public class WhiteListPolicyTest { QueryTracker queryTracker; @BeforeMethod(groups = "short") public void setUp() { queryTracker = new QueryTracker(); } /** * Provides basic validation of {@link WhiteListPolicy}. * <p/> * Ensures that: * <ol> * <li>Only addresses provided in the whitelist are every used for querying.</li> * <li>If no nodes present in the whitelist are available, queries fail with a {@link NoHostAvailableException}</li> * </ol> * * @test_category load_balancing:white_list */ @Test(groups = "short") public void should_only_query_hosts_in_white_list() throws Exception { // given: a 5 node cluster with a WhiteListPolicy targeting nodes 3 and 5. ScassandraCluster sCluster = ScassandraCluster.builder().withNodes(5).build(); List<InetSocketAddress> whiteList = Lists.newArrayList(sCluster.address(3), sCluster.address(5)); Cluster cluster = Cluster.builder() .addContactPoints(sCluster.address(5).getAddress()) .withPort(sCluster.getBinaryPort()) .withLoadBalancingPolicy(new WhiteListPolicy(new RoundRobinPolicy(), whiteList)) .withNettyOptions(nonQuietClusterCloseOptions) .build(); try { sCluster.init(); Session session = cluster.connect(); // when: a query is executed 50 times. queryTracker.query(session, 50); // then: only nodes 3 and 5 should have been queried. queryTracker.assertQueried(sCluster, 1, 1, 0); queryTracker.assertQueried(sCluster, 1, 2, 0); queryTracker.assertQueried(sCluster, 1, 3, 25); queryTracker.assertQueried(sCluster, 1, 4, 0); queryTracker.assertQueried(sCluster, 1, 5, 25); queryTracker.reset(); // when: the only nodes in the whitelist are stopped. sCluster.stop(cluster, 3); sCluster.stop(cluster, 5); // then: all queries should raise a NHAE. queryTracker.query(session, 50, ConsistencyLevel.ONE, NoHostAvailableException.class); queryTracker.assertQueried(sCluster, 1, 1, 0); queryTracker.assertQueried(sCluster, 1, 2, 0); queryTracker.assertQueried(sCluster, 1, 3, 0); queryTracker.assertQueried(sCluster, 1, 4, 0); queryTracker.assertQueried(sCluster, 1, 5, 0); } finally { cluster.close(); sCluster.stop(); } } /** * Validates that a {@link Cluster} cannot be initiated if using a {@link WhiteListPolicy} and * none of the specified contact point addresses are present in the white list. * * @test_category load_balancing:white_list */ @Test(groups = "short", expectedExceptions = {IllegalArgumentException.class}) public void should_require_contact_point_in_white_list() throws Exception { // given: a 5 node cluster with a WhiteListPolicy targeting node2. ScassandraCluster sCluster = ScassandraCluster.builder().withNodes(5).build(); // when: using a Cluster instance with none of the contact points in the declared // WhiteListPolicy. List<InetSocketAddress> whiteList = Lists.newArrayList(sCluster.address(2)); Cluster cluster = Cluster.builder() .addContactPointsWithPorts(sCluster.address(3)) .withPort(sCluster.getBinaryPort()) .withLoadBalancingPolicy(new WhiteListPolicy(new RoundRobinPolicy(), whiteList)) .withNettyOptions(nonQuietClusterCloseOptions) .build(); try { sCluster.init(); // then: The cluster instance should fail to initialize as none of the contact // points is present in the white list. cluster.init(); } finally { cluster.close(); sCluster.stop(); } } }