6c09db43cf9c63fd6edb42587e07d2e3dc460d64
[yangtools.git] / yang / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / parser / stmt / rfc7950 / ActionStatementTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.yangtools.yang.parser.stmt.rfc7950;
10
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;
15
16 import java.util.HashSet;
17 import java.util.Set;
18 import org.junit.Test;
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
21 import org.opendaylight.yangtools.yang.model.api.ActionNodeContainer;
22 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
25 import org.opendaylight.yangtools.yang.model.api.Module;
26 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
27 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
28 import org.opendaylight.yangtools.yang.stmt.StmtTestUtils;
29
30 public class ActionStatementTest {
31
32     private static final String FOO_NS = "foo-namespace";
33     private static final String FOO_REV = "2016-12-13";
34
35     @Test
36     public void testActionStatementInDataContainers() throws Exception {
37         final SchemaContext schemaContext = StmtTestUtils.parseYangSource("/rfc7950/action-stmt/foo.yang");
38         assertNotNull(schemaContext);
39
40         assertContainsActions(schemaContext, "root", "grp-action", "aug-action");
41         assertContainsActions(schemaContext, "top-list", "top-list-action");
42         assertContainsActions(schemaContext, "top", "top-action");
43
44         final Set<GroupingDefinition> groupings = schemaContext.getGroupings();
45         assertEquals(1, groupings.size());
46         assertContainsActions(groupings.iterator().next(), "grp-action");
47
48         final Set<Module> modules = schemaContext.getModules();
49         assertEquals(1, modules.size());
50         final Module foo = modules.iterator().next();
51         final Set<AugmentationSchemaNode> augmentations = foo.getAugmentations();
52         assertEquals(1, augmentations.size());
53         assertContainsActions(augmentations.iterator().next(), "aug-action", "grp-action");
54     }
55
56     private static void assertContainsActions(final SchemaContext schemaContext, final String dataContainerName,
57             final String... actionNames) {
58         final DataSchemaNode dataChildByName = schemaContext.getDataChildByName(QName.create(FOO_NS, FOO_REV,
59                 dataContainerName));
60         assertTrue(dataChildByName instanceof ActionNodeContainer);
61         assertContainsActions((ActionNodeContainer) dataChildByName, actionNames);
62     }
63
64     private static void assertContainsActions(final ActionNodeContainer actionContainer,
65             final String... actionNames) {
66         final Set<ActionDefinition> actions = actionContainer.getActions();
67         assertEquals(actionNames.length, actions.size());
68
69         final Set<QName> actionQNames = new HashSet<>();
70         actions.forEach(n -> actionQNames.add(n.getQName()));
71
72         for (final String actionName : actionNames) {
73             assertTrue(actionQNames.contains(QName.create(FOO_NS, FOO_REV, actionName)));
74         }
75     }
76
77     @Test
78     public void testActionUnsupportedInYang10() throws Exception {
79         try {
80             StmtTestUtils.parseYangSource("/rfc7950/action-stmt/foo10.yang");
81             fail("Test should fail due to invalid Yang 1.0");
82         } catch (final ReactorException e) {
83             assertTrue(e.getCause().getMessage().startsWith("action is not a YANG statement or use of extension"));
84         }
85     }
86
87     @Test
88     public void testActionWithinIllegalAncestor() throws Exception {
89         try {
90             StmtTestUtils.parseYangSource("/rfc7950/action-stmt/foo-invalid.yang");
91             fail("Test should fail due to invalid Yang 1.1");
92         } catch (final ReactorException e) {
93             assertTrue(e.getCause().getMessage().startsWith("Action (foo-namespace?revision=2016-12-13)"
94                     + "action-in-grouping is defined within a notification, rpc or another action"));
95         }
96     }
97
98     @Test
99     public void testActionWithinListWithoutKey() throws Exception {
100         try {
101             StmtTestUtils.parseYangSource("/rfc7950/action-stmt/bar-invalid.yang");
102             fail("Test should fail due to invalid Yang 1.1");
103         } catch (final ReactorException e) {
104             assertTrue(e.getCause().getMessage().startsWith(
105                     "Action (bar-namespace?revision=2016-12-13)my-action is defined within a list"
106                             + " that has no key statement"));
107         }
108     }
109
110     @Test
111     public void testActionInUsedGroupingWithinCase() throws Exception {
112         try {
113             StmtTestUtils.parseYangSource("/rfc7950/action-stmt/baz-invalid.yang");
114             fail("Test should fail due to invalid Yang 1.1");
115         } catch (final ReactorException e) {
116             assertTrue(e.getCause().getMessage().startsWith(
117                     "Action (baz-namespace?revision=2016-12-13)action-in-grouping is defined within a "
118                             + "case statement"));
119         }
120     }
121
122     @Test
123     public void testActionInUsedGroupingAtTopLevelOfModule() throws Exception {
124         try {
125             StmtTestUtils.parseYangSource("/rfc7950/action-stmt/foobar-invalid.yang");
126             fail("Test should fail due to invalid Yang 1.1");
127         } catch (final ReactorException e) {
128             assertTrue(e.getCause().getMessage().startsWith(
129                     "Action (foobar-namespace?revision=2016-12-13)my-action is defined at the top level of a module"));
130         }
131     }
132 }