1 package org.opendaylight.vpnservice.interfacemgr.test;
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;
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;
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;
51 @RunWith(MockitoJUnitRunner.class)
52 public class InterfaceManagerTest {
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<>();
59 @Mock DataBroker dataBroker;
60 @Mock IdManager idManager;
61 @Mock ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
62 @Mock ReadOnlyTransaction mockReadTx;
63 @Mock WriteTransaction mockWriteTx;
65 MockDataChangedEvent dataChangeEvent;
66 InterfaceManager imgr;
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;
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) {
90 * Do nothing for now. Ideally we should capture this information
91 * and use it to verify results.
93 written.put(path, data);
95 protected <T extends DataObject> void asyncUpdate(LogicalDatastoreType datastoreType,
96 InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
97 updated.put(path, data);
100 protected <T extends DataObject> void asyncRemove(LogicalDatastoreType datastoreType,
101 InstanceIdentifier<T> path, FutureCallback<Void> callback) {
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");
120 when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx);
121 when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx);
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);
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());
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
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());
178 private org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface buildStateInterface(
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();
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))
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);
197 BaseIds baseId = new BaseIdsBuilder().setOfPortId(ncId).build();
198 builder.addAugmentation(BaseIds.class, baseId);
199 return builder.build();
202 private NodeConnector buildNodeConnector(NodeConnectorId ncId) {
203 NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder()
205 .setKey(new NodeConnectorKey(ncId));
206 return ncBuilder.build();