/*
* 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.client.bootstrap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Test;
import org.kaaproject.kaa.client.channel.BootstrapTransport;
import org.kaaproject.kaa.client.channel.IpTransportInfo;
import org.kaaproject.kaa.client.channel.IpTransportInfoTest;
import org.kaaproject.kaa.client.channel.KaaDataChannel;
import org.kaaproject.kaa.client.channel.KaaDataDemultiplexer;
import org.kaaproject.kaa.client.channel.KaaDataMultiplexer;
import org.kaaproject.kaa.client.channel.KaaInternalChannelManager;
import org.kaaproject.kaa.client.channel.KaaInvalidChannelException;
import org.kaaproject.kaa.client.channel.TransportConnectionInfo;
import org.kaaproject.kaa.client.channel.TransportProtocolIdConstants;
import org.kaaproject.kaa.client.channel.connectivity.ConnectivityChecker;
import org.kaaproject.kaa.client.channel.failover.DefaultFailoverManager;
import org.kaaproject.kaa.client.channel.failover.FailoverManager;
import org.kaaproject.kaa.client.channel.failover.FailoverStatus;
import org.kaaproject.kaa.client.channel.failover.strategies.DefaultFailoverStrategy;
import org.kaaproject.kaa.client.channel.failover.strategies.FailoverStrategy;
import org.kaaproject.kaa.client.context.ExecutorContext;
import org.kaaproject.kaa.client.transport.TransportException;
import org.kaaproject.kaa.common.TransportType;
import org.kaaproject.kaa.common.endpoint.gen.ProtocolMetaData;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class DefaultBootstrapManagerTest {
@Test
public void testReceiveOperationsServerList() throws TransportException {
BootstrapTransport transport = mock(BootstrapTransport.class);
DefaultBootstrapManager manager = new DefaultBootstrapManager(transport, null, null);
boolean exception = false;
try {
manager.receiveOperationsServerList();
manager.useNextOperationsServer(TransportProtocolIdConstants.HTTP_TRANSPORT_ID, FailoverStatus.NO_CONNECTIVITY);
} catch (BootstrapRuntimeException e) {
exception = true;
}
assertTrue(exception);
manager.receiveOperationsServerList();
verify(transport, times(2)).sync();
}
@Test
public void testOperationsServerInfoRetrieving() throws TransportException, NoSuchAlgorithmException, InvalidKeySpecException {
ExecutorContext executorContext = mock(ExecutorContext.class);
DefaultBootstrapManager manager = new DefaultBootstrapManager(null, executorContext, null);
boolean exception = false;
try {
manager.useNextOperationsServer(TransportProtocolIdConstants.HTTP_TRANSPORT_ID, FailoverStatus.NO_CONNECTIVITY);
} catch (BootstrapRuntimeException e) {
exception = true;
}
assertTrue(exception);
BootstrapTransport transport = mock(BootstrapTransport.class);
// Generating pseudo bootstrap key
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.genKeyPair();
List<ProtocolMetaData> list = new ArrayList<ProtocolMetaData>();
ProtocolMetaData md = IpTransportInfoTest.buildMetaData(TransportProtocolIdConstants.HTTP_TRANSPORT_ID, "localhost", 9889,
keyPair.getPublic());
list.add(md);
ChanelManagerMock channelManager = spy(new ChanelManagerMock());
when(executorContext.getScheduledExecutor()).thenReturn(Executors.newScheduledThreadPool(1));
FailoverStrategy strategy = new DefaultFailoverStrategy(1, 1, 1, TimeUnit.MILLISECONDS);
FailoverManager failoverManager =
spy(new DefaultFailoverManager(channelManager, executorContext, strategy, 1, TimeUnit.MILLISECONDS));
manager.setChannelManager(channelManager);
manager.setFailoverManager(failoverManager);
manager.setTransport(transport);
manager.onProtocolListUpdated(list);
manager.useNextOperationsServer(TransportProtocolIdConstants.HTTP_TRANSPORT_ID, FailoverStatus.NO_CONNECTIVITY);
assertTrue(channelManager.isServerUpdated());
assertEquals("http://localhost:9889", channelManager.getReceivedUrl());
manager.useNextOperationsServerByAccessPointId("some.name".hashCode());
verify(channelManager, times(1)).onTransportConnectionInfoUpdated(any(TransportConnectionInfo.class));
}
@Test
public void testUseServerByDnsName() throws NoSuchAlgorithmException {
DefaultBootstrapManager manager = new DefaultBootstrapManager(null, null, null);
ChanelManagerMock channelManager = spy(new ChanelManagerMock());
manager.setChannelManager(channelManager);
BootstrapTransport transport = mock(BootstrapTransport.class);
manager.setTransport(transport);
// Generating pseudo operation key
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.genKeyPair();
List<ProtocolMetaData> list = new ArrayList<ProtocolMetaData>();
ProtocolMetaData md = IpTransportInfoTest.buildMetaData(TransportProtocolIdConstants.HTTP_TRANSPORT_ID, "localhost", 9889,
keyPair.getPublic());
list.add(md);
manager.onProtocolListUpdated(list);
assertEquals("http://localhost:9889", channelManager.getReceivedUrl());
manager.useNextOperationsServerByAccessPointId("localhost2:9889".hashCode());
verify(transport, times(1)).sync();
list = new ArrayList<ProtocolMetaData>();
md = IpTransportInfoTest.buildMetaData(TransportProtocolIdConstants.HTTP_TRANSPORT_ID, "localhost2", 9889, keyPair.getPublic());
list.add(md);
manager.onProtocolListUpdated(list);
assertEquals("http://localhost2:9889", channelManager.getReceivedUrl());
assertTrue(channelManager.isServerUpdated());
}
public class ChanelManagerMock implements KaaInternalChannelManager {
private boolean serverUpdated = false;
private String receivedUrl;
public ChanelManagerMock() {
}
public String getReceivedUrl() {
return receivedUrl;
}
public boolean isServerUpdated() {
return serverUpdated;
}
@Override
public void setConnectivityChecker(ConnectivityChecker checker) {
}
@Override
public void addChannel(KaaDataChannel channel) {
}
@Override
public void removeChannel(KaaDataChannel channel) {
}
@Override
public List<KaaDataChannel> getChannels() {
return null;
}
@Override
public KaaDataChannel getChannel(String id) {
return null;
}
@Override
public void onServerFailed(TransportConnectionInfo server, FailoverStatus status) {
}
@Override
public void setFailoverManager(FailoverManager failoverManager) {
}
@Override
public void onTransportConnectionInfoUpdated(TransportConnectionInfo newServer) {
receivedUrl = new IpTransportInfo(newServer).getUrl();
serverUpdated = true;
}
@Override
public void clearChannelList() {
}
@Override
public void setChannel(TransportType transport, KaaDataChannel channel) throws KaaInvalidChannelException {
}
@Override
public void removeChannel(String id) {
}
@Override
public void shutdown() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void setOperationMultiplexer(KaaDataMultiplexer multiplexer) {
// TODO Auto-generated method stub
}
@Override
public void setOperationDemultiplexer(KaaDataDemultiplexer demultiplexer) {
// TODO Auto-generated method stub
}
@Override
public void setBootstrapMultiplexer(KaaDataMultiplexer multiplexer) {
// TODO Auto-generated method stub
}
@Override
public void setBootstrapDemultiplexer(KaaDataDemultiplexer demultiplexer) {
// TODO Auto-generated method stub
}
@Override
public void sync(TransportType type) {
// TODO Auto-generated method stub
}
@Override
public void syncAck(TransportType type) {
// TODO Auto-generated method stub
}
@Override
public void syncAll(TransportType type) {
// TODO Auto-generated method stub
}
@Override
public TransportConnectionInfo getActiveServer(TransportType logging) {
// TODO Auto-generated method stub
return null;
}
}
}