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 java.math.BigInteger;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.L3nexthop;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.VpnNexthopsKey;
19 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
20 import com.google.common.base.Optional;
21 import com.google.common.util.concurrent.Futures;
22 import java.lang.reflect.InvocationTargetException;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.HashSet;
26 import java.util.List;
29 import org.junit.Before;
30 import org.junit.Test;
31 import org.junit.runner.RunWith;
32 import org.mockito.Mock;
33 import org.mockito.runners.MockitoJUnitRunner;
34 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
35 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
36 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
37 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
38 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
39 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
40 import org.opendaylight.idmanager.IdManager;
41 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
42 import org.opendaylight.vpnservice.nexthopmgr.NexthopManager;
43 import org.opendaylight.vpnservice.nexthopmgr.VpnInterfaceChangeListener;
44 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
45 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;
46 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
47 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;
48 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacenciesBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.AdjacencyKey;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.VpnNexthops;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.vpnnexthops.VpnNexthop;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.vpnnexthops.VpnNexthopBuilder;
56 import org.opendaylight.yangtools.concepts.ListenerRegistration;
57 import org.opendaylight.yangtools.yang.binding.Augmentation;
58 import org.opendaylight.yangtools.yang.binding.DataContainer;
59 import org.opendaylight.yangtools.yang.binding.DataObject;
60 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
61 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
63 @RunWith(MockitoJUnitRunner.class)
64 public class NexthopManagerTest {
66 private final String ifName = "dpn1-if0";
67 private final String vpnName = "vpn1";
68 private final String ipAddress = "1.1.1.1";
69 private final String macAddress = "11:22:33:44:55:66";
70 private final int groupId = 5000;
71 private final BigInteger dpId = BigInteger.ONE;
72 private final long vpnId = 2L;
74 Map<InstanceIdentifier<?>, DataObject> written = new HashMap<>();
75 Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
76 Set<InstanceIdentifier<?>> removed = new HashSet<>();
79 DataBroker dataBroker;
83 IInterfaceManager interfacemanager;
85 ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
87 ReadOnlyTransaction mockReadTx;
89 WriteTransaction mockWriteTx;
91 IMdsalApiManager mdsalmanager;
93 MockDataChangedEvent dataChangeEvent;
95 VpnInterfaceChangeListener vpnchglistener;
96 VpnInstance vpninstance;
97 VpnInterface vpninterface;
98 VpnNexthops vpnnexthops;
99 VpnNexthop vpnNexthop;
101 InstanceIdentifier<VpnInterface> vpnInterfaceIdent;
102 InstanceIdentifier<Adjacencies> adjacencies;
103 Adjacencies adjacency;
104 List<Adjacency> adjList = new ArrayList<Adjacency>();
106 Adjacency adjacencyobject = new Adjacency() {
109 public <E extends Augmentation<Adjacency>> E getAugmentation(Class<E> augmentationType) {
114 public Class<? extends DataContainer> getImplementedInterface() {
119 public Long getNextHopId() {
124 public String getMacAddress() {
129 public Long getLabel() {
134 public AdjacencyKey getKey() {
139 public String getIpAddress() {
145 public void setUp() throws Exception {
146 adjacency = getVpnInterfaceAugmentation(adjList);
148 InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class).augmentation(Adjacencies.class);
149 vpnInterfaceIdent = adjacencies.firstIdentifierOf(VpnInterface.class);
150 vpninterface = getVpnInterface(ifName, vpnName, adjacency);
151 adjList.add(adjacencyobject);
154 dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
155 any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(
156 dataChangeListenerRegistration);
158 dataChangeEvent = new MockDataChangedEvent();
159 vpnNexthop = new VpnNexthopBuilder().setEgressPointer(10L).setIpAddress(ipAddress).build();
160 nhmgr = new NexthopManager(dataBroker) {
161 protected long createNextHopPointer(String nexthopKey) {
165 protected long getVpnId(String vpnName) {
169 protected VpnNexthop getVpnNexthop(long vpnId, String ipAddress) {
173 protected void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer) {
178 nhmgr.setInterfaceManager(interfacemanager);
179 nhmgr.setMdsalManager(mdsalmanager);
180 vpnchglistener = new VpnInterfaceChangeListener(dataBroker, nhmgr);
184 private void setupMocks() {
185 when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx);
186 when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx);
190 public void testAdd() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
191 Optional<VpnInterface> vpnIf = Optional.of(vpninterface);
193 doReturn(Futures.immediateCheckedFuture(vpnIf)).when(mockReadTx).read(LogicalDatastoreType.OPERATIONAL,
195 InstanceIdentifierBuilder<VpnNexthops> idBuilder =
196 InstanceIdentifier.builder(L3nexthop.class).child(VpnNexthops.class, new VpnNexthopsKey(vpnId));
197 InstanceIdentifier<VpnNexthops> id = idBuilder.build();
198 doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(LogicalDatastoreType.OPERATIONAL,id);
200 when(interfacemanager.getDpnForInterface(ifName)).thenReturn(dpId);
201 dataChangeEvent.created.put(adjacencies, adjacency);
202 vpnchglistener.onDataChanged(dataChangeEvent);
204 // FIXME: Add some verifications
207 private Adjacencies getVpnInterfaceAugmentation(List<Adjacency> nextHops) {
208 return new AdjacenciesBuilder().setAdjacency(nextHops).build();
211 private VpnInterface getVpnInterface(String intfName, String vpnName, Adjacencies aug) {
212 return new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(intfName)).setVpnInstanceName(vpnName)
213 .addAugmentation(Adjacencies.class, aug).build();