2 * Copyright (c) 2016 Cisco Systems, Inc. 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
9 package org.opendaylight.yangtools.yang.parser.stmt.rfc7950;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.junit.Assert.fail;
16 import java.util.Collection;
17 import java.util.HashSet;
19 import org.junit.Test;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
22 import org.opendaylight.yangtools.yang.model.api.ActionNodeContainer;
23 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
26 import org.opendaylight.yangtools.yang.model.api.Module;
27 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
29 import org.opendaylight.yangtools.yang.stmt.StmtTestUtils;
31 public class ActionStatementTest {
33 private static final String FOO_NS = "foo-namespace";
34 private static final String FOO_REV = "2016-12-13";
37 public void testActionStatementInDataContainers() throws Exception {
38 final SchemaContext schemaContext = StmtTestUtils.parseYangSource("/rfc7950/action-stmt/foo.yang");
39 assertNotNull(schemaContext);
41 assertContainsActions(schemaContext, "root", "grp-action", "aug-action");
42 assertContainsActions(schemaContext, "top-list", "top-list-action");
43 assertContainsActions(schemaContext, "top", "top-action");
45 final Collection<? extends GroupingDefinition> groupings = schemaContext.getGroupings();
46 assertEquals(1, groupings.size());
47 assertContainsActions(groupings.iterator().next(), "grp-action");
49 final Collection<? extends Module> modules = schemaContext.getModules();
50 assertEquals(1, modules.size());
51 final Module foo = modules.iterator().next();
52 final Collection<? extends AugmentationSchemaNode> augmentations = foo.getAugmentations();
53 assertEquals(1, augmentations.size());
54 assertContainsActions(augmentations.iterator().next(), "aug-action", "grp-action");
57 private static void assertContainsActions(final SchemaContext schemaContext, final String dataContainerName,
58 final String... actionNames) {
59 final DataSchemaNode dataChildByName = schemaContext.getDataChildByName(QName.create(FOO_NS, FOO_REV,
61 assertTrue(dataChildByName instanceof ActionNodeContainer);
62 assertContainsActions((ActionNodeContainer) dataChildByName, actionNames);
65 private static void assertContainsActions(final ActionNodeContainer actionContainer,
66 final String... actionNames) {
67 final Collection<? extends ActionDefinition> actions = actionContainer.getActions();
68 assertEquals(actionNames.length, actions.size());
70 final Set<QName> actionQNames = new HashSet<>();
71 actions.forEach(n -> actionQNames.add(n.getQName()));
73 for (final String actionName : actionNames) {
74 assertTrue(actionQNames.contains(QName.create(FOO_NS, FOO_REV, actionName)));
79 public void testActionUnsupportedInYang10() throws Exception {
81 StmtTestUtils.parseYangSource("/rfc7950/action-stmt/foo10.yang");
82 fail("Test should fail due to invalid Yang 1.0");
83 } catch (final ReactorException e) {
84 assertTrue(e.getCause().getMessage().startsWith("action is not a YANG statement or use of extension"));
89 public void testActionWithinIllegalAncestor() throws Exception {
91 StmtTestUtils.parseYangSource("/rfc7950/action-stmt/foo-invalid.yang");
92 fail("Test should fail due to invalid Yang 1.1");
93 } catch (final ReactorException e) {
94 assertTrue(e.getCause().getMessage().startsWith("Action (foo-namespace?revision=2016-12-13)"
95 + "action-in-grouping is defined within a notification, rpc or another action"));
100 public void testActionWithinListWithoutKey() throws Exception {
102 StmtTestUtils.parseYangSource("/rfc7950/action-stmt/bar-invalid.yang");
103 fail("Test should fail due to invalid Yang 1.1");
104 } catch (final ReactorException e) {
105 assertTrue(e.getCause().getMessage().startsWith(
106 "Action (bar-namespace?revision=2016-12-13)my-action is defined within a list"
107 + " that has no key statement"));
112 public void testActionInUsedGroupingWithinCase() throws Exception {
114 StmtTestUtils.parseYangSource("/rfc7950/action-stmt/baz-invalid.yang");
115 fail("Test should fail due to invalid Yang 1.1");
116 } catch (final ReactorException e) {
117 assertTrue(e.getCause().getMessage().startsWith(
118 "Action (baz-namespace?revision=2016-12-13)action-in-grouping is defined within a "
119 + "case statement"));
124 public void testActionInUsedGroupingAtTopLevelOfModule() throws Exception {
126 StmtTestUtils.parseYangSource("/rfc7950/action-stmt/foobar-invalid.yang");
127 fail("Test should fail due to invalid Yang 1.1");
128 } catch (final ReactorException e) {
129 assertTrue(e.getCause().getMessage().startsWith(
130 "Action (foobar-namespace?revision=2016-12-13)my-action is defined at the top level of a module"));