Fix NPE in InterfaceDataTranslator.isInterfaceOfType 67/13167/2
authorMarek Gradzki <[email protected]>
Thu, 21 Jun 2018 06:39:59 +0000 (08:39 +0200)
committerMarek Gradzki <[email protected]>
Thu, 21 Jun 2018 06:55:18 +0000 (08:55 +0200)
SwInterfaceDetails returned by dump manager are nullable.
In that case isInterfaceOfType should return false.

Change-Id: Iaf3d1f6c6923ed6863357fe2470716f135b6164f
Signed-off-by: Marek Gradzki <[email protected]>
v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfacesstate/InterfaceDataTranslator.java
v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/interfacesstate/InterfaceDataTranslatorTest.java

index 9f788af..75554d4 100644 (file)
@@ -29,6 +29,7 @@ import java.math.BigInteger;
 import java.util.Objects;
 import java.util.stream.Collector;
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.EthernetCsmacd;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -177,9 +178,13 @@ public interface InterfaceDataTranslator extends ByteDataTranslator, JvppReplyCo
         return isInterfaceOfType(ifcType, vppInterfaceDetails);
     }
 
-    default boolean isInterfaceOfType(final Class<? extends InterfaceType> ifcType,
-                                      final SwInterfaceDetails cachedDetails) {
-        return ifcType.equals(getInterfaceType(toString(cachedDetails.interfaceName)));
+    default boolean isInterfaceOfType(@Nonnull final Class<? extends InterfaceType> ifcType,
+                                      @Nullable final SwInterfaceDetails cachedDetails) {
+        if (cachedDetails == null) {
+            return false;
+        } else {
+            return ifcType.equals(getInterfaceType(toString(cachedDetails.interfaceName)));
+        }
     }
 
     /**
index 9a96974..5595ebb 100644 (file)
 package io.fd.hc2vpp.v3po.interfacesstate;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
+import io.fd.hc2vpp.v3po.interfacesstate.cache.InterfaceCacheDumpManager;
+import io.fd.honeycomb.translate.read.ReadContext;
+import io.fd.honeycomb.translate.read.ReadFailedException;
+import io.fd.vpp.jvpp.core.dto.SwInterfaceDetails;
+import java.nio.charset.StandardCharsets;
 import org.junit.Test;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.EthernetCsmacd;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.Tap;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VhostUser;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VxlanGpeTunnel;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VxlanTunnel;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class InterfaceDataTranslatorTest implements InterfaceDataTranslator {
 
     @Test
     public void testVppPhysAddrToYang() throws Exception {
-        assertEquals("01:02:03:04:05:06", vppPhysAddrToYang(new byte[]{1, 2, 3, 4, 5, 6}));
+        assertEquals("01:02:03:04:05:06", vppPhysAddrToYang(new byte[] {1, 2, 3, 4, 5, 6}));
         // Extended (64-bit) MAC addresses are currently not supported (it might require yang model update),
         // so test if extended part is ignored
-        assertEquals("0a:0b:0c:0d:0e:0f", vppPhysAddrToYang(new byte[]{0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0, 0}));
+        assertEquals("0a:0b:0c:0d:0e:0f", vppPhysAddrToYang(new byte[] {0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0, 0}));
     }
 
     @Test(expected = NullPointerException.class)
@@ -42,7 +55,7 @@ public class InterfaceDataTranslatorTest implements InterfaceDataTranslator {
 
     @Test(expected = IllegalArgumentException.class)
     public void testVppPhysAddrToYangInvalidByteArrayLength() throws Exception {
-        vppPhysAddrToYang(new byte[]{1, 2, 3, 4, 5});
+        vppPhysAddrToYang(new byte[] {1, 2, 3, 4, 5});
     }
 
     @Test
@@ -54,4 +67,35 @@ public class InterfaceDataTranslatorTest implements InterfaceDataTranslator {
         assertEquals(EthernetCsmacd.class, getInterfaceType("eth0.0"));
         assertEquals(EthernetCsmacd.class, getInterfaceType("local0"));
     }
+
+    @Test
+    public void testIsInterfaceOfType() {
+        assertTrue(isInterfaceOfType(Tap.class, interfaceDetails("tap0")));
+        assertTrue(isInterfaceOfType(VxlanTunnel.class, interfaceDetails("vxlan0")));
+        assertTrue(isInterfaceOfType(VxlanGpeTunnel.class, interfaceDetails("vxlan_gpe0")));
+        assertTrue(isInterfaceOfType(VhostUser.class, interfaceDetails("VirtualEthernet0/0/0")));
+        assertTrue(isInterfaceOfType(EthernetCsmacd.class, interfaceDetails("eth0.0")));
+        assertTrue(isInterfaceOfType(EthernetCsmacd.class, interfaceDetails("local0")));
+    }
+
+    @Test
+    public void testIsInterfaceOfTypeMissingIfc() throws ReadFailedException {
+        final InterfaceCacheDumpManager dumpManager = mock(InterfaceCacheDumpManager.class);
+        final ReadContext ctx = mock(ReadContext.class);
+        final String ifcName = "tapThatDoesNotExists";
+        final InstanceIdentifier<Interface> id =
+            InstanceIdentifier.create(InterfacesState.class).child(Interface.class, new InterfaceKey(ifcName));
+
+        when(dumpManager.getInterfaceDetail(id, ctx, ifcName)).thenReturn(null);
+
+        assertFalse(isInterfaceOfType(dumpManager, id, ctx, Tap.class));
+    }
+
+    private SwInterfaceDetails interfaceDetails(final String interfaceName) {
+        final SwInterfaceDetails details = new SwInterfaceDetails();
+        details.interfaceName = interfaceName.getBytes(StandardCharsets.UTF_8);
+        return details;
+    }
+
+
 }
\ No newline at end of file