59ae824069b44a1a83d8c0fc7504291ac6093e35
[bgpcep.git] / bgp / concepts / src / test / java / org / opendaylight / bgp / concepts / NextHopUtilTest.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.bgp.concepts;
9
10 import static org.junit.Assert.assertArrayEquals;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNull;
13 import static org.junit.Assert.fail;
14
15 import io.netty.buffer.ByteBuf;
16 import io.netty.buffer.Unpooled;
17 import java.lang.reflect.Constructor;
18 import java.lang.reflect.InvocationTargetException;
19 import org.junit.Test;
20 import org.opendaylight.protocol.util.ByteArray;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCase;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
28 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;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
30 import org.opendaylight.yangtools.yang.binding.DataContainer;
31
32 public class NextHopUtilTest {
33
34     private static final byte[] ipv4B = { 42, 42, 42, 42 };
35     private static final byte[] ipv6B = { 0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
36     private static final byte[] ipv6lB = { 0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
37         1, (byte) 0xfe, (byte) 0x80, 0, 0, 0, 0, 0, 0, (byte) 0xc0, 1, 0x0b, (byte) 0xff, (byte) 0xfe, 0x7e, 0, 0 };
38
39     private static final Ipv4Address ipv4 = new Ipv4Address("42.42.42.42");
40     private static final Ipv6Address ipv6 = new Ipv6Address("2001:db8::1");
41     private static final Ipv6Address ipv6l = new Ipv6Address("fe80::c001:bff:fe7e:0");
42
43     @Test
44     public void testSerializeNextHop() {
45         CNextHop hop = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(ipv4).build()).build();
46         final ByteBuf buffer = Unpooled.buffer();
47         NextHopUtil.serializeNextHop(hop, buffer);
48         assertArrayEquals(ipv4B, ByteArray.readAllBytes(buffer));
49
50         hop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setGlobal(ipv6).build()).build();
51         buffer.clear();
52         NextHopUtil.serializeNextHop(hop, buffer);
53         assertArrayEquals(ipv6B, ByteArray.readAllBytes(buffer));
54
55         hop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setGlobal(ipv6).setLinkLocal(ipv6l).build()).build();
56         buffer.clear();
57         NextHopUtil.serializeNextHop(hop, buffer);
58         assertArrayEquals(ipv6lB, ByteArray.readAllBytes(buffer));
59
60         buffer.clear();
61         NextHopUtil.serializeNextHop(new CNextHop() {
62
63             @Override
64             public Class<? extends DataContainer> getImplementedInterface() {
65                 return null;
66             }
67         }, buffer);
68         assertEquals(0, buffer.readableBytes());
69
70         hop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setLinkLocal(ipv6l).build()).build();
71         buffer.clear();
72         try {
73             NextHopUtil.serializeNextHop(hop, buffer);
74             fail("Exception should happen");
75         } catch (final IllegalArgumentException e) {
76             assertEquals("Ipv6 Next Hop is missing Global address.", e.getMessage());
77         }
78     }
79
80     @Test
81     public void testParseNextHop() {
82         CNextHop hop = null;
83         try {
84             hop = NextHopUtil.parseNextHop(Unpooled.wrappedBuffer(ipv4B));
85         } catch (final IllegalArgumentException e) {
86             fail("This exception should not happen");
87         }
88         assertEquals(ipv4, ((Ipv4NextHopCase) hop).getIpv4NextHop().getGlobal());
89
90         try {
91             hop = NextHopUtil.parseNextHop(Unpooled.wrappedBuffer(ipv6B));
92         } catch (final IllegalArgumentException e) {
93             fail("This exception should not happen");
94         }
95         assertEquals(ipv6, ((Ipv6NextHopCase) hop).getIpv6NextHop().getGlobal());
96         assertNull(((Ipv6NextHopCase) hop).getIpv6NextHop().getLinkLocal());
97
98         try {
99             hop = NextHopUtil.parseNextHop(Unpooled.wrappedBuffer(ipv6lB));
100         } catch (final IllegalArgumentException e) {
101             fail("This exception should not happen");
102         }
103         assertEquals(ipv6, ((Ipv6NextHopCase) hop).getIpv6NextHop().getGlobal());
104         assertEquals(ipv6l, ((Ipv6NextHopCase) hop).getIpv6NextHop().getLinkLocal());
105
106         final byte[] wrong = new byte[] { (byte) 0x20, (byte) 0x01, (byte) 0x0d };
107         try {
108             NextHopUtil.parseNextHop(Unpooled.wrappedBuffer(wrong));
109             fail("Exception should happen");
110         } catch (final IllegalArgumentException e) {
111             assertEquals("Cannot parse NEXT_HOP attribute. Wrong bytes length: 3", e.getMessage());
112         }
113     }
114
115     @Test(expected=UnsupportedOperationException.class)
116     public void testPrivateConstructor() throws Throwable {
117         final Constructor<NextHopUtil> c = NextHopUtil.class.getDeclaredConstructor();
118         c.setAccessible(true);
119         try {
120             c.newInstance();
121         } catch (InvocationTargetException e) {
122             throw e.getCause();
123         }
124     }
125 }