2 * Copyright (c) 2015 Pantheon Technologies s.r.o. 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.yangtools.yang.data.tree.impl;
10 import org.junit.jupiter.api.Test;
11 import org.opendaylight.yangtools.yang.common.QName;
12 import org.opendaylight.yangtools.yang.common.QNameModule;
13 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
14 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
15 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
16 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
17 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
18 import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode;
19 import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBuilder;
20 import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
21 import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
22 import org.opendaylight.yangtools.yang.data.tree.api.DataTree;
23 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeConfiguration;
24 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModification;
25 import org.opendaylight.yangtools.yang.data.tree.api.DataValidationFailedException;
26 import org.opendaylight.yangtools.yang.data.tree.impl.di.InMemoryDataTreeFactory;
27 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
31 private DataTree inMemoryDataTree;
33 private QName subRoot;
34 private QName outerList;
35 private QName innerList;
40 private QNameModule foo;
43 void test() throws DataValidationFailedException {
44 foo = QNameModule.of("foo");
45 root = QName.create(foo, "root");
46 subRoot = QName.create(foo, "sub-root");
47 outerList = QName.create(foo, "outer-list");
48 innerList = QName.create(foo, "inner-list");
49 oid = QName.create(foo, "o-id");
50 iid = QName.create(foo, "i-id");
51 oleaf = QName.create(foo, "o");
52 ileaf = QName.create(foo, "i");
53 inMemoryDataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_OPERATIONAL,
54 YangParserTestUtils.parseYang("""
84 secondModification(1);
85 secondModification(2);
86 secondModification(3);
89 private void firstModification() throws DataValidationFailedException {
91 YangInstanceIdentifier path = YangInstanceIdentifier.of(root);
92 DataTreeModification modification = inMemoryDataTree.takeSnapshot().newModification();
93 modification.merge(path, createRootContainerBuilder()
94 .withChild(createSubRootContainerBuilder()
95 .withChild(ImmutableNodes.newSystemMapBuilder()
96 .withNodeIdentifier(NodeIdentifier.create(outerList))
97 .withChild(createOuterListEntry("1", "o-1"))
98 .withChild(createOuterListEntry("2", "o-2"))
99 .withChild(createOuterListEntry("3", "o-3"))
104 /* WRITE INNER LIST WITH ENTRIES*/
105 path = YangInstanceIdentifier.of(root).node(subRoot).node(outerList).node(createOuterListEntryPath("2"))
107 modification.write(path, createInnerListBuilder()
108 .withChild(createInnerListEntry("a", "i-a"))
109 .withChild(createInnerListEntry("b", "i-b"))
113 modification.ready();
114 inMemoryDataTree.validate(modification);
115 inMemoryDataTree.commit(inMemoryDataTree.prepare(modification));
118 private void secondModification(final int testScenarioNumber) throws DataValidationFailedException {
120 ContainerNode rootContainerNode = createRootContainerBuilder()
121 .withChild(createSubRootContainerBuilder()
122 .withChild(ImmutableNodes.newSystemMapBuilder()
123 .withNodeIdentifier(NodeIdentifier.create(outerList))
124 .withChild(createOuterListEntry("3", "o-3"))
125 .withChild(createOuterListEntry("4", "o-4"))
126 .withChild(createOuterListEntry("5", "o-5"))
131 YangInstanceIdentifier path = YangInstanceIdentifier.of(root);
132 DataTreeModification modification = inMemoryDataTree.takeSnapshot().newModification();
133 modification.merge(path, rootContainerNode);
135 switch (testScenarioNumber) {
137 /* WRITE EMPTY INNER LIST */
138 writeEmptyInnerList(modification, "2");
141 /* WRITE INNER LIST ENTRY */
142 MapEntryNode innerListEntryA = createInnerListEntry("a", "i-a-2");
143 path = YangInstanceIdentifier.of(root, subRoot, outerList).node(createOuterListEntryPath("2"))
144 .node(innerList).node(createInnerListEntryPath("a"));
145 modification.write(path, innerListEntryA);
149 /* WRITE INNER LIST WITH ENTRIES */
150 path = YangInstanceIdentifier.of(root, subRoot, outerList).node(createOuterListEntryPath("2"))
152 modification.write(path, createInnerListBuilder()
153 .withChild(createInnerListEntry("a", "i-a-3"))
154 .withChild(createInnerListEntry("c", "i-c"))
163 modification.ready();
164 inMemoryDataTree.validate(modification);
165 inMemoryDataTree.commit(inMemoryDataTree.prepare(modification));
168 private void writeEmptyInnerList(final DataTreeModification modification, final String outerListEntryKey) {
169 YangInstanceIdentifier path = YangInstanceIdentifier.of(root, subRoot, outerList)
170 .node(createOuterListEntryPath(outerListEntryKey)).node(innerList);
171 modification.write(path, createInnerListBuilder().build());
174 private DataContainerNodeBuilder<NodeIdentifier, ContainerNode> createRootContainerBuilder() {
175 return ImmutableNodes.newContainerBuilder().withNodeIdentifier(new NodeIdentifier(root));
178 private DataContainerNodeBuilder<NodeIdentifier, ContainerNode> createSubRootContainerBuilder() {
179 return ImmutableNodes.newContainerBuilder().withNodeIdentifier(new NodeIdentifier(subRoot));
182 private CollectionNodeBuilder<MapEntryNode, SystemMapNode> createInnerListBuilder() {
183 return ImmutableNodes.newSystemMapBuilder().withNodeIdentifier(NodeIdentifier.create(innerList));
186 private NodeIdentifierWithPredicates createInnerListEntryPath(final String keyValue) {
187 return NodeIdentifierWithPredicates.of(innerList, iid, keyValue);
190 private NodeIdentifierWithPredicates createOuterListEntryPath(final String keyValue) {
191 return NodeIdentifierWithPredicates.of(outerList, oid, keyValue);
194 private MapEntryNode createOuterListEntry(final String keyValue, final String leafValue) {
195 return ImmutableNodes.newMapEntryBuilder()
196 .withNodeIdentifier(NodeIdentifierWithPredicates.of(outerList, oid, keyValue))
197 .withChild(ImmutableNodes.leafNode(oid, keyValue))
198 .withChild(ImmutableNodes.leafNode(oleaf, leafValue))
202 private MapEntryNode createInnerListEntry(final String keyValue, final String leafValue) {
203 return ImmutableNodes.newMapEntryBuilder()
204 .withNodeIdentifier(NodeIdentifierWithPredicates.of(innerList, iid, keyValue))
205 .withChild(ImmutableNodes.leafNode(iid, keyValue))
206 .withChild(ImmutableNodes.leafNode(ileaf, leafValue))