/**
* Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.openflowplugin.openflow.md.util;
import java.math.BigInteger;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
import org.opendaylight.openflowplugin.api.openflow.md.core.ConnectionConductor;
import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext;
import org.opendaylight.openflowplugin.openflow.md.core.session.OFRoleManager;
import org.opendaylight.openflowplugin.openflow.md.core.session.RolePushException;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ControllerRole;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequest;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.common.config.impl.rev140326.OfpRole;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import com.google.common.util.concurrent.Futures;
/**
* testing {@link RoleUtil}
*/
@RunWith(MockitoJUnitRunner.class)
public class RoleUtilTest {
@Mock
private SessionContext session;
@Mock
private GetFeaturesOutput features;
@Mock
private ConnectionConductor primaryConductor;
@Mock
private ConnectionAdapter connectionAdapter;
private final BigInteger generationId = BigInteger.TEN;
private RoleRequestOutput roleRequestOutput;
/**
* prepare values
*/
@Before
public void setUp() {
Mockito.when(session.getFeatures()).thenReturn(features);
Mockito.when(features.getVersion()).thenReturn(Short.valueOf((short) 42));
Mockito.when(session.getNextXid()).thenReturn(84L);
Mockito.when(session.getPrimaryConductor()).thenReturn(primaryConductor);
Mockito.when(primaryConductor.getConnectionAdapter()).thenReturn(connectionAdapter);
roleRequestOutput = new RoleRequestOutputBuilder()
.setGenerationId(generationId)
.setRole(ControllerRole.OFPCRROLESLAVE)
.setVersion((short) 42)
.setXid(21L)
.build();
Mockito.when(connectionAdapter.roleRequest(Matchers.any(RoleRequestInput.class)))
.thenReturn(Futures.immediateFuture(RpcResultBuilder.success(roleRequestOutput).build()));
}
/**
* Test method for {@link org.opendaylight.openflowplugin.openflow.md.util.RoleUtil#toOFJavaRole(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.common.config.impl.rev140326.OfpRole)}.
*/
@Test
public void testToOFJavaRole() {
Assert.assertEquals(ControllerRole.OFPCRROLEMASTER, RoleUtil.toOFJavaRole(OfpRole.BECOMEMASTER));
Assert.assertEquals(ControllerRole.OFPCRROLESLAVE, RoleUtil.toOFJavaRole(OfpRole.BECOMESLAVE));
Assert.assertEquals(ControllerRole.OFPCRROLENOCHANGE, RoleUtil.toOFJavaRole(OfpRole.NOCHANGE));
}
/**
* Test method for {@link org.opendaylight.openflowplugin.openflow.md.util.RoleUtil#toOFJavaRole(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.common.config.impl.rev140326.OfpRole)}.
*/
@Test(expected = NullPointerException.class)
public void testToOFJavaRoleNull() {
RoleUtil.toOFJavaRole(null);
}
/**
* Test method for {@link org.opendaylight.openflowplugin.openflow.md.util.RoleUtil#createRoleRequestInput(org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.common.config.impl.rev140326.OfpRole, java.math.BigInteger)}.
*/
@Test
public void testCreateRuleRequestInput() {
RoleRequestInput roleRequestInput = RoleUtil.createRoleRequestInput(session, OfpRole.BECOMEMASTER, generationId).build();
Assert.assertEquals(generationId, roleRequestInput.getGenerationId());
Assert.assertEquals(RoleRequestInput.class, roleRequestInput.getImplementedInterface());
Assert.assertEquals(ControllerRole.OFPCRROLEMASTER, roleRequestInput.getRole());
Assert.assertEquals(42, roleRequestInput.getVersion().intValue());
Assert.assertEquals(84L, roleRequestInput.getXid().longValue());
}
/**
* Test method for {@link org.opendaylight.openflowplugin.openflow.md.util.RoleUtil#sendRoleChangeRequest(org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.common.config.impl.rev140326.OfpRole, java.math.BigInteger)}.
* @throws Exception
*/
@Test
public void testSendRoleChangeRequest() throws Exception {
Future<RpcResult<RoleRequestOutput>> roleRequestOutputFx = RoleUtil.sendRoleChangeRequest(session, OfpRole.BECOMEMASTER, generationId);
Assert.assertNotNull(roleRequestOutputFx);
ArgumentCaptor<RoleRequestInput> roleRequestCaptor = ArgumentCaptor.forClass(RoleRequestInput.class);
Mockito.verify(connectionAdapter).roleRequest(roleRequestCaptor.capture());
RoleRequest roleRequestInput = roleRequestCaptor.getValue();
Assert.assertEquals(generationId, roleRequestInput.getGenerationId());
Assert.assertEquals(RoleRequestInput.class, roleRequestInput.getImplementedInterface());
Assert.assertEquals(ControllerRole.OFPCRROLEMASTER, roleRequestInput.getRole());
Assert.assertEquals(42, roleRequestInput.getVersion().intValue());
Assert.assertEquals(84L, roleRequestInput.getXid().longValue());
}
/**
* Test method for {@link org.opendaylight.openflowplugin.openflow.md.util.RoleUtil#readGenerationIdFromDevice(org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext)}.
* @throws Exception
*/
@Test
public void testReadGenerationIdFromDevice() throws Exception {
BigInteger generationIdFromDevice = RoleUtil.readGenerationIdFromDevice(session).get();
Assert.assertEquals(generationId, generationIdFromDevice);
}
/**
* Test method for {@link org.opendaylight.openflowplugin.openflow.md.util.RoleUtil#getNextGenerationId(java.math.BigInteger)}.
*/
@Test
public void testGetNextGenerationId() {
BigInteger[] src = new BigInteger[] {
BigInteger.ZERO,
BigInteger.ONE,
OFRoleManager.MAX_GENERATION_ID.subtract(BigInteger.ONE),
OFRoleManager.MAX_GENERATION_ID
};
BigInteger[] out = new BigInteger[] {
BigInteger.ONE,
BigInteger.valueOf(2L),
OFRoleManager.MAX_GENERATION_ID,
BigInteger.ZERO
};
for (int i = 0; i < src.length; i++) {
BigInteger nextGenerationId = RoleUtil.getNextGenerationId(src[i]);
Assert.assertEquals(out[i], nextGenerationId);
}
}
/**
* Test method for {@link org.opendaylight.openflowplugin.openflow.md.util.RoleUtil#makeCheckedRuleRequestFxResult(com.google.common.util.concurrent.ListenableFuture)}.
* @throws Exception
*/
@Test
public void testMakeCheckedRuleRequestFxResult() throws Exception {
String message = "me sooo naughty!";
try {
RoleUtil.makeCheckedRuleRequestFxResult(Futures.<Boolean>immediateFailedFuture(new Exception(message))).checkedGet();
} catch (Exception e) {
Assert.assertEquals(RolePushException.class, e.getClass());
Assert.assertEquals(ExecutionException.class, e.getCause().getClass());
Assert.assertEquals(Exception.class, e.getCause().getCause().getClass());
Assert.assertNull(e.getCause().getCause().getCause());
Assert.assertEquals(message, e.getCause().getCause().getMessage());
}
try {
RoleUtil.makeCheckedRuleRequestFxResult(Futures.<Boolean>immediateFailedFuture(new RolePushException(message))).checkedGet();
} catch (Exception e) {
Assert.assertEquals(RolePushException.class, e.getClass());
Assert.assertNull(e.getCause());
Assert.assertEquals(message, e.getMessage());
}
}
}