0dc9d96e95d3a6f030ca0fd3ead2f14252a6d57e
[yangtools.git] / data / yang-data-tree-ri / src / test / java / org / opendaylight / yangtools / yang / data / tree / impl / Bug8291Test.java
1 /*
2  * Copyright (c) 2017 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.tree.impl;
9
10 import static org.junit.Assert.assertNotNull;
11
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;
30
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");
37
38     private EffectiveModelContext schemaContext;
39
40     @Before
41     public void init() {
42         schemaContext = YangParserTestUtils.parseYang("""
43             module bug8291 {
44               yang-version 1;
45               namespace bug8291;
46               prefix bug8291;
47
48               container root {
49                 list outer-list {
50                   key "id";
51                   leaf id {
52                     type uint16;
53                   }
54
55                   list inner-list {
56                     key name;
57                     leaf name {
58                       type string;
59                     }
60                     leaf value {
61                       type string;
62                     }
63                   }
64                 }
65               }
66             }""");
67         assertNotNull("Schema context must not be null.", schemaContext);
68     }
69
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);
75     }
76
77     @Test
78     public void test() throws DataValidationFailedException {
79         final DataTree inMemoryDataTree = initDataTree(schemaContext);
80         writeOuterListMapEntry(inMemoryDataTree);
81         writeInnerList(inMemoryDataTree);
82     }
83
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());
89
90         modificationTree.ready();
91         inMemoryDataTree.validate(modificationTree);
92         final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
93         inMemoryDataTree.commit(prepare);
94     }
95
96     private static void writeOuterListMapEntry(final DataTree inMemoryDataTree)
97             throws DataValidationFailedException {
98         final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
99
100         final MapEntryNode outerListMapEntry = Builders.mapEntryBuilder()
101             .withNodeIdentifier(NodeIdentifierWithPredicates.of(OUTER_LIST, OUTER_LIST_ID, 1))
102             .withChild(ImmutableNodes.leafNode(OUTER_LIST_ID, 1))
103             .build();
104
105         modificationTree.write(YangInstanceIdentifier.of(NodeIdentifierWithPredicates.of(OUTER_LIST, OUTER_LIST_ID, 1)),
106             outerListMapEntry);
107         modificationTree.ready();
108
109         inMemoryDataTree.validate(modificationTree);
110         final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
111         inMemoryDataTree.commit(prepare);
112     }
113 }