2 * Copyright © 2020 FRINX s.r.o. 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.netconf.sal.connect.netconf.util;
10 import static org.junit.Assert.assertTrue;
11 import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.toId;
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;
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;
34 public class FieldsSchemalessRpcStructureTransformerTest {
37 * Sample YANG structure.<br>
68 private static final QNameModule TEST_MODULE = QNameModule.create(
69 XMLNamespace.of("test-namespace"), Revision.of("2020-10-25"));
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"));
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"));
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);
84 private static final QName LIST1_QNAME = QName.create(TEST_MODULE, "list-1");
85 private static final NodeIdentifier LIST1_NID = toId(LIST1_QNAME);
87 private final SchemalessRpcStructureTransformer transformer = new SchemalessRpcStructureTransformer();
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));
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());
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);
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());
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);