/*
* 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.channel.failover;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.kaaproject.kaa.client.KaaClient;
import org.kaaproject.kaa.client.channel.KaaChannelManager;
import org.kaaproject.kaa.client.channel.TransportConnectionInfo;
import org.kaaproject.kaa.client.channel.failover.FailoverDecision.FailoverAction;
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.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.concurrent.TimeUnit;
public class FailoverStrategyTest {
private FailoverManager failoverManager;
private FailoverStrategy failoverStrategy;
@Before
public void setUp() {
KaaChannelManager channelManager = Mockito.mock(KaaChannelManager.class);
ExecutorContext context = Mockito.mock(ExecutorContext.class);
failoverStrategy = Mockito.spy(new DefaultFailoverStrategy(1, 1, 1, TimeUnit.MILLISECONDS));
failoverManager = new DefaultFailoverManager(channelManager, context, failoverStrategy, 1, TimeUnit.MILLISECONDS);
}
@Test
public void changeStrategyAtRuntimeTest() {
KaaClient kaaClient = Mockito.mock(KaaClient.class);
Mockito.doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
FailoverStrategy strategy = (FailoverStrategy) invocationOnMock.getArguments()[0];
failoverManager.setFailoverStrategy(strategy);
return null;
}
}).when(kaaClient).setFailoverStrategy(Mockito.any(FailoverStrategy.class));
FailoverStatus singleFailoverStatus = FailoverStatus.OPERATION_SERVERS_NA;
FailoverDecision primaryFailoverDecision = failoverManager.onFailover(singleFailoverStatus);
kaaClient.setFailoverStrategy(new DefaultFailoverStrategy() {
@Override
public FailoverDecision onFailover(FailoverStatus failoverStatus) {
if (failoverStatus == FailoverStatus.OPERATION_SERVERS_NA) {
return new FailoverDecision(FailoverAction.USE_NEXT_BOOTSTRAP);
}
return null;
}
});
FailoverDecision secondaryFailoverDecision = failoverManager.onFailover(singleFailoverStatus);
Assert.assertNotEquals(primaryFailoverDecision.getAction(), secondaryFailoverDecision.getAction());
}
@Test
public void basicFailoverStrategyTest() {
FailoverStatus incomingStatus = FailoverStatus.BOOTSTRAP_SERVERS_NA;
Assert.assertNotNull(failoverManager.onFailover(incomingStatus));
Mockito.verify(failoverStrategy, Mockito.times(1)).onFailover(incomingStatus);
TransportConnectionInfo connectionInfo = Mockito.mock(TransportConnectionInfo.class);
failoverManager.onServerConnected(connectionInfo);
Mockito.verify(failoverStrategy, Mockito.times(1)).onRecover(connectionInfo);
}
}