/* * 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; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; import static org.mockito.Mockito.mock; import static org.testng.Assert.*; /** * Base class for replication strategy tests. Currently only supports testing * using the default Murmur3Partitioner. */ public class AbstractReplicationStrategyTest { private static final Token.Factory partitioner = Token.getFactory("Murmur3Partitioner"); private static final Cluster.Manager mockManager = mock(Cluster.Manager.class); protected static class HostMock extends Host { private final InetSocketAddress address; private HostMock(InetSocketAddress address, Cluster.Manager manager) { super(address, new ConvictionPolicy.DefaultConvictionPolicy.Factory(), manager); this.address = address; } private HostMock(InetSocketAddress address, String dc, String rack, Cluster.Manager manager) { this(address, manager); this.setLocationInfo(dc, rack); } @Override public String toString() { return address.toString(); } public InetSocketAddress getMockAddress() { return address; } @Override public boolean equals(Object o) { if (!(o instanceof HostMock)) return false; return address.equals(((HostMock) o).address); } @Override public int hashCode() { return address.hashCode(); } } protected static Token.Factory partitioner() { return partitioner; } /** * Convenience method to quickly create a mock host by a given address. * Specified address must be accessible, otherwise a RuntimeException is thrown */ protected static HostMock host(InetSocketAddress address) { return new HostMock(address, mockManager); } /** * Convenience method to quickly create a mock host by the given address * located in the given datacenter/rack */ protected static HostMock host(InetSocketAddress address, String dc, String rack) { return new HostMock(address, dc, rack, mockManager); } /** * Convenience method to cast a Host object into a MockHost. * Returns null if parameter host is not a mock */ protected static HostMock asMock(Host host) { return (host instanceof HostMock ? (HostMock) host : null); } /** * Convenience method to quickly retrieve a mock host's address as specified * if created by the <code>host(...)</code> methods. Returns null if * given host is not a mock. */ protected static InetSocketAddress mockAddress(Host host) { HostMock mock = asMock(host); return mock == null ? null : mock.getMockAddress(); } protected static Token token(String value) { return partitioner.fromString(value); } protected static List<Token> tokens(String... values) { Builder<Token> builder = ImmutableList.<Token>builder(); for (String value : values) { builder.add(token(value)); } return builder.build(); } /** * Asserts that the replica map for a given token contains the expected list of replica hosts. * Hosts are checked in order, replica placement should be an ordered set */ protected static void assertReplicaPlacement(Map<Token, Set<Host>> replicaMap, Token token, InetSocketAddress... expected) { Set<Host> replicaSet = replicaMap.get(token); assertNotNull(replicaSet); assertReplicasForToken(replicaSet, expected); } /** * Checks if a given ordered set of replicas matches the expected list of replica hosts */ protected static void assertReplicasForToken(Set<Host> replicaSet, InetSocketAddress... expected) { final String message = "Contents of replica set: " + replicaSet + " do not match expected hosts: " + Arrays.toString(expected); assertEquals(replicaSet.size(), expected.length, message); int i = 0; for (Host hostReturned : replicaSet) { boolean match = true; if (!expected[i++].equals(mockAddress(hostReturned))) { match = false; } assertTrue(match, message); } } protected static InetSocketAddress socketAddress(String address) { try { return new InetSocketAddress(InetAddress.getByName(address), 9042); } catch (UnknownHostException ex) { throw new RuntimeException(ex); } } }