Further migration of test code from legacy setters
[bgpcep.git] / pcep / topology / topology-stats / src / test / java / org / opendaylight / bgpcep / pcep / topology / stats / rpc / TopologyStatsRpcServiceImplTest.java
1 /*
2  * Copyright (c) 2019 Lumina Networks, 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
9 package org.opendaylight.bgpcep.pcep.topology.stats.rpc;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertTrue;
13
14 import java.util.Arrays;
15 import java.util.Collections;
16 import java.util.List;
17 import java.util.stream.Collectors;
18 import org.junit.After;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.mdsal.binding.api.WriteTransaction;
22 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
23 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdRpcAug;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdRpcAugBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdStatsAug;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdStatsAugBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesRpcAug;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesRpcAugBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAug;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAugBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesRpcAug;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesRpcAugBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAug;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAugBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.error.messages.grouping.ErrorMessages;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.error.messages.grouping.ErrorMessagesBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPref;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPrefBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.Messages;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.MessagesBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilities;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilitiesBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerPrefBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.grouping.PcepSessionState;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.grouping.PcepSessionStateBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTime;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTimeBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsInputBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsOutput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsOutputBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.stats.rev181109.PcepTopologyNodeStatsAug;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.stats.rev181109.PcepTopologyNodeStatsAugBuilder;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopologyBuilder;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
59 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
60 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
61 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
62 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
63 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
64 import org.opendaylight.yangtools.yang.common.RpcResult;
65 import org.opendaylight.yangtools.yang.common.Uint16;
66 import org.opendaylight.yangtools.yang.common.Uint32;
67 import org.opendaylight.yangtools.yang.common.Uint8;
68
69 public class TopologyStatsRpcServiceImplTest extends AbstractConcurrentDataBrokerTest {
70     private static final String TOPOLOGY_ID1 = "pcep-topology-1";
71     private static final String TOPOLOGY_ID2 = "pcep-topology-2";
72     private static final String NONEXISTENT_TOPOLOGY = "nonexistent-topology";
73     private static final String NONPCEP_TOPOLOGY = "nonpcep-topology";
74     private static final String NODE_ID1 = "pcc://1.1.1.1";
75     private static final String NODE_ID2 = "pcc://2.2.2.2";
76     private static final String NODE_ID3 = "pcc://3.3.3.3";
77     private static final String NONEXISTENT_NODE = "pcc://4.4.4.4";
78     private static final String NONPCEP_NODE = "nonpcep-node";
79
80     TopologyStatsRpcServiceImpl rpcService;
81
82     @Before
83     public void setUp() throws Exception {
84         rpcService = new TopologyStatsRpcServiceImpl(getDataBroker());
85         rpcService.init();
86
87         // PCEP topology with one PCC node
88         final Topology t1 = createTopology(TOPOLOGY_ID1, Collections.singletonList(createPcepNode(NODE_ID1)));
89
90         // PCEP topology with two PCC node
91         final Topology t2 =
92                 createTopology(TOPOLOGY_ID2, Arrays.asList(createPcepNode(NODE_ID2), createPcepNode(NODE_ID3)));
93
94         // Non-PCEP topology with one non-PCC node
95         final Topology t3 = createTopology(NONPCEP_TOPOLOGY,
96                 Collections.singletonList(new NodeBuilder().setNodeId(new NodeId(NONPCEP_NODE)).build()));
97
98         final WriteTransaction wtx = getDataBroker().newWriteOnlyTransaction();
99         final NetworkTopologyBuilder ntb = new NetworkTopologyBuilder();
100         ntb.setTopology(Arrays.asList(t1, t2, t3));
101         wtx.put(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.builder(NetworkTopology.class).build(),
102                 ntb.build());
103         wtx.commit().get();
104     }
105
106     private static Topology createTopology(final String topologyId, final List<Node> nodes) {
107         return new TopologyBuilder().setTopologyId(new TopologyId(topologyId)).setNode(nodes).build();
108     }
109
110     private static Node createPcepNode(final String nodeId) {
111         return new NodeBuilder().setNodeId(new NodeId(nodeId))
112                 .addAugmentation(PcepTopologyNodeStatsAug.class,
113                         new PcepTopologyNodeStatsAugBuilder().setPcepSessionState(createTopologySessionState()).build())
114                 .build();
115     }
116
117     private static PcepSessionState createTopologySessionState() {
118         final ReplyTime replyTime = new ReplyTimeBuilder()
119                 .setAverageTime(Uint32.ONE)
120                 .setMaxTime(Uint32.valueOf(3))
121                 .setMinTime(Uint32.valueOf(2))
122                 .build();
123
124         final ErrorMessages errorMsg = new ErrorMessagesBuilder()
125                 .setReceivedErrorMsgCount(Uint32.ONE)
126                 .setSentErrorMsgCount(Uint32.valueOf(2))
127                 .build();
128
129         final StatefulMessagesStatsAug statefulMsg = new StatefulMessagesStatsAugBuilder()
130                 .setLastReceivedRptMsgTimestamp(Uint32.valueOf(1553183614L))
131                 .setSentUpdMsgCount(Uint32.ONE)
132                 .setReceivedRptMsgCount(Uint32.valueOf(2))
133                 .setSentInitMsgCount(Uint32.valueOf(3))
134                 .build();
135
136         final Messages messages = new MessagesBuilder()
137                 .setLastSentMsgTimestamp(Uint32.valueOf(1553183734L))
138                 .setUnknownMsgReceived(Uint16.ONE)
139                 .setSentMsgCount(Uint32.valueOf(5))
140                 .setReceivedMsgCount(Uint32.valueOf(4))
141                 .setReplyTime(replyTime)
142                 .setErrorMessages(errorMsg)
143                 .addAugmentation(StatefulMessagesStatsAug.class, statefulMsg).build();
144
145         final PeerCapabilities capabilities = new PeerCapabilitiesBuilder()
146                 .addAugmentation(StatefulCapabilitiesStatsAug.class, new StatefulCapabilitiesStatsAugBuilder()
147                         .setStateful(true).setInstantiation(true).setActive(true).build())
148                 .build();
149
150         final LocalPref localPref = new LocalPrefBuilder()
151                 .setKeepalive(Uint8.valueOf(30))
152                 .setDeadtimer(Uint8.valueOf(120))
153                 .setIpAddress("127.0.0.1")
154                 .setSessionId(Uint16.ZERO)
155                 .addAugmentation(PcepEntityIdStatsAug.class, new PcepEntityIdStatsAugBuilder()
156                     .setSpeakerEntityIdValue(new byte[] {0x01, 0x02, 0x03, 0x04})
157                     .build())
158                 .build();
159
160         return new PcepSessionStateBuilder().setSynchronized(true).setSessionDuration("0:00:05:18")
161                 .setDelegatedLspsCount(Uint16.ONE).setLocalPref(localPref)
162                 .setPeerPref(new PeerPrefBuilder(localPref).build())
163                 .setPeerCapabilities(capabilities).setMessages(messages).build();
164     }
165
166     private static PcepSessionState createRpcSessionState() {
167         final ReplyTime replyTime = new ReplyTimeBuilder()
168                 .setAverageTime(Uint32.ONE)
169                 .setMaxTime(Uint32.valueOf(3))
170                 .setMinTime(Uint32.valueOf(2))
171                 .build();
172
173         final ErrorMessages errorMsg = new ErrorMessagesBuilder()
174                 .setReceivedErrorMsgCount(Uint32.ONE).setSentErrorMsgCount(Uint32.valueOf(2)).build();
175
176         final StatefulMessagesRpcAug statefulMsg = new StatefulMessagesRpcAugBuilder()
177                 .setLastReceivedRptMsgTimestamp(Uint32.valueOf(1553183614L))
178                 .setSentUpdMsgCount(Uint32.ONE)
179                 .setReceivedRptMsgCount(Uint32.valueOf(2))
180                 .setSentInitMsgCount(Uint32.valueOf(3))
181                 .build();
182
183         final Messages messages = new MessagesBuilder()
184                 .setLastSentMsgTimestamp(Uint32.valueOf(1553183734L))
185                 .setUnknownMsgReceived(Uint16.ONE)
186                 .setSentMsgCount(Uint32.valueOf(5))
187                 .setReceivedMsgCount(Uint32.valueOf(4))
188                 .setReplyTime(replyTime)
189                 .setErrorMessages(errorMsg)
190                 .addAugmentation(StatefulMessagesRpcAug.class, statefulMsg).build();
191
192         final PeerCapabilities capabilities = new PeerCapabilitiesBuilder()
193                 .addAugmentation(StatefulCapabilitiesRpcAug.class, new StatefulCapabilitiesRpcAugBuilder()
194                         .setStateful(true).setInstantiation(true).setActive(true).build())
195                 .build();
196
197         final LocalPref localPref = new LocalPrefBuilder()
198                 .setKeepalive(Uint8.valueOf(30))
199                 .setDeadtimer(Uint8.valueOf(120))
200                 .setIpAddress("127.0.0.1")
201                 .setSessionId(Uint16.ZERO)
202                 .addAugmentation(PcepEntityIdRpcAug.class, new PcepEntityIdRpcAugBuilder()
203                     .setSpeakerEntityIdValue(new byte[] {0x01, 0x02, 0x03, 0x04})
204                     .build())
205                 .build();
206
207         return new PcepSessionStateBuilder().setSynchronized(true).setSessionDuration("0:00:05:18")
208                 .setDelegatedLspsCount(Uint16.ONE).setLocalPref(localPref)
209                 .setPeerPref(new PeerPrefBuilder(localPref).build())
210                 .setPeerCapabilities(capabilities).setMessages(messages)
211                 .build();
212     }
213
214     @Test
215     public void testGetStatsNoMatch() throws Exception {
216         GetStatsInput in;
217         GetStatsOutput out;
218
219         // Non-existing topology
220         in = createGetStatsInput(NONEXISTENT_TOPOLOGY, null);
221         out = createGetStatsOutput(NONEXISTENT_TOPOLOGY, Collections.emptyList(), null);
222         performTest(in, out);
223
224         // Non-existent node
225         in = createGetStatsInput(TOPOLOGY_ID1, Collections.singletonList(NONEXISTENT_NODE));
226         out = createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NONEXISTENT_NODE), null);
227         performTest(in, out);
228
229         // Non-PCEP topology
230         in = createGetStatsInput(NONPCEP_TOPOLOGY, Collections.singletonList(NONPCEP_NODE));
231         out = createGetStatsOutput(NONPCEP_TOPOLOGY, Collections.singletonList(NONPCEP_NODE), null);
232         performTest(in, out);
233     }
234
235     @Test
236     public void testGetStatsPartialMatch() throws Exception {
237         GetStatsInput in;
238         GetStatsOutput out;
239
240         // Match one PCEP topology
241         in = createGetStatsInput(TOPOLOGY_ID1, null);
242         out = createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NODE_ID1), createRpcSessionState());
243         performTest(in, out);
244
245         // Match one PCEP node in one topology
246         in = createGetStatsInput(TOPOLOGY_ID2, Collections.singletonList(NODE_ID3));
247         out = createGetStatsOutput(TOPOLOGY_ID2, Collections.singletonList(NODE_ID3), createRpcSessionState());
248         performTest(in, out);
249
250         // Match two PCEP nodes in one topology
251         in = createGetStatsInput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3));
252         out = createGetStatsOutput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3), createRpcSessionState());
253         performCountTest(in, out);
254     }
255
256     @Test
257     @SuppressWarnings("checkstyle:LineLength")
258     public void testGetStatsAllMatch() throws Exception {
259         GetStatsInput in;
260
261         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.Topology ot1 =
262                 createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NODE_ID1), createRpcSessionState())
263                         .getTopology().get(0);
264         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.Topology ot2 =
265                 createGetStatsOutput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3), createRpcSessionState())
266                         .getTopology().get(0);
267         final GetStatsOutput out = new GetStatsOutputBuilder().setTopology(Arrays.asList(ot1, ot2)).build();
268
269         // Implicitly match all PCEP topologies and nodes
270         in = createGetStatsInput(null, null);
271         performCountTest(in, out);
272
273         // Explicitly match all PCEP topologies and nodes
274         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.Topology it1 =
275                 createGetStatsInput(TOPOLOGY_ID1, Collections.singletonList(NODE_ID1)).getTopology().get(0);
276         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.Topology it2 =
277                 createGetStatsInput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3)).getTopology().get(0);
278         in = new GetStatsInputBuilder().setTopology(Arrays.asList(it1, it2)).build();
279         performCountTest(in, out);
280     }
281
282     private void performTest(final GetStatsInput in, final GetStatsOutput out) throws Exception {
283         final RpcResult<GetStatsOutput> result = rpcService.getStats(in).get();
284         assertEquals(result.getResult(), out);
285         assertTrue(result.isSuccessful());
286         assertTrue(result.getErrors().isEmpty());
287     }
288
289     /*
290      * When topology and/or node list is expected to contain more than one item,
291      * direct comparison will fail due to potential list ordering differences. So
292      * just compare the number of nodes
293      */
294     private void performCountTest(final GetStatsInput in, final GetStatsOutput out) throws Exception {
295         final RpcResult<GetStatsOutput> result = rpcService.getStats(in).get();
296         assertEquals(result.getResult().getTopology().size(), out.getTopology().size());
297         assertTrue(result.isSuccessful());
298         assertEquals(result.getResult().getTopology().stream().flatMap(t -> t.getNode().stream()).count(),
299                 out.getTopology().stream().flatMap(t -> t.getNode().stream()).count());
300         assertTrue(result.isSuccessful());
301         assertTrue(result.getErrors().isEmpty());
302     }
303
304     @SuppressWarnings("checkstyle:LineLength")
305     private static GetStatsInput createGetStatsInput(final String topologyId, final List<String> nodeIds) {
306         final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.topology.Node> nodes;
307         if (nodeIds != null) {
308             nodes = nodeIds.stream().map(
309                 nodeId -> new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.topology.NodeBuilder()
310                         .setNodeId(new NodeId(nodeId)).build())
311                 .collect(Collectors.toList());
312         } else {
313             nodes = null;
314         }
315         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.Topology topology;
316         if (topologyId != null) {
317             topology =
318                     new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.TopologyBuilder()
319                             .setTopologyId(new TopologyId(topologyId)).setNode(nodes).build();
320         } else {
321             topology = null;
322         }
323         return new GetStatsInputBuilder().setTopology(topology != null ? Collections.singletonList(topology) : null)
324                 .build();
325     }
326
327     @SuppressWarnings("checkstyle:LineLength")
328     private static GetStatsOutput createGetStatsOutput(final String topologyId, final List<String> nodeIds,
329             final PcepSessionState state) {
330         final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.topology.Node> nodes;
331         if (nodeIds != null) {
332             nodes = nodeIds.stream().map(
333                 nodeId -> new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.topology.NodeBuilder()
334                         .setNodeId(new NodeId(nodeId)).setPcepSessionState(state).build())
335                 .collect(Collectors.toList());
336         } else {
337             nodes = null;
338         }
339         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.Topology topology;
340         if (topologyId != null) {
341             topology =
342                     new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.TopologyBuilder()
343                             .setTopologyId(new TopologyId(topologyId)).setNode(nodes).build();
344         } else {
345             topology = null;
346         }
347         return new GetStatsOutputBuilder().setTopology(topology != null ? Collections.singletonList(topology) : null)
348                 .build();
349     }
350
351     @After
352     public void tearDown() {
353         rpcService.close();
354     }
355 }