BUG-4826: BGP Evpn RibSupport test 54/37954/1
authorClaudio D. Gasparini <cgaspari@cisco.com>
Fri, 8 Apr 2016 14:22:01 +0000 (16:22 +0200)
committerClaudio D. Gasparini <cgaspari@cisco.com>
Thu, 21 Apr 2016 06:55:57 +0000 (08:55 +0200)
BGP Evpn RibSupport test implementation

Change-Id: Ib91aa24fa0ed74c72a2d7da36f481a5a615ff98d
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
bgp/evpn/src/test/java/org/opendaylight/controller/config/yang/bgp/evpn/EvpnModuleTest.java [new file with mode: 0644]
bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/BGPActivatorTest.java [new file with mode: 0644]
bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupportTest.java [new file with mode: 0644]
bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/RIBActivatorTest.java [new file with mode: 0644]
bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/nlri/EvpnNlriAttributesParserTest.java [new file with mode: 0644]

diff --git a/bgp/evpn/src/test/java/org/opendaylight/controller/config/yang/bgp/evpn/EvpnModuleTest.java b/bgp/evpn/src/test/java/org/opendaylight/controller/config/yang/bgp/evpn/EvpnModuleTest.java
new file mode 100644 (file)
index 0000000..82cdddc
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * 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.controller.config.yang.bgp.evpn;
+
+import com.google.common.collect.Lists;
+import javax.management.ObjectName;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.controller.config.api.jmx.CommitStatus;
+import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
+import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
+import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
+import org.opendaylight.controller.config.yang.bgp.parser.spi.SimpleBGPExtensionProviderContextModuleFactory;
+import org.opendaylight.controller.config.yang.bgp.parser.spi.SimpleBGPExtensionProviderContextModuleTest;
+import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleFactory;
+import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleTest;
+
+public final class EvpnModuleTest extends AbstractConfigTest {
+    private static final String FACTORY_NAME = EvpnModuleFactory.NAME;
+    private static final String INSTANCE_NAME = "bgp-evpn-impl";
+
+    @Before
+    public void setUp() {
+        super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, new EvpnModuleFactory(),
+            new SimpleBGPExtensionProviderContextModuleFactory(), new RIBExtensionsImplModuleFactory()));
+    }
+
+    @Test
+    public void testLSTypeDefaultValue() throws Exception {
+        final CommitStatus status = createEvpnModuleInstance();
+        assertBeanCount(1, FACTORY_NAME);
+        assertStatus(status, 3, 0, 0);
+    }
+
+    @Test
+    public void testCreateBean() throws Exception {
+        final CommitStatus status = createEvpnModuleInstance();
+        assertBeanCount(1, FACTORY_NAME);
+        assertStatus(status, 3, 0, 0);
+    }
+
+    @Test
+    public void testReusingOldInstance() throws Exception {
+        createEvpnModuleInstance();
+        final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        assertBeanCount(1, FACTORY_NAME);
+        final CommitStatus status = transaction.commit();
+        assertBeanCount(1, FACTORY_NAME);
+        assertStatus(status, 0, 0, 3);
+    }
+
+    @Test
+    public void testReconfigureInstance() throws Exception {
+        createEvpnModuleInstance();
+        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        assertBeanCount(1, FACTORY_NAME);
+        CommitStatus status = transaction.commit();
+        assertBeanCount(1, FACTORY_NAME);
+        assertStatus(status, 0, 0, 3);
+    }
+
+    private CommitStatus createEvpnModuleInstance() throws Exception {
+        final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        final ObjectName evpnON = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
+
+        SimpleBGPExtensionProviderContextModuleTest.createBGPExtensionsModuleInstance(transaction, Lists.newArrayList(evpnON));
+        RIBExtensionsImplModuleTest.createRIBExtensionsModuleInstance(transaction, Lists.newArrayList(evpnON));
+        return transaction.commit();
+    }
+
+}
\ No newline at end of file
diff --git a/bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/BGPActivatorTest.java b/bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/BGPActivatorTest.java
new file mode 100644 (file)
index 0000000..339f29b
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * 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.protocol.bgp.evpn.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.pojo.SimpleBGPExtensionProviderContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EvpnSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.L2vpnAddressFamily;
+
+public class BGPActivatorTest {
+    @Test
+    public void testActivator() throws Exception {
+        final BGPActivator act = new BGPActivator();
+        final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext();
+        assertNull(context.getAddressFamilyRegistry().classForFamily(25));
+        assertNull(context.getSubsequentAddressFamilyRegistry().classForFamily(70));
+        act.start(context);
+        assertEquals(L2vpnAddressFamily.class, context.getAddressFamilyRegistry().classForFamily(25));
+        assertEquals(EvpnSubsequentAddressFamily.class, context.getSubsequentAddressFamilyRegistry().classForFamily(70));
+        act.close();
+    }
+}
\ No newline at end of file
diff --git a/bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupportTest.java b/bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupportTest.java
new file mode 100644 (file)
index 0000000..ec12f7f
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * 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.protocol.bgp.evpn.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.opendaylight.protocol.bgp.evpn.impl.EvpnTestUtil.RD_MODEL;
+import static org.opendaylight.protocol.bgp.evpn.impl.EvpnTestUtil.createValueBuilder;
+import static org.opendaylight.protocol.bgp.evpn.impl.nlri.EvpnNlriParserTest.createMACIpAdvChoice;
+import static org.opendaylight.protocol.bgp.evpn.spi.pojo.SimpleEvpnNlriRegistryTest.EVPN_NID;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
+import org.opendaylight.protocol.bgp.evpn.impl.esi.types.ESIActivator;
+import org.opendaylight.protocol.bgp.evpn.impl.nlri.EthADRParserTest;
+import org.opendaylight.protocol.bgp.evpn.impl.nlri.NlriActivator;
+import org.opendaylight.protocol.bgp.parser.BGPParsingException;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EvpnSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.L2vpnAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.evpn.EvpnChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.evpn.destination.EvpnDestination;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Routes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListNodeBuilder;
+
+public class EvpnRibSupportTest {
+
+    private static final NodeIdentifier RD_NID = NodeIdentifier.create(QName.create(EvpnChoice.QNAME, "route-distinguisher").intern());
+    private static final NodeIdentifier ROUTES_NODE_ID = new NodeIdentifier(Routes.QNAME);
+    private static final Ipv4Address ipv4 = new Ipv4Address("42.42.42.42");
+    private static final NodeIdentifier DESTINATION_NID = NodeIdentifier.create(EvpnDestination.QNAME);
+    private final EvpnRibSupport evpnRibSupport = EvpnRibSupport.getInstance();
+    private final List<MapEntryNode> evpnList = new ArrayList<>();
+    private List<YangInstanceIdentifier> routes;
+    @Mock
+    private DOMDataWriteTransaction tx;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        routes = new ArrayList<>();
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public Object answer(final InvocationOnMock invocation) throws Throwable {
+                final Object[] args = invocation.getArguments();
+                EvpnRibSupportTest.this.routes.add((YangInstanceIdentifier) args[1]);
+                return args[1];
+            }
+        }).when(this.tx).put(Mockito.any(LogicalDatastoreType.class), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
+
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public Object answer(final InvocationOnMock invocation) throws Throwable {
+                final Object[] args = invocation.getArguments();
+                EvpnRibSupportTest.this.routes.remove(args[1]);
+                return args[1];
+            }
+        }).when(this.tx).delete(Mockito.any(LogicalDatastoreType.class), Mockito.any(YangInstanceIdentifier.class));
+    }
+
+
+    @Test
+    public void testbuildReach() throws BGPParsingException {
+        final CNextHop hop = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(ipv4).build()).build();
+        final MpReachNlri result = evpnRibSupport.buildReach(evpnList, hop);
+        assertEquals(L2vpnAddressFamily.class, result.getAfi());
+        assertEquals(EvpnSubsequentAddressFamily.class, result.getSafi());
+        assertEquals(new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("42.42.42.42")).build()).build(), result.getCNextHop());
+    }
+
+    @Test
+    public void testBuildUnreach() {
+        final MpUnreachNlri result = evpnRibSupport.buildUnreach(evpnList);
+        assertEquals(L2vpnAddressFamily.class, result.getAfi());
+        assertEquals(EvpnSubsequentAddressFamily.class, result.getSafi());
+    }
+
+    @Test
+    public void testDestRoutesEthADRModel() {
+        ESIActivator.registerEsiTypeParsers(new ArrayList<>());
+        NlriActivator.registerNlriParsers(new ArrayList<>());
+
+        final DataContainerNodeAttrBuilder<NodeIdentifier, UnkeyedListEntryNode> evpnBI = ImmutableUnkeyedListEntryNodeBuilder.create();
+        evpnBI.withNodeIdentifier(EVPN_NID);
+        evpnBI.withChild(EthADRParserTest.createEthADRModel());
+        evpnBI.withChild(createValueBuilder(RD_MODEL, RD_NID).build());
+
+        final UnkeyedListNode routes = ImmutableUnkeyedListNodeBuilder.create().withNodeIdentifier(DESTINATION_NID).addChild(evpnBI.build()).build();
+        final ContainerNode destination = ImmutableContainerNodeBuilder.create().addChild(routes).withNodeIdentifier(DESTINATION_NID).build();
+        final ContainerNode attributes = ImmutableContainerNodeBuilder.create().withNodeIdentifier(new NodeIdentifier(Attributes.QNAME)).build();
+
+        final YangInstanceIdentifier yangIdentifier = YangInstanceIdentifier.of(Routes.QNAME);
+        evpnRibSupport.putDestinationRoutes(tx, yangIdentifier, destination, attributes, ROUTES_NODE_ID);
+        Assert.assertEquals(1, this.routes.size());
+
+        evpnRibSupport.deleteDestinationRoutes(tx, yangIdentifier, destination, ROUTES_NODE_ID);
+        Assert.assertEquals(0, this.routes.size());
+    }
+
+    @Test
+    public void testDestRoutesMacIp() {
+        ESIActivator.registerEsiTypeParsers(new ArrayList<>());
+        NlriActivator.registerNlriParsers(new ArrayList<>());
+
+        final DataContainerNodeAttrBuilder<NodeIdentifier, UnkeyedListEntryNode> evpnBI = ImmutableUnkeyedListEntryNodeBuilder.create();
+        evpnBI.withNodeIdentifier(EVPN_NID);
+        evpnBI.withChild(createMACIpAdvChoice());
+        evpnBI.withChild(createValueBuilder(RD_MODEL, RD_NID).build());
+
+        final UnkeyedListNode routes = ImmutableUnkeyedListNodeBuilder.create().withNodeIdentifier(DESTINATION_NID).addChild(evpnBI.build()).build();
+        final ContainerNode destination = ImmutableContainerNodeBuilder.create().addChild(routes).withNodeIdentifier(DESTINATION_NID).build();
+        final ContainerNode attributes = ImmutableContainerNodeBuilder.create().withNodeIdentifier(new NodeIdentifier(Attributes.QNAME)).build();
+
+        final YangInstanceIdentifier yangIdentifier = YangInstanceIdentifier.of(Routes.QNAME);
+        evpnRibSupport.putDestinationRoutes(tx, yangIdentifier, destination, attributes, ROUTES_NODE_ID);
+        Assert.assertEquals(1, this.routes.size());
+
+        evpnRibSupport.deleteDestinationRoutes(tx, yangIdentifier, destination, ROUTES_NODE_ID);
+        Assert.assertEquals(0, this.routes.size());
+    }
+}
\ No newline at end of file
diff --git a/bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/RIBActivatorTest.java b/bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/RIBActivatorTest.java
new file mode 100644 (file)
index 0000000..3e50f56
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * 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.protocol.bgp.evpn.impl;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
+import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EvpnSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.L2vpnAddressFamily;
+
+public class RIBActivatorTest {
+    @Test
+    public void testRIBActivator() {
+        final RIBActivator ribAct = new RIBActivator();
+        final RIBExtensionProviderContext context = new SimpleRIBExtensionProviderContext();
+        assertNull(context.getRIBSupport(L2vpnAddressFamily.class, EvpnSubsequentAddressFamily.class));
+        ribAct.startRIBExtensionProvider(context);
+        assertNotNull(context.getRIBSupport(L2vpnAddressFamily.class, EvpnSubsequentAddressFamily.class));
+        ribAct.close();
+    }
+}
\ No newline at end of file
diff --git a/bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/nlri/EvpnNlriAttributesParserTest.java b/bgp/evpn/src/test/java/org/opendaylight/protocol/bgp/evpn/impl/nlri/EvpnNlriAttributesParserTest.java
new file mode 100644 (file)
index 0000000..75ca899
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * 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.protocol.bgp.evpn.impl.nlri;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.opendaylight.protocol.bgp.evpn.impl.EvpnTestUtil.RD;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import java.util.ArrayList;
+import java.util.Collections;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.protocol.bgp.evpn.impl.esi.types.ESIActivator;
+import org.opendaylight.protocol.bgp.parser.BGPParsingException;
+import org.opendaylight.protocol.util.ByteArray;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.evpn.destination.EvpnDestinationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationEvpnCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.evpn._case.DestinationEvpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.evpn._case.DestinationEvpnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.unreach.nlri.WithdrawnRoutes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
+
+public class EvpnNlriAttributesParserTest {
+    private DestinationEvpn dest;
+    private EvpnNlriParser parser;
+
+    @Before
+    public void setUp() {
+        ESIActivator.registerEsiTypeParsers(new ArrayList<>());
+        NlriActivator.registerNlriParsers(new ArrayList<>());
+        this.dest = new DestinationEvpnBuilder().setEvpnDestination(Collections.singletonList(new EvpnDestinationBuilder()
+            .setRouteDistinguisher(RD).setEvpnChoice(IncMultEthTagRParserTest.createIncMultiCase()).build())).build();
+        this.parser = new EvpnNlriParser();
+    }
+
+    @Test
+    public void testAttributes1() throws BGPParsingException {
+        final ByteBuf buffer = Unpooled.buffer();
+        final Attributes att = new AttributesBuilder().addAugmentation(Attributes1.class,
+            new Attributes1Builder().setMpReachNlri(createReach()).build()).build();
+        this.parser.serializeAttribute(att, buffer);
+        assertArrayEquals(IncMultEthTagRParserTest.RESULT, ByteArray.getAllBytes(buffer));
+    }
+
+    private MpReachNlri createReach() {
+        final MpReachNlriBuilder mpReachExpected = new MpReachNlriBuilder();
+        final AdvertizedRoutes wd = new AdvertizedRoutesBuilder().setDestinationType(new DestinationEvpnCaseBuilder()
+            .setDestinationEvpn(this.dest).build()).build();
+        return mpReachExpected.setAdvertizedRoutes(wd).build();
+    }
+
+    @Test
+    public void testAttributes2() throws BGPParsingException {
+        final ByteBuf buffer = Unpooled.buffer();
+        final Attributes att = new AttributesBuilder().addAugmentation(Attributes2.class,
+            new Attributes2Builder().setMpUnreachNlri(createUnreach()).build()).build();
+        this.parser.serializeAttribute(att, buffer);
+        assertArrayEquals(IncMultEthTagRParserTest.RESULT, ByteArray.getAllBytes(buffer));
+    }
+
+    private MpUnreachNlri createUnreach() {
+        final MpUnreachNlriBuilder mpReachExpected = new MpUnreachNlriBuilder();
+        final WithdrawnRoutes wd = new WithdrawnRoutesBuilder().setDestinationType(new DestinationEvpnCaseBuilder()
+            .setDestinationEvpn(this.dest).build()).build();
+        return mpReachExpected.setWithdrawnRoutes(wd).build();
+    }
+
+}