From 0125f41acf8764d48c8a78d71a34647631811853 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 19 Aug 2021 14:36:51 +0200 Subject: [PATCH] Allow refine to change 'default' in leaf-list RFC7950 allows 'default' to be specified for 'leaf-list's, which we recognize. Unfortunately the definition of refine statement does not take this into account. Fix that and add an explicit test. JIRA: YANGTOOLS-1312 Change-Id: I0c3ba7ca7cabba486c7226d520ce82a7ec2d194b Signed-off-by: Robert Varga --- .../reactor/YangValidationBundles.java | 21 +++++----- .../yangtools/yang/stmt/YT1312Test.java | 38 +++++++++++++++++++ .../src/test/resources/bugs/YT1312/foo.yang | 26 +++++++++++++ 3 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1312Test.java create mode 100644 parser/yang-parser-rfc7950/src/test/resources/bugs/YT1312/foo.yang diff --git a/parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/YangValidationBundles.java b/parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/YangValidationBundles.java index bee9d0bf40..97ebbd67de 100644 --- a/parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/YangValidationBundles.java +++ b/parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/YangValidationBundles.java @@ -27,17 +27,18 @@ public final class YangValidationBundles { YangStmtMapping.MAX_ELEMENTS, YangStmtMapping.IF_FEATURE); public static final Map> SUPPORTED_REFINE_TARGETS = - ImmutableMap.>builder() - .put(YangStmtMapping.DEFAULT, ImmutableSet.of(YangStmtMapping.LEAF, YangStmtMapping.CHOICE)) + ImmutableMap.>builder() + .put(YangStmtMapping.DEFAULT, ImmutableSet.of( + YangStmtMapping.LEAF, YangStmtMapping.CHOICE, YangStmtMapping.LEAF_LIST)) .put(YangStmtMapping.MANDATORY, ImmutableSet.of( - YangStmtMapping.LEAF, YangStmtMapping.CHOICE, YangStmtMapping.ANYXML, YangStmtMapping.ANYDATA)) - .put(YangStmtMapping.PRESENCE, ImmutableSet.of(YangStmtMapping.CONTAINER)) - .put(YangStmtMapping.MUST, ImmutableSet.of( - YangStmtMapping.CONTAINER, YangStmtMapping.LIST, YangStmtMapping.LEAF, - YangStmtMapping.LEAF_LIST, YangStmtMapping.ANYXML, YangStmtMapping.ANYDATA)) - .put(YangStmtMapping.MIN_ELEMENTS, ImmutableSet.of(YangStmtMapping.LIST, YangStmtMapping.LEAF_LIST)) - .put(YangStmtMapping.MAX_ELEMENTS, ImmutableSet.of(YangStmtMapping.LIST, YangStmtMapping.LEAF_LIST)) - .build(); + YangStmtMapping.LEAF, YangStmtMapping.ANYDATA, YangStmtMapping.ANYXML, YangStmtMapping.CHOICE)) + .put(YangStmtMapping.MAX_ELEMENTS, ImmutableSet.of(YangStmtMapping.LIST, YangStmtMapping.LEAF_LIST)) + .put(YangStmtMapping.MIN_ELEMENTS, ImmutableSet.of(YangStmtMapping.LIST, YangStmtMapping.LEAF_LIST)) + .put(YangStmtMapping.MUST, ImmutableSet.of( + YangStmtMapping.LEAF, YangStmtMapping.LEAF_LIST, YangStmtMapping.LIST, YangStmtMapping.CONTAINER, + YangStmtMapping.ANYDATA, YangStmtMapping.ANYXML)) + .put(YangStmtMapping.PRESENCE, ImmutableSet.of(YangStmtMapping.CONTAINER)) + .build(); private YangValidationBundles() { // Hidden on purpose diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1312Test.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1312Test.java new file mode 100644 index 0000000000..5141ef95c0 --- /dev/null +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1312Test.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 PANTHEON.tech, 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.stmt; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; + +import java.util.Optional; +import org.junit.Test; +import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.common.XMLNamespace; +import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement; + +public class YT1312Test { + @Test + public void testRefineDefault() throws Exception { + final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1312/foo.yang") + .getModuleStatement(QNameModule.create(XMLNamespace.of("foo"))); + + final LeafListEffectiveStatement grpFoo = module + .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow() + .findFirstEffectiveSubstatement(LeafListEffectiveStatement.class).orElseThrow(); + final LeafListEffectiveStatement foo = module + .findFirstEffectiveSubstatement(LeafListEffectiveStatement.class).orElseThrow(); + + assertNotSame(foo, grpFoo); + assertEquals(Optional.empty(), grpFoo.findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class)); + assertEquals(Optional.of("abc"), foo.findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class)); + } +} diff --git a/parser/yang-parser-rfc7950/src/test/resources/bugs/YT1312/foo.yang b/parser/yang-parser-rfc7950/src/test/resources/bugs/YT1312/foo.yang new file mode 100644 index 0000000000..00ff520553 --- /dev/null +++ b/parser/yang-parser-rfc7950/src/test/resources/bugs/YT1312/foo.yang @@ -0,0 +1,26 @@ +module foo { + namespace foo; + prefix foo; + yang-version 1.1; + + grouping grp { + leaf-list foo { + type string; + } + leaf-list bar { + type string; + default ""; + } + } + + uses grp { + refine foo { + default abc; + } + + refine bar { + default def; + } + } +} + -- 2.36.6