Interfacemgr: Added Unit Tests
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / test / java / org / opendaylight / vpnservice / interfacemgr / test / InterfaceManagerTest.java
1 package org.opendaylight.vpnservice.interfacemgr.test;
2
3 import static org.junit.Assert.*;
4 import static org.mockito.Matchers.any;
5 import static org.mockito.Mockito.doReturn;
6 import static org.mockito.Mockito.when;
7
8 import com.google.common.base.Optional;
9 import com.google.common.util.concurrent.FutureCallback;
10 import com.google.common.util.concurrent.Futures;
11 import java.util.HashMap;
12 import java.util.HashSet;
13 import java.util.Map;
14 import java.util.Set;
15 import org.junit.Assert;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.junit.runner.RunWith;
19 import org.mockito.Mock;
20 import org.mockito.runners.MockitoJUnitRunner;
21 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
22 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
23 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
24 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
25 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
26 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
27 import org.opendaylight.idmanager.IdManager;
28 import org.opendaylight.vpnservice.interfacemgr.IfmUtil;
29 import org.opendaylight.vpnservice.interfacemgr.InterfaceManager;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPool;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.BaseIds;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.BaseIdsBuilder;
47 import org.opendaylight.yangtools.concepts.ListenerRegistration;
48 import org.opendaylight.yangtools.yang.binding.DataObject;
49 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
50
51 @RunWith(MockitoJUnitRunner.class)
52 public class InterfaceManagerTest {
53
54     private String ifName = "dpn1-if0";
55     Map<InstanceIdentifier<?>,DataObject> written = new HashMap<>();
56     Map<InstanceIdentifier<?>,DataObject> updated = new HashMap<>();
57     Set<InstanceIdentifier<?>> removed = new HashSet<>();
58
59     @Mock DataBroker dataBroker;
60     @Mock IdManager idManager;
61     @Mock ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
62     @Mock ReadOnlyTransaction mockReadTx;
63     @Mock WriteTransaction mockWriteTx;
64
65     MockDataChangedEvent dataChangeEvent;
66     InterfaceManager imgr;
67
68     NodeConnectorId ncId;
69     NodeConnector nc;
70     Interface interf;
71     InstanceIdentifier<Interface> ifIdent;
72     InstanceIdentifier<NodeConnector> ncIdent;
73     InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifsIdent;
74     org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateIface;
75     InstanceIdentifier<IdPool> poolIdent;
76
77     @Before
78     public void setUp() throws Exception {
79         when(dataBroker.registerDataChangeListener(
80                 any(LogicalDatastoreType.class),
81                 any(InstanceIdentifier.class),
82                 any(DataChangeListener.class),
83                 any(DataChangeScope.class)))
84                 .thenReturn(dataChangeListenerRegistration);
85         dataChangeEvent = new MockDataChangedEvent();
86         imgr = new InterfaceManager(dataBroker, idManager) {
87             protected <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,
88                             InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
89                 /*
90                  * Do nothing for now. Ideally we should capture this information
91                  * and use it to verify results.
92                  */
93                 written.put(path, data);
94             }
95             protected <T extends DataObject> void asyncUpdate(LogicalDatastoreType datastoreType,
96                             InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
97                 updated.put(path, data);
98             }
99
100             protected <T extends DataObject> void asyncRemove(LogicalDatastoreType datastoreType,
101                             InstanceIdentifier<T> path, FutureCallback<Void> callback) {
102                 removed.add(path);
103             }
104
105         };
106         setupMocks();
107     }
108
109     private void setupMocks() {
110         ncId = new NodeConnectorId("openflow:10:111");
111         nc = buildNodeConnector(ncId);
112         interf = buildInterface(ifName, "Test Interface1", true, L2vlan.class, ncId);
113         ifIdent = IfmUtil.buildId(ifName);
114         ncIdent = getNcIdent("openflow:10",ncId);
115         ifsIdent = IfmUtil.buildStateInterfaceId(interf.getName());
116         stateIface = buildStateInterface(ifName);
117         poolIdent = IfmUtil.getPoolId("interfaces");
118
119         // Setup mocks
120         when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx);
121         when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx);
122     }
123
124     @Test
125     public void testAdd() {
126         Optional<Interface> expected = Optional.of(interf);
127         Optional<NodeConnector> expectedNc = Optional.of(nc);
128         doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx).read(
129                         LogicalDatastoreType.CONFIGURATION, ifIdent);
130         doReturn(Futures.immediateCheckedFuture(expectedNc)).when(mockReadTx).read(
131                         LogicalDatastoreType.OPERATIONAL, ncIdent);
132         doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(
133                         LogicalDatastoreType.OPERATIONAL, ifsIdent);
134         doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(
135                         LogicalDatastoreType.OPERATIONAL, poolIdent);
136
137         dataChangeEvent.created.put(IfmUtil.buildId(ifName), interf);
138         imgr.onDataChanged(dataChangeEvent);
139         //Add some verifications
140         assertEquals(1,written.size());
141         assertEquals(0,updated.size());
142         assertEquals(0, removed.size());
143         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface writtenIface =
144                         (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface)written.get(ifsIdent);
145         assertEquals(stateIface.getKey(), writtenIface.getKey());
146         assertEquals(65536, writtenIface.getIfIndex().intValue());
147         assertEquals(OperStatus.Up, writtenIface.getOperStatus());
148     }
149
150     @Test
151     public void testUpdate() {
152         Optional<Interface> expected = Optional.of(interf);
153         Optional<NodeConnector> expectedNc = Optional.of(nc);
154         Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> expectedStateIf = Optional.of(stateIface);
155         doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx).read(
156                         LogicalDatastoreType.CONFIGURATION, ifIdent);
157         doReturn(Futures.immediateCheckedFuture(expectedNc)).when(mockReadTx).read(
158                         LogicalDatastoreType.OPERATIONAL, ncIdent);
159         doReturn(Futures.immediateCheckedFuture(expectedStateIf)).when(mockReadTx).read(
160                         LogicalDatastoreType.OPERATIONAL, ifsIdent);
161         doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(
162                         LogicalDatastoreType.OPERATIONAL, poolIdent);
163         dataChangeEvent.original.put(IfmUtil.buildId(ifName), interf);
164         dataChangeEvent.updated.put(IfmUtil.buildId(ifName), interf);
165         imgr.onDataChanged(dataChangeEvent);
166         //Add some verifications
167
168         assertEquals(0,written.size());
169         assertEquals(1,updated.size());
170         assertEquals(0, removed.size());
171         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface updatedIface =
172                         (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface)updated.get(ifsIdent);
173         assertNotEquals(stateIface.getKey(),updatedIface.getKey());
174         assertNull(updatedIface.getIfIndex());
175         assertEquals(OperStatus.Up, updatedIface.getOperStatus());
176     }
177
178     private org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface buildStateInterface(
179                     String ifName) {
180         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder =
181                         new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder();
182         ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifName));
183         return ifaceBuilder.build();
184     }
185
186     private InstanceIdentifier<NodeConnector> getNcIdent(String nodeKey, NodeConnectorId ncId) {
187         return InstanceIdentifier.builder(Nodes.class)
188                         .child(Node.class, new NodeKey(new NodeId(nodeKey)))
189                         .child(NodeConnector.class, new NodeConnectorKey(ncId))
190                         .build();
191     }
192
193     private Interface buildInterface(String ifName, String desc, boolean enabled, Class<? extends InterfaceType> ifType, NodeConnectorId ncId) {
194         InterfaceBuilder builder = new InterfaceBuilder().setKey(new InterfaceKey(ifName)).setName(ifName)
195                         .setDescription(desc).setEnabled(enabled).setType(ifType);
196
197         BaseIds baseId = new BaseIdsBuilder().setOfPortId(ncId).build();
198         builder.addAugmentation(BaseIds.class, baseId);
199         return builder.build();
200     }
201
202     private NodeConnector buildNodeConnector(NodeConnectorId ncId) {
203         NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder()
204                         .setId(ncId)
205                         .setKey(new NodeConnectorKey(ncId));
206         return ncBuilder.build();
207     }
208
209 }