added one nemo-impl test file
[nemo.git] / nemo-renderers / openflow-renderer / src / test / java / org / opendaylight / nemo / renderer / openflow / physicalnetwork / PhysicalNetworkAdapterTest.java
1 /*\r
2  * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
3  *\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
7  */\r
8 package org.opendaylight.nemo.renderer.openflow.physicalnetwork;\r
9 \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
64 \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
75 /**\r
76  * Created by zhangmeng on 2015/12/17.\r
77  */\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
87     @Before\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
96 \r
97         CheckedFuture checkedFuture = mock(CheckedFuture.class);\r
98         ReadOnlyTransaction readOnlyTransaction = mock(ReadOnlyTransaction.class);\r
99 \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
111 \r
112         physicalNetworkAdapter =  new PhysicalNetworkAdapter(dataBroker,\r
113                 notificationProviderService,\r
114                 phyConfigLoader,\r
115                 ofFlowUtils);\r
116 \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
124     }\r
125 \r
126     @Test\r
127     public void testClose() throws Exception {\r
128         physicalNetworkAdapter.close();\r
129     }\r
130 \r
131     @Test\r
132     public void testGetPhyConfigLoader() throws Exception {\r
133         Assert.assertTrue(physicalNetworkAdapter.getPhyConfigLoader() == phyConfigLoader);\r
134     }\r
135 \r
136     @Test\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
150 \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
156                 .thenReturn(null)\r
157                 .thenReturn(physicalNode);\r
158         when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTransaction);\r
159         when(writeTransaction.submit()).thenReturn(checkedFuture_write);\r
160 \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
181 \r
182 //        physicalNetworkAdapter.ofNodeAdded(node);\r
183 \r
184 \r
185     }\r
186 ///////////////////////////// ////////////////////////////////////////////////\r
187     @Test\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
192 \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
199 \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
204                 .thenReturn(null)\r
205                 .thenReturn(physicalNode);\r
206         when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTransaction);\r
207         when(writeTransaction.submit()).thenReturn(checkedFuture);\r
208 \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
213     }\r
214 \r
215     @Test\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
220 \r
221         Assert.assertTrue((Boolean) field.get(physicalNetworkAdapter) == false);\r
222 \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
232 \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
236 \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
249 \r
250 \r
251         when(phyConfigLoader.getPhysicalLink(any(PhysicalLinkId.class)))\r
252                 .thenReturn(null)\r
253                 .thenReturn(physicalLink);\r
254         when(physicalLink.getMetric()).thenReturn(1L);\r
255 \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
260 \r
261         physicalNetworkAdapter.close();\r
262     }\r
263 \r
264     @Test\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
269 \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
277 \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
282                 .thenReturn(null)\r
283                 .thenReturn(physicalLink);\r
284         when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTransaction);\r
285         when(writeTransaction.submit()).thenReturn(checkedFuture);\r
286 \r
287 //        physicalNetworkAdapter.ofLinkRemoved(link);\r
288 //        physicalNetworkAdapter.ofLinkRemoved(link);\r
289         method.invoke(physicalNetworkAdapter, link);\r
290         method.invoke(physicalNetworkAdapter, link);\r
291 \r
292         verify(phyConfigLoader,times(2)).getPhysicalLink(any(PhysicalLinkId.class));\r
293         verify(writeTransaction,times(2)).submit();\r
294     }\r
295 \r
296     @Test\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
301 \r
302         NodeKey nodeKey = mock(NodeKey.class);\r
303         NodeConnectorKey connectorKey = mock(NodeConnectorKey.class);\r
304         InstanceIdentifier<NodeConnector> result;\r
305 \r
306         result = (InstanceIdentifier<NodeConnector>)method.invoke(physicalNetworkAdapter,nodeKey,connectorKey);\r
307         Assert.assertTrue(result != null);\r
308 \r
309     }\r
310 \r
311     @Test\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
316 \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
321 \r
322         when(dataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction);\r
323         when(readOnlyTransaction.read(any(LogicalDatastoreType.class),any(InstanceIdentifier.class))).thenReturn(checkedFuture_read);\r
324 \r
325 //        method.invoke(physicalNetworkAdapter,nodeKey,connectorKey);\r
326     }\r
327 }