Bump versions by 0.1.0 for next dev cycle
[unimgr.git] / netvirt / src / test / java / org / opendaylight / unimgr / mef / netvirt / EvcUniListenerTest.java
1 /*
2  * Copyright (c) 2016 Hewlett Packard Enterprise, Co. 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.unimgr.mef.netvirt;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.verify;
14 import static org.mockito.Mockito.spy;
15 import static org.mockito.Mockito.when;
16
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.Collection;
20 import java.util.List;
21 import java.util.concurrent.ExecutionException;
22
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.mockito.Mock;
27 import org.mockito.Mockito;
28 import org.mockito.Spy;
29 import org.mockito.internal.stubbing.answers.Returns;
30 import org.mockito.internal.stubbing.answers.ReturnsArgumentAt;
31 import org.mockito.invocation.InvocationOnMock;
32 import org.mockito.stubbing.Answer;
33 import org.mockito.stubbing.OngoingStubbing;
34 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
35 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
36 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
37 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
38 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
39 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
40 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
41 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
42 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
43 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.CeVlans;
44 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.PhysicalLayers;
45 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.PhysicalLayersBuilder;
46 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.Links;
47 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.LinksBuilder;
48 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.Link;
49 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.LinkBuilder;
50 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni;
51 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.UniBuilder;
52 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.EvcUniCeVlans;
53 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.EvcUniCeVlansBuilder;
54 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.evc.uni.ce.vlans.EvcUniCeVlan;
55 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.evc.uni.ce.vlans.EvcUniCeVlanBuilder;
56 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
57 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.VlanIdType;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
61 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
62 import org.powermock.core.classloader.annotations.PrepareForTest;
63 import org.powermock.modules.junit4.PowerMockRunner;
64
65 import com.google.common.base.Optional;
66 import com.google.common.util.concurrent.CheckedFuture;
67
68 import scala.collection.TraversableOnce.OnceCanBuildFrom;
69
70 @RunWith(PowerMockRunner.class)
71 @PrepareForTest({ LogicalDatastoreType.class, EvcUniListener.class })
72 public class EvcUniListenerTest {
73
74     @Mock
75     private DataBroker dataBroker;
76     @Mock
77     private WriteTransaction transaction;
78     private EvcUniListener uniListener;
79
80     @Before
81     public void setUp() {
82         dataBroker = mock(DataBroker.class);
83         uniListener = new EvcUniListener(dataBroker);
84     }
85
86     @SuppressWarnings("unchecked")
87     @Test
88     public void testUniAdded() throws Exception {
89         String uniId = "MMPOP1-ce0-Slot0-Port1";
90         String deviceName = "ce0";
91         String interfaceName = "GigabitEthernet-0-1";
92         Uni uni = evcUni(uniId, deviceName, interfaceName);
93
94         prepareWriteTransaction();
95
96         Collection<DataTreeModification<Uni>> collection = new ArrayList();
97         collection.add(TestHelper.getUni(null, uni, ModificationType.WRITE));
98
99         prepareReadTransaction(uniId, deviceName, interfaceName);
100
101         uniListener.onDataTreeChanged(collection);              
102
103         Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, interfaceName));
104
105         verifyWriteInterface(trunkInterface);
106     }
107
108     @SuppressWarnings("unchecked")
109     @Test
110     public void testUniWithVlansAdded() throws Exception {
111         String uniId = "MMPOP1-ce0-Slot1-Port1";
112         String deviceName = "ce0";
113         String interfaceName = "GigabitEthernet-1-1";
114         Uni uni = evcUni(uniId, deviceName, interfaceName, 3, 4);
115         prepareWriteTransaction();
116         prepareReadTransaction(uniId, deviceName, interfaceName);
117
118         Collection<DataTreeModification<Uni>> collection = new ArrayList();
119         collection.add(TestHelper.getUni(null, uni, ModificationType.WRITE));
120         uniListener.onDataTreeChanged(collection);
121
122         Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, interfaceName));
123         verifyWriteInterface(trunkInterface);
124         Interface vlan3Interface = NetvirtUtils.createTrunkMemberInterface(uniId + ".3", uniId, 3);
125         verifyWriteInterface(vlan3Interface);
126         Interface vlan4Interface = NetvirtUtils.createTrunkMemberInterface(uniId + ".4", uniId, 4);
127         verifyWriteInterface(vlan4Interface);
128     }
129
130     @SuppressWarnings("unchecked")
131     @Test
132     public void testUniRemoved() throws Exception {
133         String uniId = "MMPOP1-ce0-Slot0-Port1";
134         String deviceName = "ce0";
135         String interfaceName = "GigabitEthernet-0-1";
136         Uni uni = evcUni(uniId, deviceName, interfaceName);
137
138         prepareWriteTransaction();
139         prepareReadTransaction(uniId, deviceName, interfaceName);
140
141         Collection<DataTreeModification<Uni>> collection = new ArrayList();
142         collection.add(TestHelper.getUni(uni, null, ModificationType.DELETE));
143
144         uniListener.onDataTreeChanged(collection);
145
146         verifyDeleteInterface(uniId);
147     }
148
149     @SuppressWarnings("unchecked")
150     @Test
151     public void testUniWithVlansRemoved() throws Exception {
152         String uniId = "MMPOP1-ce0-Slot1-Port1";
153         String deviceName = "ce0";
154         String interfaceName = "GigabitEthernet-1-1";
155         Uni uni = evcUni(uniId, deviceName, interfaceName, 3, 4);
156         prepareWriteTransaction();
157         prepareReadTransaction(uniId, deviceName, interfaceName);
158
159         Collection<DataTreeModification<Uni>> collection = new ArrayList();
160         collection.add(TestHelper.getUni(uni, null, ModificationType.DELETE));
161
162         uniListener.onDataTreeChanged(collection);
163
164         verifyDeleteInterface(uniId);
165         verifyDeleteInterface(uniId + ".3");
166         verifyDeleteInterface(uniId + ".4");
167     }
168
169     @SuppressWarnings("unchecked")
170     @Test
171     public void testUniInterfaceUpdated() throws Exception {
172         String uniId = "MMPOP1-ce0-Slot0-Port1";
173         String deviceName = "ce0";
174         String origInterfaceName = "GigabitEthernet-0-1";
175         String updatedInterfaceName = "GigabitEthernet-1-1";
176         Uni origUni = evcUni(uniId, deviceName, origInterfaceName);
177         Uni updatedUni = evcUni(uniId, deviceName, updatedInterfaceName);
178         prepareWriteTransaction();
179         prepareReadTransaction(uniId, deviceName, origInterfaceName, updatedInterfaceName);
180
181         Collection<DataTreeModification<Uni>> collection = new ArrayList();
182         collection.add(TestHelper.getUni(origUni, updatedUni, ModificationType.SUBTREE_MODIFIED));
183
184         uniListener.onDataTreeChanged(collection);
185
186         Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, updatedInterfaceName));
187         verifyWriteInterface(trunkInterface);
188     }
189
190     @SuppressWarnings("unchecked")
191     @Test
192     public void testUniWithVlanInterfaceUpdated() throws Exception {
193         String uniId = "MMPOP1-ce0-Slot0-Port1";
194         String deviceName = "ce0";
195         String origInterfaceName = "GigabitEthernet-0-1";
196         String updatedInterfaceName = "GigabitEthernet-1-1";
197         Uni origUni = evcUni(uniId, deviceName, origInterfaceName, 3, 4);
198         Uni updatedUni = evcUni(uniId, deviceName, updatedInterfaceName, 3, 4);
199         prepareWriteTransaction();
200         prepareReadTransaction(uniId, deviceName, origInterfaceName, updatedInterfaceName);
201
202         Collection<DataTreeModification<Uni>> collection = new ArrayList();
203         collection.add(TestHelper.getUni(origUni, updatedUni, ModificationType.SUBTREE_MODIFIED));
204
205         uniListener.onDataTreeChanged(collection);
206
207         Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, updatedInterfaceName));
208         verifyWriteInterface(trunkInterface);
209     }
210
211     @SuppressWarnings("unchecked")
212     @Test
213     public void testUniVlanUpdated() throws Exception {
214         String uniId = "MMPOP1-ce0-Slot0-Port1";
215         String deviceName = "ce0";
216         String interfaceName = "GigabitEthernet-1-1";
217         Uni origUni = evcUni(uniId, deviceName, interfaceName, 1, 2, 3);
218         Uni updatedUni = evcUni(uniId, deviceName, interfaceName, 2, 3, 4, 5);
219         prepareWriteTransaction();
220         prepareReadTransaction(uniId, deviceName, interfaceName);
221
222         Collection<DataTreeModification<Uni>> collection = new ArrayList();
223         collection.add(TestHelper.getUni(origUni, updatedUni, ModificationType.SUBTREE_MODIFIED));
224
225         uniListener.onDataTreeChanged(collection);
226
227         Interface vlan4Interface = NetvirtUtils.createTrunkMemberInterface(uniId + ".4", uniId, 4);
228         verifyWriteInterface(vlan4Interface);
229         Interface vlan5Interface = NetvirtUtils.createTrunkMemberInterface(uniId + ".5", uniId, 5);
230         verifyWriteInterface(vlan5Interface);
231         verifyDeleteInterface(uniId + ".1");
232
233     }
234
235     private void verifyWriteInterface(Interface iface) {
236         verify(transaction).put(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier(iface.getName()), iface,
237                 true);
238         verify(transaction).submit();
239     }
240
241     private void verifyDeleteInterface(String interfaceName) {
242         verify(transaction).delete(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier(interfaceName));
243         verify(transaction).submit();
244     }
245
246     @SuppressWarnings("unchecked")
247     private void prepareWriteTransaction() {
248         transaction = mock(WriteTransaction.class);
249         when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
250         CheckedFuture<Void, TransactionCommitFailedException> future = mock(CheckedFuture.class);
251         when(transaction.submit()).thenReturn(future);
252     }
253
254     @SuppressWarnings("unchecked")
255     private void prepareReadTransaction(String uniId, String deviceName, String... interfaceNames)
256             throws InterruptedException, ExecutionException {
257
258         ReadOnlyTransaction readTransaction = mock(ReadOnlyTransaction.class);
259         when(dataBroker.newReadOnlyTransaction()).thenReturn(readTransaction);
260
261         CheckedFuture<Optional<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni>, ReadFailedException> future = mock(
262                 CheckedFuture.class);
263
264         OngoingStubbing<Optional<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni>> ongoingStubbing = when(future.get()); 
265         
266         for (String interfaceName : interfaceNames)
267         {
268             ongoingStubbing = ongoingStubbing.thenReturn(Optional.of(uni(uniId, deviceName, interfaceName)));            
269         }        
270
271         when(readTransaction.read(LogicalDatastoreType.CONFIGURATION, MefUtils.getUniInstanceIdentifier(uniId)))
272                 .thenReturn(future);
273     }
274
275     private InstanceIdentifier<Interface> interfaceInstanceIdentifier(String interfaceName) {
276         return InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName))
277                 .build();
278     }
279
280     private org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni uni(
281             String uniId, String deviceName, String interfaceName) {
282         Link link = new LinkBuilder().setDevice(new Identifier45(deviceName)).setInterface(interfaceName).build();
283         Links links = new LinksBuilder().setLink(Arrays.asList(link)).build();
284         PhysicalLayers physicalLayers = new PhysicalLayersBuilder().setLinks(links).build();
285         org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.UniBuilder uniBuilder = new org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.UniBuilder()
286                 .setUniId(new Identifier45(uniId)).setPhysicalLayers(physicalLayers);
287
288         return uniBuilder.build();
289     }
290
291     private Uni evcUni(String uniId, String deviceName, String interfaceName, long... vlans) {
292         UniBuilder uniBuilder = new UniBuilder().setUniId(new Identifier45(uniId));
293
294         if (vlans != null) {
295             List<EvcUniCeVlan> vlanList = new ArrayList<>();
296             for (long vlan : vlans) {
297                 vlanList.add(ceVlan(vlan));
298             }
299             EvcUniCeVlans ceVlans = new EvcUniCeVlansBuilder().setEvcUniCeVlan(vlanList).build();
300             uniBuilder.setEvcUniCeVlans(ceVlans);
301         }
302
303         return uniBuilder.build();
304     }
305
306     private EvcUniCeVlan ceVlan(long vlanId) {
307         return new EvcUniCeVlanBuilder().setVid(new VlanIdType(vlanId)).build();
308     }
309
310     private String getParentIfaceName(String deviceName, String interfaceName) {
311         return deviceName + ":" + interfaceName;
312     }    
313 }