1 package io.fd.honeycomb.translate.v3po.interfaces.pbb;
3 import static org.junit.Assert.assertArrayEquals;
4 import static org.junit.Assert.assertEquals;
5 import static org.junit.Assert.assertNotNull;
6 import static org.junit.Assert.assertTrue;
7 import static org.junit.Assert.fail;
8 import static org.mockito.Matchers.any;
9 import static org.mockito.Mockito.times;
10 import static org.mockito.Mockito.verify;
11 import static org.mockito.Mockito.when;
13 import io.fd.honeycomb.translate.vpp.util.NamingContext;
14 import io.fd.honeycomb.translate.write.WriteFailedException;
15 import io.fd.honeycomb.vpp.test.write.WriterCustomizerTest;
16 import io.fd.vpp.jvpp.VppCallbackException;
17 import io.fd.vpp.jvpp.core.dto.L2InterfacePbbTagRewrite;
18 import io.fd.vpp.jvpp.core.dto.L2InterfacePbbTagRewriteReply;
19 import org.junit.Test;
20 import org.mockito.ArgumentCaptor;
21 import org.mockito.Captor;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pbb.types.rev161214.Operation;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.pbb.rev161214.PbbRewriteInterfaceAugmentation;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.pbb.rev161214.interfaces._interface.PbbRewrite;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.pbb.rev161214.interfaces._interface.PbbRewriteBuilder;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 public class PbbRewriteCustomizerTest extends WriterCustomizerTest {
35 private ArgumentCaptor<L2InterfacePbbTagRewrite> rewriteArgumentCaptor;
37 private NamingContext interfaceContext;
38 private PbbRewriteCustomizer customizer;
39 private InstanceIdentifier<PbbRewrite> validId;
40 private InstanceIdentifier<PbbRewrite> invalidId;
43 protected void setUp() throws Exception {
44 interfaceContext = new NamingContext("interface", "interface-context");
45 customizer = new PbbRewriteCustomizer(api, interfaceContext);
47 defineMapping(mappingContext, "pbb-interface", 1, "interface-context");
48 validId = InstanceIdentifier.create(Interfaces.class)
49 .child(Interface.class, new InterfaceKey("pbb-interface"))
50 .augmentation(PbbRewriteInterfaceAugmentation.class)
51 .child(PbbRewrite.class);
53 invalidId = InstanceIdentifier.create(PbbRewrite.class);
57 public void testWrite() throws WriteFailedException {
58 whenRewriteThenSuccess();
59 customizer.writeCurrentAttributes(validId, validData(), writeContext);
60 verifyRewriteRequest(desiredSetResult());
64 public void testWriteFailedCallFailed() {
65 whenRewriteThenFail();
66 final PbbRewrite validData = validData();
68 customizer.writeCurrentAttributes(validId, validData, writeContext);
69 } catch (Exception e) {
70 assertTrue(e instanceof WriteFailedException.CreateFailedException);
71 assertTrue(e.getCause() instanceof VppCallbackException);
73 final WriteFailedException.CreateFailedException ex = ((WriteFailedException.CreateFailedException) e);
74 assertEquals(validId, ex.getFailedId());
75 assertEquals(validData, ex.getData());
79 fail("Test should have failed");
83 public void testWriteFailedInvalidData() {
84 verifyInvalidWriteDataCombination(invalidDataNoDestination());
85 verifyInvalidWriteDataCombination(invalidDataNoSource());
86 verifyInvalidWriteDataCombination(invalidDataNoItag());
87 verifyInvalidWriteDataCombination(invalidDataNoOperation());
88 verifyInvalidWriteDataCombination(invalidDataNoVlan());
92 public void testUpdate() throws WriteFailedException {
93 whenRewriteThenSuccess();
94 final PbbRewrite rewrite = validData();
95 customizer.updateCurrentAttributes(validId, rewrite, rewrite, writeContext);
96 verifyRewriteRequest(desiredSetResult());
100 public void testUpdateFailedCallFailed() {
101 whenRewriteThenFail();
102 final PbbRewrite invalidData = invalidDataNoVlan();
103 final PbbRewrite validData = validData();
105 customizer.updateCurrentAttributes(validId, invalidData, validData, writeContext);
106 } catch (Exception e) {
107 assertTrue(e instanceof WriteFailedException.UpdateFailedException);
108 assertTrue(e.getCause() instanceof VppCallbackException);
110 final WriteFailedException.UpdateFailedException ex = ((WriteFailedException.UpdateFailedException) e);
111 assertEquals(validId, ex.getFailedId());
112 assertEquals(invalidData, ex.getDataBefore());
113 assertEquals(validData, ex.getDataAfter());
117 fail("Test should have failed");
121 public void testUpdateFailedInvalidData() {
122 verifyInvalidUpdateDataCombination(invalidDataNoDestination());
123 verifyInvalidUpdateDataCombination(invalidDataNoSource());
124 verifyInvalidUpdateDataCombination(invalidDataNoItag());
125 verifyInvalidUpdateDataCombination(invalidDataNoOperation());
126 verifyInvalidUpdateDataCombination(invalidDataNoVlan());
130 public void testDelete() throws WriteFailedException {
131 whenRewriteThenSuccess();
132 customizer.deleteCurrentAttributes(validId, validData(), writeContext);
133 verifyRewriteRequest(desiredDisableResult());
137 public void testDeleteFailedCallFailed() {
138 whenRewriteThenFail();
139 final PbbRewrite validData = validData();
141 customizer.deleteCurrentAttributes(validId, validData, writeContext);
142 } catch (Exception e) {
143 assertTrue(e instanceof WriteFailedException.DeleteFailedException);
144 assertTrue(e.getCause() instanceof VppCallbackException);
145 assertEquals(validId, ((WriteFailedException.DeleteFailedException) e).getFailedId());
149 fail("Test should have failed");
153 public void testDeleteFailedInvalidData() {
154 verifyInvalidDeleteDataCombination(invalidDataNoDestination());
155 verifyInvalidDeleteDataCombination(invalidDataNoSource());
156 verifyInvalidDeleteDataCombination(invalidDataNoItag());
157 verifyInvalidDeleteDataCombination(invalidDataNoOperation());
158 verifyInvalidDeleteDataCombination(invalidDataNoVlan());
161 private void whenRewriteThenSuccess() {
162 when(api.l2InterfacePbbTagRewrite(any())).thenReturn(future(new L2InterfacePbbTagRewriteReply()));
165 private void whenRewriteThenFail() {
166 when(api.l2InterfacePbbTagRewrite(any())).thenReturn(failedFuture());
169 private void verifyInvalidWriteDataCombination(final PbbRewrite invalidData) {
171 customizer.writeCurrentAttributes(validId, invalidData, writeContext);
172 } catch (Exception e) {
173 assertTrue(e instanceof NullPointerException);
177 fail("Verifying of invalid combination failed");
180 private void verifyInvalidUpdateDataCombination(final PbbRewrite invalidData) {
182 customizer.updateCurrentAttributes(validId, validData(), invalidData, writeContext);
183 } catch (Exception e) {
184 assertTrue(e instanceof NullPointerException);
188 fail("Verifying of invalid combination failed");
192 private void verifyInvalidDeleteDataCombination(final PbbRewrite invalidData) {
194 customizer.deleteCurrentAttributes(validId, invalidData, writeContext);
195 } catch (Exception e) {
196 assertTrue(e instanceof NullPointerException);
200 fail("Verifying of invalid combination failed");
204 private L2InterfacePbbTagRewrite desiredSetResult() {
205 final L2InterfacePbbTagRewrite desiredResult = new L2InterfacePbbTagRewrite();
206 desiredResult.swIfIndex = 1;
207 desiredResult.vtrOp = Operation.Pop2.getIntValue();
208 desiredResult.bDmac = new byte[]{-69, -69, -69, -69, -69, -69};
209 desiredResult.bSmac = new byte[]{-86, -86, -86, -86, -86, -86};
210 desiredResult.bVlanid = 1;
211 desiredResult.iSid = 2;
213 return desiredResult;
216 private L2InterfacePbbTagRewrite desiredDisableResult() {
217 final L2InterfacePbbTagRewrite desiredResult = new L2InterfacePbbTagRewrite();
218 desiredResult.swIfIndex = 1;
219 desiredResult.vtrOp = 0;
220 desiredResult.bDmac = new byte[]{-69, -69, -69, -69, -69, -69};
221 desiredResult.bSmac = new byte[]{-86, -86, -86, -86, -86, -86};
222 desiredResult.bVlanid = 1;
223 desiredResult.iSid = 2;
225 return desiredResult;
228 private void verifyRewriteRequest(final L2InterfacePbbTagRewrite desiredResult) {
229 verify(api, times(1)).l2InterfacePbbTagRewrite(rewriteArgumentCaptor.capture());
231 final L2InterfacePbbTagRewrite actualRequest = rewriteArgumentCaptor.getValue();
233 assertNotNull(actualRequest);
234 assertEquals(actualRequest.bVlanid, desiredResult.bVlanid);
235 assertEquals(actualRequest.iSid, desiredResult.iSid);
236 assertEquals(actualRequest.vtrOp, desiredResult.vtrOp);
237 assertEquals(actualRequest.outerTag, desiredResult.outerTag);
238 assertArrayEquals(actualRequest.bDmac, desiredResult.bDmac);
239 assertArrayEquals(actualRequest.bSmac, desiredResult.bSmac);
242 private PbbRewrite invalidDataNoDestination() {
243 return new PbbRewriteBuilder()
244 .setBVlanTagVlanId(1)
246 .setSourceAddress(new MacAddress("aa:aa:aa:aa:aa:aa"))
247 .setInterfaceOperation(Operation.Pop2)
251 private PbbRewrite invalidDataNoSource() {
252 return new PbbRewriteBuilder()
253 .setBVlanTagVlanId(1)
255 .setDestinationAddress(new MacAddress("bb:bb:bb:bb:bb:bb"))
256 .setInterfaceOperation(Operation.Pop2)
260 private PbbRewrite invalidDataNoItag() {
261 return new PbbRewriteBuilder()
262 .setBVlanTagVlanId(1)
263 .setSourceAddress(new MacAddress("aa:aa:aa:aa:aa:aa"))
264 .setDestinationAddress(new MacAddress("bb:bb:bb:bb:bb:bb"))
265 .setInterfaceOperation(Operation.Pop2)
269 private PbbRewrite invalidDataNoVlan() {
270 return new PbbRewriteBuilder()
272 .setSourceAddress(new MacAddress("aa:aa:aa:aa:aa:aa"))
273 .setDestinationAddress(new MacAddress("bb:bb:bb:bb:bb:bb"))
274 .setInterfaceOperation(Operation.Pop2)
278 private PbbRewrite invalidDataNoOperation() {
279 return new PbbRewriteBuilder()
281 .setSourceAddress(new MacAddress("aa:aa:aa:aa:aa:aa"))
282 .setDestinationAddress(new MacAddress("bb:bb:bb:bb:bb:bb"))
283 .setInterfaceOperation(Operation.Pop2)
287 private PbbRewrite validData() {
288 return new PbbRewriteBuilder()
289 .setBVlanTagVlanId(1)
291 .setSourceAddress(new MacAddress("aa:aa:aa:aa:aa:aa"))
292 .setDestinationAddress(new MacAddress("bb:bb:bb:bb:bb:bb"))
293 .setInterfaceOperation(Operation.Pop2)