Added unit tests for NextHopManager
[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 com.google.common.base.Optional;
16 import com.google.common.util.concurrent.Futures;
17
18 import java.lang.reflect.InvocationTargetException;
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.HashSet;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.Set;
25
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.mockito.Mock;
30 import org.mockito.runners.MockitoJUnitRunner;
31 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
32 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
33 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
34 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
35 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
36 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
37 import org.opendaylight.idmanager.IdManager;
38 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
39 import org.opendaylight.vpnservice.nexthopmgr.NexthopManager;
40 import org.opendaylight.vpnservice.nexthopmgr.VpnInterfaceChangeListener;
41 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
42 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;
43 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
44 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;
45 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacenciesBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.AdjacencyKey;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.VpnNexthops;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.vpnnexthops.VpnNexthop;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.vpnnexthops.VpnNexthopBuilder;
53 import org.opendaylight.yangtools.concepts.ListenerRegistration;
54 import org.opendaylight.yangtools.yang.binding.Augmentation;
55 import org.opendaylight.yangtools.yang.binding.DataContainer;
56 import org.opendaylight.yangtools.yang.binding.DataObject;
57 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
59
60 @RunWith(MockitoJUnitRunner.class)
61 public class NexthopManagerTest {
62
63   private final String ifName = "dpn1-if0";
64   private final String vpnName = "vpn1";
65   private final String ipAddress = "1.1.1.1";
66   private final String macAddress = "11:22:33:44:55:66";
67   private final int groupId = 5000;
68   private final long dpId = 1L;
69   private final long vpnId = 2L;
70
71   Map<InstanceIdentifier<?>, DataObject> written = new HashMap<>();
72   Map<InstanceIdentifier<?>, DataObject> updated = new HashMap<>();
73   Set<InstanceIdentifier<?>> removed = new HashSet<>();
74
75   @Mock
76   DataBroker dataBroker;
77   @Mock
78   IdManager idManager;
79   @Mock
80   IInterfaceManager interfacemanager;
81   @Mock
82   ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
83   @Mock
84   ReadOnlyTransaction mockReadTx;
85   @Mock
86   WriteTransaction mockWriteTx;
87   @Mock
88   IMdsalApiManager mdsalmanager;
89
90   MockDataChangedEvent dataChangeEvent;
91   NexthopManager nhmgr;
92   VpnInterfaceChangeListener vpnchglistener;
93   VpnInstance vpninstance;
94   VpnInterface vpninterface;
95   VpnNexthops vpnnexthops;
96   VpnNexthop vpnNexthop;
97
98   InstanceIdentifier<VpnInterface> vpnInterfaceIdent;
99   InstanceIdentifier<Adjacencies> adjacencies;
100   Adjacencies adjacency;
101   List<Adjacency> adjList = new ArrayList<Adjacency>();
102
103   Adjacency adjacencyobject = new Adjacency() {
104
105     @Override
106     public <E extends Augmentation<Adjacency>> E getAugmentation(Class<E> augmentationType) {
107       return null;
108     }
109
110     @Override
111     public Class<? extends DataContainer> getImplementedInterface() {
112       return null;
113     }
114
115     @Override
116     public Long getNextHopId() {
117       return null;
118     }
119
120     @Override
121     public String getMacAddress() {
122       return macAddress;
123     }
124
125     @Override
126     public Long getLabel() {
127       return null;
128     }
129
130     @Override
131     public AdjacencyKey getKey() {
132       return null;
133     }
134
135     @Override
136     public String getIpAddress() {
137       return ipAddress;
138     }
139   };
140
141   @Before
142   public void setUp() throws Exception {
143     adjacency = getVpnInterfaceAugmentation(adjList);
144     adjacencies =
145             InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class).augmentation(Adjacencies.class);
146     vpnInterfaceIdent = adjacencies.firstIdentifierOf(VpnInterface.class);
147     vpninterface = getVpnInterface(ifName, vpnName, adjacency);
148     adjList.add(adjacencyobject);
149
150     when(
151             dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
152                     any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(
153             dataChangeListenerRegistration);
154
155     dataChangeEvent = new MockDataChangedEvent();
156     vpnNexthop = new VpnNexthopBuilder().setEgressPointer(10L).setIpAddress(ipAddress).build();
157     nhmgr = new NexthopManager(dataBroker) {
158       protected int createNextHopPointer(String nexthopKey) {
159         return groupId;
160       }
161
162       protected long getVpnId(String vpnName) {
163         return vpnId;
164       }
165
166       protected VpnNexthop getVpnNexthop(long vpnId, String ipAddress) {
167         return vpnNexthop;
168       }
169
170       protected void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer) {
171         return;
172       }
173     };
174
175     nhmgr.setInterfaceManager(interfacemanager);
176     nhmgr.setMdsalManager(mdsalmanager);
177     vpnchglistener = new VpnInterfaceChangeListener(dataBroker, nhmgr);
178     setupMocks();
179   }
180
181   private void setupMocks() {
182     when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx);
183     when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx);
184   }
185
186   @Test
187   public void testAdd() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
188     Optional<VpnInterface> vpnIf = Optional.of(vpninterface);
189
190     doReturn(Futures.immediateCheckedFuture(vpnIf)).when(mockReadTx).read(LogicalDatastoreType.OPERATIONAL,
191             vpnInterfaceIdent);
192
193     when(interfacemanager.getDpnForInterface(ifName)).thenReturn(dpId);
194     dataChangeEvent.created.put(adjacencies, adjacency);
195     vpnchglistener.onDataChanged(dataChangeEvent);
196
197  // FIXME: Add some verifications
198   }
199
200   private Adjacencies getVpnInterfaceAugmentation(List<Adjacency> nextHops) {
201     return new AdjacenciesBuilder().setAdjacency(nextHops).build();
202   }
203
204   private VpnInterface getVpnInterface(String intfName, String vpnName, Adjacencies aug) {
205     return new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(intfName)).setVpnInstanceName(vpnName)
206             .addAugmentation(Adjacencies.class, aug).build();
207   }
208 }