+/*
+ * Copyright (c) 2016 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.impl.util;
+import com.google.common.collect.Lists;
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.mockito.junit.MockitoJUnitRunner;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
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;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import org.opendaylight.yangtools.yang.common.Uint8;
-/**
- * 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 Long PORT_NO = 5l;
- static final Long SECOND_PORT_NO = 6l;
- static final String ID_VALUE = "openflow:10";
-
- @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);
-
-
- OpenflowPortsUtil.init();
- }
-
- @Test(expected = NullPointerException.class)
- public void testForNotNullableDeviceStateInGetPortNo() throws Exception {
- NodeConnectorRefToPortTranslator.getPortNoFromDeviceState(null);
- }
-
- @Test(expected = NullPointerException.class)
- public void testForNotNullableDeviceStateInToNodeConnectorRef() throws Exception {
- NodeConnectorRefToPortTranslator.toNodeConnectorRef(null);
- }
-
- @Test(expected = NullPointerException.class)
- public void testForNotNullableDeviceStateInFromNodeConnectorRef() throws Exception {
- NodeConnectorRefToPortTranslator.fromNodeConnectorRef(null, null);
+ private static final String PACKET_DATA = "Test_Data";
+ private static final Uint32 PORT_NO = Uint32.valueOf(5L);
+ private static final Uint64 DATA_PATH_ID = Uint64.TEN;
+ private static final Uint8 OF_VERSION = OFConstants.OFP_VERSION_1_3;
+ private static final Uint32 TABLE_ID = Uint32.valueOf(42);
+
+ private static PacketIn createPacketIn(final Uint32 portNo) {
+ InPortBuilder inPortBuilder = new InPortBuilder()
+ .setPortNumber(new PortNumber(portNo));
+
+ InPortCaseBuilder caseBuilder = new InPortCaseBuilder()
+ .setInPort(inPortBuilder.build());
+
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder()
+ .setOxmClass(OpenflowBasicClass.VALUE)
+ .setOxmMatchField(InPort.VALUE)
+ .setHasMask(false)
+ .setMatchEntryValue(caseBuilder.build());
+
+ MatchBuilder matchBuilder = new MatchBuilder()
+ .setMatchEntry(Lists.newArrayList(matchEntryBuilder.build()));
+
+ return new PacketInMessageBuilder()
+ .setVersion(EncodeConstants.OF_VERSION_1_0)
+ .setData(PACKET_DATA.getBytes())
+ .setReason(PacketInReason.OFPRACTION)
+ .setMatch(matchBuilder.build())
+ .setVersion(EncodeConstants.OF_VERSION_1_3)
+ .setCookie(Uint64.ZERO)
+ .setTableId(new TableId(TABLE_ID))
+ .build();
}
@Test
- public void testGetPortNoFromDeviceState() throws Exception {
- Long portNo = NodeConnectorRefToPortTranslator.getPortNoFromDeviceState(deviceState);
+ public void testGetPortNoFromPacketIn() {
+ PacketIn packetIn = createPacketIn(PORT_NO);
+ Uint32 portNo = NodeConnectorRefToPortTranslator.getPortNoFromPacketIn(packetIn);
assertEquals(portNo, PORT_NO);
}
@Test
- public void testNodeConnectorConversion() throws Exception {
- // Convert DeviceState to NodeConnectorRef
- NodeConnectorRef ref = NodeConnectorRefToPortTranslator.toNodeConnectorRef(deviceState);
+ public void testNodeConnectorConversion() {
+ // 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
+ Uint32 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, Uint64.ONE));
}
-}
\ No newline at end of file
+}