Use ByteBuf.readRetainedSlice()
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / util / NodeConnectorRefToPortTranslatorTest.java
index 008486a73593e0e7cd511f9feb9f80f212db19f4..a750fa738519814501a96bf4b0685ce17637d46b 100644 (file)
+/*
+ * 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
+}