/* * Copyright (c) 2018 Cisco Systems, Inc. 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.impl.leafref; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.opendaylight.yangtools.yang.common.QName; 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.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; public class YT891Test { private static final QName FOO_TOP = QName.create("urn:opendaylight:params:xml:ns:yang:foo", "2018-07-27", "foo-top"); private static final QName CONTAINER_IN_LIST = QName.create(FOO_TOP, "container-in-list"); private static final QName LIST_IN_GROUPING = QName.create(FOO_TOP, "list-in-grouping"); private static final QName NAME = QName.create(FOO_TOP, "name"); private static final QName REF = QName.create(FOO_TOP, "ref"); private static final YangInstanceIdentifier FOO_TOP_ID = YangInstanceIdentifier.of(FOO_TOP); private static final QName BAZ_TOP = QName.create("urn:opendaylight:params:xml:ns:yang:baz", "2018-07-27", "baz-top"); private static final QName BAZ_NAME = QName.create(BAZ_TOP, "name"); private static final QName LIST_IN_CONTAINER = QName.create(BAZ_TOP, "list-in-container"); private static final YangInstanceIdentifier BAZ_TOP_ID = YangInstanceIdentifier.of(BAZ_TOP); private static EffectiveModelContext schemaContext; private static LeafRefContext leafRefContext; private DataTree dataTree; @Before public void before() { dataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext); } @BeforeClass public static void beforeClass() { schemaContext = YangParserTestUtils.parseYangResourceDirectory("/yt891"); leafRefContext = LeafRefContext.create(schemaContext); } @AfterClass public static void afterClass() { schemaContext = null; leafRefContext = null; } @Test public void testValid() throws Exception { final DataTreeModification writeModification = dataTree.takeSnapshot().newModification(); writeModification.write(FOO_TOP_ID, fooTopWithList("name1")); writeModification.ready(); final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification); LeafRefValidation.validate(writeContributorsCandidate, leafRefContext); dataTree.commit(writeContributorsCandidate); } @Test(expected = LeafRefDataValidationFailedException.class) public void testInvalid() throws Exception { final DataTreeModification writeModification = dataTree.takeSnapshot().newModification(); writeModification.write(FOO_TOP_ID, fooTopWithList("name2")); writeModification.ready(); LeafRefValidation.validate(dataTree.prepare(writeModification), leafRefContext); } @Test public void testGroupingWithLeafrefValid() throws Exception { final DataTreeModification writeModification = dataTree.takeSnapshot().newModification(); writeModification.write(BAZ_TOP_ID, bazTop()); writeModification.write(FOO_TOP_ID, fooTopWithRef("name1")); writeModification.ready(); LeafRefValidation.validate(dataTree.prepare(writeModification), leafRefContext); } @Test(expected = LeafRefDataValidationFailedException.class) public void testGroupingWithLeafrefInvalid() throws Exception { final DataTreeModification writeModification = dataTree.takeSnapshot().newModification(); writeModification.write(BAZ_TOP_ID, bazTop()); writeModification.write(FOO_TOP_ID, fooTopWithRef("name3")); writeModification.ready(); LeafRefValidation.validate(dataTree.prepare(writeModification), leafRefContext); } private static ContainerNode fooTopWithList(final String refValue) { return Builders.containerBuilder() .withNodeIdentifier(new NodeIdentifier(FOO_TOP)) .withChild(Builders.mapBuilder() .withNodeIdentifier(new NodeIdentifier(LIST_IN_GROUPING)) .withChild(Builders.mapEntryBuilder() .withNodeIdentifier(NodeIdentifierWithPredicates.of(LIST_IN_GROUPING, NAME, "name1")) .withChild(ImmutableNodes.leafNode(NAME, "name1")) .withChild(Builders.containerBuilder() .withNodeIdentifier(new NodeIdentifier(CONTAINER_IN_LIST)) .withChild(ImmutableNodes.leafNode(NAME, refValue)) .build()) .build()) .build()) .build(); } private static ContainerNode fooTopWithRef(final String refValue) { return Builders.containerBuilder() .withNodeIdentifier(new NodeIdentifier(FOO_TOP)) .withChild(ImmutableNodes.leafNode(REF, refValue)) .build(); } private static ContainerNode bazTop() { return Builders.containerBuilder() .withNodeIdentifier(new NodeIdentifier(BAZ_TOP)) .withChild(Builders.mapBuilder() .withNodeIdentifier(new NodeIdentifier(LIST_IN_CONTAINER)) .withChild(Builders.mapEntryBuilder() .withNodeIdentifier(NodeIdentifierWithPredicates.of(LIST_IN_CONTAINER, BAZ_NAME, "name1")) .withChild(ImmutableNodes.leafNode(BAZ_NAME, "name1")) .build()) .build()) .build(); } }