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.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer.NodeResult;
22 import org.opendaylight.yang.gen.v1.mdsal437.norev.Cont;
23 import org.opendaylight.yang.gen.v1.mdsal437.norev.ContBuilder;
24 import org.opendaylight.yang.gen.v1.mdsal437.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;
39 public class AnyxmlLeafTest extends AbstractBindingCodecTest {
40 private static final NodeIdentifier CONT_NODE_ID = new NodeIdentifier(Cont.QNAME);
42 private DOMSource domSource;
43 private ContainerNode cont;
46 public void before() {
49 final Document doc = UntrustedXML.newDocumentBuilder().newDocument();
50 final Element element = doc.createElement("foo");
51 domSource = new DOMSource(element);
53 cont = Builders.containerBuilder()
54 .withNodeIdentifier(CONT_NODE_ID)
55 .withChild(Builders.anyXmlBuilder()
56 .withNodeIdentifier(new NodeIdentifier(ContAny.QNAME))
63 public void testAnyxmlToBinding() {
64 final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(
65 YangInstanceIdentifier.of(CONT_NODE_ID), cont);
66 assertEquals(InstanceIdentifier.create(Cont.class), entry.getKey());
67 final DataObject ldo = entry.getValue();
68 assertThat(ldo, instanceOf(Cont.class));
70 // So no... GrpAny should be null ..
71 final Cont contValue = (Cont) ldo;
72 assertNull(contValue.getGrpAny());
74 // ContAny is interesting
75 final ContAny anyCont = contValue.getContAny();
76 assertNotNull(anyCont);
77 assertEquals(ContAny.class, anyCont.implementedInterface());
79 final OpaqueData<?> value = anyCont.getValue();
81 assertEquals(DOMSource.class, value.getObjectModel());
82 assertSame(domSource, value.getData());
85 final int hashOne = anyCont.hashCode();
86 final int hashTwo = anyCont.hashCode();
87 assertEquals(hashOne, hashTwo);
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);
99 public void testAnyxmlFromBinding() {
100 final var entry = (NodeResult) codecContext.toNormalizedNode(
101 InstanceIdentifier.create(Cont.class), new ContBuilder().setContAny(new FakeCont()).build());
102 assertEquals(YangInstanceIdentifier.of(CONT_NODE_ID), entry.path());
103 assertEquals(cont, entry.node());
106 private final class FakeData extends AbstractOpaqueData<DOMSource> {
108 public Class<DOMSource> getObjectModel() {
109 return DOMSource.class;
113 public DOMSource getData() {
118 private abstract static class AbstractTestCont extends AbstractOpaqueObject<ContAny> implements ContAny {
122 private final class FakeCont extends AbstractTestCont {
124 public OpaqueData<?> getValue() {
125 return new FakeData();
129 private final class TestNormalizedNodeCont extends AbstractTestCont {
131 public OpaqueData<?> getValue() {
132 return new AbstractOpaqueData<NormalizedNode>() {
135 public Class<NormalizedNode> getObjectModel() {
136 return NormalizedNode.class;
140 public NormalizedNode getData() {