2 * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others. All
5 * This program and the accompanying materials are made available under the
6 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
7 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.vpnservice.nexthopmgr.test;
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.when;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.L3nexthop;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.VpnNexthopsKey;
17 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
19 import com.google.common.base.Optional;
20 import com.google.common.util.concurrent.Futures;
21 import java.lang.reflect.InvocationTargetException;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.HashSet;
25 import java.util.List;
28 import org.junit.Before;
29 import org.junit.Test;
30 import org.junit.runner.RunWith;
31 import org.mockito.Mock;
32 import org.mockito.runners.MockitoJUnitRunner;
33 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
34 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
35 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
36 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
37 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
38 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
39 import org.opendaylight.idmanager.IdManager;
40 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
41 import org.opendaylight.vpnservice.nexthopmgr.NexthopManager;
42 import org.opendaylight.vpnservice.nexthopmgr.VpnInterfaceChangeListener;
43 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
44 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;
45 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
46 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;
47 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacenciesBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.AdjacencyKey;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.VpnNexthops;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.vpnnexthops.VpnNexthop;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.vpnnexthops.VpnNexthopBuilder;
55 import org.opendaylight.yangtools.concepts.ListenerRegistration;
56 import org.opendaylight.yangtools.yang.binding.Augmentation;
57 import org.opendaylight.yangtools.yang.binding.DataContainer;
58 import org.opendaylight.yangtools.yang.binding.DataObject;
59 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
60 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
62 @RunWith(MockitoJUnitRunner.class)
63 public class NexthopManagerTest {
65 private final String ifName = "dpn1-if0";
66 private final String vpnName = "vpn1";
67 private final String ipAddress = "1.1.1.1";
68 private final String macAddress = "11:22:33:44:55:66";
69 private final int groupId = 5000;
70 private final long dpId = 1L;
71 private final long vpnId = 2L;
73 Map<InstanceIdentifier<?>, DataObject> written = new HashMap<>();
74 Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
75 Set<InstanceIdentifier<?>> removed = new HashSet<>();
78 DataBroker dataBroker;
82 IInterfaceManager interfacemanager;
84 ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
86 ReadOnlyTransaction mockReadTx;
88 WriteTransaction mockWriteTx;
90 IMdsalApiManager mdsalmanager;
92 MockDataChangedEvent dataChangeEvent;
94 VpnInterfaceChangeListener vpnchglistener;
95 VpnInstance vpninstance;
96 VpnInterface vpninterface;
97 VpnNexthops vpnnexthops;
98 VpnNexthop vpnNexthop;
100 InstanceIdentifier<VpnInterface> vpnInterfaceIdent;
101 InstanceIdentifier<Adjacencies> adjacencies;
102 Adjacencies adjacency;
103 List<Adjacency> adjList = new ArrayList<Adjacency>();
105 Adjacency adjacencyobject = new Adjacency() {
108 public <E extends Augmentation<Adjacency>> E getAugmentation(Class<E> augmentationType) {
113 public Class<? extends DataContainer> getImplementedInterface() {
118 public Long getNextHopId() {
123 public String getMacAddress() {
128 public Long getLabel() {
133 public AdjacencyKey getKey() {
138 public String getIpAddress() {
144 public void setUp() throws Exception {
145 adjacency = getVpnInterfaceAugmentation(adjList);
147 InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class).augmentation(Adjacencies.class);
148 vpnInterfaceIdent = adjacencies.firstIdentifierOf(VpnInterface.class);
149 vpninterface = getVpnInterface(ifName, vpnName, adjacency);
150 adjList.add(adjacencyobject);
153 dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
154 any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(
155 dataChangeListenerRegistration);
157 dataChangeEvent = new MockDataChangedEvent();
158 vpnNexthop = new VpnNexthopBuilder().setEgressPointer(10L).setIpAddress(ipAddress).build();
159 nhmgr = new NexthopManager(dataBroker) {
160 protected int createNextHopPointer(String nexthopKey) {
164 protected long getVpnId(String vpnName) {
168 protected VpnNexthop getVpnNexthop(long vpnId, String ipAddress) {
172 protected void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer) {
177 nhmgr.setInterfaceManager(interfacemanager);
178 nhmgr.setMdsalManager(mdsalmanager);
179 vpnchglistener = new VpnInterfaceChangeListener(dataBroker, nhmgr);
183 private void setupMocks() {
184 when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx);
185 when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx);
189 public void testAdd() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
190 Optional<VpnInterface> vpnIf = Optional.of(vpninterface);
192 doReturn(Futures.immediateCheckedFuture(vpnIf)).when(mockReadTx).read(LogicalDatastoreType.OPERATIONAL,
194 InstanceIdentifierBuilder<VpnNexthops> idBuilder =
195 InstanceIdentifier.builder(L3nexthop.class).child(VpnNexthops.class, new VpnNexthopsKey(vpnId));
196 InstanceIdentifier<VpnNexthops> id = idBuilder.build();
197 doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(LogicalDatastoreType.OPERATIONAL,id);
199 when(interfacemanager.getDpnForInterface(ifName)).thenReturn(dpId);
200 dataChangeEvent.created.put(adjacencies, adjacency);
201 vpnchglistener.onDataChanged(dataChangeEvent);
203 // FIXME: Add some verifications
206 private Adjacencies getVpnInterfaceAugmentation(List<Adjacency> nextHops) {
207 return new AdjacenciesBuilder().setAdjacency(nextHops).build();
210 private VpnInterface getVpnInterface(String intfName, String vpnName, Adjacencies aug) {
211 return new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(intfName)).setVpnInstanceName(vpnName)
212 .addAugmentation(Adjacencies.class, aug).build();