Update binding-dom adaptation to remove AugmentationNode
[mdsal.git] / binding / mdsal-binding-dom-codec / src / test / java / org / opendaylight / mdsal / binding / dom / codec / impl / AnydataLeafTest.java
1 /*
2  * Copyright (c) 2019 PANTHEON.tech, 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.dom.codec.impl;
9
10 import static org.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertNotEquals;
14 import static org.junit.Assert.assertNotNull;
15 import static org.junit.Assert.assertNull;
16 import static org.junit.Assert.assertSame;
17
18 import java.util.Map.Entry;
19 import javax.xml.transform.dom.DOMSource;
20 import org.junit.Test;
21 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer.NodeResult;
22 import org.opendaylight.yang.gen.v1.mdsal438.norev.Cont;
23 import org.opendaylight.yang.gen.v1.mdsal438.norev.ContBuilder;
24 import org.opendaylight.yang.gen.v1.mdsal438.norev.cont.ContAny;
25 import org.opendaylight.yangtools.util.xml.UntrustedXML;
26 import org.opendaylight.yangtools.yang.binding.AbstractOpaqueData;
27 import org.opendaylight.yangtools.yang.binding.AbstractOpaqueObject;
28 import org.opendaylight.yangtools.yang.binding.DataObject;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.opendaylight.yangtools.yang.binding.OpaqueData;
31 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
32 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
33 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
34 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
35 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
36 import org.w3c.dom.Document;
37 import org.w3c.dom.Element;
38
39 public class AnydataLeafTest extends AbstractBindingCodecTest {
40     private static final NodeIdentifier CONT_NODE_ID = new NodeIdentifier(Cont.QNAME);
41
42     private DOMSource domSource;
43     private ContainerNode cont;
44
45     @Override
46     public void before() {
47         super.before();
48
49         final Document doc = UntrustedXML.newDocumentBuilder().newDocument();
50         final Element element = doc.createElement("foo");
51         domSource = new DOMSource(element);
52
53         cont = Builders.containerBuilder()
54                 .withNodeIdentifier(CONT_NODE_ID)
55                 .withChild(Builders.anydataBuilder(DOMSource.class)
56                     .withNodeIdentifier(new NodeIdentifier(ContAny.QNAME))
57                     .withValue(domSource)
58                     .build())
59                 .build();
60     }
61
62     @Test
63     public void testAnydataToBinding() {
64         final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(
65             YangInstanceIdentifier.create(CONT_NODE_ID), cont);
66         assertEquals(InstanceIdentifier.create(Cont.class), entry.getKey());
67         final DataObject ldo = entry.getValue();
68         assertThat(ldo, instanceOf(Cont.class));
69
70         // So no... GrpAny should be null ..
71         final Cont contValue = (Cont) ldo;
72         assertNull(contValue.getGrpAny());
73
74         // ContAny is interesting
75         final ContAny anyCont = contValue.getContAny();
76         assertNotNull(anyCont);
77         assertEquals(ContAny.class, anyCont.implementedInterface());
78
79         final OpaqueData<?> value = anyCont.getValue();
80         assertNotNull(value);
81         assertEquals(DOMSource.class, value.getObjectModel());
82         assertSame(domSource, value.getData());
83
84         // Stable hashCode
85         final int hashOne = anyCont.hashCode();
86         final int hashTwo = anyCont.hashCode();
87         assertEquals(hashOne, hashTwo);
88
89         // Basic equality
90         assertNotEquals(anyCont, null);
91         assertEquals(anyCont, anyCont);
92         assertEquals(new FakeCont(), anyCont);
93         assertEquals(anyCont, new FakeCont());
94         assertNotEquals(anyCont, new TestNormalizedNodeCont());
95         assertNotEquals(new TestNormalizedNodeCont(), anyCont);
96     }
97
98     @Test
99     public void testAnydataFromBinding() {
100         final var entry = (NodeResult) codecContext.toNormalizedNode(
101             InstanceIdentifier.create(Cont.class), new ContBuilder().setContAny(new FakeCont()).build());
102         assertEquals(YangInstanceIdentifier.create(CONT_NODE_ID), entry.path());
103         assertEquals(cont, entry.node());
104     }
105
106     private final class FakeData extends AbstractOpaqueData<DOMSource> {
107         @Override
108         public Class<DOMSource> getObjectModel() {
109             return DOMSource.class;
110         }
111
112         @Override
113         public DOMSource getData() {
114             return domSource;
115         }
116     }
117
118     private abstract static class AbstractTestCont extends AbstractOpaqueObject<ContAny> implements ContAny {
119
120     }
121
122     private final class FakeCont extends AbstractTestCont {
123         @Override
124         public OpaqueData<?> getValue() {
125             return new FakeData();
126         }
127     }
128
129     private final class TestNormalizedNodeCont extends AbstractTestCont {
130         @Override
131         public OpaqueData<?> getValue() {
132             return new AbstractOpaqueData<NormalizedNode>() {
133
134                 @Override
135                 public Class<NormalizedNode> getObjectModel() {
136                     return NormalizedNode.class;
137                 }
138
139                 @Override
140                 public NormalizedNode getData() {
141                     return cont;
142                 }
143             };
144         }
145     }
146 }