HONEYCOMB-37: Add unit test for Vxlan tunnel state customizer
authorMaros Marsalek <[email protected]>
Wed, 11 May 2016 12:29:27 +0000 (14:29 +0200)
committerMaros Marsalek <[email protected]>
Fri, 13 May 2016 06:59:38 +0000 (06:59 +0000)
Change-Id: I8a3499233c2d200b0bb0c1e2534ea1dfdbb5f12c
Signed-off-by: Maros Marsalek <[email protected]>
v3po/api/src/main/yang/v3po.yang
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/VxlanCustomizer.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/VxlanCustomizerTest.java [new file with mode: 0644]
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/v3po/translate/v3po/test/RootReaderCustomizerTest.java

index ca335aa..7746d1a 100644 (file)
@@ -344,7 +344,6 @@ module v3po {
         type inet:ip-address;
       }
 
-
       leaf vni {
         type uint32;
       }
index 2034a03..6244a20 100644 (file)
@@ -91,12 +91,15 @@ public class VxlanCustomizer extends FutureJVppCustomizer implements ChildWriter
         try {
             deleteVxlanTunnel(id.firstKeyOf(Interface.class).getName(), dataBefore);
         } catch (VppApiInvocationException e) {
-            LOG.warn("Delete of Vxlan failed", e);
+            LOG.warn("Delete of Vxlan tunnel failed", e);
             throw new WriteFailedException.DeleteFailedException(id, e);
         }
     }
 
     private void createVxlanTunnel(final String swIfName, final Vxlan vxlan) throws VppApiInvocationException {
+        // TODO check that the type of interface is vxlan-tunnel (it is expressed in YANG, but not validated on DataTree level)
+        // DO the same for other interface aguments/types
+
         final byte isIpv6 = (byte) (isIpv6(vxlan) ? 1 : 0);
         final InetAddress srcAddress = InetAddresses.forString(getAddressString(vxlan.getSrc()));
         final InetAddress dstAddress = InetAddresses.forString(getAddressString(vxlan.getDst()));
diff --git a/v3po/v3po2vpp/src/test/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/VxlanCustomizerTest.java b/v3po/v3po2vpp/src/test/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/VxlanCustomizerTest.java
new file mode 100644 (file)
index 0000000..760e85b
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.v3po.translate.v3po.interfacesstate;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import com.google.common.collect.Lists;
+import io.fd.honeycomb.v3po.translate.Context;
+import io.fd.honeycomb.v3po.translate.spi.read.RootReaderCustomizer;
+import io.fd.honeycomb.v3po.translate.v3po.test.ChildReaderCustomizerTest;
+import io.fd.honeycomb.v3po.translate.v3po.util.NamingContext;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import org.junit.Test;
+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.rev150105.VppInterfaceStateAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Vxlan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.openvpp.jvpp.dto.SwInterfaceDetails;
+import org.openvpp.jvpp.dto.VxlanTunnelDetails;
+import org.openvpp.jvpp.dto.VxlanTunnelDetailsReplyDump;
+import org.openvpp.jvpp.dto.VxlanTunnelDump;
+
+public class VxlanCustomizerTest extends ChildReaderCustomizerTest<Vxlan, VxlanBuilder> {
+
+    private NamingContext interfacesContext;
+    private Context ctx;
+    static final InstanceIdentifier<Vxlan> IID =
+        InstanceIdentifier.create(InterfacesState.class).child(Interface.class, new InterfaceKey("ifc1"))
+            .augmentation(VppInterfaceStateAugmentation.class).child(Vxlan.class);
+
+    public VxlanCustomizerTest() {
+        super(Vxlan.class);
+    }
+
+    @Override
+    public void setUpBefore() {
+        interfacesContext = new NamingContext("vxlan-tunnel");
+        interfacesContext.addName(0, "ifc1");
+
+        ctx = new Context();
+        final SwInterfaceDetails v = new SwInterfaceDetails();
+        v.interfaceName = "vxlan-tunnel4".getBytes();
+        final Map<Integer, SwInterfaceDetails> map = new HashMap<>();
+        map.put(0, v);
+        ctx.put(InterfaceCustomizer.DUMPED_IFCS_CONTEXT_KEY, map);
+    }
+
+    @Override
+    protected void setUpAfter() throws UnknownHostException {
+        final CompletableFuture<VxlanTunnelDetailsReplyDump> vxlanTunnelDetailsReplyDumpCompletionStage =
+            new CompletableFuture<>();
+
+        final VxlanTunnelDetailsReplyDump value = new VxlanTunnelDetailsReplyDump();
+        final VxlanTunnelDetails vxlanTunnelDetails = new VxlanTunnelDetails();
+        vxlanTunnelDetails.isIpv6 = 0;
+        vxlanTunnelDetails.decapNextIndex = 1;
+        vxlanTunnelDetails.dstAddress = InetAddress.getByName("1.2.3.4").getAddress();
+        vxlanTunnelDetails.srcAddress = InetAddress.getByName("1.2.3.5").getAddress();
+        vxlanTunnelDetails.encapVrfId = 55;
+        vxlanTunnelDetails.swIfIndex = 0;
+        vxlanTunnelDetails.vni = 9;
+
+        value.vxlanTunnelDetails = Lists.newArrayList(vxlanTunnelDetails);
+        vxlanTunnelDetailsReplyDumpCompletionStage.complete(value);
+
+        doReturn(vxlanTunnelDetailsReplyDumpCompletionStage).when(api).vxlanTunnelDump(any(VxlanTunnelDump.class));
+    }
+
+    @Test
+    public void testReadCurrentAttributes() throws Exception {
+        final VxlanBuilder builder = getCustomizer().getBuilder(IID);
+        getCustomizer().readCurrentAttributes(IID, builder, ctx);
+
+        assertEquals(9, builder.getVni().intValue());
+        assertEquals(55, builder.getEncapVrfId().intValue());
+
+        assertNull(builder.getSrc().getIpv6Address());
+        assertNotNull(builder.getSrc().getIpv4Address());
+        assertEquals("1.2.3.5", builder.getSrc().getIpv4Address().getValue());
+
+        assertNull(builder.getDst().getIpv6Address());
+        assertNotNull(builder.getDst().getIpv4Address());
+        assertEquals("1.2.3.4", builder.getDst().getIpv4Address().getValue());
+
+        verify(api).vxlanTunnelDump(any(VxlanTunnelDump.class));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testReadCurrentAttributesVppNameNotCached() throws Exception {
+        InterfaceCustomizer.getCachedInterfaceDump(ctx).remove(0);
+
+        final VxlanBuilder builder = getCustomizer().getBuilder(IID);
+        getCustomizer().readCurrentAttributes(IID, builder, ctx);
+    }
+
+    @Test
+    public void testReadCurrentAttributesWrongType() throws Exception {
+        final SwInterfaceDetails v = new SwInterfaceDetails();
+        v.interfaceName = "tap-2".getBytes();
+        InterfaceCustomizer.getCachedInterfaceDump(ctx).put(0, v);
+
+        final VxlanBuilder builder = getCustomizer().getBuilder(IID);
+        getCustomizer().readCurrentAttributes(IID, builder, ctx);
+
+        // Should be ignored
+        verifyZeroInteractions(api);
+    }
+
+    @Override
+    protected RootReaderCustomizer<Vxlan, VxlanBuilder> initCustomizer() {
+        return new VxlanCustomizer(api, interfacesContext);
+    }
+}
\ No newline at end of file
index 76eb0fb..19d307e 100644 (file)
@@ -67,7 +67,7 @@ public abstract class RootReaderCustomizerTest<D extends DataObject, B extends B
     /**
      * Optional setup for subclasses. Invoked after customizer is initialized.
      */
-    protected void setUpAfter() {
+    protected void setUpAfter() throws Exception {
 
     }