Expose streams with all supported encodings
[netconf.git] / restconf / restconf-nb / src / test / java / org / opendaylight / restconf / server / spi / AbstractRestconfStreamRegistryTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, 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.restconf.server.spi;
9
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;
13
14 import java.util.HashMap;
15 import java.util.Map;
16 import java.util.Set;
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;
31
32 /**
33  * Unit tests for {@link AbstractRestconfStreamRegistry}.
34  */
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");
40
41     @Test
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";
46
47         assertMappedData(prepareMap(streamName, uri, outputType),
48             AbstractRestconfStreamRegistry.streamEntry(streamName, "description", "location",
49                 Set.of(new EncodingName(outputType))));
50     }
51
52     @Test
53     void toStreamEntryNodeNotifiTest() throws Exception {
54         final var outputType = "JSON";
55         final var uri = "uri";
56
57         assertMappedData(prepareMap("notifi", uri, outputType),
58             AbstractRestconfStreamRegistry.streamEntry("notifi", "description", "location",
59                 Set.of(new EncodingName(outputType))));
60     }
61
62     private static Map<QName, Object> prepareMap(final String name, final String uri, final String outputType) {
63         return Map.of(
64             AbstractRestconfStreamRegistry.NAME_QNAME, name,
65             AbstractRestconfStreamRegistry.LOCATION_QNAME, uri,
66             AbstractRestconfStreamRegistry.ENCODING_QNAME, outputType,
67             AbstractRestconfStreamRegistry.DESCRIPTION_QNAME, "description");
68     }
69
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());
76             }
77         }
78     }
79
80     /**
81      * Verify whether the loaded modules contain any deviations.
82      *
83      * @param containerNode
84      *             modules
85      */
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)) {
94                             deviationsFound++;
95                         }
96                     }
97                 }
98             }
99         }
100         assertTrue(deviationsFound > 0);
101     }
102
103     /**
104      * Verify loaded modules.
105      *
106      * @param containerNode
107      *             modules
108      */
109     // FIXME: what is this supposed to verify?
110     private static void verifyLoadedModules(final ContainerNode containerNode) {
111         final var loadedModules = new HashMap<String, String>();
112
113         for (var child : containerNode.body()) {
114             if (child instanceof LeafNode) {
115                 assertEquals(QName.create(Module.QNAME, "module-set-id"), child.name().getNodeType());
116             }
117             if (child instanceof MapNode mapChild) {
118                 assertEquals(Module.QNAME, child.name().getNodeType());
119                 for (var mapEntryNode : mapChild.body()) {
120                     String name = "";
121                     String revision = "";
122                     for (var dataContainerChild : mapEntryNode.body()) {
123                         switch (dataContainerChild.name().getNodeType().getLocalName()) {
124                             case "name":
125                                 name = String.valueOf(dataContainerChild.body());
126                                 break;
127                             case "revision":
128                                 revision = String.valueOf(dataContainerChild.body());
129                                 break;
130                             default :
131                                 LOG.info("Unknown local name '{}' of node.",
132                                     dataContainerChild.name().getNodeType().getLocalName());
133                                 break;
134                         }
135                     }
136                     loadedModules.put(name, revision);
137                 }
138             }
139         }
140
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());
148
149             loadedModules.remove(name);
150         }
151     }
152 }