2 * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
9 package org.opendaylight.vpnservice.interfacemgr.test;
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;
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;
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;
59 @RunWith(MockitoJUnitRunner.class)
60 public class InterfaceManagerTest {
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<>();
67 @Mock DataBroker dataBroker;
68 @Mock IdManager idManager;
69 @Mock ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
70 @Mock ReadOnlyTransaction mockReadTx;
71 @Mock WriteTransaction mockWriteTx;
73 MockDataChangedEvent dataChangeEvent;
74 InterfaceManager imgr;
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;
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) {
98 * Do nothing for now. Ideally we should capture this information
99 * and use it to verify results.
101 written.put(path, data);
103 protected <T extends DataObject> void asyncUpdate(LogicalDatastoreType datastoreType,
104 InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
105 updated.put(path, data);
108 protected <T extends DataObject> void asyncRemove(LogicalDatastoreType datastoreType,
109 InstanceIdentifier<T> path, FutureCallback<Void> callback) {
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");
128 when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx);
129 when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx);
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);
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());
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
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());
186 private org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface buildStateInterface(
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();
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))
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);
205 BaseIds baseId = new BaseIdsBuilder().setOfPortId(ncId).build();
206 builder.addAugmentation(BaseIds.class, baseId);
207 return builder.build();
210 private NodeConnector buildNodeConnector(NodeConnectorId ncId) {
211 NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder()
213 .setKey(new NodeConnectorKey(ncId));
214 return ncBuilder.build();