package org.opendaylight.openflowplugin.impl.util;
+import com.google.common.collect.Lists;
+import java.math.BigInteger;
import junit.framework.TestCase;
import org.junit.Before;
-import org.junit.Rule;
import org.junit.Test;
-import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceState;
import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.features.reply.PhyPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.features.reply.PhyPortBuilder;
-import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
-
-import static org.mockito.Mockito.*;
-
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.port._case.InPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketIn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder;
/**
* Created by Tomas Slusny on 24.3.2016.
@RunWith(MockitoJUnitRunner.class)
public class NodeConnectorRefToPortTranslatorTest extends TestCase {
- @Mock
- DeviceState deviceState;
- @Mock
- KeyedInstanceIdentifier<Node, NodeKey> nodeInstanceIdentifier;
- @Mock
- GetFeaturesOutput getFeaturesOutput;
- @Mock
- List<PhyPort> phyPorts;
- @Mock
- Iterator<PhyPort> phyPortsIterator;
- @Mock
- PhyPort phyPort;
- @Mock
- PhyPort phyPort2;
-
-
- @Mock
- DeviceState secondDeviceState;
- @Mock
- GetFeaturesOutput secondGetFeaturesOutput;
- @Mock
- PhyPort secondPhyPort;
-
+ static final String PACKET_DATA = "Test_Data";
static final Long PORT_NO = 5l;
static final Long SECOND_PORT_NO = 6l;
- static final String ID_VALUE = "openflow:10";
+ static final BigInteger DATA_PATH_ID = BigInteger.TEN;
+ static final short OF_VERSION = OFConstants.OFP_VERSION_1_3;
+ static final String ID_VALUE = "openflow:" + DATA_PATH_ID;
+ static final Long TABLE_ID = 42L;
+
+ private static PacketIn createPacketIn(long portNo) {
+ InPortBuilder inPortBuilder = new InPortBuilder()
+ .setPortNumber(new PortNumber(portNo));
+
+ InPortCaseBuilder caseBuilder = new InPortCaseBuilder()
+ .setInPort(inPortBuilder.build());
+
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder()
+ .setOxmClass(OpenflowBasicClass.class)
+ .setOxmMatchField(InPort.class)
+ .setHasMask(false)
+ .setMatchEntryValue(caseBuilder.build());
+
+ MatchBuilder matchBuilder = new MatchBuilder()
+ .setMatchEntry(Lists.newArrayList(matchEntryBuilder.build()));
+
+ return new PacketInMessageBuilder()
+ .setVersion(OFConstants.OFP_VERSION_1_0)
+ .setData(PACKET_DATA.getBytes())
+ .setReason(PacketInReason.OFPRACTION)
+ .setMatch(matchBuilder.build())
+ .setVersion(OFConstants.OFP_VERSION_1_3)
+ .setCookie(BigInteger.ZERO)
+ .setTableId(new TableId(TABLE_ID))
+ .build();
+ }
@Before
public void setUp() throws Exception {
- // Create nodePath (we cannot mock it in regular way because KeyedInstanceIdentifier.getKey() is final)
- final KeyedInstanceIdentifier<Node, NodeKey> nodePath = KeyedInstanceIdentifier
- .create(Nodes.class)
- .child(Node.class, new NodeKey(new NodeId(ID_VALUE)));
-
- // Mock first device state
- final List<PhyPort> phyPorts = Arrays.asList(null, phyPort2, phyPort);
- when(deviceState.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
- when(deviceState.getNodeInstanceIdentifier()).thenReturn(nodePath);
- when(deviceState.getFeatures()).thenReturn(getFeaturesOutput);
- when(getFeaturesOutput.getDatapathId()).thenReturn(BigInteger.TEN);
- when(getFeaturesOutput.getPhyPort()).thenReturn(phyPorts);
- when(phyPort.getPortNo()).thenReturn(PORT_NO);
- when(phyPort2.getPortNo()).thenReturn(null);
-
- // Mock second device state
- final List<PhyPort> secondPhyPorts = Arrays.asList(phyPort);
- when(secondDeviceState.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
- when(secondDeviceState.getNodeInstanceIdentifier()).thenReturn(nodePath);
- when(secondDeviceState.getFeatures()).thenReturn(secondGetFeaturesOutput);
- when(secondGetFeaturesOutput.getDatapathId()).thenReturn(BigInteger.TEN);
- when(secondGetFeaturesOutput.getPhyPort()).thenReturn(secondPhyPorts);
- when(secondPhyPort.getPortNo()).thenReturn(SECOND_PORT_NO);
-
-
+ // Initialize the OpenFlow version/port map
OpenflowPortsUtil.init();
}
@Test(expected = NullPointerException.class)
- public void testForNotNullableDeviceStateInGetPortNo() throws Exception {
- NodeConnectorRefToPortTranslator.getPortNoFromDeviceState(null);
+ public void testForNotNullablePacketInInGetPortNo() throws Exception {
+ NodeConnectorRefToPortTranslator.getPortNoFromPacketIn(null);
}
@Test(expected = NullPointerException.class)
- public void testForNotNullableDeviceStateInToNodeConnectorRef() throws Exception {
- NodeConnectorRefToPortTranslator.toNodeConnectorRef(null);
+ public void testForNotNullablePacketInInToNodeConnectorRef() throws Exception {
+ NodeConnectorRefToPortTranslator.toNodeConnectorRef(null, DATA_PATH_ID);
}
@Test(expected = NullPointerException.class)
- public void testForNotNullableDeviceStateInFromNodeConnectorRef() throws Exception {
- NodeConnectorRefToPortTranslator.fromNodeConnectorRef(null, null);
+ public void testForNotNullableNodeConnectorRefInFromNodeConnectorRef() throws Exception {
+ NodeConnectorRefToPortTranslator.fromNodeConnectorRef(null, OF_VERSION);
}
@Test
- public void testGetPortNoFromDeviceState() throws Exception {
- Long portNo = NodeConnectorRefToPortTranslator.getPortNoFromDeviceState(deviceState);
+ public void testGetPortNoFromPacketIn() throws Exception {
+ PacketIn packetIn = createPacketIn(PORT_NO);
+ Long portNo = NodeConnectorRefToPortTranslator.getPortNoFromPacketIn(packetIn);
assertEquals(portNo, PORT_NO);
}
@Test
public void testNodeConnectorConversion() throws Exception {
- // Convert DeviceState to NodeConnectorRef
- NodeConnectorRef ref = NodeConnectorRefToPortTranslator.toNodeConnectorRef(deviceState);
+ // Mock the packet in message
+ PacketIn packetIn = createPacketIn(PORT_NO);
- // Test getting port from NodeConnectorRef
- Long refPort = NodeConnectorRefToPortTranslator.fromNodeConnectorRef(deviceState, ref);
- assertEquals(PORT_NO, refPort);
+ // Convert PacketIn to NodeConnectorRef
+ NodeConnectorRef ref = NodeConnectorRefToPortTranslator.toNodeConnectorRef(packetIn, DATA_PATH_ID);
- // Test for getting same port, even when we used different DeviceState as fallback
- Long secondPort = NodeConnectorRefToPortTranslator.fromNodeConnectorRef(secondDeviceState, ref);
- assertEquals(refPort, secondPort);
+ // Get port number from created NodeConnectorRef
+ Long refPort = NodeConnectorRefToPortTranslator.fromNodeConnectorRef(ref, OF_VERSION);
- // Test fallback to device state if there is any problem with NodeConnectorRef
- refPort = NodeConnectorRefToPortTranslator.fromNodeConnectorRef(deviceState, null);
+ // Check if we got the correct port number
assertEquals(PORT_NO, refPort);
- // Check if 2 NodeConnectorRef created from same DeviceState have same value
- assertEquals(ref, NodeConnectorRefToPortTranslator.toNodeConnectorRef(deviceState));
+ // Check if 2 NodeConnectorRef created from same PacketIn have same value
+ assertEquals(ref, NodeConnectorRefToPortTranslator.toNodeConnectorRef(packetIn, DATA_PATH_ID));
+
+ // Check if 2 NodeConnectorRef created from same PacketIn but different datapaths do not have same value
+ assertNotSame(ref, NodeConnectorRefToPortTranslator.toNodeConnectorRef(packetIn, BigInteger.ONE));
}
}
\ No newline at end of file