2 * Copyright (c) 2019 PANTHEON.tech, s.r.o. 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.mdsal.binding.dom.codec.impl;
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;
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.mdsal437.norev.Cont;
22 import org.opendaylight.yang.gen.v1.mdsal437.norev.ContBuilder;
23 import org.opendaylight.yang.gen.v1.mdsal437.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;
38 public class AnyxmlLeafTest extends AbstractBindingCodecTest {
39 private static final NodeIdentifier CONT_NODE_ID = new NodeIdentifier(Cont.QNAME);
41 private DOMSource domSource;
42 private ContainerNode cont;
45 public void before() {
48 final Document doc = UntrustedXML.newDocumentBuilder().newDocument();
49 final Element element = doc.createElement("foo");
50 domSource = new DOMSource(element);
52 cont = Builders.containerBuilder()
53 .withNodeIdentifier(CONT_NODE_ID)
54 .withChild(Builders.anyXmlBuilder()
55 .withNodeIdentifier(new NodeIdentifier(ContAny.QNAME))
62 public void testAnyxmlToBinding() {
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));
69 // So no... GrpAny should be null ..
70 final Cont contValue = (Cont) ldo;
71 assertNull(contValue.getGrpAny());
73 // ContAny is interesting
74 final ContAny anyCont = contValue.getContAny();
75 assertNotNull(anyCont);
76 assertEquals(ContAny.class, anyCont.implementedInterface());
78 final OpaqueData<?> value = anyCont.getValue();
80 assertEquals(DOMSource.class, value.getObjectModel());
81 assertSame(domSource, value.getData());
84 final int hashOne = anyCont.hashCode();
85 final int hashTwo = anyCont.hashCode();
86 assertEquals(hashOne, hashTwo);
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);
98 public void testAnyxmlFromBinding() {
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());
105 private final class FakeData extends AbstractOpaqueData<DOMSource> {
107 public Class<DOMSource> getObjectModel() {
108 return DOMSource.class;
112 public DOMSource getData() {
117 private abstract static class AbstractTestCont extends AbstractOpaqueObject<ContAny> implements ContAny {
121 private final class FakeCont extends AbstractTestCont {
123 public OpaqueData<?> getValue() {
124 return new FakeData();
128 private final class TestNormalizedNodeCont extends AbstractTestCont {
130 public OpaqueData<?> getValue() {
131 return new AbstractOpaqueData<NormalizedNode>() {
134 public Class<NormalizedNode> getObjectModel() {
135 return NormalizedNode.class;
139 public NormalizedNode getData() {