/*
* 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.bootstrap.service;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.kaaproject.kaa.server.common.zk.bootstrap.BootstrapNode;
import org.kaaproject.kaa.server.common.zk.gen.ConnectionInfo;
import org.kaaproject.kaa.server.common.zk.gen.OperationsNodeInfo;
import org.kaaproject.kaa.server.common.zk.gen.TransportMetaData;
import org.kaaproject.kaa.server.common.zk.gen.VersionConnectionInfoPair;
import org.kaaproject.kaa.server.sync.bootstrap.ProtocolConnectionData;
import org.kaaproject.kaa.server.sync.bootstrap.ProtocolVersionId;
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.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Andrew Shvayka
*/
public class DefaultOperationsServerListServiceTest {
private DefaultOperationsServerListService service;
@Before
public void before() {
service = new DefaultOperationsServerListService();
BootstrapNode zkNode = Mockito.mock(BootstrapNode.class);
OperationsNodeInfo nodeInfo = new OperationsNodeInfo();
nodeInfo.setConnectionInfo(new ConnectionInfo("localhost", 8000, ByteBuffer.wrap(new byte[0])));
List<TransportMetaData> mdList = new ArrayList<TransportMetaData>();
mdList.add(new TransportMetaData(1, 42, 42, Collections.singletonList(new VersionConnectionInfoPair(42, ByteBuffer.wrap("test"
.getBytes())))));
mdList.add(new TransportMetaData(2, 73, 73, Collections.singletonList(new VersionConnectionInfoPair(73, ByteBuffer.wrap("test"
.getBytes())))));
mdList.add(new TransportMetaData(3, 1, 3, Arrays.asList(new VersionConnectionInfoPair(1, ByteBuffer.wrap("test1".getBytes())),
new VersionConnectionInfoPair(2, ByteBuffer.wrap("test2".getBytes())),
new VersionConnectionInfoPair(3, ByteBuffer.wrap("test3".getBytes())))));
nodeInfo.setTransports(mdList);
Mockito.when(zkNode.getCurrentOperationServerNodes()).thenReturn(Arrays.asList(nodeInfo));
service.init(zkNode);
}
@Test
public void testFilterOneResult() {
Set<ProtocolConnectionData> result = service.filter(Collections.singletonList(new ProtocolVersionId(1, 42)));
Assert.assertNotNull(result);
Assert.assertEquals(1, result.size());
Assert.assertNotNull(result.iterator().next());
Assert.assertEquals(1, result.iterator().next().getProtocolId());
Assert.assertEquals(42, result.iterator().next().getProtocolVersion());
}
@Test
public void testFilterResultDeduplication() {
Set<ProtocolConnectionData> result = service.filter(Arrays.asList(new ProtocolVersionId(3, 1), new ProtocolVersionId(3, 1)));
Assert.assertNotNull(result);
Assert.assertEquals(1, result.size());
Assert.assertNotNull(result.iterator().next());
Assert.assertEquals(3, result.iterator().next().getProtocolId());
Assert.assertEquals(1, result.iterator().next().getProtocolVersion());
}
@Test
public void testFilterMultipleResults() {
Set<ProtocolConnectionData> result = service.filter(Arrays.asList(new ProtocolVersionId(1, 42), new ProtocolVersionId(2, 73)));
Assert.assertNotNull(result);
Assert.assertEquals(2, result.size());
}
@Test
public void testFilterNoResults() {
Set<ProtocolConnectionData> result = service.filter(Arrays.asList(new ProtocolVersionId(2, 42), new ProtocolVersionId(1, 73)));
Assert.assertNotNull(result);
Assert.assertEquals(0, result.size());
}
@Test(expected = RuntimeException.class)
public void filterInterrupted() throws InterruptedException {
DefaultOperationsServerListService.Memorizer memorizer = Mockito.mock(DefaultOperationsServerListService.Memorizer.class);
Mockito.doThrow(new InterruptedException()).when(memorizer).compute(Mockito.any(Object.class));
ReflectionTestUtils.setField(service, "cache", memorizer);
service.filter(Collections.<ProtocolVersionId>emptyList());
}
@Test
public void testOnNodeAddedAndUpdated() {
OperationsNodeInfo nodeInfo = Mockito.mock(OperationsNodeInfo.class);
ConnectionInfo connectionInfo = Mockito.mock(ConnectionInfo.class);
Mockito.when(nodeInfo.getConnectionInfo()).thenReturn(connectionInfo);
Map<String, OperationsNodeInfo> opsMap = Mockito.mock(Map.class);
ReflectionTestUtils.setField(service, "opsMap", opsMap);
DefaultOperationsServerListService.Memorizer memorizer = Mockito.mock(DefaultOperationsServerListService.Memorizer.class);
ReflectionTestUtils.setField(service, "cache", memorizer);
service.onNodeUpdated(nodeInfo);
service.onNodeAdded(nodeInfo);
Mockito.verify(opsMap, Mockito.times(2)).put(Mockito.anyString(), Mockito.eq(nodeInfo));
Mockito.verify(memorizer, Mockito.times(2)).clear();
}
@Test
public void testOnNodeRemoved() {
OperationsNodeInfo nodeInfo = Mockito.mock(OperationsNodeInfo.class);
ConnectionInfo connectionInfo = Mockito.mock(ConnectionInfo.class);
Mockito.when(nodeInfo.getConnectionInfo()).thenReturn(connectionInfo);
Map<String, OperationsNodeInfo> opsMap = Mockito.mock(Map.class);
ReflectionTestUtils.setField(service, "opsMap", opsMap);
DefaultOperationsServerListService.Memorizer memorizer = Mockito.mock(DefaultOperationsServerListService.Memorizer.class);
ReflectionTestUtils.setField(service, "cache", memorizer);
service.onNodeRemoved(nodeInfo);
Mockito.verify(opsMap, Mockito.only()).remove(Mockito.anyString());
Mockito.verify(memorizer, Mockito.only()).clear();
}
}