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