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
8 package org.opendaylight.yangtools.yang.stmt;
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;
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;
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"));
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");
49 private static EffectiveModelContext AUGMENT_IN_AUGMENT;
52 public static void beforeClass() throws Exception {
53 AUGMENT_IN_AUGMENT = assertEffectiveModelDir("/augment-test/augment-in-augment");
57 public void testAugmentParsing() {
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);
65 assertEquals(Absolute.of(Q0, Q1, Q2), augment.getTargetPath());
67 final Collection<? extends DataSchemaNode> augmentChildren = augment.getChildNodes();
68 assertEquals(4, augmentChildren.size());
69 for (final DataSchemaNode dsn : augmentChildren) {
70 checkIsAugmenting(dsn, false);
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"));
82 assertNotNull(ds0ChannelNumber);
83 assertNotNull(interfaceId);
84 assertNotNull(schemas);
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());
94 assertEquals(QName.create(FOO, "interface-id"), interfaceId.getQName());
95 assertFalse(interfaceId.isAugmenting());
98 assertEquals(QName.create(FOO, "schemas"), schemas.getQName());
99 assertFalse(schemas.isAugmenting());
102 assertEquals(QName.create(FOO, "odl"), odl.getQName());
103 assertFalse(odl.isAugmenting());
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()) {
115 } else if ("br:ifType='ds0'".equals(as.getWhenCondition().orElseThrow().toString())) {
117 } else if ("br:ifType='ds2'".equals(as.getWhenCondition().orElseThrow().toString())) {
121 assertNotNull(augment1);
122 assertNotNull(augment2);
123 assertNotNull(augment3);
125 assertEquals(1, augment1.getChildNodes().size());
126 final ContainerSchemaNode augmentHolder = (ContainerSchemaNode) augment1.getDataChildByName(QName.create(
127 module3.getQNameModule(), "augment-holder"));
128 assertNotNull(augmentHolder);
130 assertEquals(1, augment2.getChildNodes().size());
131 final ContainerSchemaNode augmentHolder2 = (ContainerSchemaNode) augment2.getDataChildByName(QName.create(
132 module3.getQNameModule(), "augment-holder2"));
133 assertNotNull(augmentHolder2);
135 assertEquals(1, augment3.getChildNodes().size());
136 final CaseSchemaNode pause = (CaseSchemaNode) augment3.getDataChildByName(QName.create(
137 module3.getQNameModule(), "pause"));
138 assertNotNull(pause);
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"));
150 // augment "/br:interfaces/br:ifEntry" {
151 final ContainerSchemaNode augmentHolder = (ContainerSchemaNode) ifEntry.getDataChildByName(QName.create(BAZ,
153 checkIsAugmenting(augmentHolder, true);
154 assertEquals(Q2, augmentHolder.getQName());
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,
162 final ContainerSchemaNode schemas = (ContainerSchemaNode) augmentHolder.getDataChildByName(QName.create(FOO,
164 final ChoiceSchemaNode odl = (ChoiceSchemaNode) augmentHolder.getDataChildByName(QName.create(FOO, "odl"));
166 assertNotNull(ds0ChannelNumber);
167 assertNotNull(interfaceId);
168 assertNotNull(schemas);
171 // leaf ds0ChannelNumber
172 assertEquals(QName.create(FOO, "ds0ChannelNumber"), ds0ChannelNumber.getQName());
175 assertEquals(QName.create(FOO, "interface-id"), interfaceId.getQName());
178 assertEquals(QName.create(FOO, "schemas"), schemas.getQName());
181 assertEquals(QName.create(FOO, "odl"), odl.getQName());
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);
196 // augment "/br:interfaces/br:ifEntry/bz:augment-holder"
197 final ChoiceSchemaNode odl = (ChoiceSchemaNode) augmentedHolder.getDataChildByName(QName.create(FOO, "odl"));
199 final Collection<? extends CaseSchemaNode> cases = odl.getCases();
200 assertEquals(4, cases.size());
202 CaseSchemaNode id = null;
203 CaseSchemaNode node1 = null;
204 CaseSchemaNode node2 = null;
205 CaseSchemaNode node3 = null;
207 for (final CaseSchemaNode ccn : cases) {
208 if ("id".equals(ccn.getQName().getLocalName())) {
210 } else if ("node1".equals(ccn.getQName().getLocalName())) {
212 } else if ("node2".equals(ccn.getQName().getLocalName())) {
214 } else if ("node3".equals(ccn.getQName().getLocalName())) {
220 assertNotNull(node1);
221 assertNotNull(node2);
222 assertNotNull(node3);
225 assertEquals(QName.create(FOO, "id"), id.getQName());
226 final Collection<? extends DataSchemaNode> idChildren = id.getChildNodes();
227 assertEquals(1, idChildren.size());
230 assertEquals(QName.create(FOO, "node1"), node1.getQName());
231 final Collection<? extends DataSchemaNode> node1Children = node1.getChildNodes();
232 assertTrue(node1Children.isEmpty());
235 assertEquals(QName.create(FOO, "node2"), node2.getQName());
236 final Collection<? extends DataSchemaNode> node2Children = node2.getChildNodes();
237 assertTrue(node2Children.isEmpty());
240 assertEquals(QName.create(FOO, "node3"), node3.getQName());
241 final Collection<? extends DataSchemaNode> node3Children = node3.getChildNodes();
242 assertEquals(1, node3Children.size());
246 final LeafSchemaNode caseIdChild = (LeafSchemaNode) idChildren.iterator().next();
247 assertNotNull(caseIdChild);
248 assertEquals(QName.create(FOO, "id"), caseIdChild.getQName());
251 final ContainerSchemaNode caseNode3Child = (ContainerSchemaNode) node3Children.iterator().next();
252 assertNotNull(caseNode3Child);
253 assertEquals(QName.create(FOO, "node3"), caseNode3Child.getQName());
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());
266 RpcDefinition submit = null;
267 for (final RpcDefinition rpc : rpcs) {
268 if ("submit".equals(rpc.getQName().getLocalName())) {
273 assertNotNull(submit);
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,
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());
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())) {
294 } else if ("create".equals(child.getQName().getLocalName())) {
296 } else if ("destroy".equals(child.getQName().getLocalName())) {
300 assertNotNull(attach);
301 assertNotNull(create);
302 assertNotNull(destroy);
304 assertTrue(attach.isAugmenting());
305 assertTrue(create.isAugmenting());
306 assertTrue(destroy.isAugmenting());
309 assertEquals(QName.create(NS_FOO, revision, "attach"), attach.getQName());
310 final Collection<? extends DataSchemaNode> attachChildren = attach.getChildNodes();
311 assertEquals(1, attachChildren.size());
314 assertEquals(QName.create(NS_FOO, revision, "create"), create.getQName());
315 final Collection<? extends DataSchemaNode> createChildren = create.getChildNodes();
316 assertEquals(1, createChildren.size());
319 assertEquals(QName.create(NS_FOO, revision, "destroy"), destroy.getQName());
320 final Collection<? extends DataSchemaNode> destroyChildren = destroy.getChildNodes();
321 assertEquals(1, destroyChildren.size());
325 public void testAugmentInUsesResolving() throws Exception {
326 final EffectiveModelContext context = assertEffectiveModelDir("/augment-test/augment-in-uses");
327 assertEquals(1, context.getModules().size());
329 final Module test = context.getModules().iterator().next();
330 final DataNodeContainer links = (DataNodeContainer) test.getDataChildByName(QName.create(test.getQNameModule(),
332 final DataNodeContainer link = (DataNodeContainer) links.getDataChildByName(QName.create(test.getQNameModule(),
334 final DataNodeContainer nodes = (DataNodeContainer) link.getDataChildByName(QName.create(test.getQNameModule(),
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());
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.
349 * @param node node to check
350 * @param expected expected value
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);
358 } else if (node instanceof ChoiceSchemaNode) {
359 for (CaseSchemaNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
360 checkIsAugmenting(caseNode, expected);