2 * Copyright (c) 2017 Cisco Systems, Inc. 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 static org.junit.Assert.assertNotNull;
12 import org.junit.Before;
13 import org.junit.Test;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
16 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
18 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
19 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
20 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
21 import org.opendaylight.yangtools.yang.data.tree.api.DataTree;
22 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
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.api.TreeType;
27 import org.opendaylight.yangtools.yang.data.tree.impl.di.InMemoryDataTreeFactory;
28 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
29 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
31 public class Bug8291Test {
32 private static final String NS = "bug8291";
33 private static final QName ROOT = QName.create(NS, "root");
34 private static final QName OUTER_LIST = QName.create(NS, "outer-list");
35 private static final QName OUTER_LIST_ID = QName.create(NS, "id");
36 private static final QName INNER_LIST = QName.create(NS, "inner-list");
38 private EffectiveModelContext schemaContext;
42 schemaContext = YangParserTestUtils.parseYang("""
67 assertNotNull("Schema context must not be null.", schemaContext);
70 private static DataTree initDataTree(final EffectiveModelContext schemaContext)
71 throws DataValidationFailedException {
72 final DataTreeConfiguration config = new DataTreeConfiguration.Builder(TreeType.CONFIGURATION).setRootPath(
73 YangInstanceIdentifier.of(ROOT).node(OUTER_LIST)).build();
74 return new InMemoryDataTreeFactory().create(config, schemaContext);
78 public void test() throws DataValidationFailedException {
79 final DataTree inMemoryDataTree = initDataTree(schemaContext);
80 writeOuterListMapEntry(inMemoryDataTree);
81 writeInnerList(inMemoryDataTree);
84 private static void writeInnerList(final DataTree inMemoryDataTree) throws DataValidationFailedException {
85 final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
86 modificationTree.write(
87 YangInstanceIdentifier.of(NodeIdentifierWithPredicates.of(OUTER_LIST, OUTER_LIST_ID, 1)).node(INNER_LIST),
88 Builders.mapBuilder().withNodeIdentifier(new NodeIdentifier(INNER_LIST)).build());
90 modificationTree.ready();
91 inMemoryDataTree.validate(modificationTree);
92 final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
93 inMemoryDataTree.commit(prepare);
96 private static void writeOuterListMapEntry(final DataTree inMemoryDataTree)
97 throws DataValidationFailedException {
98 final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
100 final MapEntryNode outerListMapEntry = Builders.mapEntryBuilder()
101 .withNodeIdentifier(NodeIdentifierWithPredicates.of(OUTER_LIST, OUTER_LIST_ID, 1))
102 .withChild(ImmutableNodes.leafNode(OUTER_LIST_ID, 1))
105 modificationTree.write(YangInstanceIdentifier.of(NodeIdentifierWithPredicates.of(OUTER_LIST, OUTER_LIST_ID, 1)),
107 modificationTree.ready();
109 inMemoryDataTree.validate(modificationTree);
110 final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
111 inMemoryDataTree.commit(prepare);