Migrate networkmodel module to JUnit5
[transportpce.git] / networkmodel / src / test / java / org / opendaylight / transportpce / networkmodel / util / OpenRoadmTopologyTest.java
1 /*
2  * Copyright © 2020 Orange Labs, Inc. 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 package org.opendaylight.transportpce.networkmodel.util;
9
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertFalse;
12 import static org.junit.jupiter.api.Assertions.assertNotNull;
13 import static org.junit.jupiter.api.Assertions.assertThrows;
14 import static org.junit.jupiter.api.Assertions.assertTrue;
15 import static org.mockito.ArgumentMatchers.any;
16 import static org.mockito.Mockito.never;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.when;
19
20 import com.google.common.util.concurrent.FluentFuture;
21 import com.google.common.util.concurrent.ListenableFuture;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.List;
25 import java.util.Optional;
26 import java.util.concurrent.ExecutionException;
27 import java.util.concurrent.Executor;
28 import java.util.concurrent.TimeUnit;
29 import java.util.concurrent.TimeoutException;
30 import java.util.stream.Collectors;
31 import org.junit.jupiter.api.Test;
32 import org.junit.jupiter.api.extension.ExtendWith;
33 import org.mockito.Mock;
34 import org.mockito.invocation.InvocationOnMock;
35 import org.mockito.junit.jupiter.MockitoExtension;
36 import org.mockito.stubbing.Answer;
37 import org.opendaylight.mdsal.common.api.CommitInfo;
38 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
39 import org.opendaylight.transportpce.common.NetworkUtils;
40 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
41 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
42 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
43 import org.opendaylight.transportpce.networkmodel.util.test.NetworkmodelTestUtil;
44 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMaps;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder;
69 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
70 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
71 import org.opendaylight.yangtools.yang.common.Uint16;
72
73
74 @ExtendWith(MockitoExtension.class)
75 public class OpenRoadmTopologyTest {
76     @Mock
77     private NetworkTransactionService networkTransactionService;
78
79     @Test
80     void createTopologyShardForDegreeTest() {
81         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 2, List.of());
82         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
83         assertNotNull(topologyShard);
84         assertEquals(2, topologyShard.getNodes().size(), "Should contain 2 Degree nodes only");
85         assertEquals(2, topologyShard.getLinks().size(), "Should contain 2 links");
86         List<Node> nodes = topologyShard.getNodes().stream()
87             .sorted((n1, n2) -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue()))
88             .collect(Collectors.toList());
89         for (Node node : nodes) {
90             String nodeNb = node.getNodeId().getValue().substring(node.getNodeId().getValue().length() - 1);
91             checkDegreeNode(nodeNb, node);
92         }
93
94         List<Link> links = topologyShard.getLinks().stream()
95             .sorted((l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()))
96             .collect(Collectors.toList());
97         assertEquals(2, links.size(), "Should contain 2 express links");
98         assertEquals("ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX", links.get(0).getLinkId().getValue());
99         assertEquals("ROADMA01-DEG1", links.get(0).getSource().getSourceNode().getValue());
100         assertEquals("DEG1-CTP-TXRX", links.get(0).getSource().getSourceTp().getValue());
101         assertEquals("ROADMA01-DEG2", links.get(0).getDestination().getDestNode().getValue());
102         assertEquals("DEG2-CTP-TXRX", links.get(0).getDestination().getDestTp().getValue());
103         assertEquals("ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX", links.get(1).getLinkId().getValue());
104         assertEquals("ROADMA01-DEG2", links.get(1).getSource().getSourceNode().getValue());
105         assertEquals("DEG2-CTP-TXRX", links.get(1).getSource().getSourceTp().getValue());
106         assertEquals("ROADMA01-DEG1", links.get(1).getDestination().getDestNode().getValue());
107         assertEquals("DEG1-CTP-TXRX", links.get(1).getDestination().getDestTp().getValue());
108     }
109
110     @Test
111     void createTopologyShardForSrgTest() {
112         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm(
113                 "ROADMA01", "nodeA", 0, List.of(Integer.valueOf(1)));
114         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
115         assertNotNull(topologyShard);
116         List<Node> nodes = topologyShard.getNodes();
117         assertEquals(1, nodes.size(), "Should contain 1 SRG node only");
118         assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
119         checkSrgNode("1", nodes.get(0));
120     }
121
122     @Test
123     void createTopologyShardForMultipleSrgTest() {
124         List<Integer> srgNbs = List.of(Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(10),
125                 Integer.valueOf(11));
126         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 0, srgNbs);
127         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
128         assertNotNull(topologyShard);
129         List<Node> nodes = topologyShard.getNodes().stream()
130             .sorted((n1, n2) -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue()))
131             .collect(Collectors.toList());
132         assertEquals(4, nodes.size(), "Should contain 4 SRG nodes");
133         assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
134         checkSrgNode("1", nodes.get(0));
135         checkSrgNode("10", nodes.get(1));
136         checkSrgNode("11", nodes.get(2));
137         checkSrgNode("2", nodes.get(3));
138     }
139
140     @Test
141     void createTopologyShardForCompleteRdmNodeTest() {
142         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 2,
143             List.of(Integer.valueOf(1), Integer.valueOf(2)));
144         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
145         assertNotNull(topologyShard);
146         assertEquals(4, topologyShard.getNodes().size(), "Should contain 2 Deg and 2 SRG nodes");
147         List<Link> addLinks = topologyShard.getLinks().stream()
148             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.ADDLINK))
149             .collect(Collectors.toList());
150         assertEquals(4, addLinks.size(), "Should contain 4 add links");
151         List<Link> dropLinks = topologyShard.getLinks().stream()
152             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.DROPLINK))
153             .collect(Collectors.toList());
154         assertEquals(4, dropLinks.size(), "Should contain 4 drop links");
155         List<Link> expressLinks = topologyShard.getLinks().stream()
156             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.EXPRESSLINK))
157             .collect(Collectors.toList());
158         assertEquals(2, expressLinks.size(), "Should contain 2 express links");
159     }
160
161     @Test
162     void createTopologyShardForTpdrNodeTest() {
163         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, null);
164         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
165         assertNotNull(topologyShard);
166         assertEquals(1, topologyShard.getNodes().size(), "Should contain a single node");
167         assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
168         checkTpdrNode(topologyShard.getNodes().get(0));
169     }
170
171     @Test
172     void createTopologyShardForTpdrNode2Test() {
173         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, XpdrNodeTypes.Tpdr);
174         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
175         assertNotNull(topologyShard);
176         assertEquals(1, topologyShard.getNodes().size(), "Should contain a single node");
177         assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
178         checkTpdrNode(topologyShard.getNodes().get(0));
179     }
180
181     @Test
182     void createTopologyShardForMpdrNodeTest() {
183         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, XpdrNodeTypes.Mpdr);
184         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
185         assertNotNull(topologyShard);
186         assertEquals(1, topologyShard.getNodes().size(), "Should contain a single node");
187         assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
188         checkOtnXpdrNode(topologyShard.getNodes().get(0));
189     }
190
191     @Test
192     void createTopologyShardForSwitchNodeTest() {
193         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, XpdrNodeTypes.Switch);
194         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
195         assertNotNull(topologyShard);
196         assertEquals(1, topologyShard.getNodes().size(), "Should contain a single node");
197         assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
198         checkOtnXpdrNode(topologyShard.getNodes().get(0));
199     }
200
201     @Test
202     void createTopologyShardForRdmWithoutClliTest() {
203         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", null, 2, List.of());
204         Exception exception = assertThrows(NullPointerException.class, () -> {
205             OpenRoadmTopology.createTopologyShard(mappingNode);
206         });
207         assertTrue("Supplied value may not be null".contains(exception.getMessage()));
208     }
209
210     @Test
211     void deleteLinkOkTest() throws InterruptedException, ExecutionException {
212         String srcNode = "ROADM-A1-DEG1";
213         String dstNode = "ROADM-A1-SRG1";
214         String srcTp = "DEG1-CTP-TXRX";
215         String destTp = "SRG1-CP-TXRX";
216         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
217         org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1 link1 =
218             new Link1Builder().build();
219         Link link = new LinkBuilder()
220             .setLinkId(linkId)
221             .setSource(new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(new TpId(srcTp)).build())
222             .setDestination(new DestinationBuilder().setDestNode(new NodeId(dstNode)).setDestTp(new TpId(destTp))
223                 .build())
224             .addAugmentation(link1)
225             .build();
226         InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class)
227             .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
228             .augmentation(Network1.class)
229             .child(Link.class, new LinkKey(linkId))
230             .build();
231         when(networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID))
232             .thenReturn(new LinkFuture(link));
233
234         Answer<FluentFuture<CommitInfo>> answer = new Answer<FluentFuture<CommitInfo>>() {
235
236             @Override
237             public FluentFuture<CommitInfo> answer(InvocationOnMock invocation) throws Throwable {
238                 return CommitInfo.emptyFluentFuture();
239             }
240
241         };
242         when(networkTransactionService.commit()).then(answer);
243
244         boolean result = OpenRoadmTopology.deleteLink("ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX",
245             networkTransactionService);
246         assertTrue(result, "link deletion should be ok");
247     }
248
249     @Test
250     void deleteLinkNotOkTest() throws InterruptedException, ExecutionException {
251         String srcNode = "ROADM-A1-DEG1";
252         String dstNode = "ROADM-A1-SRG1";
253         String srcTp = "DEG1-CTP-TXRX";
254         String destTp = "SRG1-CP-TXRX";
255         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
256
257         InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class)
258             .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
259             .augmentation(Network1.class)
260             .child(Link.class, new LinkKey(linkId))
261             .build();
262         when(networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID)).thenReturn(new LinkFuture());
263
264         boolean result = OpenRoadmTopology.deleteLink(
265                 "ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX", networkTransactionService);
266         assertFalse(result, "link deletion should not be ok");
267     }
268
269     @Test
270     void deleteLinkExceptionTest() throws InterruptedException, ExecutionException {
271         String srcNode = "ROADM-A1-DEG1";
272         String dstNode = "ROADM-A1-SRG1";
273         String srcTp = "DEG1-CTP-TXRX";
274         String destTp = "SRG1-CP-TXRX";
275         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
276
277         InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class)
278             .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
279             .augmentation(Network1.class)
280             .child(Link.class, new LinkKey(linkId))
281             .build();
282         when(networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID))
283             .thenReturn(new InterruptedLinkFuture());
284         boolean result = OpenRoadmTopology.deleteLink(
285                 "ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX", networkTransactionService);
286         verify(networkTransactionService, never()).merge(any(), any(), any());
287         assertFalse(result, "Result should be false du to InterruptedException");
288     }
289
290     private void checkDegreeNode(String nodeNb, Node node) {
291         assertEquals("ROADMA01-DEG" + nodeNb, node.getNodeId().getValue());
292         List<SupportingNode> supportingNodes = node.nonnullSupportingNode().values().stream()
293             .sorted((sn1, sn2) -> sn1.getNetworkRef().getValue().compareTo(sn2.getNetworkRef().getValue()))
294             .collect(Collectors.toList());
295         assertEquals(2, supportingNodes.size());
296         assertEquals("clli-network", supportingNodes.get(0).getNetworkRef().getValue());
297         assertEquals("nodeA", supportingNodes.get(0).getNodeRef().getValue());
298         assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
299         assertEquals("ROADMA01", supportingNodes.get(1).getNodeRef().getValue());
300         assertEquals(OpenroadmNodeType.DEGREE, node.augmentation(Node1.class).getNodeType());
301         assertEquals(
302             Uint16.valueOf(nodeNb),
303             node.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1.class)
304                 .getDegreeAttributes().getDegreeNumber());
305         List<AvailFreqMaps> availFreqMapsValues = new ArrayList<>(node.augmentation(
306                 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1.class)
307             .getDegreeAttributes().getAvailFreqMaps().values());
308         assertEquals(GridConstant.NB_OCTECTS, availFreqMapsValues.get(0).getFreqMap().length);
309         byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
310         Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
311         assertEquals(Arrays.toString(byteArray), Arrays.toString(availFreqMapsValues.get(0).getFreqMap()));
312         List<TerminationPoint> tps = node.augmentation(
313                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
314             .nonnullTerminationPoint().values().stream()
315             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
316             .collect(Collectors.toList());
317         assertEquals(2, tps.size());
318         assertEquals("DEG" + nodeNb + "-CTP-TXRX", tps.get(0).getTpId().getValue());
319         assertEquals(OpenroadmTpType.DEGREETXRXCTP, tps.get(0).augmentation(TerminationPoint1.class).getTpType());
320         assertEquals("DEG" + nodeNb + "-TTP-TXRX", tps.get(1).getTpId().getValue());
321         assertEquals(OpenroadmTpType.DEGREETXRXTTP, tps.get(1).augmentation(TerminationPoint1.class).getTpType());
322     }
323
324     private void checkSrgNode(String nodeNb, Node node) {
325         assertEquals("ROADMA01-SRG" + nodeNb, node.getNodeId().getValue());
326         List<SupportingNode> supportingNodes = node.nonnullSupportingNode().values().stream()
327             .sorted((sn1, sn2) -> sn1.getNetworkRef().getValue().compareTo(sn2.getNetworkRef().getValue()))
328             .collect(Collectors.toList());
329         assertEquals(2, supportingNodes.size());
330         assertEquals("clli-network", supportingNodes.get(0).getNetworkRef().getValue());
331         assertEquals("nodeA", supportingNodes.get(0).getNodeRef().getValue());
332         assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
333         assertEquals("ROADMA01", supportingNodes.get(1).getNodeRef().getValue());
334         assertEquals(OpenroadmNodeType.SRG, node.augmentation(Node1.class).getNodeType());
335         List<AvailFreqMaps> availFreqMapsValues = new ArrayList<>(node.augmentation(
336                 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1.class)
337             .getSrgAttributes().getAvailFreqMaps().values());
338         assertEquals(GridConstant.NB_OCTECTS, availFreqMapsValues.get(0).getFreqMap().length);
339         byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
340         Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
341         assertEquals(Arrays.toString(byteArray), Arrays.toString(availFreqMapsValues.get(0).getFreqMap()));
342         List<TerminationPoint> tps = node.augmentation(
343                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
344             .nonnullTerminationPoint().values().stream()
345             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
346             .collect(Collectors.toList());
347         assertEquals(5, tps.size());
348         assertEquals("SRG" + nodeNb + "-CP-TXRX", tps.get(0).getTpId().getValue());
349         assertEquals(OpenroadmTpType.SRGTXRXCP, tps.get(0).augmentation(TerminationPoint1.class).getTpType());
350         assertEquals("SRG" + nodeNb + "-PP3-TXRX", tps.get(3).getTpId().getValue());
351         assertEquals(OpenroadmTpType.SRGTXRXPP, tps.get(3).augmentation(TerminationPoint1.class).getTpType());
352     }
353
354     private void checkTpdrNode(Node node) {
355         assertEquals("XPDRA01-XPDR1", node.getNodeId().getValue());
356         List<SupportingNode> supportingNodes = node.nonnullSupportingNode().values().stream()
357             .sorted((sn1, sn2) -> sn1.getNetworkRef().getValue().compareTo(sn2.getNetworkRef().getValue()))
358             .collect(Collectors.toList());
359         assertEquals(2, supportingNodes.size());
360         assertEquals("clli-network", supportingNodes.get(0).getNetworkRef().getValue());
361         assertEquals("nodeA", supportingNodes.get(0).getNodeRef().getValue());
362         assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
363         assertEquals("XPDRA01", supportingNodes.get(1).getNodeRef().getValue());
364         assertEquals(OpenroadmNodeType.XPONDER, node.augmentation(Node1.class).getNodeType());
365         List<TerminationPoint> tps = node.augmentation(
366                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
367             .nonnullTerminationPoint().values().stream()
368             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
369             .collect(Collectors.toList());
370         assertEquals(4, tps.size());
371         assertEquals("XPDR1-CLIENT1", tps.get(0).getTpId().getValue());
372         assertEquals(OpenroadmTpType.XPONDERCLIENT, tps.get(0).augmentation(TerminationPoint1.class).getTpType());
373         assertEquals(
374             "XPDR1-NETWORK1",
375             tps.get(0).augmentation(TerminationPoint1.class).getAssociatedConnectionMapTp().iterator().next()
376                 .getValue());
377         assertEquals("XPDR1-NETWORK1", tps.get(2).getTpId().getValue());
378         assertEquals(OpenroadmTpType.XPONDERNETWORK, tps.get(2).augmentation(TerminationPoint1.class).getTpType());
379         assertEquals(
380             "XPDR1-CLIENT1",
381             tps.get(2).augmentation(TerminationPoint1.class).getAssociatedConnectionMapTp().iterator().next()
382                 .getValue());
383     }
384
385     private void checkOtnXpdrNode(Node node) {
386         assertEquals("XPDRA01-XPDR1", node.getNodeId().getValue());
387         List<SupportingNode> supportingNodes = node.nonnullSupportingNode().values().stream()
388             .sorted((sn1, sn2) -> sn1.getNetworkRef().getValue().compareTo(sn2.getNetworkRef().getValue()))
389             .collect(Collectors.toList());
390         assertEquals(2, supportingNodes.size());
391         assertEquals("clli-network", supportingNodes.get(0).getNetworkRef().getValue());
392         assertEquals("nodeA", supportingNodes.get(0).getNodeRef().getValue());
393         assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
394         assertEquals("XPDRA01", supportingNodes.get(1).getNodeRef().getValue());
395         assertEquals(OpenroadmNodeType.XPONDER, node.augmentation(Node1.class).getNodeType());
396         List<TerminationPoint> tps = node.augmentation(
397                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
398             .nonnullTerminationPoint().values().stream()
399             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
400             .collect(Collectors.toList());
401         assertEquals(2, tps.size());
402         assertEquals("XPDR1-NETWORK1", tps.get(0).getTpId().getValue());
403         assertEquals(OpenroadmTpType.XPONDERNETWORK, tps.get(0).augmentation(TerminationPoint1.class).getTpType());
404     }
405
406     private class LinkFuture implements  ListenableFuture<Optional<Link>> {
407
408         private Link link;
409
410         LinkFuture() {
411         }
412
413         LinkFuture(Link link) {
414             this.link = link;
415         }
416
417         @Override
418         public boolean cancel(boolean arg0) {
419             return false;
420         }
421
422         @Override
423         public Optional<Link> get() throws InterruptedException, ExecutionException {
424             if (link != null) {
425                 return Optional.of(link);
426             } else {
427                 return Optional.empty();
428             }
429         }
430
431         @Override
432         public Optional<Link> get(long arg0, TimeUnit arg1)
433             throws InterruptedException, ExecutionException, TimeoutException {
434             if (link != null) {
435                 return Optional.of(link);
436             } else {
437                 return Optional.empty();
438             }
439         }
440
441         @Override
442         public boolean isCancelled() {
443             return false;
444         }
445
446         @Override
447         public boolean isDone() {
448             return false;
449         }
450
451         @Override
452         public void addListener(Runnable listener, Executor executor) {
453         }
454     }
455
456     private class InterruptedLinkFuture implements  ListenableFuture<Optional<Link>> {
457
458         @Override
459         public boolean cancel(boolean arg0) {
460             return false;
461         }
462
463         @Override
464         public Optional<Link> get() throws InterruptedException, ExecutionException {
465             throw new InterruptedException("Interrupted");
466         }
467
468         @Override
469         public Optional<Link> get(long arg0, TimeUnit arg1)
470             throws InterruptedException, ExecutionException, TimeoutException {
471             throw new InterruptedException("Interrupted");
472         }
473
474         @Override
475         public boolean isCancelled() {
476             return false;
477         }
478
479         @Override
480         public boolean isDone() {
481             return false;
482         }
483
484         @Override
485         public void addListener(Runnable listener, Executor executor) {
486         }
487     }
488 }