f42e5225c0da7d4081abbbfeba48af0778172278
[yangtools.git] / parser / yang-parser-rfc7950 / 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.Collection;
17 import java.util.HashSet;
18 import java.util.Set;
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;
30
31 public class ActionStatementTest {
32
33     private static final String FOO_NS = "foo-namespace";
34     private static final String FOO_REV = "2016-12-13";
35
36     @Test
37     public void testActionStatementInDataContainers() throws Exception {
38         final SchemaContext schemaContext = StmtTestUtils.parseYangSource("/rfc7950/action-stmt/foo.yang");
39         assertNotNull(schemaContext);
40
41         assertContainsActions(schemaContext, "root", "grp-action", "aug-action");
42         assertContainsActions(schemaContext, "top-list", "top-list-action");
43         assertContainsActions(schemaContext, "top", "top-action");
44
45         final Collection<? extends GroupingDefinition> groupings = schemaContext.getGroupings();
46         assertEquals(1, groupings.size());
47         assertContainsActions(groupings.iterator().next(), "grp-action");
48
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");
55     }
56
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,
60                 dataContainerName));
61         assertTrue(dataChildByName instanceof ActionNodeContainer);
62         assertContainsActions((ActionNodeContainer) dataChildByName, actionNames);
63     }
64
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());
69
70         final Set<QName> actionQNames = new HashSet<>();
71         actions.forEach(n -> actionQNames.add(n.getQName()));
72
73         for (final String actionName : actionNames) {
74             assertTrue(actionQNames.contains(QName.create(FOO_NS, FOO_REV, actionName)));
75         }
76     }
77
78     @Test
79     public void testActionUnsupportedInYang10() throws Exception {
80         try {
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"));
85         }
86     }
87
88     @Test
89     public void testActionWithinIllegalAncestor() throws Exception {
90         try {
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"));
96         }
97     }
98
99     @Test
100     public void testActionWithinListWithoutKey() throws Exception {
101         try {
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"));
108         }
109     }
110
111     @Test
112     public void testActionInUsedGroupingWithinCase() throws Exception {
113         try {
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"));
120         }
121     }
122
123     @Test
124     public void testActionInUsedGroupingAtTopLevelOfModule() throws Exception {
125         try {
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"));
131         }
132     }
133 }