2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.restconf.server.spi;
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertNotNull;
12 import static org.junit.jupiter.api.Assertions.assertTrue;
14 import java.util.HashMap;
17 import org.junit.jupiter.api.Test;
18 import org.opendaylight.restconf.server.spi.RestconfStream.EncodingName;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.Module;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.module.Deviation;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.common.Revision;
23 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
25 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
26 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
27 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
28 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
33 * Unit tests for {@link AbstractRestconfStreamRegistry}.
35 class AbstractRestconfStreamRegistryTest {
36 private static final Logger LOG = LoggerFactory.getLogger(AbstractRestconfStreamRegistryTest.class);
37 private static final EffectiveModelContext CONTEXT =
38 // TODO: assemble these from dependencies?
39 YangParserTestUtils.parseYangResourceDirectory("/modules/restconf-module-testing");
42 void toStreamEntryNodeTest() throws Exception {
43 final var outputType = "XML";
44 final var uri = "uri";
45 final var streamName = "/nested-module:depth1-cont/depth2-leaf1";
47 assertMappedData(prepareMap(streamName, uri, outputType),
48 AbstractRestconfStreamRegistry.streamEntry(streamName, "description", "location",
49 Set.of(new EncodingName(outputType))));
53 void toStreamEntryNodeNotifiTest() throws Exception {
54 final var outputType = "JSON";
55 final var uri = "uri";
57 assertMappedData(prepareMap("notifi", uri, outputType),
58 AbstractRestconfStreamRegistry.streamEntry("notifi", "description", "location",
59 Set.of(new EncodingName(outputType))));
62 private static Map<QName, Object> prepareMap(final String name, final String uri, final String outputType) {
64 AbstractRestconfStreamRegistry.NAME_QNAME, name,
65 AbstractRestconfStreamRegistry.LOCATION_QNAME, uri,
66 AbstractRestconfStreamRegistry.ENCODING_QNAME, outputType,
67 AbstractRestconfStreamRegistry.DESCRIPTION_QNAME, "description");
70 private static void assertMappedData(final Map<QName, Object> map, final MapEntryNode mappedData) {
71 assertNotNull(mappedData);
72 for (var child : mappedData.body()) {
73 if (child instanceof LeafNode<?> leaf) {
74 assertTrue(map.containsKey(leaf.name().getNodeType()));
75 assertEquals(map.get(leaf.name().getNodeType()), leaf.body());
81 * Verify whether the loaded modules contain any deviations.
83 * @param containerNode
86 // FIXME: what is this supposed to verify?
87 private static void verifyDeviations(final ContainerNode containerNode) {
88 int deviationsFound = 0;
89 for (var child : containerNode.body()) {
90 if (child instanceof MapNode mapChild) {
91 for (var mapEntryNode : mapChild.body()) {
92 for (var dataContainerChild : mapEntryNode.body()) {
93 if (dataContainerChild.name().getNodeType().equals(Deviation.QNAME)) {
100 assertTrue(deviationsFound > 0);
104 * Verify loaded modules.
106 * @param containerNode
109 // FIXME: what is this supposed to verify?
110 private static void verifyLoadedModules(final ContainerNode containerNode) {
111 final var loadedModules = new HashMap<String, String>();
113 for (var child : containerNode.body()) {
114 if (child instanceof LeafNode) {
115 assertEquals(QName.create(Module.QNAME, "module-set-id"), child.name().getNodeType());
117 if (child instanceof MapNode mapChild) {
118 assertEquals(Module.QNAME, child.name().getNodeType());
119 for (var mapEntryNode : mapChild.body()) {
121 String revision = "";
122 for (var dataContainerChild : mapEntryNode.body()) {
123 switch (dataContainerChild.name().getNodeType().getLocalName()) {
125 name = String.valueOf(dataContainerChild.body());
128 revision = String.valueOf(dataContainerChild.body());
131 LOG.info("Unknown local name '{}' of node.",
132 dataContainerChild.name().getNodeType().getLocalName());
136 loadedModules.put(name, revision);
141 final var expectedModules = CONTEXT.getModules();
142 assertEquals(expectedModules.size(), loadedModules.size());
143 for (var m : expectedModules) {
144 final String name = m.getName();
145 final String revision = loadedModules.get(name);
146 assertNotNull("Expected module not found", revision);
147 assertEquals(Revision.ofNullable(revision), m.getRevision());
149 loadedModules.remove(name);