/*
* 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 org.testng.annotations.Test;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class OPPTokenFactoryTest {
private static final Token.Factory factory = Token.OPPToken.FACTORY;
private static final Token minToken = token(ByteBuffer.allocate(0));
@Test(groups = "unit")
public void should_split_range() {
List<Token> splits = factory.split(token('a'), token('d'), 3);
assertThat(splits).containsExactly(
token('b'),
token('c')
);
}
@Test(groups = "unit")
public void should_split_range_producing_empty_splits_near_ring_end() {
// the first token following min
ByteBuffer buffer = ByteBuffer.wrap(new byte[]{0});
Token zero = token(buffer);
// These are edge cases where we want to make sure we don't accidentally generate the ]min,min] range (which is the whole ring)
List<Token> splits = factory.split(minToken, zero, 3);
assertThat(splits).containsExactly(
zero,
zero
);
}
@Test(groups = "unit")
public void should_strip_trailing_0_bytes() {
Token with0Bytes = token(ByteBuffer.wrap(new byte[]{4, 0, 0, 0}));
Token without0Bytes = token(ByteBuffer.wrap(new byte[]{4}));
Token fromStringWith0Bytes = factory.fromString("040000");
assertThat(with0Bytes)
.isEqualTo(without0Bytes)
.isEqualTo(fromStringWith0Bytes);
Token withMixed0Bytes = factory.fromString("0004000400");
Token withoutMixed0Bytes = factory.fromString("00040004");
assertThat(withMixed0Bytes)
.isEqualTo(withoutMixed0Bytes);
}
@Test(groups = "unit")
public void should_split_range_that_wraps_around_the_ring() {
for (int start = 1; start < 128; start++) {
for (int end = start; end < start; end++) {
// Take the midpoint of the ring and offset by the midpoint of start+end.
long expected = 0x81 + ((start + end) / 2);
TokenRange tr = new TokenRange(token(start), token(end), factory);
assertThat(factory.split(tr.getStart(), tr.getEnd(), 2))
.as("Expected 0x%X for start: %d, end: %d", expected, start, end)
.containsExactly(token(expected));
}
}
}
@Test(groups = "unit", expectedExceptions = IllegalArgumentException.class)
public void should_not_be_allowed_to_split_with_min_token() {
factory.split(minToken, minToken, 1);
}
private static Token token(char c) {
return new Token.OPPToken(ByteBuffer.wrap(new byte[]{(byte) c}));
}
private static Token token(long i) {
return new Token.OPPToken(ByteBuffer.wrap(BigInteger.valueOf(i).toByteArray()));
}
private static Token token(ByteBuffer buffer) {
// note - protocol version is ignored in OPPFactory, so we actually don't care about the value
return factory.deserialize(buffer, ProtocolVersion.NEWEST_SUPPORTED);
}
}