2 * Copyright (c) 2016 Hewlett Packard Enterprise, Co. and others. All rights reserved.
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
9 package org.opendaylight.unimgr.mef.netvirt;
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;
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;
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;
65 import com.google.common.base.Optional;
66 import com.google.common.util.concurrent.CheckedFuture;
68 import scala.collection.TraversableOnce.OnceCanBuildFrom;
70 @RunWith(PowerMockRunner.class)
71 @PrepareForTest({ LogicalDatastoreType.class, EvcUniListener.class })
72 public class EvcUniListenerTest {
75 private DataBroker dataBroker;
77 private WriteTransaction transaction;
78 private EvcUniListener uniListener;
82 dataBroker = mock(DataBroker.class);
83 uniListener = new EvcUniListener(dataBroker);
86 @SuppressWarnings("unchecked")
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);
94 prepareWriteTransaction();
96 Collection<DataTreeModification<Uni>> collection = new ArrayList();
97 collection.add(TestHelper.getUni(null, uni, ModificationType.WRITE));
99 prepareReadTransaction(uniId, deviceName, interfaceName);
101 uniListener.onDataTreeChanged(collection);
103 Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, interfaceName));
105 verifyWriteInterface(trunkInterface);
108 @SuppressWarnings("unchecked")
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);
118 Collection<DataTreeModification<Uni>> collection = new ArrayList();
119 collection.add(TestHelper.getUni(null, uni, ModificationType.WRITE));
120 uniListener.onDataTreeChanged(collection);
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);
130 @SuppressWarnings("unchecked")
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);
138 prepareWriteTransaction();
139 prepareReadTransaction(uniId, deviceName, interfaceName);
141 Collection<DataTreeModification<Uni>> collection = new ArrayList();
142 collection.add(TestHelper.getUni(uni, null, ModificationType.DELETE));
144 uniListener.onDataTreeChanged(collection);
146 verifyDeleteInterface(uniId);
149 @SuppressWarnings("unchecked")
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);
159 Collection<DataTreeModification<Uni>> collection = new ArrayList();
160 collection.add(TestHelper.getUni(uni, null, ModificationType.DELETE));
162 uniListener.onDataTreeChanged(collection);
164 verifyDeleteInterface(uniId);
165 verifyDeleteInterface(uniId + ".3");
166 verifyDeleteInterface(uniId + ".4");
169 @SuppressWarnings("unchecked")
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);
181 Collection<DataTreeModification<Uni>> collection = new ArrayList();
182 collection.add(TestHelper.getUni(origUni, updatedUni, ModificationType.SUBTREE_MODIFIED));
184 uniListener.onDataTreeChanged(collection);
186 Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, updatedInterfaceName));
187 verifyWriteInterface(trunkInterface);
190 @SuppressWarnings("unchecked")
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);
202 Collection<DataTreeModification<Uni>> collection = new ArrayList();
203 collection.add(TestHelper.getUni(origUni, updatedUni, ModificationType.SUBTREE_MODIFIED));
205 uniListener.onDataTreeChanged(collection);
207 Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, updatedInterfaceName));
208 verifyWriteInterface(trunkInterface);
211 @SuppressWarnings("unchecked")
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);
222 Collection<DataTreeModification<Uni>> collection = new ArrayList();
223 collection.add(TestHelper.getUni(origUni, updatedUni, ModificationType.SUBTREE_MODIFIED));
225 uniListener.onDataTreeChanged(collection);
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");
235 private void verifyWriteInterface(Interface iface) {
236 verify(transaction).put(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier(iface.getName()), iface,
238 verify(transaction).submit();
241 private void verifyDeleteInterface(String interfaceName) {
242 verify(transaction).delete(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier(interfaceName));
243 verify(transaction).submit();
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);
254 @SuppressWarnings("unchecked")
255 private void prepareReadTransaction(String uniId, String deviceName, String... interfaceNames)
256 throws InterruptedException, ExecutionException {
258 ReadOnlyTransaction readTransaction = mock(ReadOnlyTransaction.class);
259 when(dataBroker.newReadOnlyTransaction()).thenReturn(readTransaction);
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);
264 OngoingStubbing<Optional<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni>> ongoingStubbing = when(future.get());
266 for (String interfaceName : interfaceNames)
268 ongoingStubbing = ongoingStubbing.thenReturn(Optional.of(uni(uniId, deviceName, interfaceName)));
271 when(readTransaction.read(LogicalDatastoreType.CONFIGURATION, MefUtils.getUniInstanceIdentifier(uniId)))
275 private InstanceIdentifier<Interface> interfaceInstanceIdentifier(String interfaceName) {
276 return InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName))
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);
288 return uniBuilder.build();
291 private Uni evcUni(String uniId, String deviceName, String interfaceName, long... vlans) {
292 UniBuilder uniBuilder = new UniBuilder().setUniId(new Identifier45(uniId));
295 List<EvcUniCeVlan> vlanList = new ArrayList<>();
296 for (long vlan : vlans) {
297 vlanList.add(ceVlan(vlan));
299 EvcUniCeVlans ceVlans = new EvcUniCeVlansBuilder().setEvcUniCeVlan(vlanList).build();
300 uniBuilder.setEvcUniCeVlans(ceVlans);
303 return uniBuilder.build();
306 private EvcUniCeVlan ceVlan(long vlanId) {
307 return new EvcUniCeVlanBuilder().setVid(new VlanIdType(vlanId)).build();
310 private String getParentIfaceName(String deviceName, String interfaceName) {
311 return deviceName + ":" + interfaceName;