Remove unneeded throws
[yangtools.git] / parser / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / AugmentTest.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 package org.opendaylight.yangtools.yang.stmt;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14
15 import java.util.Collection;
16 import org.junit.BeforeClass;
17 import org.junit.Test;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.common.QNameModule;
20 import org.opendaylight.yangtools.yang.common.Revision;
21 import org.opendaylight.yangtools.yang.common.XMLNamespace;
22 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
27 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
29 import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
31 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.Module;
33 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
34 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
35 import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions;
36
37 public class AugmentTest extends AbstractYangTest {
38     private static final QNameModule FOO = QNameModule.create(
39         XMLNamespace.of("urn:opendaylight.foo"), Revision.of("2013-10-13"));
40     private static final QNameModule BAR = QNameModule.create(
41         XMLNamespace.of("urn:opendaylight.bar"), Revision.of("2013-10-14"));
42     private static final QNameModule BAZ = QNameModule.create(
43         XMLNamespace.of("urn:opendaylight.baz"), Revision.of("2013-10-15"));
44
45     private static final QName Q0 = QName.create(BAR, "interfaces");
46     private static final QName Q1 = QName.create(BAR, "ifEntry");
47     private static final QName Q2 = QName.create(BAZ, "augment-holder");
48
49     private static EffectiveModelContext AUGMENT_IN_AUGMENT;
50
51     @BeforeClass
52     public static void beforeClass() throws Exception {
53         AUGMENT_IN_AUGMENT = assertEffectiveModelDir("/augment-test/augment-in-augment");
54     }
55
56     @Test
57     public void testAugmentParsing() {
58         // foo.yang
59         final Module module1 = AUGMENT_IN_AUGMENT.findModules("foo").iterator().next();
60         Collection<? extends AugmentationSchemaNode> augmentations = module1.getAugmentations();
61         assertEquals(1, augmentations.size());
62         final AugmentationSchemaNode augment = augmentations.iterator().next();
63         assertNotNull(augment);
64
65         assertEquals(Absolute.of(Q0, Q1, Q2), augment.getTargetPath());
66
67         final Collection<? extends DataSchemaNode> augmentChildren = augment.getChildNodes();
68         assertEquals(4, augmentChildren.size());
69         for (final DataSchemaNode dsn : augmentChildren) {
70             checkIsAugmenting(dsn, false);
71         }
72
73         final LeafSchemaNode ds0ChannelNumber = (LeafSchemaNode) augment.getDataChildByName(QName.create(
74                 module1.getQNameModule(), "ds0ChannelNumber"));
75         final LeafSchemaNode interfaceId = (LeafSchemaNode) augment.getDataChildByName(QName.create(
76                 module1.getQNameModule(), "interface-id"));
77         final ContainerSchemaNode schemas = (ContainerSchemaNode) augment.getDataChildByName(QName.create(
78                 module1.getQNameModule(), "schemas"));
79         final ChoiceSchemaNode odl = (ChoiceSchemaNode) augment.getDataChildByName(QName.create(
80                 module1.getQNameModule(), "odl"));
81
82         assertNotNull(ds0ChannelNumber);
83         assertNotNull(interfaceId);
84         assertNotNull(schemas);
85         assertNotNull(odl);
86
87         // leaf ds0ChannelNumber
88         assertEquals(QName.create(FOO, "ds0ChannelNumber"), ds0ChannelNumber.getQName());
89         assertFalse(ds0ChannelNumber.isAugmenting());
90         // type of leaf ds0ChannelNumber
91         assertEquals(TypeDefinitions.STRING, ds0ChannelNumber.getType().getQName());
92
93         // leaf interface-id
94         assertEquals(QName.create(FOO, "interface-id"), interfaceId.getQName());
95         assertFalse(interfaceId.isAugmenting());
96
97         // container schemas
98         assertEquals(QName.create(FOO, "schemas"), schemas.getQName());
99         assertFalse(schemas.isAugmenting());
100
101         // choice odl
102         assertEquals(QName.create(FOO, "odl"), odl.getQName());
103         assertFalse(odl.isAugmenting());
104
105         // baz.yang
106         final Module module3 = AUGMENT_IN_AUGMENT.findModules("baz").iterator().next();
107         augmentations = module3.getAugmentations();
108         assertEquals(3, augmentations.size());
109         AugmentationSchemaNode augment1 = null;
110         AugmentationSchemaNode augment2 = null;
111         AugmentationSchemaNode augment3 = null;
112         for (final AugmentationSchemaNode as : augmentations) {
113             if (!as.getWhenCondition().isPresent()) {
114                 augment3 = as;
115             } else if ("br:ifType='ds0'".equals(as.getWhenCondition().orElseThrow().toString())) {
116                 augment1 = as;
117             } else if ("br:ifType='ds2'".equals(as.getWhenCondition().orElseThrow().toString())) {
118                 augment2 = as;
119             }
120         }
121         assertNotNull(augment1);
122         assertNotNull(augment2);
123         assertNotNull(augment3);
124
125         assertEquals(1, augment1.getChildNodes().size());
126         final ContainerSchemaNode augmentHolder = (ContainerSchemaNode) augment1.getDataChildByName(QName.create(
127                 module3.getQNameModule(), "augment-holder"));
128         assertNotNull(augmentHolder);
129
130         assertEquals(1, augment2.getChildNodes().size());
131         final ContainerSchemaNode augmentHolder2 = (ContainerSchemaNode) augment2.getDataChildByName(QName.create(
132                 module3.getQNameModule(), "augment-holder2"));
133         assertNotNull(augmentHolder2);
134
135         assertEquals(1, augment3.getChildNodes().size());
136         final CaseSchemaNode pause = (CaseSchemaNode) augment3.getDataChildByName(QName.create(
137                 module3.getQNameModule(), "pause"));
138         assertNotNull(pause);
139     }
140
141     @Test
142     public void testAugmentResolving() {
143         final Module module2 = AUGMENT_IN_AUGMENT.findModules("bar").iterator().next();
144         final ContainerSchemaNode interfaces = (ContainerSchemaNode) module2.getDataChildByName(QName.create(
145                 module2.getQNameModule(), "interfaces"));
146         final ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName(QName.create(
147                 module2.getQNameModule(), "ifEntry"));
148
149         // baz.yang
150         // augment "/br:interfaces/br:ifEntry" {
151         final ContainerSchemaNode augmentHolder = (ContainerSchemaNode) ifEntry.getDataChildByName(QName.create(BAZ,
152                 "augment-holder"));
153         checkIsAugmenting(augmentHolder, true);
154         assertEquals(Q2, augmentHolder.getQName());
155
156         // foo.yang
157         // augment "/br:interfaces/br:ifEntry/bz:augment-holder"
158         final LeafSchemaNode ds0ChannelNumber = (LeafSchemaNode) augmentHolder.getDataChildByName(QName.create(FOO,
159                 "ds0ChannelNumber"));
160         final LeafSchemaNode interfaceId = (LeafSchemaNode) augmentHolder.getDataChildByName(QName.create(FOO,
161                 "interface-id"));
162         final ContainerSchemaNode schemas = (ContainerSchemaNode) augmentHolder.getDataChildByName(QName.create(FOO,
163                 "schemas"));
164         final ChoiceSchemaNode odl = (ChoiceSchemaNode) augmentHolder.getDataChildByName(QName.create(FOO, "odl"));
165
166         assertNotNull(ds0ChannelNumber);
167         assertNotNull(interfaceId);
168         assertNotNull(schemas);
169         assertNotNull(odl);
170
171         // leaf ds0ChannelNumber
172         assertEquals(QName.create(FOO, "ds0ChannelNumber"), ds0ChannelNumber.getQName());
173
174         // leaf interface-id
175         assertEquals(QName.create(FOO, "interface-id"), interfaceId.getQName());
176
177         // container schemas
178         assertEquals(QName.create(FOO, "schemas"), schemas.getQName());
179
180         // choice odl
181         assertEquals(QName.create(FOO, "odl"), odl.getQName());
182     }
183
184     @Test
185     public void testAugmentedChoice() {
186         final Module module2 = AUGMENT_IN_AUGMENT.findModules("bar").iterator().next();
187         final ContainerSchemaNode interfaces = (ContainerSchemaNode) module2.getDataChildByName(QName.create(
188                 module2.getQNameModule(), "interfaces"));
189         final ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName(QName.create(
190                 module2.getQNameModule(), "ifEntry"));
191         final ContainerSchemaNode augmentedHolder = (ContainerSchemaNode) ifEntry.getDataChildByName(QName.create(
192                 BAZ, "augment-holder"));
193         checkIsAugmenting(augmentedHolder, true);
194
195         // foo.yang
196         // augment "/br:interfaces/br:ifEntry/bz:augment-holder"
197         final ChoiceSchemaNode odl = (ChoiceSchemaNode) augmentedHolder.getDataChildByName(QName.create(FOO, "odl"));
198         assertNotNull(odl);
199         final Collection<? extends CaseSchemaNode> cases = odl.getCases();
200         assertEquals(4, cases.size());
201
202         CaseSchemaNode id = null;
203         CaseSchemaNode node1 = null;
204         CaseSchemaNode node2 = null;
205         CaseSchemaNode node3 = null;
206
207         for (final CaseSchemaNode ccn : cases) {
208             if ("id".equals(ccn.getQName().getLocalName())) {
209                 id = ccn;
210             } else if ("node1".equals(ccn.getQName().getLocalName())) {
211                 node1 = ccn;
212             } else if ("node2".equals(ccn.getQName().getLocalName())) {
213                 node2 = ccn;
214             } else if ("node3".equals(ccn.getQName().getLocalName())) {
215                 node3 = ccn;
216             }
217         }
218
219         assertNotNull(id);
220         assertNotNull(node1);
221         assertNotNull(node2);
222         assertNotNull(node3);
223
224         // case id
225         assertEquals(QName.create(FOO, "id"), id.getQName());
226         final Collection<? extends DataSchemaNode> idChildren = id.getChildNodes();
227         assertEquals(1, idChildren.size());
228
229         // case node1
230         assertEquals(QName.create(FOO, "node1"), node1.getQName());
231         final Collection<? extends DataSchemaNode> node1Children = node1.getChildNodes();
232         assertTrue(node1Children.isEmpty());
233
234         // case node2
235         assertEquals(QName.create(FOO, "node2"), node2.getQName());
236         final Collection<? extends DataSchemaNode> node2Children = node2.getChildNodes();
237         assertTrue(node2Children.isEmpty());
238
239         // case node3
240         assertEquals(QName.create(FOO, "node3"), node3.getQName());
241         final Collection<? extends DataSchemaNode> node3Children = node3.getChildNodes();
242         assertEquals(1, node3Children.size());
243
244         // test cases
245         // case id child
246         final LeafSchemaNode caseIdChild = (LeafSchemaNode) idChildren.iterator().next();
247         assertNotNull(caseIdChild);
248         assertEquals(QName.create(FOO, "id"), caseIdChild.getQName());
249
250         // case node3 child
251         final ContainerSchemaNode caseNode3Child = (ContainerSchemaNode) node3Children.iterator().next();
252         assertNotNull(caseNode3Child);
253         assertEquals(QName.create(FOO, "node3"), caseNode3Child.getQName());
254     }
255
256     @Test
257     public void testAugmentRpc() throws Exception {
258         final EffectiveModelContext context = assertEffectiveModelDir("/augment-test/rpc");
259         final XMLNamespace NS_BAR = XMLNamespace.of("urn:opendaylight:bar");
260         final XMLNamespace NS_FOO = XMLNamespace.of("urn:opendaylight:foo");
261         final Revision revision = Revision.of("2013-10-11");
262         final Module bar = context.findModules("bar").iterator().next();
263         final Collection<? extends RpcDefinition> rpcs = bar.getRpcs();
264         assertEquals(2, rpcs.size());
265
266         RpcDefinition submit = null;
267         for (final RpcDefinition rpc : rpcs) {
268             if ("submit".equals(rpc.getQName().getLocalName())) {
269                 submit = rpc;
270                 break;
271             }
272         }
273         assertNotNull(submit);
274
275         final QName submitQName = QName.create(NS_BAR, revision, "submit");
276         assertEquals(submitQName, submit.getQName());
277         final InputSchemaNode input = submit.getInput();
278         final QName inputQName = QName.create(NS_BAR, revision, "input");
279         assertEquals(inputQName, input.getQName());
280         final ChoiceSchemaNode arguments = (ChoiceSchemaNode) input.getDataChildByName(QName.create(NS_BAR, revision,
281                 "arguments"));
282         final QName argumentsQName = QName.create(NS_BAR, revision, "arguments");
283         assertEquals(argumentsQName, arguments.getQName());
284         assertFalse(arguments.isAugmenting());
285         final Collection<? extends CaseSchemaNode> cases = arguments.getCases();
286         assertEquals(3, cases.size());
287
288         CaseSchemaNode attach = null;
289         CaseSchemaNode create = null;
290         CaseSchemaNode destroy = null;
291         for (final CaseSchemaNode child : cases) {
292             if ("attach".equals(child.getQName().getLocalName())) {
293                 attach = child;
294             } else if ("create".equals(child.getQName().getLocalName())) {
295                 create = child;
296             } else if ("destroy".equals(child.getQName().getLocalName())) {
297                 destroy = child;
298             }
299         }
300         assertNotNull(attach);
301         assertNotNull(create);
302         assertNotNull(destroy);
303
304         assertTrue(attach.isAugmenting());
305         assertTrue(create.isAugmenting());
306         assertTrue(destroy.isAugmenting());
307
308         // case attach
309         assertEquals(QName.create(NS_FOO, revision, "attach"), attach.getQName());
310         final Collection<? extends DataSchemaNode> attachChildren = attach.getChildNodes();
311         assertEquals(1, attachChildren.size());
312
313         // case create
314         assertEquals(QName.create(NS_FOO, revision, "create"), create.getQName());
315         final Collection<? extends DataSchemaNode> createChildren = create.getChildNodes();
316         assertEquals(1, createChildren.size());
317
318         // case attach
319         assertEquals(QName.create(NS_FOO, revision, "destroy"), destroy.getQName());
320         final Collection<? extends DataSchemaNode> destroyChildren = destroy.getChildNodes();
321         assertEquals(1, destroyChildren.size());
322     }
323
324     @Test
325     public void testAugmentInUsesResolving() throws Exception {
326         final EffectiveModelContext context = assertEffectiveModelDir("/augment-test/augment-in-uses");
327         assertEquals(1, context.getModules().size());
328
329         final Module test = context.getModules().iterator().next();
330         final DataNodeContainer links = (DataNodeContainer) test.getDataChildByName(QName.create(test.getQNameModule(),
331                 "links"));
332         final DataNodeContainer link = (DataNodeContainer) links.getDataChildByName(QName.create(test.getQNameModule(),
333                 "link"));
334         final DataNodeContainer nodes = (DataNodeContainer) link.getDataChildByName(QName.create(test.getQNameModule(),
335                 "nodes"));
336         final ContainerSchemaNode node = (ContainerSchemaNode) nodes.getDataChildByName(QName.create(
337                 test.getQNameModule(), "node"));
338         final Collection<? extends AugmentationSchemaNode> augments = node.getAvailableAugmentations();
339         assertEquals(1, augments.size());
340         assertEquals(1, node.getChildNodes().size());
341         final LeafSchemaNode id = (LeafSchemaNode) node.getDataChildByName(QName.create(test.getQNameModule(), "id"));
342         assertTrue(id.isAugmenting());
343     }
344
345     /**
346      * Test if node has augmenting flag set to expected value. In case this is  DataNodeContainer/ChoiceNode, check its
347      * child nodes/case nodes too.
348      *
349      * @param node node to check
350      * @param expected expected value
351      */
352     private static void checkIsAugmenting(final DataSchemaNode node, final boolean expected) {
353         assertEquals(expected, node.isAugmenting());
354         if (node instanceof DataNodeContainer) {
355             for (DataSchemaNode child : ((DataNodeContainer) node).getChildNodes()) {
356                 checkIsAugmenting(child, expected);
357             }
358         } else if (node instanceof ChoiceSchemaNode) {
359             for (CaseSchemaNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
360                 checkIsAugmenting(caseNode, expected);
361             }
362         }
363     }
364 }