Bug 8228 - metadata service fix made cleaner
[groupbasedpolicy.git] / renderers / vpp / src / test / java / org / opendaylight / groupbasedpolicy / renderer / vpp / listener / VppEndpointListenerTest.java
1 /*
2  * Copyright (c) 2016 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
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.listener;
10
11 import java.util.Arrays;
12 import java.util.Collection;
13
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.mockito.ArgumentCaptor;
18 import org.mockito.Mockito;
19 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
20 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.VppEndpointConfEvent;
23 import org.opendaylight.groupbasedpolicy.test.CustomDataBrokerTest;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint_location_provider.rev160419.LocationProviders;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.AddressType;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ContextType;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.Forwarding;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointBuilder;
32 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
33 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
34
35 import com.google.common.base.Optional;
36 import com.google.common.eventbus.EventBus;
37
38 public class VppEndpointListenerTest extends CustomDataBrokerTest {
39
40     private final static String ADDRESS = "1.1.1.1/32";
41     private final static ContextId CONTEXT_ID = new ContextId("ctx1");
42     private final static String IFACE_NAME = "ifaceName";
43
44     private DataBroker dataBroker;
45     private VppEndpointListener listener;
46     private EventBus eventBusMock;
47
48     @Override
49     public Collection<Class<?>> getClassesFromModules() {
50         return Arrays.asList(Node.class, VppEndpoint.class, Forwarding.class, LocationProviders.class);
51     }
52
53     @Before
54     public void init() {
55         dataBroker = getDataBroker();
56         eventBusMock = Mockito.mock(EventBus.class);
57         listener = new VppEndpointListener(dataBroker, eventBusMock);
58     }
59
60     @Test
61     public void testOnWrite() throws Exception {
62         ArgumentCaptor<VppEndpointConfEvent> argVppEpEvent = ArgumentCaptor.forClass(VppEndpointConfEvent.class);
63         VppEndpoint vppEndpoint = new VppEndpointBuilder().setAddress(ADDRESS)
64             .setAddressType(AddressType.class)
65             .setContextId(CONTEXT_ID)
66             .setContextType(ContextType.class)
67             .build();
68         InstanceIdentifier<VppEndpoint> vppEpIid =
69                 InstanceIdentifier.builder(Config.class).child(VppEndpoint.class, vppEndpoint.getKey()).build();
70         WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
71         wTx.put(LogicalDatastoreType.CONFIGURATION, vppEpIid, vppEndpoint);
72         wTx.submit().get();
73
74         Mockito.verify(eventBusMock).post(argVppEpEvent.capture());
75         VppEndpointConfEvent capturedVppEpEvent = argVppEpEvent.getValue();
76         Assert.assertEquals(vppEpIid, capturedVppEpEvent.getIid());
77         assertEqualsOptional(null, capturedVppEpEvent.getBefore());
78         assertEqualsOptional(vppEndpoint, capturedVppEpEvent.getAfter());
79     }
80
81     @Test
82     public void testOnDelete() throws Exception {
83         ArgumentCaptor<VppEndpointConfEvent> argVppEpEvent = ArgumentCaptor.forClass(VppEndpointConfEvent.class);
84         VppEndpoint vppEndpoint = new VppEndpointBuilder().setAddress(ADDRESS)
85             .setAddressType(AddressType.class)
86             .setContextId(CONTEXT_ID)
87             .setContextType(ContextType.class)
88             .build();
89         InstanceIdentifier<VppEndpoint> vppEpIid =
90                 InstanceIdentifier.builder(Config.class).child(VppEndpoint.class, vppEndpoint.getKey()).build();
91         WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
92         wTx.put(LogicalDatastoreType.CONFIGURATION, vppEpIid, vppEndpoint);
93         wTx.submit().get();
94         wTx = getDataBroker().newWriteOnlyTransaction();
95         wTx.delete(LogicalDatastoreType.CONFIGURATION, vppEpIid);
96         wTx.submit().get();
97
98         Mockito.verify(eventBusMock, Mockito.times(2)).post(argVppEpEvent.capture());
99         VppEndpointConfEvent capturedVppEpEvent = argVppEpEvent.getAllValues().get(1);
100         Assert.assertEquals(vppEpIid, capturedVppEpEvent.getIid());
101         assertEqualsOptional(vppEndpoint, capturedVppEpEvent.getBefore());
102         assertEqualsOptional(null, capturedVppEpEvent.getAfter());
103     }
104
105     @Test
106     public void testOnSubtreeModified() throws Exception {
107         ArgumentCaptor<VppEndpointConfEvent> argVppEpEvent = ArgumentCaptor.forClass(VppEndpointConfEvent.class);
108         VppEndpointBuilder vppEndpointBuilder = new VppEndpointBuilder().setAddress(ADDRESS)
109             .setAddressType(AddressType.class)
110             .setContextId(CONTEXT_ID)
111             .setContextType(ContextType.class);
112         VppEndpoint vppEndpoint = vppEndpointBuilder.build();
113         InstanceIdentifier<VppEndpoint> vppEpIid =
114                 InstanceIdentifier.builder(Config.class).child(VppEndpoint.class, vppEndpoint.getKey()).build();
115         WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
116         wTx.put(LogicalDatastoreType.CONFIGURATION, vppEpIid, vppEndpoint);
117         wTx.submit().get();
118         VppEndpoint modifiedVppEndpoint = vppEndpointBuilder.setVppInterfaceName(IFACE_NAME).build();
119         wTx = getDataBroker().newWriteOnlyTransaction();
120         wTx.put(LogicalDatastoreType.CONFIGURATION, vppEpIid, modifiedVppEndpoint);
121         wTx.submit().get();
122
123         Mockito.verify(eventBusMock, Mockito.times(2)).post(argVppEpEvent.capture());
124         VppEndpointConfEvent capturedFirstVppEpEvent = argVppEpEvent.getAllValues().get(0);
125         Assert.assertEquals(vppEpIid, capturedFirstVppEpEvent.getIid());
126         assertEqualsOptional(null, capturedFirstVppEpEvent.getBefore());
127         assertEqualsOptional(vppEndpoint, capturedFirstVppEpEvent.getAfter());
128         VppEndpointConfEvent capturedSecondVppEpEvent = argVppEpEvent.getAllValues().get(1);
129         Assert.assertEquals(vppEpIid, capturedSecondVppEpEvent.getIid());
130         assertEqualsOptional(vppEndpoint, capturedSecondVppEpEvent.getBefore());
131         assertEqualsOptional(modifiedVppEndpoint, capturedSecondVppEpEvent.getAfter());
132     }
133
134     private <T> void assertEqualsOptional(T expected, Optional<T> actual) {
135         if (expected == null) {
136             Assert.assertFalse(actual.isPresent());
137         } else {
138             Assert.assertTrue(actual.isPresent());
139             Assert.assertEquals(expected, actual.get());
140         }
141     }
142
143 }