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.*;
12 import java.io.FileNotFoundException;
14 import java.text.DateFormat;
15 import java.text.ParseException;
16 import java.text.SimpleDateFormat;
17 import java.util.Arrays;
18 import java.util.Collections;
19 import java.util.Date;
20 import java.util.List;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
27 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
28 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
29 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
31 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.Module;
34 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
35 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
36 import org.opendaylight.yangtools.yang.model.util.BaseTypes;
38 public class AugmentTest {
40 private final URI types1NS = URI.create("urn:simple.nodes.test");
41 private final URI types2NS = URI.create("urn:simple.types.test");
42 private final URI types3NS = URI.create("urn:custom.nodes.test");
43 private Date types1Rev;
44 private Date types2Rev;
45 private Date types3Rev;
46 private final String t1 = "n";
47 private final String t2 = "t";
48 private final String t3 = "c";
53 private final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
54 private Set<Module> modules;
57 public void init() throws FileNotFoundException, ParseException {
58 types1Rev = simpleDateFormat.parse("2013-02-27");
59 types2Rev = simpleDateFormat.parse("2013-07-03");
60 types3Rev = simpleDateFormat.parse("2013-02-27");
62 q0 = new QName(types2NS, types2Rev, t2, "interfaces");
63 q1 = new QName(types2NS, types2Rev, t2, "ifEntry");
64 q2 = new QName(types3NS, types3Rev, t3, "augment-holder");
66 modules = TestUtils.loadModules(getClass().getResource("/model").getPath());
67 assertEquals(3, modules.size());
71 public void testAugmentParsing() {
72 SchemaPath expectedSchemaPath;
73 QName[] qnames = new QName[3];
79 Module module1 = TestUtils.findModule(modules, "nodes");
80 Set<AugmentationSchema> augmentations = module1.getAugmentations();
81 assertEquals(1, augmentations.size());
82 AugmentationSchema augment = augmentations.iterator().next();
83 assertNotNull(augment);
85 expectedSchemaPath = new SchemaPath(Arrays.asList(qnames), true);
86 assertEquals(expectedSchemaPath, augment.getTargetPath());
88 Set<DataSchemaNode> augmentChildren = augment.getChildNodes();
89 assertEquals(5, augmentChildren.size());
90 for (DataSchemaNode dsn : augmentChildren) {
91 TestUtils.checkIsAugmenting(dsn, false);
94 LeafSchemaNode ds0ChannelNumber = (LeafSchemaNode) augment.getDataChildByName("ds0ChannelNumber");
95 LeafSchemaNode interfaceId = (LeafSchemaNode) augment.getDataChildByName("interface-id");
96 LeafSchemaNode myType = (LeafSchemaNode) augment.getDataChildByName("my-type");
97 ContainerSchemaNode schemas = (ContainerSchemaNode) augment.getDataChildByName("schemas");
98 ChoiceNode odl = (ChoiceNode) augment.getDataChildByName("odl");
100 assertNotNull(ds0ChannelNumber);
101 assertNotNull(interfaceId);
102 assertNotNull(myType);
103 assertNotNull(schemas);
106 qnames = new QName[4];
111 // leaf ds0ChannelNumber
112 qnames[3] = new QName(types1NS, types1Rev, t1, "ds0ChannelNumber");
113 expectedSchemaPath = new SchemaPath(Arrays.asList(qnames), true);
114 assertEquals(expectedSchemaPath, ds0ChannelNumber.getPath());
115 assertFalse(ds0ChannelNumber.isAugmenting());
116 // type of leaf ds0ChannelNumber
117 QName typeQName = BaseTypes.constructQName("string");
118 List<QName> typePath = Collections.singletonList(typeQName);
119 expectedSchemaPath = new SchemaPath(typePath, true);
120 assertEquals(expectedSchemaPath, ds0ChannelNumber.getType().getPath());
123 qnames[3] = new QName(types1NS, types1Rev, t1, "interface-id");
124 expectedSchemaPath = new SchemaPath(Arrays.asList(qnames), true);
125 assertEquals(expectedSchemaPath, interfaceId.getPath());
126 assertFalse(interfaceId.isAugmenting());
129 qnames[3] = new QName(types1NS, types1Rev, t1, "my-type");
130 expectedSchemaPath = new SchemaPath(Arrays.asList(qnames), true);
131 assertEquals(expectedSchemaPath, myType.getPath());
132 assertFalse(myType.isAugmenting());
135 qnames[3] = new QName(types1NS, types1Rev, t1, "schemas");
136 expectedSchemaPath = new SchemaPath(Arrays.asList(qnames), true);
137 assertEquals(expectedSchemaPath, schemas.getPath());
138 assertFalse(schemas.isAugmenting());
141 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
142 expectedSchemaPath = new SchemaPath(Arrays.asList(qnames), true);
143 assertEquals(expectedSchemaPath, odl.getPath());
144 assertFalse(odl.isAugmenting());
147 Module module3 = TestUtils.findModule(modules, "custom");
148 augmentations = module3.getAugmentations();
149 assertEquals(2, augmentations.size());
150 AugmentationSchema augment1 = null;
151 AugmentationSchema augment2 = null;
152 for (AugmentationSchema as : augmentations) {
153 if ("if:ifType='ds0'".equals(as.getWhenCondition().toString())) {
155 } else if ("if:ifType='ds2'".equals(as.getWhenCondition().toString())) {
159 assertNotNull(augment1);
160 assertNotNull(augment2);
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);
172 public void testAugmentResolving() throws ParseException {
173 Module module2 = TestUtils.findModule(modules, "types");
174 ContainerSchemaNode interfaces = (ContainerSchemaNode) module2.getDataChildByName("interfaces");
175 ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName("ifEntry");
176 ContainerSchemaNode augmentedContainer = (ContainerSchemaNode) ifEntry.getDataChildByName("augment-holder");
177 TestUtils.checkIsAugmenting(augmentedContainer, true);
180 // augment "/data:interfaces/data:ifEntry/t3:augment-holder"
181 LeafSchemaNode ds0ChannelNumber = (LeafSchemaNode) augmentedContainer.getDataChildByName("ds0ChannelNumber");
182 LeafSchemaNode interfaceId = (LeafSchemaNode) augmentedContainer.getDataChildByName("interface-id");
183 LeafSchemaNode myType = (LeafSchemaNode) augmentedContainer.getDataChildByName("my-type");
184 ContainerSchemaNode schemas = (ContainerSchemaNode) augmentedContainer.getDataChildByName("schemas");
185 ChoiceNode odl = (ChoiceNode) augmentedContainer.getDataChildByName("odl");
187 assertNotNull(ds0ChannelNumber);
188 assertNotNull(interfaceId);
189 assertNotNull(myType);
190 assertNotNull(schemas);
193 SchemaPath expectedPath;
194 QName[] qnames = new QName[4];
199 // leaf ds0ChannelNumber
200 qnames[3] = new QName(types1NS, types1Rev, t1, "ds0ChannelNumber");
201 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
202 assertEquals(expectedPath, ds0ChannelNumber.getPath());
205 qnames[3] = new QName(types1NS, types1Rev, t1, "interface-id");
206 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
207 assertEquals(expectedPath, interfaceId.getPath());
210 qnames[3] = new QName(types1NS, types1Rev, t1, "my-type");
211 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
212 assertEquals(expectedPath, myType.getPath());
215 qnames[3] = new QName(types1NS, types1Rev, t1, "schemas");
216 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
217 assertEquals(expectedPath, schemas.getPath());
220 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
221 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
222 assertEquals(expectedPath, odl.getPath());
226 public void testAugmentChoice() throws ParseException {
227 Module module2 = TestUtils.findModule(modules, "types");
228 ContainerSchemaNode interfaces = (ContainerSchemaNode) module2.getDataChildByName("interfaces");
229 ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName("ifEntry");
230 ContainerSchemaNode augmentedContainer = (ContainerSchemaNode) ifEntry.getDataChildByName("augment-holder");
231 TestUtils.checkIsAugmenting(augmentedContainer, true);
234 // augment "/data:interfaces/data:ifEntry/t3:augment-holder"
235 ChoiceNode odl = (ChoiceNode) augmentedContainer.getDataChildByName("odl");
237 Set<ChoiceCaseNode> cases = odl.getCases();
238 assertEquals(4, cases.size());
240 ChoiceCaseNode id = null;
241 ChoiceCaseNode node1 = null;
242 ChoiceCaseNode node2 = null;
243 ChoiceCaseNode node3 = null;
245 for (ChoiceCaseNode ccn : cases) {
246 if ("id".equals(ccn.getQName().getLocalName())) {
248 } else if ("node1".equals(ccn.getQName().getLocalName())) {
250 } else if ("node2".equals(ccn.getQName().getLocalName())) {
252 } else if ("node3".equals(ccn.getQName().getLocalName())) {
258 assertNotNull(node1);
259 assertNotNull(node2);
260 assertNotNull(node3);
262 SchemaPath expectedPath;
263 QName[] qnames = new QName[5];
267 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
270 qnames[4] = new QName(types1NS, types1Rev, t1, "id");
271 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
272 assertEquals(expectedPath, id.getPath());
273 Set<DataSchemaNode> idChildren = id.getChildNodes();
274 assertEquals(1, idChildren.size());
277 qnames[4] = new QName(types1NS, types1Rev, t1, "node1");
278 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
279 assertEquals(expectedPath, node1.getPath());
280 Set<DataSchemaNode> node1Children = node1.getChildNodes();
281 assertTrue(node1Children.isEmpty());
284 qnames[4] = new QName(types1NS, types1Rev, t1, "node2");
285 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
286 assertEquals(expectedPath, node2.getPath());
287 Set<DataSchemaNode> node2Children = node2.getChildNodes();
288 assertTrue(node2Children.isEmpty());
291 qnames[4] = new QName(types1NS, types1Rev, t1, "node3");
292 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
293 assertEquals(expectedPath, node3.getPath());
294 Set<DataSchemaNode> node3Children = node3.getChildNodes();
295 assertEquals(1, node3Children.size());
298 qnames = new QName[6];
302 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
305 qnames[4] = new QName(types1NS, types1Rev, t1, "id");
306 qnames[5] = new QName(types1NS, types1Rev, t1, "id");
307 LeafSchemaNode caseIdChild = (LeafSchemaNode) idChildren.iterator().next();
308 assertNotNull(caseIdChild);
309 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
310 assertEquals(expectedPath, caseIdChild.getPath());
313 qnames[4] = new QName(types1NS, types1Rev, t1, "node3");
314 qnames[5] = new QName(types1NS, types1Rev, t1, "node3");
315 ContainerSchemaNode caseNode3Child = (ContainerSchemaNode) node3Children.iterator().next();
316 assertNotNull(caseNode3Child);
317 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
318 assertEquals(expectedPath, caseNode3Child.getPath());
322 public void testAugmentRpc() throws Exception {
323 modules = TestUtils.loadModules(getClass().getResource("/augment-test/rpc").getPath());
324 final URI NS_BAR = URI.create("urn:opendaylight:bar");
325 final URI NS_FOO = URI.create("urn:opendaylight:foo");
326 final Date revision = simpleDateFormat.parse("2013-10-11");
328 Module bar = TestUtils.findModule(modules, "bar");
329 Set<RpcDefinition> rpcs = bar.getRpcs();
330 assertEquals(2, rpcs.size());
332 RpcDefinition submit = null;
333 for (RpcDefinition rpc : rpcs) {
334 if ("submit".equals(rpc.getQName().getLocalName())) {
339 assertNotNull(submit);
341 QName submitQName = new QName(NS_BAR, revision, "b", "submit");
342 assertEquals(submitQName, submit.getQName());
343 ContainerSchemaNode input = submit.getInput();
344 QName inputQName = new QName(NS_BAR, revision, "b", "input");
345 assertEquals(inputQName, input.getQName());
346 ChoiceNode arguments = (ChoiceNode) input.getDataChildByName("arguments");
347 QName argumentsQName = new QName(NS_BAR, revision, "b", "arguments");
348 assertEquals(argumentsQName, arguments.getQName());
349 assertFalse(arguments.isAugmenting());
350 Set<ChoiceCaseNode> cases = arguments.getCases();
351 assertEquals(3, cases.size());
353 ChoiceCaseNode attach = null;
354 ChoiceCaseNode create = null;
355 ChoiceCaseNode destroy = null;
356 for (ChoiceCaseNode child : cases) {
357 if ("attach".equals(child.getQName().getLocalName())) {
359 } else if ("create".equals(child.getQName().getLocalName())) {
361 } else if ("destroy".equals(child.getQName().getLocalName())) {
365 assertNotNull(attach);
366 assertNotNull(create);
367 assertNotNull(destroy);
369 assertTrue(attach.isAugmenting());
370 assertTrue(create.isAugmenting());
371 assertTrue(destroy.isAugmenting());
373 SchemaPath expectedPath;
374 QName[] qnames = new QName[4];
375 qnames[0] = submitQName;
376 qnames[1] = inputQName;
377 qnames[2] = argumentsQName;
380 qnames[3] = new QName(NS_FOO, revision, "f", "attach");
381 assertEquals(qnames[3], attach.getQName());
382 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
383 assertEquals(expectedPath, attach.getPath());
384 Set<DataSchemaNode> attachChildren = attach.getChildNodes();
385 assertEquals(1, attachChildren.size());
388 qnames[3] = new QName(NS_FOO, revision, "f", "create");
389 assertEquals(qnames[3], create.getQName());
390 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
391 assertEquals(expectedPath, create.getPath());
392 Set<DataSchemaNode> createChildren = create.getChildNodes();
393 assertEquals(1, createChildren.size());
396 qnames[3] = new QName(NS_FOO, revision, "f", "destroy");
397 assertEquals(qnames[3], destroy.getQName());
398 expectedPath = new SchemaPath(Arrays.asList(qnames), true);
399 assertEquals(expectedPath, destroy.getPath());
400 Set<DataSchemaNode> destroyChildren = destroy.getChildNodes();
401 assertEquals(1, destroyChildren.size());