Merge "Bug 4988: OF statistics & REST client"
[groupbasedpolicy.git] / renderers / ofoverlay / src / test / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / endpoint / EndpointManagerTest.java
1 /*
2  * Copyright (c) 2015 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.ofoverlay.endpoint;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.never;
14 import static org.mockito.Mockito.spy;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verify;
17 import static org.mockito.Mockito.when;
18
19 import java.lang.reflect.Method;
20 import java.util.Collection;
21 import java.util.Collections;
22 import java.util.HashSet;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Set;
26 import java.util.UUID;
27 import java.util.concurrent.ScheduledExecutorService;
28
29 import org.junit.Assert;
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
33 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
34 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
35 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
36 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
37 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
38 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
39 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
40 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
41 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
42 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
43 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
44 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
45 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
46 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
47 import org.opendaylight.groupbasedpolicy.dto.EgKey;
48 import org.opendaylight.groupbasedpolicy.dto.EpKey;
49 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.EndpointListener;
50 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointKey;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Key;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Prefix;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddress;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayL3Context;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ForwardingContext;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomain;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
74 import org.opendaylight.yangtools.concepts.ListenerRegistration;
75 import org.opendaylight.yangtools.yang.binding.DataObject;
76 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
77 import org.opendaylight.yangtools.yang.binding.RpcService;
78
79 import com.google.common.base.Optional;
80 import com.google.common.util.concurrent.CheckedFuture;
81
82 public class EndpointManagerTest {
83
84     private EndpointManager manager;
85     private DataBroker dataProvider;
86     private RpcProviderRegistry rpcRegistry;
87     private NotificationService notificationService;
88     private ScheduledExecutorService executor;
89     private SwitchManager switchManager;
90     private ListenerRegistration<DataChangeListener> listenerReg;
91     private EndpointListener endpointListener;
92     private Endpoint endpoint1;
93     private Endpoint endpoint2;
94     private TenantId tenantId;
95     private EndpointGroupId endpointGroupId;
96     private L2BridgeDomainId l2BridgeDomainId;
97     private OfOverlayContext context1;
98     private OfOverlayContext context2;
99     private NodeId nodeId1;
100     private NodeId nodeId2;
101     private EndpointL3 oldL3Ep;
102     private EndpointL3 newL3Ep;
103     private Optional<Endpoints> optionalRead;
104
105     @SuppressWarnings("unchecked")
106     @Before
107     public void initialisation() throws Exception {
108         dataProvider = mock(DataBroker.class);
109         rpcRegistry = mock(RpcProviderRegistry.class);
110         notificationService = mock(NotificationService.class);
111         executor = mock(ScheduledExecutorService.class);
112         switchManager = mock(SwitchManager.class);
113         WriteTransaction writeTransaction = mock(WriteTransaction.class);
114         when(dataProvider.newWriteOnlyTransaction()).thenReturn(writeTransaction);
115         CheckedFuture<Void, TransactionCommitFailedException> checkedFutureWrite = mock(CheckedFuture.class);
116         when(writeTransaction.submit()).thenReturn(checkedFutureWrite);
117         BindingAwareBroker.RpcRegistration<EndpointService> rpcRegistration = mock(BindingAwareBroker.RpcRegistration.class);
118         listenerReg = mock(ListenerRegistration.class);
119         when(dataProvider.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
120                 any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(listenerReg);
121         when(dataProvider.registerDataTreeChangeListener(any(DataTreeIdentifier.class),
122                 any(DataTreeChangeListener.class))).thenReturn(listenerReg);
123
124         when(rpcRegistry.addRpcImplementation(any(Class.class), any(RpcService.class))).thenReturn(rpcRegistration);
125
126         manager = spy(new EndpointManager(dataProvider, rpcRegistry, notificationService, executor, switchManager));
127         endpointListener = mock(EndpointListener.class);
128         manager.registerListener(endpointListener);
129
130         endpoint1 = mock(Endpoint.class);
131         endpoint2 = mock(Endpoint.class);
132         tenantId = mock(TenantId.class);
133         endpointGroupId = mock(EndpointGroupId.class);
134         l2BridgeDomainId = mock(L2BridgeDomainId.class);
135         MacAddress macAddress = new MacAddress("12:34:56:78:9a:bc");
136         when(endpoint1.getTenant()).thenReturn(tenantId);
137         when(endpoint1.getEndpointGroup()).thenReturn(endpointGroupId);
138         when(endpoint1.getL2Context()).thenReturn(l2BridgeDomainId);
139         when(endpoint1.getMacAddress()).thenReturn(macAddress);
140         when(endpoint2.getTenant()).thenReturn(tenantId);
141         when(endpoint2.getEndpointGroup()).thenReturn(endpointGroupId);
142         when(endpoint2.getL2Context()).thenReturn(l2BridgeDomainId);
143         when(endpoint2.getMacAddress()).thenReturn(macAddress);
144         context1 = mock(OfOverlayContext.class);
145         context2 = mock(OfOverlayContext.class);
146         when(endpoint1.getAugmentation(OfOverlayContext.class)).thenReturn(context1);
147         when(endpoint2.getAugmentation(OfOverlayContext.class)).thenReturn(context2);
148         nodeId1 = mock(NodeId.class);
149         nodeId2 = mock(NodeId.class);
150         when(context1.getNodeId()).thenReturn(nodeId1);
151         when(context2.getNodeId()).thenReturn(nodeId2);
152         when(nodeId1.getValue()).thenReturn("nodeValue1");
153         when(nodeId2.getValue()).thenReturn("nodeValue2");
154
155         // onDataChanged
156         AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change = mock(AsyncDataChangeEvent.class);
157         InstanceIdentifier<DataObject> endpointId = mock(InstanceIdentifier.class);
158         Set<InstanceIdentifier<?>> removedPaths = new HashSet<>();
159         removedPaths.add(endpointId);
160         when(change.getRemovedPaths()).thenReturn(removedPaths);
161
162         // updateEndpointL3
163         oldL3Ep = mock(EndpointL3.class);
164         newL3Ep = mock(EndpointL3.class);
165
166         // getEndpointsFromDataStore
167         ReadOnlyTransaction readTransaction = mock(ReadOnlyTransaction.class);
168         when(dataProvider.newReadOnlyTransaction()).thenReturn(readTransaction);
169         CheckedFuture<Optional<Endpoints>, ReadFailedException> checkedFutureRead = mock(CheckedFuture.class);
170         when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
171                 checkedFutureRead);
172         optionalRead = mock(Optional.class);
173         when(checkedFutureRead.checkedGet()).thenReturn(optionalRead);
174         when(optionalRead.isPresent()).thenReturn(false);
175
176     }
177
178     // ***************
179     // EndpointManager
180     // ***************
181
182     @Test
183     public void getGroupsForNodeTest() {
184         Assert.assertTrue(manager.getGroupsForNode(nodeId1).isEmpty());
185         manager.processEndpoint(null, endpoint1);
186         Assert.assertFalse(manager.getGroupsForNode(nodeId1).isEmpty());
187     }
188
189     @Test
190     public void getNodesForGroupTest() {
191         EgKey egKey = mock(EgKey.class);
192         Set<NodeId> nodesForGroup = manager.getNodesForGroup(egKey);
193         Assert.assertNotNull(nodesForGroup);
194         Assert.assertTrue(nodesForGroup.isEmpty());
195     }
196
197     @Test
198     public void getEndpointsForNodeTestNodeIdEgKey() {
199         EgKey egKey = new EgKey(tenantId, endpointGroupId);
200         Assert.assertTrue(manager.getEndpointsForNode(nodeId1, egKey).isEmpty());
201         manager.processEndpoint(null, endpoint1);
202         Assert.assertFalse(manager.getEndpointsForNode(nodeId1, egKey).isEmpty());
203     }
204
205     @Test
206     public void getEndpointsForNodeTestNodeId() {
207         Assert.assertTrue(manager.getEndpointsForNode(nodeId1).isEmpty());
208         manager.processEndpoint(null, endpoint1);
209         Assert.assertFalse(manager.getEndpointsForNode(nodeId1).isEmpty());
210     }
211
212     @Test
213     public void getEndpoint() {
214         EpKey epKey = new EpKey(endpoint1.getL2Context(), endpoint1.getMacAddress());
215         manager.processEndpoint(null, endpoint1);
216         Assert.assertEquals(endpoint1, manager.getEndpoint(epKey));
217     }
218
219     @SuppressWarnings("unchecked")
220     @Test
221     public void getEndpointsL3PrefixForTenantTest() throws Exception {
222         ReadOnlyTransaction readTransaction = mock(ReadOnlyTransaction.class);
223         when(dataProvider.newReadOnlyTransaction()).thenReturn(readTransaction);
224         CheckedFuture<Optional<Endpoints>, ReadFailedException> resultFuture = mock(CheckedFuture.class);
225         when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
226                 resultFuture);
227         Optional<Endpoints> optional = mock(Optional.class);
228         when(resultFuture.checkedGet()).thenReturn(optional);
229         when(optional.isPresent()).thenReturn(true);
230         Endpoints endpoints = mock(Endpoints.class);
231         when(optional.get()).thenReturn(endpoints);
232         EndpointL3Prefix endpointL3Prefix = mock(EndpointL3Prefix.class);
233         when(endpoints.getEndpointL3Prefix()).thenReturn(Collections.singletonList(endpointL3Prefix));
234         when(endpointL3Prefix.getTenant()).thenReturn(tenantId);
235
236         Collection<EndpointL3Prefix> result = manager.getEndpointsL3PrefixForTenant(tenantId);
237         Assert.assertTrue(result.contains(endpointL3Prefix));
238     }
239
240     @SuppressWarnings("unchecked")
241     @Test
242     public void getEndpointsFromDataStoreTest() throws Exception {
243         ReadOnlyTransaction transaction = mock(ReadOnlyTransaction.class);
244         when(dataProvider.newReadOnlyTransaction()).thenReturn(transaction);
245         CheckedFuture<Optional<Endpoints>, ReadFailedException> checkedFuture = mock(CheckedFuture.class);
246         when(transaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(checkedFuture);
247         Optional<Endpoints> optional = mock(Optional.class);
248         when(checkedFuture.checkedGet()).thenReturn(optional);
249         when(optional.isPresent()).thenReturn(false);
250         Assert.assertNull(manager.getEndpointsFromDataStore());
251
252         when(optional.isPresent()).thenReturn(true);
253         Endpoints endpoints = mock(Endpoints.class);
254         when(optional.get()).thenReturn(endpoints);
255         Assert.assertEquals(endpoints, manager.getEndpointsFromDataStore());
256
257         manager = new EndpointManager(null, rpcRegistry, notificationService, executor, switchManager);
258         Assert.assertNull(manager.getEndpointsFromDataStore());
259     }
260
261     @Test
262     public void getL3EndpointsTestEndpointsNull() throws Exception {
263         Assert.assertNull(manager.getL3Endpoints());
264     }
265
266     @Test
267     public void getL3EndpointsTestEndpointL3Null() throws Exception {
268         when(optionalRead.isPresent()).thenReturn(true);
269         Endpoints endpoints = mock(Endpoints.class);
270         when(optionalRead.get()).thenReturn(endpoints);
271         when(endpoints.getEndpointL3()).thenReturn(null);
272
273         Assert.assertNull(manager.getL3Endpoints());
274     }
275
276     @Test
277     public void getL3EndpointsTest() throws Exception {
278         when(optionalRead.isPresent()).thenReturn(true);
279         Endpoints endpoints = mock(Endpoints.class);
280         when(optionalRead.get()).thenReturn(endpoints);
281         List<EndpointL3> endpointL3List = Collections.singletonList(mock(EndpointL3.class));
282         when(endpoints.getEndpointL3()).thenReturn(endpointL3List);
283
284         Assert.assertEquals(endpointL3List, manager.getL3Endpoints());
285     }
286
287     @Test
288     public void getL3EpWithNatByL2KeyTest() {
289         when(optionalRead.isPresent()).thenReturn(true);
290         Endpoints endpoints = mock(Endpoints.class);
291         when(optionalRead.get()).thenReturn(endpoints);
292         EndpointL3 endpointL3 = mock(EndpointL3.class);
293         List<EndpointL3> endpointL3List = Collections.singletonList(endpointL3);
294         when(endpoints.getEndpointL3()).thenReturn(endpointL3List);
295
296         NatAddress overlayL3Nat = mock(NatAddress.class);
297         when(endpointL3.getAugmentation(NatAddress.class)).thenReturn(overlayL3Nat);
298         when(overlayL3Nat.getNatAddress()).thenReturn(mock(IpAddress.class));
299
300         when(endpointL3.getL2Context()).thenReturn(mock(L2BridgeDomainId.class));
301         when(endpointL3.getMacAddress()).thenReturn(mock(MacAddress.class));
302
303         Map<EndpointKey, EndpointL3> result = manager.getL3EpWithNatByL2Key();
304         Assert.assertTrue(result.containsValue(endpointL3));
305     }
306
307     @Test
308     public void getL3EpWithNatByL2KeyTestL3EpsNull() {
309         Map<EndpointKey, EndpointL3> result = manager.getL3EpWithNatByL2Key();
310         Assert.assertTrue(result.isEmpty());
311     }
312
313     @Test
314     public void getL3EpWithNatByL2KeyTestGetMacAddressNull() {
315         when(optionalRead.isPresent()).thenReturn(true);
316         Endpoints endpoints = mock(Endpoints.class);
317         when(optionalRead.get()).thenReturn(endpoints);
318         EndpointL3 endpointL3 = mock(EndpointL3.class);
319         List<EndpointL3> endpointL3List = Collections.singletonList(endpointL3);
320         when(endpoints.getEndpointL3()).thenReturn(endpointL3List);
321
322         NatAddress overlayL3Nat = mock(NatAddress.class);
323         when(endpointL3.getAugmentation(NatAddress.class)).thenReturn(overlayL3Nat);
324
325         when(endpointL3.getL2Context()).thenReturn(mock(L2BridgeDomainId.class));
326         when(endpointL3.getMacAddress()).thenReturn(null);
327
328         Map<EndpointKey, EndpointL3> result = manager.getL3EpWithNatByL2Key();
329         Assert.assertTrue(result.isEmpty());
330     }
331
332     @Test
333     public void getL3EpWithNatByL2KeyTestGetL2ContextNull() {
334         when(optionalRead.isPresent()).thenReturn(true);
335         Endpoints endpoints = mock(Endpoints.class);
336         when(optionalRead.get()).thenReturn(endpoints);
337         EndpointL3 endpointL3 = mock(EndpointL3.class);
338         List<EndpointL3> endpointL3List = Collections.singletonList(endpointL3);
339         when(endpoints.getEndpointL3()).thenReturn(endpointL3List);
340
341         NatAddress overlayL3Nat = mock(NatAddress.class);
342         when(endpointL3.getAugmentation(NatAddress.class)).thenReturn(overlayL3Nat);
343
344         when(endpointL3.getL2Context()).thenReturn(null);
345         when(endpointL3.getMacAddress()).thenReturn(mock(MacAddress.class));
346
347         Map<EndpointKey, EndpointL3> result = manager.getL3EpWithNatByL2Key();
348         Assert.assertTrue(result.isEmpty());
349     }
350
351     @Test
352     public void getEndpointsForGroupTest() {
353         EgKey newEgKey = new EgKey(tenantId, endpointGroupId);
354         Assert.assertTrue(manager.getEndpointsForGroup(newEgKey).isEmpty());
355         manager.processEndpoint(null, endpoint1);
356         Assert.assertFalse(manager.getEndpointsForGroup(newEgKey).isEmpty());
357     }
358
359     @Test
360     public void getConditionsForEndpoint() {
361         Endpoint endpoint = mock(Endpoint.class);
362         when(endpoint.getCondition()).thenReturn(null);
363         Assert.assertTrue(manager.getConditionsForEndpoint(endpoint).isEmpty());
364
365         List<ConditionName> conditionNameList = Collections.singletonList(mock(ConditionName.class));
366         when(endpoint.getCondition()).thenReturn(conditionNameList);
367         Assert.assertEquals(conditionNameList, manager.getConditionsForEndpoint(endpoint));
368     }
369
370     @Test
371     public void updateEndpointL3TestNewL3EpValidExternalTrue() throws Exception {
372         when(newL3Ep.getTenant()).thenReturn(mock(TenantId.class));
373         when(newL3Ep.getEndpointGroup()).thenReturn(mock(EndpointGroupId.class));
374         when(newL3Ep.getL3Context()).thenReturn(mock(L3ContextId.class));
375         when(newL3Ep.getIpAddress()).thenReturn(mock(IpAddress.class));
376
377         OfOverlayL3Context ofOverlayL3Context = mock(OfOverlayL3Context.class);
378         when(newL3Ep.getAugmentation(OfOverlayL3Context.class)).thenReturn(ofOverlayL3Context);
379
380         NetworkDomainId networkDomainId = mock(NetworkDomainId.class);
381         when(newL3Ep.getNetworkContainment()).thenReturn(networkDomainId);
382
383         EndpointL3Key endpointL3Key = mock(EndpointL3Key.class);
384         when(newL3Ep.getKey()).thenReturn(endpointL3Key);
385         IpAddress ipAddress = mock(IpAddress.class);
386         when(endpointL3Key.getIpAddress()).thenReturn(ipAddress);
387         when(newL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
388         manager.processL3Endpoint(null, newL3Ep);
389         verify(endpointListener,never()).endpointUpdated(any(EpKey.class));
390     }
391
392     @Test
393     public void updateEndpointL3TestNewL3EpValidExternalTrueNetworkContainmentNull() throws Exception {
394         when(newL3Ep.getTenant()).thenReturn(mock(TenantId.class));
395         when(newL3Ep.getEndpointGroup()).thenReturn(mock(EndpointGroupId.class));
396         when(newL3Ep.getL3Context()).thenReturn(mock(L3ContextId.class));
397         when(newL3Ep.getIpAddress()).thenReturn(mock(IpAddress.class));
398
399         OfOverlayL3Context ofOverlayL3Context = mock(OfOverlayL3Context.class);
400         when(newL3Ep.getAugmentation(OfOverlayL3Context.class)).thenReturn(ofOverlayL3Context);
401
402         when(newL3Ep.getNetworkContainment()).thenReturn(null);
403
404         EndpointL3Key endpointL3Key = mock(EndpointL3Key.class);
405         when(newL3Ep.getKey()).thenReturn(endpointL3Key);
406         IpAddress ipAddress = mock(IpAddress.class);
407         when(endpointL3Key.getIpAddress()).thenReturn(ipAddress);
408         when(newL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
409         manager.processL3Endpoint(null, newL3Ep);
410         verify(endpointListener,never()).endpointUpdated(any(EpKey.class));
411     }
412
413     @Test
414     public void updateEndpointL3TestNewL3EpValidInternal() throws Exception {
415         when(newL3Ep.getTenant()).thenReturn(mock(TenantId.class));
416         when(newL3Ep.getEndpointGroup()).thenReturn(mock(EndpointGroupId.class));
417         when(newL3Ep.getL3Context()).thenReturn(mock(L3ContextId.class));
418         when(newL3Ep.getIpAddress()).thenReturn(mock(IpAddress.class));
419
420         OfOverlayL3Context ofOverlayL3Context = mock(OfOverlayL3Context.class);
421         when(newL3Ep.getAugmentation(OfOverlayL3Context.class)).thenReturn(ofOverlayL3Context);
422
423         when(newL3Ep.getNetworkContainment()).thenReturn(null);
424
425         when(newL3Ep.getL2Context()).thenReturn(mock(L2BridgeDomainId.class));
426         when(newL3Ep.getMacAddress()).thenReturn(mock(MacAddress.class));
427         when(newL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
428         manager.processL3Endpoint(null, newL3Ep);
429         verify(endpointListener).endpointUpdated(any(EpKey.class));
430     }
431
432     @Test
433     public void updateEndpointL3TestNewL3EpValidFalse() throws Exception {
434         when(newL3Ep.getTenant()).thenReturn(mock(TenantId.class));
435         when(newL3Ep.getEndpointGroup()).thenReturn(mock(EndpointGroupId.class));
436         when(newL3Ep.getL3Context()).thenReturn(mock(L3ContextId.class));
437         when(newL3Ep.getIpAddress()).thenReturn(null);
438         when(newL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
439         manager.processL3Endpoint(null, newL3Ep);
440         verify(endpointListener,never()).endpointUpdated(any(EpKey.class));
441     }
442
443     @Test
444     public void updateEndpointL3TestDelete() throws Exception {
445         when(oldL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
446         manager.processL3Endpoint(oldL3Ep, null);
447         verify(endpointListener).endpointUpdated(any(EpKey.class));
448     }
449
450     @Test
451     public void updateEndpointTestNewEndpointRemove() {
452         Collection<Endpoint> collection;
453         manager.processEndpoint(null, endpoint2);
454         verify(endpointListener).endpointUpdated(any(EpKey.class));
455         verify(endpointListener).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
456         collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
457         Assert.assertFalse(collection.isEmpty());
458
459         manager.processEndpoint(endpoint2, null);
460         verify(endpointListener, times(2)).endpointUpdated(any(EpKey.class));
461         verify(endpointListener, times(2)).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
462         collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
463         Assert.assertTrue(collection.isEmpty());
464     }
465
466     @Test
467     public void updateEndpointTestNewLocNullOldLocNullOfOverlayContextAugmentationNull() {
468         when(endpoint1.getAugmentation(OfOverlayContext.class)).thenReturn(null);
469         when(endpoint2.getAugmentation(OfOverlayContext.class)).thenReturn(null);
470
471         manager.processEndpoint(endpoint1, endpoint2);
472         verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
473         verify(endpointListener, never()).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
474     }
475
476     @Test
477     public void updateEndpointTestNewLocNullOldLocNull() {
478         when(context1.getNodeId()).thenReturn(null);
479         when(context2.getNodeId()).thenReturn(null);
480
481         manager.processEndpoint(endpoint1, endpoint2);
482         verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
483         verify(endpointListener, never()).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
484     }
485
486     @Test
487     public void updateEndpointTestNewLocNullOldLocNullExternalPut() {
488         when(endpoint1.getAugmentation(OfOverlayContext.class)).thenReturn(null);
489         when(endpoint2.getAugmentation(OfOverlayContext.class)).thenReturn(null);
490
491         manager.processEndpoint(endpoint1, endpoint2);
492         verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
493         verify(endpointListener, never()).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
494     }
495
496     @Test
497     public void updateEndpointTestNewLocNullOldLocNullExternalRemove() {
498         when(context1.getNodeId()).thenReturn(null);
499         manager.processEndpoint(null, endpoint1);
500
501         manager.processEndpoint(endpoint1, null);
502         verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
503         verify(endpointListener, never()).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
504     }
505
506     /**
507      * Endpoint changes it's location
508      */
509     @Test
510     public void updateEndpointLocationTestUpdate() {
511         Collection<Endpoint> collection;
512         manager.processEndpoint(null, endpoint1);
513
514         manager.processEndpoint(endpoint1, endpoint2);
515         verify(endpointListener, times(2)).endpointUpdated(any(EpKey.class));
516         // create: node1, update: node1 -> node2
517         verify(endpointListener, times(3)).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
518         collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
519         Assert.assertFalse(collection.isEmpty());
520     }
521
522     /**
523      * Endpoint changes it's EPG
524      */
525     @Test
526     public void updateEndpointGroupTestUpdate() {
527         Collection<Endpoint> collection;
528         EndpointGroupId otherEndpointGroupId = mock(EndpointGroupId.class);
529         when(endpoint2.getEndpointGroup()).thenReturn(otherEndpointGroupId);
530         when(endpoint2.getAugmentation(OfOverlayContext.class)).thenReturn(context1);
531         manager.processEndpoint(null, endpoint1);
532
533         manager.processEndpoint(endpoint1, endpoint2);
534         verify(endpointListener, times(2)).endpointUpdated(any(EpKey.class));
535         verify(endpointListener, times(1)).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
536         collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
537         Assert.assertTrue(collection.isEmpty());
538         collection = manager.getEndpointsForGroup(new EgKey(tenantId, otherEndpointGroupId));
539         Assert.assertFalse(collection.isEmpty());
540     }
541
542     /**
543      * Endpoint changes it's location and EPGs
544      */
545     @Test
546     public void updateEndpointLocationAndGroupTestUpdate() {
547         Collection<Endpoint> collection;
548         EndpointGroupId otherEndpointGroupId = mock(EndpointGroupId.class);
549         when(endpoint2.getEndpointGroup()).thenReturn(otherEndpointGroupId);
550         manager.processEndpoint(null, endpoint1);
551
552         manager.processEndpoint(endpoint1, endpoint2);
553         verify(endpointListener, times(2)).endpointUpdated(any(EpKey.class));
554         // create: node1, update: node1 -> node2
555         verify(endpointListener, times(3)).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
556         collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
557         Assert.assertTrue(collection.isEmpty());
558         collection = manager.getEndpointsForGroup(new EgKey(tenantId, otherEndpointGroupId));
559         Assert.assertFalse(collection.isEmpty());
560     }
561
562     /**
563      * Endpoint becomes external when removing it's location augmentation.
564      * This might happen when an endpoint is removed from a device.
565      */
566     @Test
567     public void updateEndpointLocationRemovedTestUpdate() {
568         Collection<Endpoint> collection;
569         when(endpoint2.getAugmentation(OfOverlayContext.class)).thenReturn(null);
570         manager.processEndpoint(null, endpoint1);
571
572         manager.processEndpoint(endpoint1, endpoint2);
573         verify(endpointListener, times(2)).endpointUpdated(any(EpKey.class));
574         verify(endpointListener, times(2)).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
575         collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
576         Assert.assertTrue(collection.isEmpty());
577     }
578
579     /**
580      * Endpoint is created when adding location augmentation.
581      * Endpoint is not external anymore.
582      */
583     @Test
584     public void updateEndpointLocationAddedTestUpdate() {
585         Collection<Endpoint> collection;
586         when(endpoint1.getAugmentation(OfOverlayContext.class)).thenReturn(null);
587         manager.processEndpoint(null, endpoint1);
588
589         manager.processEndpoint(endpoint1, endpoint2);
590         verify(endpointListener).endpointUpdated(any(EpKey.class));
591         verify(endpointListener).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
592         collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
593         Assert.assertFalse(collection.isEmpty());
594     }
595
596     @Test
597     public void closeTest() throws Exception {
598         manager.close();
599         verify(listenerReg, times(3)).close();
600     }
601
602      //**************
603      //Helper Functions
604      //**************
605
606     @Test
607     public void getEgKeyTest() {
608         Assert.assertNotNull(manager.getEgKey(endpoint1));
609         Assert.assertNull(manager.getEgKey(null));
610
611         when(endpoint1.getTenant()).thenReturn(null);
612         Assert.assertNull(manager.getEgKey(endpoint1));
613
614         when(endpoint1.getTenant()).thenReturn(tenantId);
615         when(endpoint1.getEndpointGroup()).thenReturn(null);
616         Assert.assertNotNull(manager.getEgKey(endpoint1));
617
618         when(endpoint1.getEndpointGroup()).thenReturn(endpointGroupId);
619         when(endpoint1.getEndpointGroups()).thenReturn(null);
620         Assert.assertNotNull(manager.getEgKey(endpoint1));
621
622         when(endpoint1.getEndpointGroup()).thenReturn(null);
623         Assert.assertNull(manager.getEgKey(endpoint1));
624
625         when(endpoint1.getEndpointGroup()).thenReturn(endpointGroupId);
626         when(endpoint1.getL2Context()).thenReturn(null);
627         Assert.assertNull(manager.getEgKey(endpoint1));
628
629         when(endpoint1.getL2Context()).thenReturn(l2BridgeDomainId);
630         when(endpoint1.getMacAddress()).thenReturn(null);
631         Assert.assertNull(manager.getEgKey(endpoint1));
632     }
633
634     @Test
635     public void getEgKeysForEndpointTest() {
636         Endpoint endpoint = mock(Endpoint.class);
637         Set<EgKey> egKeys;
638
639         when(endpoint.getEndpointGroups()).thenReturn(null);
640         egKeys = manager.getEgKeysForEndpoint(endpoint);
641         Assert.assertTrue(egKeys.isEmpty());
642
643         EndpointGroupId endpointGroupId = mock(EndpointGroupId.class);
644         when(endpoint.getEndpointGroup()).thenReturn(endpointGroupId);
645         egKeys = manager.getEgKeysForEndpoint(endpoint);
646         Assert.assertEquals(1, egKeys.size());
647
648         EndpointGroupId epgId = mock(EndpointGroupId.class);
649         List<EndpointGroupId> endpointGroups = Collections.singletonList(epgId);
650         when(endpoint.getEndpointGroups()).thenReturn(endpointGroups);
651         egKeys = manager.getEgKeysForEndpoint(endpoint);
652         Assert.assertEquals(2, egKeys.size());
653     }
654
655     @Test
656     public void isExternalIsInternalTest() {
657         Endpoint endpoint = mock(Endpoint.class);
658         when(endpoint.getAugmentation(OfOverlayContext.class)).thenReturn(null);
659         // TODO
660 //        Assert.assertFalse(manager.isExternal(endpoint));
661 //        Assert.assertTrue(manager.isInternal(endpoint));
662 //
663 //        OfOverlayContext ofc = mock(OfOverlayContext.class);
664 //        when(endpoint.getAugmentation(OfOverlayContext.class)).thenReturn(ofc);
665 //        when(ofc.getLocationType()).thenReturn(null);
666 //        Assert.assertFalse(manager.isExternal(endpoint));
667 //        Assert.assertTrue(manager.isInternal(endpoint));
668 //
669 //        when(ofc.getLocationType()).thenReturn(LocationType.Internal);
670 //        Assert.assertFalse(manager.isExternal(endpoint));
671 //        Assert.assertTrue(manager.isInternal(endpoint));
672 //
673 //        when(ofc.getLocationType()).thenReturn(LocationType.External);
674 //        Assert.assertTrue(manager.isExternal(endpoint));
675 //        Assert.assertFalse(manager.isInternal(endpoint));
676     }
677 }