Consider AugmentationNodes when direct descendant is not found
[yangtools.git] / yang / yang-data-codec-xml / src / test / java / org / opendaylight / yangtools / yang / data / codec / xml / Yangtools892Test.java
1 /*
2  * Copyright (c) 2018 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.yangtools.yang.data.codec.xml;
9
10 import java.io.InputStream;
11 import javax.xml.stream.XMLStreamReader;
12 import org.junit.Before;
13 import org.junit.Test;
14 import org.opendaylight.yangtools.util.xml.UntrustedXML;
15 import org.opendaylight.yangtools.yang.common.QName;
16 import org.opendaylight.yangtools.yang.common.Revision;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
18 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
19 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
20 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
21 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
22 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
23 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
24 import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContext;
25 import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefValidation;
26 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
27 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
28 import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory;
29 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.Module;
31 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
32 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
33
34 public class Yangtools892Test {
35     private static final String TEST_BGP_NAME = "test-bgp";
36     private static final String TEST_BGP_NS = "urn:opendaylight:params:xml:ns:yang:test:bgp";
37     private static final String TEST_BGP_REV = "2018-08-14";
38     private static final QName BGP = QName.create(TEST_BGP_NS, TEST_BGP_REV, "bgp");
39     private static final YangInstanceIdentifier BGP_ID = YangInstanceIdentifier.of(BGP);
40
41     private static final String NETWORK_INSTANCE_NAME = "test-network-instance";
42     private static final String NETWORK_INSTANCE_NS = "urn:opendaylight:params:xml:ns:yang:test:network:instance";
43     private static final String NETWORK_INSTANCE_REV = "2018-08-14";
44     private static final QName NETWORK_INSTANCES =
45         QName.create(NETWORK_INSTANCE_NS, NETWORK_INSTANCE_REV, "network-instances");
46     private static final YangInstanceIdentifier NETWORK_INSTANCES_ID = YangInstanceIdentifier.of(NETWORK_INSTANCES);
47
48     private SchemaContext schemaContext;
49     private LeafRefContext leafRefContext;
50     private DataTree dataTree;
51     private ContainerSchemaNode bgpNode;
52     private ContainerSchemaNode networkInstancesNode;
53
54     @Before
55     public void setup() {
56         schemaContext = YangParserTestUtils.parseYangResourceDirectory("/yangtools892");
57         leafRefContext = LeafRefContext.create(schemaContext);
58         dataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext);
59         final Module testBgpModule = schemaContext.findModule(TEST_BGP_NAME, Revision.of(TEST_BGP_REV)).get();
60         bgpNode = (ContainerSchemaNode) testBgpModule.findDataChildByName(BGP).get();
61         final Module networkInstanceModule =
62             schemaContext.findModule(NETWORK_INSTANCE_NAME, Revision.of(NETWORK_INSTANCE_REV)).get();
63         networkInstancesNode = (ContainerSchemaNode) networkInstanceModule.findDataChildByName(NETWORK_INSTANCES).get();
64     }
65
66     @Test
67     public void testWriteBgpNeighbour() throws Exception {
68         final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
69         final NormalizedNode<?, ?> bgp = readNode("/yangtools892/peer-groups.xml", bgpNode);
70         writeModification.write(BGP_ID, bgp);
71         final NormalizedNode<?, ?> networkInstances = readNode("/yangtools892/neighbour.xml", networkInstancesNode);
72         writeModification.write(NETWORK_INSTANCES_ID, networkInstances);
73
74         writeModification.ready();
75         final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
76         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
77         dataTree.commit(writeContributorsCandidate);
78     }
79
80     private NormalizedNode<?, ?> readNode(final String filename, final ContainerSchemaNode node) throws Exception {
81         final InputStream resourceAsStream = Yangtools891Test.class.getResourceAsStream(filename);
82         final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
83         final NormalizedNodeResult result = new NormalizedNodeResult();
84         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
85         final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, node);
86         xmlParser.parse(reader);
87         return result.getResult();
88     }
89 }