MDSAL-310 Binding v2 codec - Instance identifier should not reference choice/case.
[mdsal.git] / binding2 / mdsal-binding2-dom-codec / src / test / java / org / opendaylight / mdsal / binding / javav2 / dom / codec / impl / NormalizedNodeSerializeDeserializeTest.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.mdsal.binding.javav2.dom.codec.impl;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.leafNode;
12
13 import com.google.common.collect.ImmutableList;
14 import java.util.HashSet;
15 import java.util.Map;
16 import java.util.Map.Entry;
17 import java.util.Set;
18 import javassist.ClassPool;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.impl.StreamWriterGenerator;
22 import org.opendaylight.mdsal.binding.javav2.runtime.javassist.JavassistUtils;
23 import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
24 import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
25 import org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.data.TreeLeafOnlyUsesAugment;
26 import org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.dto.TreeLeafOnlyUsesAugmentBuilder;
27 import org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.grp.LeafFromGrouping;
28 import org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.data.ChoiceContainer;
29 import org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.data.Top;
30 import org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.data.choice_container.identifier.simple.SimpleId;
31 import org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.data.top.TopLevelList;
32 import org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.dto.TopBuilder;
33 import org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.dto.choice_container.identifier.simple.SimpleIdBuilder;
34 import org.opendaylight.yangtools.yang.common.QName;
35 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
36 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
37 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
38 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
39 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
40 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder;
41 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
42 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder;
43 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder;
44
45 public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingRuntimeTest {
46     private BindingNormalizedNodeCodecRegistry registry;
47     private static final QName TOP_LEVEL_LIST_NAME_QNAME = QName.create(TopLevelList.QNAME, "name");
48     private static final QName AUGMENTED_STRING_QNAME = QName.create(TopLevelList.QNAME, "augmented-string");
49     private static final QName AUGMENTED_INT_QNAME = QName.create(TopLevelList.QNAME, "augmented-int");
50     private static final QName SIMPLE_VALUE_QNAME = QName.create(LeafFromGrouping.QNAME, "simple-value");
51     private static final QName SIMPLE_TYPE_QNAME = QName.create(LeafFromGrouping.QNAME, "simple-type");
52     private static final QName CHOICE_CONTAINER_QNAME = ChoiceContainer.QNAME;
53     private static final QName SIMPLE_ID_QNAME = SimpleId.QNAME;
54     private static final QName SIMPLE_LEAF_ID_QNAME = QName.create(SimpleId.QNAME, "id");
55
56     private static final InstanceIdentifier<SimpleId> BA_SIMPLE_ID = InstanceIdentifier
57         .builder(ChoiceContainer.class).child(SimpleId.class).build();
58     private static final YangInstanceIdentifier BI_SIMPLE_ID_PATH = YangInstanceIdentifier
59         .of(CHOICE_CONTAINER_QNAME).node(SIMPLE_ID_QNAME);
60
61     @Before
62     public void setup() {
63         super.setup();
64         final JavassistUtils utils = JavassistUtils.forClassPool(ClassPool.getDefault());
65         registry = new BindingNormalizedNodeCodecRegistry(StreamWriterGenerator.create(utils));
66         registry.onBindingRuntimeContextUpdated(getRuntimeContext());
67     }
68
69     private static Top topBindingData() {
70         final TopBuilder tb = new TopBuilder();
71         tb.setTopLevelList(ImmutableList.of(new org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang
72             .mdsal.test.binding.rev140701.dto.top.TopLevelListBuilder()
73             .setIdentifier(new org.opendaylight.mdsal.gen.javav2.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding
74                 .rev140701.key.top.top_level_list.TopLevelListKey("test"))
75             .setName("test")
76             .addAugmentation(TreeLeafOnlyUsesAugment.class,
77                 new TreeLeafOnlyUsesAugmentBuilder().setSimpleType(16).setSimpleValue("simple-value").build())
78             .build()))
79             .setAugmentedInt(32)
80             .setAugmentedString("aug-string");
81         return tb.build();
82     }
83
84     private static AugmentationIdentifier getTopLevelListAugId() {
85         Set<QName> qnames = new HashSet<>();
86         qnames.add(QName.create(LeafFromGrouping.QNAME, "simple-value"));
87         qnames.add(QName.create(LeafFromGrouping.QNAME, "simple-type"));
88         qnames.add(QName.create(LeafFromGrouping.QNAME, "second-simple-value"));
89         qnames.add(QName.create(LeafFromGrouping.QNAME, "list-via-uses"));
90         qnames.add(QName.create(LeafFromGrouping.QNAME, "container-with-uses"));
91         qnames.add(QName.create(LeafFromGrouping.QNAME, "leaf-from-grouping"));
92         qnames.add(QName.create(LeafFromGrouping.QNAME, "identity"));
93         qnames.add(QName.create(LeafFromGrouping.QNAME, "schema-unaware-union"));
94         qnames.add(QName.create(LeafFromGrouping.QNAME, "simple-type-ref"));
95         qnames.add(QName.create(LeafFromGrouping.QNAME, "identity-ref"));
96         qnames.add(QName.create(LeafFromGrouping.QNAME, "schema-unaware-union-ref"));
97
98         return new AugmentationIdentifier(qnames);
99     }
100
101     private static ContainerNode topNormailziedData() {
102         return ImmutableContainerNodeBuilder.create()
103             .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(Top.QNAME))
104             .withChild(ImmutableMapNodeBuilder.create()
105                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TopLevelList.QNAME))
106                 .withChild(ImmutableMapEntryNodeBuilder.create()
107                     .withNodeIdentifier(new NodeIdentifierWithPredicates(TopLevelList.QNAME,
108                         TOP_LEVEL_LIST_NAME_QNAME, "test"))
109                     .withChild(leafNode(TOP_LEVEL_LIST_NAME_QNAME, "test"))
110                     .withChild(ImmutableAugmentationNodeBuilder.create()
111                         .withNodeIdentifier(getTopLevelListAugId())
112                         .withChild(leafNode(SIMPLE_VALUE_QNAME, "simple-value"))
113                         .withChild(leafNode(SIMPLE_TYPE_QNAME, 16))
114                         .build())
115                     .build())
116                 .build())
117             .withChild(leafNode(AUGMENTED_INT_QNAME, 32))
118             .withChild(leafNode(AUGMENTED_STRING_QNAME, "aug-string"))
119             .build();
120     }
121
122     @Test
123     public void topToNormalizedNode() {
124         final Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry =
125             registry.toNormalizedNode(InstanceIdentifier.create(Top.class), topBindingData());
126         assertEquals(topNormailziedData(), entry.getValue());
127     }
128
129     @Test
130     public void topFromNormalizedNode() {
131         final Entry<InstanceIdentifier<?>, TreeNode> entry =
132             registry.fromNormalizedNode(YangInstanceIdentifier.of(Top.QNAME), topNormailziedData());
133         assertEquals(topBindingData(), entry.getValue());
134     }
135
136     private static SimpleId simpleIdBindingData() {
137         return new SimpleIdBuilder().setId(10).build();
138     }
139
140     private static ContainerNode simpleIdNormailziedData() {
141         return ImmutableContainerNodeBuilder.create()
142             .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(SIMPLE_ID_QNAME))
143             .withChild(leafNode(SIMPLE_LEAF_ID_QNAME, 10))
144             .build();
145     }
146
147     @Test
148     public void testChoiceDataToNormalizedNode() {
149         final Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry =
150             registry.toNormalizedNode(BA_SIMPLE_ID, simpleIdBindingData());
151         assertEquals(simpleIdNormailziedData(), entry.getValue());
152     }
153
154     @Test
155     public void testChoiceDataFromNormalizedNode() {
156         final Entry<InstanceIdentifier<?>, TreeNode> entry =
157             registry.fromNormalizedNode(BI_SIMPLE_ID_PATH, simpleIdNormailziedData());
158         assertEquals(simpleIdBindingData(), entry.getValue());
159     }
160
161 }