2 * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
\r
4 * This program and the accompanying materials are made available under the
\r
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
\r
8 package org.opendaylight.nemo.renderer.openflow.physicalnetwork;
\r
10 import junit.framework.TestCase;
\r
11 import org.junit.Assert;
\r
12 import org.junit.Before;
\r
13 import org.junit.Test;
\r
14 import com.google.common.base.Optional;
\r
15 import com.google.common.util.concurrent.FutureCallback;
\r
16 import com.google.common.util.concurrent.Futures;
\r
17 import com.google.common.util.concurrent.ListenableFuture;
\r
18 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
\r
19 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
\r
20 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
\r
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
\r
22 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
\r
23 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
\r
24 import org.opendaylight.nemo.renderer.openflow.FlowUtils;
\r
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkBuilder;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkKey;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeBuilder;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeKey;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPort;
\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPortBuilder;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPortKey;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalLinkId;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPortId;
\r
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
\r
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
\r
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
\r
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
\r
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link;
\r
49 import org.opendaylight.yangtools.concepts.ListenerRegistration;
\r
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.Source;
\r
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.Destination;
\r
52 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
\r
54 import org.opendaylight.yangtools.yang.binding.NotificationListener;
\r
55 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
\r
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.LinkId;
\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
\r
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
\r
60 import org.slf4j.Logger;
\r
61 import org.slf4j.LoggerFactory;
\r
62 import com.google.common.util.concurrent.CheckedFuture;
\r
63 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkKey;
\r
65 import java.lang.reflect.Field;
\r
66 import java.lang.reflect.Method;
\r
67 import java.util.ArrayList;
\r
68 import java.util.List;
\r
69 import java.util.Timer;
\r
70 import java.util.TimerTask;
\r
71 import java.util.concurrent.CopyOnWriteArraySet;
\r
72 import java.util.concurrent.CountDownLatch;
\r
73 import static org.junit.Assert.*;
\r
74 import static org.mockito.Mockito.*;
\r
76 * Created by zhangmeng on 2015/12/17.
\r
78 public class PhysicalNetworkAdapterTest extends TestCase {
\r
79 private DataBroker dataBroker;
\r
80 private NotificationProviderService notificationProviderService;
\r
81 private PhyConfigLoader phyConfigLoader;
\r
82 private FlowUtils ofFlowUtils;
\r
83 private PhysicalNetworkAdapter physicalNetworkAdapter;
\r
84 private ListenerRegistration<NotificationListener> ofPacketInListenerReg;
\r
85 private ListenerRegistration<DataChangeListener> ofNodesListenerReg;
\r
86 private ListenerRegistration<DataChangeListener> ofLinksListenerReg;
\r
88 public void setUp() throws Exception {
\r
89 ofLinksListenerReg = mock(ListenerRegistration.class);
\r
90 ofPacketInListenerReg = mock(ListenerRegistration.class);
\r
91 ofNodesListenerReg = mock(ListenerRegistration.class);
\r
92 dataBroker = mock(DataBroker.class);
\r
93 notificationProviderService = mock(NotificationProviderService.class);
\r
94 phyConfigLoader = mock(PhyConfigLoader.class);
\r
95 ofFlowUtils = mock(FlowUtils.class);
\r
97 CheckedFuture checkedFuture = mock(CheckedFuture.class);
\r
98 ReadOnlyTransaction readOnlyTransaction = mock(ReadOnlyTransaction.class);
\r
100 when(dataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction);
\r
101 when(readOnlyTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
\r
102 .thenReturn(checkedFuture);
\r
103 when(dataBroker.registerDataChangeListener(
\r
104 any(LogicalDatastoreType.class),
\r
105 any(InstanceIdentifier.class),
\r
106 any(OFNodeListener.class),
\r
107 any(DataChangeScope.class)))
\r
108 .thenReturn(ofNodesListenerReg)
\r
109 .thenReturn(ofLinksListenerReg);
\r
110 when(notificationProviderService.registerNotificationListener(any(OFPacketInListener.class))).thenReturn(ofPacketInListenerReg);
\r
112 physicalNetworkAdapter = new PhysicalNetworkAdapter(dataBroker,
\r
113 notificationProviderService,
\r
117 verify(dataBroker,times(2)).newReadOnlyTransaction();
\r
118 verify(readOnlyTransaction,times(2)).read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
\r
119 verify(dataBroker,times(2)).registerDataChangeListener(
\r
120 any(LogicalDatastoreType.class),
\r
121 any(InstanceIdentifier.class),
\r
122 any(OFNodeListener.class),
\r
123 any(DataChangeScope.class));
\r
127 public void testClose() throws Exception {
\r
128 physicalNetworkAdapter.close();
\r
132 public void testGetPhyConfigLoader() throws Exception {
\r
133 Assert.assertTrue(physicalNetworkAdapter.getPhyConfigLoader() == phyConfigLoader);
\r
137 public void testOfNodeAdded() throws Exception {
\r
138 Node node = mock(Node.class);
\r
139 NodeKey nodeKey = mock(NodeKey.class);
\r
140 NodeId nodeId = mock(NodeId.class);
\r
141 NodeConnector nodeConnector = mock(NodeConnector.class);
\r
142 List<NodeConnector> nodeConnectors = new ArrayList<NodeConnector>();
\r
143 PhysicalNode physicalNode = mock(PhysicalNode.class);
\r
144 WriteTransaction writeTransaction = mock(WriteTransaction.class);
\r
145 CheckedFuture checkedFuture_write = mock(CheckedFuture.class);
\r
146 NodeConnectorId nodeConnectorId = mock(NodeConnectorId.class);
\r
147 NodeConnectorKey nodeConnectorKey = mock(NodeConnectorKey.class);
\r
148 CheckedFuture checkedFuture_read = mock(CheckedFuture.class);
\r
149 ReadOnlyTransaction readOnlyTransaction = mock(ReadOnlyTransaction.class);
\r
151 when(node.getKey()).thenReturn(nodeKey);
\r
152 when(node.getId()).thenReturn(nodeId);
\r
153 when(nodeId.getValue()).thenReturn(new String("test"));//strNodeId
\r
154 when(node.getNodeConnector()).thenReturn(nodeConnectors);//size = 0
\r
155 when(phyConfigLoader.getPhysicalNode(any(PhysicalNodeId.class)))
\r
157 .thenReturn(physicalNode);
\r
158 when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTransaction);
\r
159 when(writeTransaction.submit()).thenReturn(checkedFuture_write);
\r
161 physicalNetworkAdapter.ofNodeAdded(node);
\r
162 physicalNetworkAdapter.ofNodeAdded(node);
\r
163 verify(phyConfigLoader,times(2)).getPhysicalNode(any(PhysicalNodeId.class));
\r
164 verify(writeTransaction,times(2)).submit();
\r
165 verify(node,times(3)).getKey();
\r
166 //test nodeConnectors not null
\r
167 //get into method "getPhysicalPort" args(nodekey ,nodeConnector)
\r
168 nodeConnectors.add(nodeConnector);
\r
169 when(nodeConnector.getId()).thenReturn(nodeConnectorId);
\r
170 when(nodeConnectorId.getValue())
\r
171 .thenReturn(new String("LOCAL"))
\r
172 .thenReturn(new String("test1"));
\r
173 when(nodeConnector.getKey()).thenReturn(nodeConnectorKey);
\r
174 physicalNetworkAdapter.ofNodeAdded(node);
\r
175 verify(node,times(5)).getKey();
\r
176 ////get into method "getOFPort" args(nodekey nodeConnectorKey )
\r
177 when(dataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction);
\r
178 when(readOnlyTransaction.read(any(LogicalDatastoreType.class),any(InstanceIdentifier.class))).thenReturn(checkedFuture_read);
\r
179 //////get into method "getOFPortInstanceIdentifier" args(nodekey nodeConnectorKey )
\r
180 //return to method "getPhysicalPort"
\r
182 // physicalNetworkAdapter.ofNodeAdded(node);
\r
186 ///////////////////////////// ////////////////////////////////////////////////
\r
188 public void testOfNodeRemoved() throws Exception {
\r
189 Class<PhysicalNetworkAdapter> class1 = PhysicalNetworkAdapter.class;
\r
190 Method method = class1.getDeclaredMethod("ofNodeRemoved", new Class[]{Node.class});
\r
191 method.setAccessible(true);
\r
193 Node node = mock(Node.class);
\r
194 NodeKey nodeKey = mock(NodeKey.class);
\r
195 NodeId nodeId = mock(NodeId.class);
\r
196 PhysicalNode physicalNode = mock(PhysicalNode.class);
\r
197 WriteTransaction writeTransaction = mock(WriteTransaction.class);
\r
198 CheckedFuture checkedFuture = mock(CheckedFuture.class);
\r
200 when(node.getKey()).thenReturn(nodeKey);
\r
201 when(node.getId()).thenReturn(nodeId);
\r
202 when(nodeId.getValue()).thenReturn(new String("test"));
\r
203 when(phyConfigLoader.getPhysicalNode(any(PhysicalNodeId.class)))
\r
205 .thenReturn(physicalNode);
\r
206 when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTransaction);
\r
207 when(writeTransaction.submit()).thenReturn(checkedFuture);
\r
209 physicalNetworkAdapter.ofNodeRemoved(node);
\r
210 physicalNetworkAdapter.ofNodeRemoved(node);
\r
211 verify(phyConfigLoader,times(2)).getPhysicalNode(any(PhysicalNodeId.class));
\r
212 verify(writeTransaction,times(2)).submit();
\r
216 public void testOfLinkAdded() throws Exception {
\r
217 Class<PhysicalNetworkAdapter> class1 = PhysicalNetworkAdapter.class;
\r
218 Field field = class1.getDeclaredField("running");
\r
219 field.setAccessible(true);
\r
221 Assert.assertTrue((Boolean) field.get(physicalNetworkAdapter) == false);
\r
223 Link link = mock(Link.class);
\r
224 LinkKey linkKey = mock(LinkKey.class);
\r
225 LinkId linkId = mock(LinkId.class);
\r
226 Source source = mock(Source.class);
\r
227 Destination destination = mock(Destination.class);
\r
228 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId
\r
229 nodeId = mock(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId.class);
\r
230 TpId tpId = mock(TpId.class);
\r
231 PhysicalLink physicalLink = mock(PhysicalLink.class);
\r
233 when(link.getKey()).thenReturn(linkKey);
\r
234 when(link.getLinkId()).thenReturn(linkId);
\r
235 when(linkId.getValue()).thenReturn(new String("test"));//strLinkId
\r
237 when(link.getSource()).thenReturn(source);
\r
238 when(link.getDestination()).thenReturn(destination);
\r
239 when(source.getSourceNode()).thenReturn(nodeId);
\r
240 when(source.getSourceTp()).thenReturn(tpId);
\r
241 when(destination.getDestNode()).thenReturn(nodeId);
\r
242 when(destination.getDestTp()).thenReturn(tpId);
\r
243 when(nodeId.getValue())
\r
244 .thenReturn(new String("srcNode"))//srcNode
\r
245 .thenReturn(new String("dstNode"));//dstNode
\r
246 when(tpId.getValue())
\r
247 .thenReturn(new String("srcTp"))//srcTp
\r
248 .thenReturn(new String("dstTp"));//dstTp
\r
251 when(phyConfigLoader.getPhysicalLink(any(PhysicalLinkId.class)))
\r
253 .thenReturn(physicalLink);
\r
254 when(physicalLink.getMetric()).thenReturn(1L);
\r
256 physicalNetworkAdapter.ofLinkAdded(link);
\r
257 Assert.assertTrue((Boolean)field.get(physicalNetworkAdapter) == true);
\r
258 physicalNetworkAdapter.ofLinkAdded(link);
\r
259 verify(physicalLink).getMetric();
\r
261 physicalNetworkAdapter.close();
\r
265 public void testOfLinkRemoved() throws Exception {
\r
266 Class<PhysicalNetworkAdapter> class1 = PhysicalNetworkAdapter.class;
\r
267 Method method = class1.getDeclaredMethod("ofLinkRemoved", new Class[]{Link.class});
\r
268 method.setAccessible(true);
\r
270 Link link = mock(Link.class);
\r
271 LinkKey linkKey = mock(LinkKey.class);
\r
272 LinkId linkId = mock(LinkId.class);
\r
273 PhysicalLink physicalLink = mock(PhysicalLink.class);
\r
274 WriteTransaction writeTransaction = mock(WriteTransaction.class);
\r
275 InstanceIdentifier instanceIdentifier = mock(InstanceIdentifier.class);
\r
276 CheckedFuture checkedFuture = mock(CheckedFuture.class);
\r
278 when(link.getKey()).thenReturn(linkKey);
\r
279 when(link.getLinkId()).thenReturn(linkId);
\r
280 when(linkId.getValue()).thenReturn(new String("1"));
\r
281 when(phyConfigLoader.getPhysicalLink(any(PhysicalLinkId.class)))
\r
283 .thenReturn(physicalLink);
\r
284 when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTransaction);
\r
285 when(writeTransaction.submit()).thenReturn(checkedFuture);
\r
287 // physicalNetworkAdapter.ofLinkRemoved(link);
\r
288 // physicalNetworkAdapter.ofLinkRemoved(link);
\r
289 method.invoke(physicalNetworkAdapter, link);
\r
290 method.invoke(physicalNetworkAdapter, link);
\r
292 verify(phyConfigLoader,times(2)).getPhysicalLink(any(PhysicalLinkId.class));
\r
293 verify(writeTransaction,times(2)).submit();
\r
297 public void testGetOFPortInstanceIdentifier() throws Exception{
\r
298 Class<PhysicalNetworkAdapter> class1 = PhysicalNetworkAdapter.class;
\r
299 Method method = class1.getDeclaredMethod("getOFPortInstanceIdentifier", new Class[]{NodeKey.class,NodeConnectorKey.class});
\r
300 method.setAccessible(true);
\r
302 NodeKey nodeKey = mock(NodeKey.class);
\r
303 NodeConnectorKey connectorKey = mock(NodeConnectorKey.class);
\r
304 InstanceIdentifier<NodeConnector> result;
\r
306 result = (InstanceIdentifier<NodeConnector>)method.invoke(physicalNetworkAdapter,nodeKey,connectorKey);
\r
307 Assert.assertTrue(result != null);
\r
312 public void testGetOFPort() throws Exception{
\r
313 Class<PhysicalNetworkAdapter> class1 = PhysicalNetworkAdapter.class;
\r
314 Method method = class1.getDeclaredMethod("getOFPort", new Class[]{NodeKey.class,NodeConnectorKey.class});
\r
315 method.setAccessible(true);
\r
317 NodeKey nodeKey = mock(NodeKey.class);
\r
318 NodeConnectorKey connectorKey = mock(NodeConnectorKey.class);
\r
319 CheckedFuture checkedFuture_read = mock(CheckedFuture.class);
\r
320 ReadOnlyTransaction readOnlyTransaction = mock(ReadOnlyTransaction.class);
\r
322 when(dataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction);
\r
323 when(readOnlyTransaction.read(any(LogicalDatastoreType.class),any(InstanceIdentifier.class))).thenReturn(checkedFuture_read);
\r
325 // method.invoke(physicalNetworkAdapter,nodeKey,connectorKey);
\r