Bump MRI upstreams
[netconf.git] / netconf / sal-netconf-connector / src / test / java / org / opendaylight / netconf / sal / connect / netconf / util / FieldsSchemalessRpcStructureTransformerTest.java
1 /*
2  * Copyright © 2020 FRINX s.r.o. 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.netconf.sal.connect.netconf.util;
9
10 import static org.junit.Assert.assertTrue;
11 import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.toId;
12
13 import java.io.IOException;
14 import java.net.URISyntaxException;
15 import java.nio.file.Files;
16 import java.nio.file.Paths;
17 import java.util.Collections;
18 import java.util.List;
19 import java.util.Map;
20 import org.custommonkey.xmlunit.Diff;
21 import org.junit.Test;
22 import org.opendaylight.netconf.api.xml.XmlUtil;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.common.QNameModule;
25 import org.opendaylight.yangtools.yang.common.Revision;
26 import org.opendaylight.yangtools.yang.common.XMLNamespace;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
30 import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
31 import org.w3c.dom.Element;
32 import org.xml.sax.SAXException;
33
34 public class FieldsSchemalessRpcStructureTransformerTest {
35
36     /**
37      * Sample YANG structure.<br>
38      * container c-1 {
39      *     leaf leaf-1 {
40      *         type string;
41      *     }
42      *     list list-1 {
43      *         leaf key-1 {
44      *             type string;
45      *         }
46      *         leaf key-2 {
47      *             type string;
48      *         }
49      *         container c-2 {
50      *             leaf leaf-3 {
51      *                 type string;
52      *             }
53      *             leaf leaf-4 {
54      *                 type string;
55      *             }
56      *         }
57      *     }
58      * }
59      * container c-x {
60      *     leaf l-x {
61      *         type boolean;
62      *     }
63      *     leaf l-y {
64      *         type boolean;
65      *     }
66      * }
67      */
68     private static final QNameModule TEST_MODULE = QNameModule.create(
69             XMLNamespace.of("test-namespace"), Revision.of("2020-10-25"));
70
71     private static final NodeIdentifier C1_NID = toId(QName.create(TEST_MODULE, "c-1"));
72     private static final NodeIdentifier C2_NID = toId(QName.create(TEST_MODULE, "c-2"));
73     private static final NodeIdentifier CX_NID = toId(QName.create(TEST_MODULE, "c-x"));
74
75     private static final NodeIdentifier LEAF1_NID = toId(QName.create(TEST_MODULE, "leaf-1"));
76     private static final NodeIdentifier LEAF2_NID = toId(QName.create(TEST_MODULE, "leaf-2"));
77     private static final NodeIdentifier LEAF3_NID = toId(QName.create(TEST_MODULE, "leaf-3"));
78     private static final NodeIdentifier LX_NID = toId(QName.create(TEST_MODULE, "l-x"));
79
80     private static final QName KEY1_QNAME = QName.create(TEST_MODULE, "key-1");
81     private static final QName KEY2_QNAME = QName.create(TEST_MODULE, "key-2");
82     private static final NodeIdentifier KEY1_NID = toId(KEY1_QNAME);
83
84     private static final QName LIST1_QNAME = QName.create(TEST_MODULE, "list-1");
85     private static final NodeIdentifier LIST1_NID = toId(LIST1_QNAME);
86
87     private final SchemalessRpcStructureTransformer transformer = new SchemalessRpcStructureTransformer();
88
89     @Test
90     public void toFilterStructureWithSingleRootTest() throws SAXException, IOException, URISyntaxException {
91         final YangInstanceIdentifier rootPath = YangInstanceIdentifier.create(C1_NID);
92         final YangInstanceIdentifier leaf1Field = YangInstanceIdentifier.create(LEAF1_NID);
93         final YangInstanceIdentifier leaf3Field = YangInstanceIdentifier.create(NodeIdentifierWithPredicates.of(
94                 LIST1_QNAME, Map.of(KEY1_QNAME, "key1", KEY2_QNAME, "key2")), C2_NID, LEAF3_NID);
95         final YangInstanceIdentifier key1Field = YangInstanceIdentifier.create(NodeIdentifierWithPredicates.of(
96                 LIST1_QNAME, Map.of(KEY1_QNAME, "key1", KEY2_QNAME, "key2")), KEY1_NID);
97         final FieldsFilter filter = FieldsFilter.of(rootPath, List.of(leaf1Field, leaf3Field, key1Field));
98
99         final DOMSourceAnyxmlNode filterStructure = (DOMSourceAnyxmlNode) transformer.toFilterStructure(
100                 Collections.singletonList(filter));
101         final Diff diff = getDiff("one-root-filter.xml", filterStructure);
102         assertTrue(diff.similar());
103     }
104
105     @Test
106     public void toFilterStructureWithTwoRootContainersTest() throws SAXException, IOException, URISyntaxException {
107         final YangInstanceIdentifier c1RootPath = YangInstanceIdentifier.create(C1_NID);
108         final YangInstanceIdentifier cxRootPath = YangInstanceIdentifier.create(CX_NID);
109         final YangInstanceIdentifier c2Field = YangInstanceIdentifier.create(LIST1_NID, C2_NID);
110         final YangInstanceIdentifier leaf2Field = YangInstanceIdentifier.create(LIST1_NID, C2_NID, LEAF2_NID);
111         final YangInstanceIdentifier lxField = YangInstanceIdentifier.create(LX_NID);
112
113         final FieldsFilter filter1 = FieldsFilter.of(c1RootPath, List.of(c2Field, leaf2Field));
114         final FieldsFilter filter2 = FieldsFilter.of(cxRootPath, Collections.singletonList(lxField));
115         final DOMSourceAnyxmlNode filterStructure = (DOMSourceAnyxmlNode) transformer.toFilterStructure(
116                 List.of(filter1, filter2));
117         final Diff diff = getDiff("two-roots-filter.xml", filterStructure);
118         assertTrue(diff.similar());
119     }
120
121     private static Diff getDiff(final String filterFileName, final DOMSourceAnyxmlNode filterStructure)
122             throws IOException, SAXException, URISyntaxException {
123         final String body = XmlUtil.toString((Element) filterStructure.body().getNode());
124         final String expectedBody = new String(Files.readAllBytes(Paths.get(FieldsSchemalessRpcStructureTransformerTest
125                 .class.getResource("/schemaless/filter/" + filterFileName).toURI())));
126         return new Diff(expectedBody, body);
127     }
128 }