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