fdcb511fb87af2ae67376059f29f4955a403a5b8
[vpnservice.git] / nexthopmgr / nexthopmgr-impl / src / test / java / org / opendaylight / vpnservice / nexthopmgr / test / NexthopManagerTest.java
1 /*
2  * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others. All
3  * rights reserved.
4  * 
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
8  */
9 package org.opendaylight.vpnservice.nexthopmgr.test;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.when;
14
15 import java.math.BigInteger;
16
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;
27 import java.util.Map;
28 import java.util.Set;
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;
62
63 @RunWith(MockitoJUnitRunner.class)
64 public class NexthopManagerTest {
65
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;
73
74   Map<InstanceIdentifier<?>, DataObject> written = new HashMap<>();
75   Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
76   Set<InstanceIdentifier<?>> removed = new HashSet<>();
77
78   @Mock
79   DataBroker dataBroker;
80   @Mock
81   IdManager idManager;
82   @Mock
83   IInterfaceManager interfacemanager;
84   @Mock
85   ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
86   @Mock
87   ReadOnlyTransaction mockReadTx;
88   @Mock
89   WriteTransaction mockWriteTx;
90   @Mock
91   IMdsalApiManager mdsalmanager;
92
93   MockDataChangedEvent dataChangeEvent;
94   NexthopManager nhmgr;
95   VpnInterfaceChangeListener vpnchglistener;
96   VpnInstance vpninstance;
97   VpnInterface vpninterface;
98   VpnNexthops vpnnexthops;
99   VpnNexthop vpnNexthop;
100
101   InstanceIdentifier<VpnInterface> vpnInterfaceIdent;
102   InstanceIdentifier<Adjacencies> adjacencies;
103   Adjacencies adjacency;
104   List<Adjacency> adjList = new ArrayList<Adjacency>();
105
106   Adjacency adjacencyobject = new Adjacency() {
107
108     @Override
109     public <E extends Augmentation<Adjacency>> E getAugmentation(Class<E> augmentationType) {
110       return null;
111     }
112
113     @Override
114     public Class<? extends DataContainer> getImplementedInterface() {
115       return null;
116     }
117
118     @Override
119     public Long getNextHopId() {
120       return null;
121     }
122
123     @Override
124     public String getMacAddress() {
125       return macAddress;
126     }
127
128     @Override
129     public Long getLabel() {
130       return null;
131     }
132
133     @Override
134     public AdjacencyKey getKey() {
135       return null;
136     }
137
138     @Override
139     public String getIpAddress() {
140       return ipAddress;
141     }
142   };
143
144   @Before
145   public void setUp() throws Exception {
146     adjacency = getVpnInterfaceAugmentation(adjList);
147     adjacencies =
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);
152
153     when(
154             dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
155                     any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(
156             dataChangeListenerRegistration);
157
158     dataChangeEvent = new MockDataChangedEvent();
159     vpnNexthop = new VpnNexthopBuilder().setEgressPointer(10L).setIpAddress(ipAddress).build();
160     nhmgr = new NexthopManager(dataBroker) {
161       protected int createNextHopPointer(String nexthopKey) {
162         return groupId;
163       }
164
165       protected long getVpnId(String vpnName) {
166         return vpnId;
167       }
168
169       protected VpnNexthop getVpnNexthop(long vpnId, String ipAddress) {
170         return vpnNexthop;
171       }
172
173       protected void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer) {
174         return;
175       }
176     };
177
178     nhmgr.setInterfaceManager(interfacemanager);
179     nhmgr.setMdsalManager(mdsalmanager);
180     vpnchglistener = new VpnInterfaceChangeListener(dataBroker, nhmgr);
181     setupMocks();
182   }
183
184   private void setupMocks() {
185     when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx);
186     when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx);
187   }
188
189   @Test
190   public void testAdd() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
191     Optional<VpnInterface> vpnIf = Optional.of(vpninterface);
192
193     doReturn(Futures.immediateCheckedFuture(vpnIf)).when(mockReadTx).read(LogicalDatastoreType.OPERATIONAL,
194             vpnInterfaceIdent);
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);
199
200     when(interfacemanager.getDpnForInterface(ifName)).thenReturn(dpId);
201     dataChangeEvent.created.put(adjacencies, adjacency);
202     vpnchglistener.onDataChanged(dataChangeEvent);
203
204  // FIXME: Add some verifications
205   }
206
207   private Adjacencies getVpnInterfaceAugmentation(List<Adjacency> nextHops) {
208     return new AdjacenciesBuilder().setAdjacency(nextHops).build();
209   }
210
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();
214   }
215 }