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