/* * Copyright (c) 2018 Pantheon Technologies s.r.o. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.yangtools.yang.data.codec.xml; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.net.URI; import java.util.Collection; import java.util.Optional; import javax.xml.stream.XMLStreamReader; import org.junit.Before; import org.junit.Test; import org.opendaylight.yangtools.util.xml.UntrustedXML; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; public class Bug890Test { private static final QNameModule FOO_MODULE = QNameModule.create(URI.create("foo"), Revision.of("2018-07-10")); private static final QName OUTGOING_LABELS_QNAME = QName.create(FOO_MODULE, "outgoing-labels"); private static final QName INDEX_QNAME = QName.create(FOO_MODULE, "index"); private SchemaContext schemaContext; @Before public void setUp() throws Exception { schemaContext = YangParserTestUtils.parseYangResource("/bug890/yang/foo.yang"); } @Test public void testinputXml() throws Exception { final InputStream resourceAsStream = XmlToNormalizedNodesTest.class.getResourceAsStream("/bug890/xml/foo.xml"); final Module fooModule = schemaContext.getModules().iterator().next(); final Optional rootCont = fooModule.findDataChildByName( QName.create(fooModule.getQNameModule(), "root")); assertTrue(rootCont.isPresent()); ContainerSchemaNode containerSchemaNode = (ContainerSchemaNode) rootCont.get(); assertNotNull(containerSchemaNode); final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream); final NormalizedNodeResult result = new NormalizedNodeResult(); final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result); final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, containerSchemaNode); xmlParser.parse(reader); assertNotNull(result.getResult()); assertTrue(result.getResult() instanceof ContainerNode); final ContainerNode rootContainer = (ContainerNode) result.getResult(); Optional> myLeaf = rootContainer.getChild(new NodeIdentifier(OUTGOING_LABELS_QNAME)); assertTrue(myLeaf.orElse(null) instanceof ContainerNode); ContainerNode outgoingLabelsContainer = (ContainerNode)myLeaf.get(); Optional> outgoingLabelsList = outgoingLabelsContainer.getChild(new NodeIdentifier(OUTGOING_LABELS_QNAME)); assertTrue(outgoingLabelsList.orElse(null) instanceof MapNode); MapNode outgoingLabelsMap = (MapNode) outgoingLabelsList.get(); assertEquals(2, outgoingLabelsMap.getValue().size()); Collection labels = outgoingLabelsMap.getValue(); YangInstanceIdentifier.NodeIdentifierWithPredicates firstNodeId = new YangInstanceIdentifier.NodeIdentifierWithPredicates(OUTGOING_LABELS_QNAME, INDEX_QNAME, 0); YangInstanceIdentifier.NodeIdentifierWithPredicates secondNodeId = new YangInstanceIdentifier.NodeIdentifierWithPredicates(OUTGOING_LABELS_QNAME, INDEX_QNAME, 1); assertTrue(labels.stream().anyMatch(mapEntryNode -> mapEntryNode.getIdentifier().compareTo(firstNodeId) == 0)); assertTrue(labels.stream().anyMatch(mapEntryNode -> mapEntryNode.getIdentifier().compareTo(secondNodeId) == 0)); } }