0b2536b85cf0f4e57f6bc1592e4dee9aa278bcd5
[honeycomb.git] / lisp / lisp2vpp / src / test / java / io / fd / honeycomb / lisp / translate / write / AdjacencyCustomizerTest.java
1 /*
2  * Copyright (c) 2016 Cisco and/or its affiliates.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package io.fd.honeycomb.lisp.translate.write;
18
19 import static io.fd.honeycomb.lisp.translate.AdjacencyData.ADDRESS_ONE;
20 import static io.fd.honeycomb.lisp.translate.AdjacencyData.ADDRESS_THREE;
21 import static io.fd.honeycomb.lisp.translate.AdjacencyData.LOCAL_EID_ONE;
22 import static io.fd.honeycomb.lisp.translate.AdjacencyData.REMOTE_EID_ONE;
23 import static io.fd.honeycomb.lisp.translate.read.dump.executor.params.MappingsDumpParams.EidType.IPV4;
24 import static org.junit.Assert.assertArrayEquals;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.fail;
28 import static org.mockito.Matchers.any;
29 import static org.mockito.Mockito.times;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when;
32
33 import io.fd.honeycomb.lisp.context.util.AdjacenciesMappingContext;
34 import io.fd.honeycomb.lisp.context.util.EidMappingContext;
35 import io.fd.honeycomb.lisp.util.EidMappingContextHelper;
36 import io.fd.honeycomb.vpp.test.write.WriterCustomizerTest;
37 import io.fd.vpp.jvpp.core.dto.LispAddDelAdjacency;
38 import io.fd.vpp.jvpp.core.dto.LispAddDelAdjacencyReply;
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.mockito.ArgumentCaptor;
42 import org.mockito.Captor;
43 import org.mockito.Mock;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.MappingId;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.Adjacencies;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.Adjacency;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.AdjacencyBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.AdjacencyKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.adjacency.LocalEidBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.adjacency.RemoteEidBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.RemoteMappings;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.remote.mappings.RemoteMapping;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.remote.mappings.RemoteMappingKey;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.EidTable;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.VniTable;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.VniTableKey;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.vni.table.BridgeDomainSubtable;
65 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
66
67 public class AdjacencyCustomizerTest extends WriterCustomizerTest implements EidMappingContextHelper {
68
69     @Captor
70     private ArgumentCaptor<LispAddDelAdjacency> requestCaptor;
71
72     private EidMappingContext localMappingContext;
73
74     private EidMappingContext remoteMappingContext;
75
76     @Mock
77     private AdjacenciesMappingContext adjacenciesMappingContext;
78
79     private AdjacencyCustomizer customizer;
80
81     private InstanceIdentifier<Adjacency> emptyId;
82     private InstanceIdentifier<Adjacency> validId;
83
84     private Adjacency emptyData;
85     private Adjacency invalidData;
86     private Adjacency validData;
87
88     @Before
89     public void init() {
90         localMappingContext = new EidMappingContext("local-mapping-context");
91         remoteMappingContext = new EidMappingContext("remote-mapping-context");
92         customizer = new AdjacencyCustomizer(api, localMappingContext, remoteMappingContext, adjacenciesMappingContext);
93
94         emptyId = InstanceIdentifier.create(Adjacency.class);
95         validId = InstanceIdentifier.create(EidTable.class)
96                 .child(VniTable.class, new VniTableKey(2L))
97                 .child(BridgeDomainSubtable.class)
98                 .child(RemoteMappings.class)
99                 .child(RemoteMapping.class, new RemoteMappingKey(new MappingId("remote-mapping")))
100                 .child(Adjacencies.class)
101                 .child(Adjacency.class, new AdjacencyKey("adj-one"));
102
103         emptyData = new AdjacencyBuilder().build();
104
105         invalidData = new AdjacencyBuilder().setId("ID").setLocalEid(
106                 new LocalEidBuilder()
107                         .setVirtualNetworkId(new InstanceIdType(12L))
108                         .setAddressType(Ipv4Afi.class)
109                         .setAddress(new Ipv4Builder().setIpv4(new Ipv4Address("192.168.2.1")).build())
110                         .build()).setRemoteEid(
111                 new RemoteEidBuilder()
112                         .setVirtualNetworkId(new InstanceIdType(12L))
113                         .setAddressType(MacAfi.class)
114                         .setAddress(new MacBuilder().setMac(new MacAddress("aa:aa:aa:aa:aa:aa")).build())
115                         .build())
116                 .build();
117
118         validData = new AdjacencyBuilder().setId("ID").setLocalEid(
119                 new LocalEidBuilder()
120                         .setVirtualNetworkId(new InstanceIdType(12L))
121                         .setAddressType(Ipv4Afi.class)
122                         .setAddress(new Ipv4Builder().setIpv4(ADDRESS_ONE).build())
123                         .build()).setRemoteEid(
124                 new RemoteEidBuilder()
125                         .setVirtualNetworkId(new InstanceIdType(12L))
126                         .setAddressType(Ipv4Afi.class)
127                         .setAddress(new Ipv4Builder().setIpv4(ADDRESS_THREE).build()).build()).build();
128
129         when(api.lispAddDelAdjacency(any())).thenReturn(future(new LispAddDelAdjacencyReply()));
130     }
131
132     @Test
133     public void writeCurrentAttributesNoKey() throws Exception {
134         try {
135             customizer.writeCurrentAttributes(emptyId, emptyData, writeContext);
136         } catch (NullPointerException e) {
137             verify(api, times(0)).lispAddDelAdjacency(any());
138             return;
139         }
140
141         fail("Test should have failed while reading parent vni table id");
142     }
143
144     @Test
145     public void writeCurrentAttributesInvalidCombination() throws Exception {
146         try {
147             customizer.writeCurrentAttributes(emptyId, invalidData, writeContext);
148         } catch (NullPointerException e) {
149             verify(api, times(0)).lispAddDelAdjacency(any());
150             return;
151         }
152
153         fail("Test should have failed while reading parent vni table id");
154     }
155
156
157     @Test
158     public void writeCurrentAttributes() throws Exception {
159         defineEidMapping(mappingContext, LOCAL_EID_ONE, new MappingId("local-eid-one"), "local-mapping-context");
160         defineEidMapping(mappingContext, REMOTE_EID_ONE, new MappingId("remote-eid-one"), "remote-mapping-context");
161         customizer.writeCurrentAttributes(validId, validData, writeContext);
162         verify(api, times(1)).lispAddDelAdjacency(requestCaptor.capture());
163         verifyRequest(requestCaptor.getValue(), 1, new byte[]{-64, -88, 2, 1}, 32, new byte[]{-64, -88, 2, 3},
164                 32, IPV4.getValue(), 2);
165         verify(adjacenciesMappingContext, times(1))
166                 .addEidPair("adj-one", "local-eid-one", "remote-eid-one", mappingContext);
167     }
168
169     @Test
170     public void writeCurrentAttributesNonExistingLocalMapping() throws Exception {
171         noEidMappingDefined(mappingContext, "local-eid-one", "local-mapping-context");
172         defineEidMapping(mappingContext, REMOTE_EID_ONE, new MappingId("remote-eid-one"), "remote-mapping-context");
173         try {
174             customizer.writeCurrentAttributes(validId, validData, writeContext);
175         } catch (IllegalStateException e) {
176             verify(api, times(0)).lispAddDelAdjacency(any());
177             return;
178         }
179
180         fail("Test should have failed while verifying local eid");
181     }
182
183     @Test
184     public void writeCurrentAttributesNonExistingRemoteMapping() throws Exception {
185         noEidMappingDefined(mappingContext, "remote-eid-one", "remote-mapping-context");
186         defineEidMapping(mappingContext, LOCAL_EID_ONE, new MappingId("local-eid-one"), "local-mapping-context");
187
188         try {
189             customizer.writeCurrentAttributes(validId, validData, writeContext);
190         } catch (IllegalStateException e) {
191             verify(api, times(0)).lispAddDelAdjacency(any());
192             return;
193         }
194
195         fail("Test should have failed while verifying remote eid");
196     }
197
198     @Test(expected = UnsupportedOperationException.class)
199     public void updateCurrentAttributes() throws Exception {
200         customizer.updateCurrentAttributes(emptyId, emptyData, emptyData, writeContext);
201     }
202
203     @Test
204     public void deleteCurrentAttributesNoKey() throws Exception {
205         try {
206             customizer.deleteCurrentAttributes(emptyId, emptyData, writeContext);
207         } catch (NullPointerException e) {
208             verify(api, times(0)).lispAddDelAdjacency(any());
209             return;
210         }
211
212         fail("Test should have failed while reading parent vni table id");
213     }
214
215     @Test(expected = IllegalArgumentException.class)
216     public void deleteCurrentAttributesInvalidCombination() throws Exception {
217         customizer.deleteCurrentAttributes(validId, invalidData, writeContext);
218     }
219
220     @Test
221     public void deleteCurrentAttributes() throws Exception {
222         customizer.deleteCurrentAttributes(validId, validData, writeContext);
223         verify(api, times(1)).lispAddDelAdjacency(requestCaptor.capture());
224         verifyRequest(requestCaptor.getValue(), 0, new byte[]{-64, -88, 2, 1}, 32, new byte[]{-64, -88, 2, 3},
225                 32, IPV4.getValue(), 2);
226         verify(adjacenciesMappingContext, times(1)).removeForIndex("adj-one", mappingContext);
227     }
228
229     private static void verifyRequest(final LispAddDelAdjacency request, final int isAdd, final byte[] leid,
230                                       final int leidLen, final byte[] reid, final int reidLen, final int eidType,
231                                       final int vni) {
232
233         assertNotNull(request);
234         assertEquals(isAdd, request.isAdd);
235         assertArrayEquals(leid, request.leid);
236         assertEquals(leidLen, request.leidLen);
237         assertArrayEquals(reid, request.reid);
238         assertEquals(reidLen, request.reidLen);
239         assertEquals(eidType, request.eidType);
240         assertEquals(vni, request.vni);
241
242     }
243 }