/*
* Copyright 2014-2016 CyberVision, 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 org.kaaproject.kaa.server.hash;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import org.junit.Assert;
import org.junit.Test;
import org.kaaproject.kaa.server.common.zk.gen.ConnectionInfo;
import org.kaaproject.kaa.server.common.zk.gen.OperationsNodeInfo;
import org.mockito.Mockito;
import org.springframework.test.util.ReflectionTestUtils;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.SortedMap;
public class ConsistentHashResolverTest {
@Test(expected = RuntimeException.class)
public void getNodeForNullUserIdTest() {
ConsistentHashResolver consistentHashResolver = new ConsistentHashResolver(new ArrayList<OperationsNodeInfo>(), 5);
consistentHashResolver.getNode(null);
}
@Test
public void getNodeForEmptyCircleTest() {
ConsistentHashResolver consistentHashResolver = new ConsistentHashResolver(new ArrayList<OperationsNodeInfo>(), 5);
OperationsNodeInfo info = consistentHashResolver.getNode("userId");
Assert.assertNull(info);
}
@Test
public void getNodeForOneItemCircleTest() {
List<OperationsNodeInfo> nodes = createNodeListWithOneNode();
ConsistentHashResolver consistentHashResolver = new ConsistentHashResolver(nodes, 1);
OperationsNodeInfo returnedNode = consistentHashResolver.getNode("userId");
Assert.assertEquals(nodes.get(0), returnedNode);
}
@Test
public void getNodeForMultipleItemsTest() {
List<OperationsNodeInfo> nodes = createNodeListWithThreeItems();
ConsistentHashResolver consistentHashResolver = new ConsistentHashResolver(nodes, 2);
OperationsNodeInfo returnedNode = consistentHashResolver.getNode("aa");
// operations node info 1 should be returned
Assert.assertEquals(nodes.get(0), returnedNode);
}
@Test
public void getNodeForMultipleItemsEmptyTailMap() {
List<OperationsNodeInfo> nodes = createNodeListWithThreeItems();
ConsistentHashResolver consistentHashResolver = new ConsistentHashResolver(nodes, 2);
OperationsNodeInfo returnedNode = consistentHashResolver.getNode("aaaa");
// operations node info 3 should be returned
Assert.assertEquals(nodes.get(2), returnedNode);
}
@Test
public void onNodeRemovedTest() throws NoSuchFieldException {
int t = 10;
List<OperationsNodeInfo> nodes = createNodeListWithOneNode();
ConsistentHashResolver consistentHashResolver = new ConsistentHashResolver(nodes, t);
SortedMap circle = mock(SortedMap.class);
ReflectionTestUtils.setField(consistentHashResolver, "circle", circle);
consistentHashResolver.onNodeUpdated(nodes.get(0));
// verify that remove was called t times
verify(circle, Mockito.times(t)).remove(any());
}
private List<OperationsNodeInfo> createNodeListWithOneNode() {
ConnectionInfo connectionInfo = new ConnectionInfo("thrift1", 4234, ByteBuffer.allocate(16));
OperationsNodeInfo operationsNodeInfo = new OperationsNodeInfo(connectionInfo, null, 523634L, null);
return Arrays.asList(operationsNodeInfo);
}
private List<OperationsNodeInfo> createNodeListWithThreeItems() {
ByteBuffer buffer1 = ByteBuffer.allocate(8);
buffer1.put(0, (byte) 98);
buffer1.put(1, (byte) 98);
ByteBuffer buffer2 = ByteBuffer.allocate(8);
buffer2.put(0, (byte) 99);
buffer2.put(1, (byte) 99);
ByteBuffer buffer3 = ByteBuffer.allocate(2);
buffer3.put(0, (byte) 100);
buffer3.put(1, (byte) 100);
ConnectionInfo connectionInfo1 = new ConnectionInfo("thrift1", 4241, buffer1);
ConnectionInfo connectionInfo2 = new ConnectionInfo("thrift2", 4242, buffer2);
ConnectionInfo connectionInfo3 = new ConnectionInfo("thrift3", 4243, buffer3);
OperationsNodeInfo operationsNodeInfo1 = new OperationsNodeInfo(connectionInfo1, null, 1231L, null);
OperationsNodeInfo operationsNodeInfo2 = new OperationsNodeInfo(connectionInfo2, null, 1232L, null);
OperationsNodeInfo operationsNodeInfo3 = new OperationsNodeInfo(connectionInfo3, null, 1233L, null);
return Arrays.asList(operationsNodeInfo1, operationsNodeInfo2, operationsNodeInfo3);
}
}