2 * Copyright (c) 2016 Cisco and/or its affiliates.
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:
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package io.fd.honeycomb.lisp.translate.write;
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;
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;
67 public class AdjacencyCustomizerTest extends WriterCustomizerTest implements EidMappingContextHelper {
70 private ArgumentCaptor<LispAddDelAdjacency> requestCaptor;
72 private EidMappingContext localMappingContext;
74 private EidMappingContext remoteMappingContext;
77 private AdjacenciesMappingContext adjacenciesMappingContext;
79 private AdjacencyCustomizer customizer;
81 private InstanceIdentifier<Adjacency> emptyId;
82 private InstanceIdentifier<Adjacency> validId;
84 private Adjacency emptyData;
85 private Adjacency invalidData;
86 private Adjacency validData;
90 localMappingContext = new EidMappingContext("local-mapping-context");
91 remoteMappingContext = new EidMappingContext("remote-mapping-context");
92 customizer = new AdjacencyCustomizer(api, localMappingContext, remoteMappingContext, adjacenciesMappingContext);
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"));
103 emptyData = new AdjacencyBuilder().build();
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())
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();
129 when(api.lispAddDelAdjacency(any())).thenReturn(future(new LispAddDelAdjacencyReply()));
133 public void writeCurrentAttributesNoKey() throws Exception {
135 customizer.writeCurrentAttributes(emptyId, emptyData, writeContext);
136 } catch (NullPointerException e) {
137 verify(api, times(0)).lispAddDelAdjacency(any());
141 fail("Test should have failed while reading parent vni table id");
145 public void writeCurrentAttributesInvalidCombination() throws Exception {
147 customizer.writeCurrentAttributes(emptyId, invalidData, writeContext);
148 } catch (NullPointerException e) {
149 verify(api, times(0)).lispAddDelAdjacency(any());
153 fail("Test should have failed while reading parent vni table id");
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);
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");
174 customizer.writeCurrentAttributes(validId, validData, writeContext);
175 } catch (IllegalStateException e) {
176 verify(api, times(0)).lispAddDelAdjacency(any());
180 fail("Test should have failed while verifying local eid");
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");
189 customizer.writeCurrentAttributes(validId, validData, writeContext);
190 } catch (IllegalStateException e) {
191 verify(api, times(0)).lispAddDelAdjacency(any());
195 fail("Test should have failed while verifying remote eid");
198 @Test(expected = UnsupportedOperationException.class)
199 public void updateCurrentAttributes() throws Exception {
200 customizer.updateCurrentAttributes(emptyId, emptyData, emptyData, writeContext);
204 public void deleteCurrentAttributesNoKey() throws Exception {
206 customizer.deleteCurrentAttributes(emptyId, emptyData, writeContext);
207 } catch (NullPointerException e) {
208 verify(api, times(0)).lispAddDelAdjacency(any());
212 fail("Test should have failed while reading parent vni table id");
215 @Test(expected = IllegalArgumentException.class)
216 public void deleteCurrentAttributesInvalidCombination() throws Exception {
217 customizer.deleteCurrentAttributes(validId, invalidData, writeContext);
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);
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,
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);