2 * Copyright (c) 2013 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.parser.impl;
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.io.FileNotFoundException;
17 import java.text.DateFormat;
18 import java.text.ParseException;
19 import java.text.SimpleDateFormat;
20 import java.util.ArrayList;
21 import java.util.Arrays;
22 import java.util.Collections;
23 import java.util.Date;
24 import java.util.List;
26 import org.junit.BeforeClass;
27 import org.junit.Test;
28 import org.opendaylight.yangtools.yang.common.QName;
29 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
30 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
31 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
32 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
34 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
35 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
36 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
37 import org.opendaylight.yangtools.yang.model.api.Module;
38 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
39 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
40 import org.opendaylight.yangtools.yang.model.util.BaseTypes;
42 public class AugmentTest {
43 private static final URI fooNS = URI.create("urn:opendaylight.foo");
44 private static final URI barNS = URI.create("urn:opendaylight.bar");
45 private static final URI bazNS = URI.create("urn:opendaylight.baz");
46 private static Date fooRev;
47 private static Date barRev;
48 private static Date bazRev;
49 private static final String foo = "foo";
50 private static final String bar = "bar";
51 private static final String baz = "baz";
52 private static QName q0;
53 private static QName q1;
54 private static QName q2;
56 private Set<Module> modules;
59 public static void init() throws FileNotFoundException, ParseException {
60 DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
61 fooRev = simpleDateFormat.parse("2013-10-13");
62 barRev = simpleDateFormat.parse("2013-10-14");
63 bazRev = simpleDateFormat.parse("2013-10-15");
65 q0 = new QName(barNS, barRev, bar, "interfaces");
66 q1 = new QName(barNS, barRev, bar, "ifEntry");
67 q2 = new QName(bazNS, bazRev, baz, "augment-holder");
71 public void testAugmentParsing() throws Exception {
72 modules = TestUtils.loadModules(getClass().getResource("/augment-test/augment-in-augment").toURI());
73 SchemaPath expectedSchemaPath;
74 List<QName> qnames = new ArrayList<>();
80 Module module1 = TestUtils.findModule(modules, "foo");
81 Set<AugmentationSchema> augmentations = module1.getAugmentations();
82 assertEquals(1, augmentations.size());
83 AugmentationSchema augment = augmentations.iterator().next();
84 assertNotNull(augment);
86 expectedSchemaPath = SchemaPath.create(qnames, true);
87 assertEquals(expectedSchemaPath, augment.getTargetPath());
89 Set<DataSchemaNode> augmentChildren = augment.getChildNodes();
90 assertEquals(4, augmentChildren.size());
91 for (DataSchemaNode dsn : augmentChildren) {
92 TestUtils.checkIsAugmenting(dsn, false);
95 LeafSchemaNode ds0ChannelNumber = (LeafSchemaNode) augment.getDataChildByName("ds0ChannelNumber");
96 LeafSchemaNode interfaceId = (LeafSchemaNode) augment.getDataChildByName("interface-id");
97 ContainerSchemaNode schemas = (ContainerSchemaNode) augment.getDataChildByName("schemas");
98 ChoiceNode odl = (ChoiceNode) augment.getDataChildByName("odl");
100 assertNotNull(ds0ChannelNumber);
101 assertNotNull(interfaceId);
102 assertNotNull(schemas);
105 // leaf ds0ChannelNumber
106 QName qname = new QName(fooNS, fooRev, foo, "ds0ChannelNumber");
108 assertEquals(qname, ds0ChannelNumber.getQName());
109 expectedSchemaPath = SchemaPath.create(qnames, true);
110 assertEquals(expectedSchemaPath, ds0ChannelNumber.getPath());
111 assertFalse(ds0ChannelNumber.isAugmenting());
112 // type of leaf ds0ChannelNumber
113 QName typeQName = BaseTypes.constructQName("string");
114 List<QName> typePath = Collections.singletonList(typeQName);
115 expectedSchemaPath = SchemaPath.create(typePath, true);
116 assertEquals(expectedSchemaPath, ds0ChannelNumber.getType().getPath());
119 qname = new QName(fooNS, fooRev, foo, "interface-id");
120 assertEquals(qname, interfaceId.getQName());
121 qnames.set(3, qname);
122 expectedSchemaPath = SchemaPath.create(qnames, true);
123 assertEquals(expectedSchemaPath, interfaceId.getPath());
124 assertFalse(interfaceId.isAugmenting());
127 qname = new QName(fooNS, fooRev, foo, "schemas");
128 assertEquals(qname, schemas.getQName());
129 qnames.set(3, qname);
130 expectedSchemaPath = SchemaPath.create(qnames, true);
131 assertEquals(expectedSchemaPath, schemas.getPath());
132 assertFalse(schemas.isAugmenting());
135 qname = new QName(fooNS, fooRev, foo, "odl");
136 assertEquals(qname, odl.getQName());
137 qnames.set(3, qname);
138 expectedSchemaPath = SchemaPath.create(qnames, true);
139 assertEquals(expectedSchemaPath, odl.getPath());
140 assertFalse(odl.isAugmenting());
143 Module module3 = TestUtils.findModule(modules, "baz");
144 augmentations = module3.getAugmentations();
145 assertEquals(3, augmentations.size());
146 AugmentationSchema augment1 = null;
147 AugmentationSchema augment2 = null;
148 AugmentationSchema augment3 = null;
149 for (AugmentationSchema as : augmentations) {
150 if (as.getWhenCondition() == null) {
152 } else if ("if:ifType='ds0'".equals(as.getWhenCondition().toString())) {
154 } else if ("if:ifType='ds2'".equals(as.getWhenCondition().toString())) {
158 assertNotNull(augment1);
159 assertNotNull(augment2);
160 assertNotNull(augment3);
162 assertEquals(1, augment1.getChildNodes().size());
163 ContainerSchemaNode augmentHolder = (ContainerSchemaNode) augment1.getDataChildByName("augment-holder");
164 assertNotNull(augmentHolder);
166 assertEquals(1, augment2.getChildNodes().size());
167 ContainerSchemaNode augmentHolder2 = (ContainerSchemaNode) augment2.getDataChildByName("augment-holder2");
168 assertNotNull(augmentHolder2);
170 assertEquals(1, augment3.getChildNodes().size());
171 LeafSchemaNode pause = (LeafSchemaNode) augment3.getDataChildByName("pause");
172 assertNotNull(pause);
176 public void testAugmentResolving() throws Exception {
177 modules = TestUtils.loadModules(getClass().getResource("/augment-test/augment-in-augment").toURI());
178 Module module2 = TestUtils.findModule(modules, "bar");
179 ContainerSchemaNode interfaces = (ContainerSchemaNode) module2.getDataChildByName("interfaces");
180 ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName("ifEntry");
182 SchemaPath expectedPath;
183 List<QName> qnames = new ArrayList<>();
189 // augment "/br:interfaces/br:ifEntry" {
190 ContainerSchemaNode augmentHolder = (ContainerSchemaNode) ifEntry.getDataChildByName("augment-holder");
191 TestUtils.checkIsAugmenting(augmentHolder, true);
192 assertEquals(q2, augmentHolder.getQName());
193 expectedPath = SchemaPath.create(qnames, true);
194 assertEquals(expectedPath, augmentHolder.getPath());
197 // augment "/br:interfaces/br:ifEntry/bz:augment-holder"
198 LeafSchemaNode ds0ChannelNumber = (LeafSchemaNode) augmentHolder.getDataChildByName("ds0ChannelNumber");
199 LeafSchemaNode interfaceId = (LeafSchemaNode) augmentHolder.getDataChildByName("interface-id");
200 ContainerSchemaNode schemas = (ContainerSchemaNode) augmentHolder.getDataChildByName("schemas");
201 ChoiceNode odl = (ChoiceNode) augmentHolder.getDataChildByName("odl");
203 assertNotNull(ds0ChannelNumber);
204 assertNotNull(interfaceId);
205 assertNotNull(schemas);
208 // leaf ds0ChannelNumber
209 QName qname = new QName(fooNS, fooRev, foo, "ds0ChannelNumber");
210 assertEquals(qname, ds0ChannelNumber.getQName());
212 expectedPath = SchemaPath.create(qnames, true);
213 assertEquals(expectedPath, ds0ChannelNumber.getPath());
216 qname = new QName(fooNS, fooRev, foo, "interface-id");
217 assertEquals(qname, interfaceId.getQName());
218 qnames.set(3, qname);
219 expectedPath = SchemaPath.create(qnames, true);
220 assertEquals(expectedPath, interfaceId.getPath());
223 qname = new QName(fooNS, fooRev, foo, "schemas");
224 assertEquals(qname, schemas.getQName());
225 qnames.set(3, qname);
226 expectedPath = SchemaPath.create(qnames, true);
227 assertEquals(expectedPath, schemas.getPath());
230 qname = new QName(fooNS, fooRev, foo, "odl");
231 assertEquals(qname, odl.getQName());
232 qnames.set(3, qname);
233 expectedPath = SchemaPath.create(qnames, true);
234 assertEquals(expectedPath, odl.getPath());
238 public void testAugmentedChoice() throws Exception {
239 modules = TestUtils.loadModules(getClass().getResource("/augment-test/augment-in-augment").toURI());
240 Module module2 = TestUtils.findModule(modules, "bar");
241 ContainerSchemaNode interfaces = (ContainerSchemaNode) module2.getDataChildByName("interfaces");
242 ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName("ifEntry");
243 ContainerSchemaNode augmentedHolder = (ContainerSchemaNode) ifEntry.getDataChildByName("augment-holder");
244 TestUtils.checkIsAugmenting(augmentedHolder, true);
247 // augment "/br:interfaces/br:ifEntry/bz:augment-holder"
248 ChoiceNode odl = (ChoiceNode) augmentedHolder.getDataChildByName("odl");
250 Set<ChoiceCaseNode> cases = odl.getCases();
251 assertEquals(4, cases.size());
253 ChoiceCaseNode id = null;
254 ChoiceCaseNode node1 = null;
255 ChoiceCaseNode node2 = null;
256 ChoiceCaseNode node3 = null;
258 for (ChoiceCaseNode ccn : cases) {
259 if ("id".equals(ccn.getQName().getLocalName())) {
261 } else if ("node1".equals(ccn.getQName().getLocalName())) {
263 } else if ("node2".equals(ccn.getQName().getLocalName())) {
265 } else if ("node3".equals(ccn.getQName().getLocalName())) {
271 assertNotNull(node1);
272 assertNotNull(node2);
273 assertNotNull(node3);
275 SchemaPath expectedPath;
276 List<QName> qnames = new ArrayList<>();
280 qnames.add(new QName(fooNS, fooRev, foo, "odl"));
283 QName qname = new QName(fooNS, fooRev, foo, "id");
284 assertEquals(qname, id.getQName());
286 expectedPath = SchemaPath.create(qnames, true);
287 assertEquals(expectedPath, id.getPath());
288 Set<DataSchemaNode> idChildren = id.getChildNodes();
289 assertEquals(1, idChildren.size());
292 qname = new QName(fooNS, fooRev, foo, "node1");
293 assertEquals(qname, node1.getQName());
294 qnames.set(4, qname);
295 expectedPath = SchemaPath.create(qnames, true);
296 assertEquals(expectedPath, node1.getPath());
297 Set<DataSchemaNode> node1Children = node1.getChildNodes();
298 assertTrue(node1Children.isEmpty());
301 qname = new QName(fooNS, fooRev, foo, "node2");
302 assertEquals(qname, node2.getQName());
303 qnames.set(4, qname);
304 expectedPath = SchemaPath.create(qnames, true);
305 assertEquals(expectedPath, node2.getPath());
306 Set<DataSchemaNode> node2Children = node2.getChildNodes();
307 assertTrue(node2Children.isEmpty());
310 qname = new QName(fooNS, fooRev, foo, "node3");
311 assertEquals(qname, node3.getQName());
312 qnames.set(4, qname);
313 expectedPath = SchemaPath.create(qnames, true);
314 assertEquals(expectedPath, node3.getPath());
315 Set<DataSchemaNode> node3Children = node3.getChildNodes();
316 assertEquals(1, node3Children.size());
323 qnames.add(new QName(fooNS, fooRev, foo, "odl"));
326 qnames.add(new QName(fooNS, fooRev, foo, "id"));
327 qnames.add(new QName(fooNS, fooRev, foo, "id"));
328 LeafSchemaNode caseIdChild = (LeafSchemaNode) idChildren.iterator().next();
329 assertNotNull(caseIdChild);
330 expectedPath = SchemaPath.create(qnames, true);
331 assertEquals(expectedPath, caseIdChild.getPath());
334 qnames.set(4, new QName(fooNS, fooRev, foo, "node3"));
335 qnames.set(5, new QName(fooNS, fooRev, foo, "node3"));
336 ContainerSchemaNode caseNode3Child = (ContainerSchemaNode) node3Children.iterator().next();
337 assertNotNull(caseNode3Child);
338 expectedPath = SchemaPath.create(qnames, true);
339 assertEquals(expectedPath, caseNode3Child.getPath());
343 public void testAugmentRpc() throws Exception {
344 modules = TestUtils.loadModules(getClass().getResource("/augment-test/rpc").toURI());
345 final URI NS_BAR = URI.create("urn:opendaylight:bar");
346 final URI NS_FOO = URI.create("urn:opendaylight:foo");
347 final Date revision = new SimpleDateFormat("yyyy-MM-dd").parse("2013-10-11");
349 Module bar = TestUtils.findModule(modules, "bar");
350 Set<RpcDefinition> rpcs = bar.getRpcs();
351 assertEquals(2, rpcs.size());
353 RpcDefinition submit = null;
354 for (RpcDefinition rpc : rpcs) {
355 if ("submit".equals(rpc.getQName().getLocalName())) {
360 assertNotNull(submit);
362 QName submitQName = new QName(NS_BAR, revision, "b", "submit");
363 assertEquals(submitQName, submit.getQName());
364 ContainerSchemaNode input = submit.getInput();
365 QName inputQName = new QName(NS_BAR, revision, "b", "input");
366 assertEquals(inputQName, input.getQName());
367 ChoiceNode arguments = (ChoiceNode) input.getDataChildByName("arguments");
368 QName argumentsQName = new QName(NS_BAR, revision, "b", "arguments");
369 assertEquals(argumentsQName, arguments.getQName());
370 assertFalse(arguments.isAugmenting());
371 Set<ChoiceCaseNode> cases = arguments.getCases();
372 assertEquals(3, cases.size());
374 ChoiceCaseNode attach = null;
375 ChoiceCaseNode create = null;
376 ChoiceCaseNode destroy = null;
377 for (ChoiceCaseNode child : cases) {
378 if ("attach".equals(child.getQName().getLocalName())) {
380 } else if ("create".equals(child.getQName().getLocalName())) {
382 } else if ("destroy".equals(child.getQName().getLocalName())) {
386 assertNotNull(attach);
387 assertNotNull(create);
388 assertNotNull(destroy);
390 assertTrue(attach.isAugmenting());
391 assertTrue(create.isAugmenting());
392 assertTrue(destroy.isAugmenting());
394 SchemaPath expectedPath;
395 QName[] qnames = new QName[4];
396 qnames[0] = submitQName;
397 qnames[1] = inputQName;
398 qnames[2] = argumentsQName;
401 qnames[3] = new QName(NS_FOO, revision, "f", "attach");
402 assertEquals(qnames[3], attach.getQName());
403 expectedPath = SchemaPath.create(Arrays.asList(qnames), true);
404 assertEquals(expectedPath, attach.getPath());
405 Set<DataSchemaNode> attachChildren = attach.getChildNodes();
406 assertEquals(1, attachChildren.size());
409 qnames[3] = new QName(NS_FOO, revision, "f", "create");
410 assertEquals(qnames[3], create.getQName());
411 expectedPath = SchemaPath.create(Arrays.asList(qnames), true);
412 assertEquals(expectedPath, create.getPath());
413 Set<DataSchemaNode> createChildren = create.getChildNodes();
414 assertEquals(1, createChildren.size());
417 qnames[3] = new QName(NS_FOO, revision, "f", "destroy");
418 assertEquals(qnames[3], destroy.getQName());
419 expectedPath = SchemaPath.create(Arrays.asList(qnames), true);
420 assertEquals(expectedPath, destroy.getPath());
421 Set<DataSchemaNode> destroyChildren = destroy.getChildNodes();
422 assertEquals(1, destroyChildren.size());
426 public void testAugmentInUsesResolving() throws Exception {
427 modules = TestUtils.loadModules(getClass().getResource("/augment-test/augment-in-uses").toURI());
428 assertEquals(1, modules.size());
430 Module test = modules.iterator().next();
431 DataNodeContainer links = (DataNodeContainer) test.getDataChildByName("links");
432 DataNodeContainer link = (DataNodeContainer) links.getDataChildByName("link");
433 DataNodeContainer nodes = (DataNodeContainer) link.getDataChildByName("nodes");
434 ContainerSchemaNode node = (ContainerSchemaNode) nodes.getDataChildByName("node");
435 Set<AugmentationSchema> augments = node.getAvailableAugmentations();
436 assertEquals(1, augments.size());
437 assertEquals(1, node.getChildNodes().size());
438 LeafSchemaNode id = (LeafSchemaNode) node.getDataChildByName("id");
439 assertTrue(id.isAugmenting());