package com.stratio.deep.cassandra.thrift; import static org.testng.Assert.assertEquals; import java.math.BigInteger; import java.util.Arrays; import java.util.List; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.dht.ByteOrderedPartitioner; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Murmur3Partitioner; import org.apache.cassandra.dht.OrderPreservingPartitioner; import org.apache.cassandra.dht.RandomPartitioner; import org.apache.cassandra.dht.Token; import org.apache.cassandra.thrift.CfSplit; import org.testng.annotations.Test; import com.stratio.deep.commons.rdd.DeepTokenRange; /** * Created by adelapena on 10/09/14. */ @Test(testName = "testFetchSortedTokens") public class ThriftRangeUtilsTest { @Test public void testFetchSortedTokensWithMurmur3Partitioner() { testStringComparableConversion(new Murmur3Partitioner()); } @Test public void testFetchSortedTokensWithRandomPartitioner() { testStringComparableConversion(new RandomPartitioner()); } @Test public void testFetchSortedTokensWithOrderPreservingPartitioner() { testStringComparableConversion(new OrderPreservingPartitioner()); } @Test(enabled = false) public void testFetchSortedTokensWithByteOrderedPartitioner() { testStringComparableConversion(new ByteOrderedPartitioner()); } private static void testStringComparableConversion(IPartitioner<?> partitioner) { ThriftRangeUtils utils = new ThriftRangeUtils(partitioner, "", 0, "", "", 0); Token<?> minToken = partitioner.getMinimumToken(); Token<?> midPoint = partitioner.midpoint(minToken, minToken); Token<?> rndPoint = partitioner.getRandomToken(); testStringComparableConversion(utils, (Comparable) minToken.token); testStringComparableConversion(utils, (Comparable) midPoint.token); testStringComparableConversion(utils, (Comparable) rndPoint.token); } private static void testStringComparableConversion(ThriftRangeUtils utils, Comparable value) { String tokenAsString = utils.tokenAsString(value); Comparable tokenAsComparable = utils.tokenAsComparable(tokenAsString); assertEquals(tokenAsComparable, value); } @Test public void testDeepTokenRangesWithMurmur3Partitioner() { testDeepTokenRangesAux(new Murmur3Partitioner(), 10L, 20L); } @Test public void testDeepTokenRangesWithRandomPartitioner() { testDeepTokenRanges(new RandomPartitioner(), BigInteger.valueOf(10), BigInteger.valueOf(20)); } @Test public void testDeepTokenRangesWithOrderPreservingPartitioner() { testDeepTokenRanges(new OrderPreservingPartitioner(), "a", "b"); } private static <K extends Comparable, T extends Token<K>> void testDeepTokenRanges(IPartitioner<T> partitioner, K start, K end) { K min = partitioner.getMinimumToken().token; testDeepTokenRangesAux(partitioner, start, end); testDeepTokenRangesAux(partitioner, end, start); testDeepTokenRangesAux(partitioner, min, end); testDeepTokenRangesAux(partitioner, start, min); testDeepTokenRangesAux(partitioner, min, min); } private static <K extends Comparable, T extends Token<K>> void testDeepTokenRangesAux(IPartitioner<T> partitioner, K start, K end) { int compare = start.compareTo(end); List<String> endpoints = Arrays.asList("192.168.0.1", "192.168.0.3", "192.168.0.2"); if (compare <= 0) { List<DeepTokenRange> expectedRanges = Arrays.asList(new DeepTokenRange(start, end, endpoints)); testDeepTokenRanges(partitioner, start, end, endpoints, expectedRanges); } else { K min = partitioner.getMinimumToken().token; List<DeepTokenRange> expectedRanges = Arrays.asList( new DeepTokenRange(start, min, endpoints), new DeepTokenRange(min, end, endpoints)); testDeepTokenRanges(partitioner, start, end, endpoints, expectedRanges); } } private static <K extends Comparable, T extends Token<K>> void testDeepTokenRanges(IPartitioner<T> partitioner, K startToken, K endToken, List<String> endpoints, List<DeepTokenRange> expectedRanges) { ThriftRangeUtils utils = new ThriftRangeUtils(partitioner, "", 0, "", "", 0); Token.TokenFactory tokenFactory = partitioner.getTokenFactory(); AbstractType tokenType = partitioner.getTokenValidator(); String start = tokenFactory.toString(tokenFactory.fromByteArray(tokenType.decompose(startToken))); String end = tokenFactory.toString(tokenFactory.fromByteArray(tokenType.decompose(endToken))); CfSplit thriftSplit = new CfSplit(start, end, 0); List<DeepTokenRange> actualRanges = utils.deepTokenRanges(Arrays.asList(thriftSplit), endpoints); assertEquals(actualRanges, expectedRanges); } }