6ee61357e55563b6d68812802f4c94e14b7db453
[yangtools.git] / yang / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / parser / impl / AugmentTest.java
1 /*
2  * Copyright (c) 2013 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.parser.impl;
9
10 import static org.junit.Assert.*;
11
12 import java.io.FileNotFoundException;
13 import java.net.URI;
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;
21 import java.util.Set;
22
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;
37
38 public class AugmentTest {
39
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";
49     private QName q0;
50     private QName q1;
51     private QName q2;
52
53     private final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
54     private Set<Module> modules;
55
56     @Before
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");
61
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");
65
66         modules = TestUtils.loadModules(getClass().getResource("/model").getPath());
67         assertEquals(3, modules.size());
68     }
69
70     @Test
71     public void testAugmentParsing() {
72         SchemaPath expectedSchemaPath;
73         QName[] qnames = new QName[3];
74         qnames[0] = q0;
75         qnames[1] = q1;
76         qnames[2] = q2;
77
78         // testfile1
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);
84
85         expectedSchemaPath = new SchemaPath(Arrays.asList(qnames), true);
86         assertEquals(expectedSchemaPath, augment.getTargetPath());
87
88         Set<DataSchemaNode> augmentChildren = augment.getChildNodes();
89         assertEquals(5, augmentChildren.size());
90         for (DataSchemaNode dsn : augmentChildren) {
91             TestUtils.checkIsAugmenting(dsn, false);
92         }
93
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");
99
100         assertNotNull(ds0ChannelNumber);
101         assertNotNull(interfaceId);
102         assertNotNull(myType);
103         assertNotNull(schemas);
104         assertNotNull(odl);
105
106         qnames = new QName[4];
107         qnames[0] = q0;
108         qnames[1] = q1;
109         qnames[2] = q2;
110
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());
121
122         // leaf interface-id
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());
127
128         // leaf my-type
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());
133
134         // container schemas
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());
139
140         // choice odl
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());
145
146         // testfile3
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())) {
154                 augment1 = as;
155             } else if ("if:ifType='ds2'".equals(as.getWhenCondition().toString())) {
156                 augment2 = as;
157             }
158         }
159         assertNotNull(augment1);
160         assertNotNull(augment2);
161
162         assertEquals(1, augment1.getChildNodes().size());
163         ContainerSchemaNode augmentHolder = (ContainerSchemaNode) augment1.getDataChildByName("augment-holder");
164         assertNotNull(augmentHolder);
165
166         assertEquals(1, augment2.getChildNodes().size());
167         ContainerSchemaNode augmentHolder2 = (ContainerSchemaNode) augment2.getDataChildByName("augment-holder2");
168         assertNotNull(augmentHolder2);
169     }
170
171     @Test
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);
178
179         // testfile1.yang
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");
186
187         assertNotNull(ds0ChannelNumber);
188         assertNotNull(interfaceId);
189         assertNotNull(myType);
190         assertNotNull(schemas);
191         assertNotNull(odl);
192
193         SchemaPath expectedPath;
194         QName[] qnames = new QName[4];
195         qnames[0] = q0;
196         qnames[1] = q1;
197         qnames[2] = q2;
198
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());
203
204         // leaf interface-id
205         qnames[3] = new QName(types1NS, types1Rev, t1, "interface-id");
206         expectedPath = new SchemaPath(Arrays.asList(qnames), true);
207         assertEquals(expectedPath, interfaceId.getPath());
208
209         // leaf my-type
210         qnames[3] = new QName(types1NS, types1Rev, t1, "my-type");
211         expectedPath = new SchemaPath(Arrays.asList(qnames), true);
212         assertEquals(expectedPath, myType.getPath());
213
214         // container schemas
215         qnames[3] = new QName(types1NS, types1Rev, t1, "schemas");
216         expectedPath = new SchemaPath(Arrays.asList(qnames), true);
217         assertEquals(expectedPath, schemas.getPath());
218
219         // choice odl
220         qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
221         expectedPath = new SchemaPath(Arrays.asList(qnames), true);
222         assertEquals(expectedPath, odl.getPath());
223     }
224
225     @Test
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);
232
233         // testfile1.yang
234         // augment "/data:interfaces/data:ifEntry/t3:augment-holder"
235         ChoiceNode odl = (ChoiceNode) augmentedContainer.getDataChildByName("odl");
236         assertNotNull(odl);
237         Set<ChoiceCaseNode> cases = odl.getCases();
238         assertEquals(4, cases.size());
239
240         ChoiceCaseNode id = null;
241         ChoiceCaseNode node1 = null;
242         ChoiceCaseNode node2 = null;
243         ChoiceCaseNode node3 = null;
244
245         for (ChoiceCaseNode ccn : cases) {
246             if ("id".equals(ccn.getQName().getLocalName())) {
247                 id = ccn;
248             } else if ("node1".equals(ccn.getQName().getLocalName())) {
249                 node1 = ccn;
250             } else if ("node2".equals(ccn.getQName().getLocalName())) {
251                 node2 = ccn;
252             } else if ("node3".equals(ccn.getQName().getLocalName())) {
253                 node3 = ccn;
254             }
255         }
256
257         assertNotNull(id);
258         assertNotNull(node1);
259         assertNotNull(node2);
260         assertNotNull(node3);
261
262         SchemaPath expectedPath;
263         QName[] qnames = new QName[5];
264         qnames[0] = q0;
265         qnames[1] = q1;
266         qnames[2] = q2;
267         qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
268
269         // case id
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());
275
276         // case node1
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());
282
283         // case node2
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());
289
290         // case node3
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());
296
297         // test cases
298         qnames = new QName[6];
299         qnames[0] = q0;
300         qnames[1] = q1;
301         qnames[2] = q2;
302         qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
303
304         // case id child
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());
311
312         // case node3 child
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());
319     }
320
321     @Test
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");
327
328         Module bar = TestUtils.findModule(modules, "bar");
329         Set<RpcDefinition> rpcs = bar.getRpcs();
330         assertEquals(2, rpcs.size());
331
332         RpcDefinition submit = null;
333         for (RpcDefinition rpc : rpcs) {
334             if ("submit".equals(rpc.getQName().getLocalName())) {
335                 submit = rpc;
336                 break;
337             }
338         }
339         assertNotNull(submit);
340
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());
352
353         ChoiceCaseNode attach = null;
354         ChoiceCaseNode create = null;
355         ChoiceCaseNode destroy = null;
356         for (ChoiceCaseNode child : cases) {
357             if ("attach".equals(child.getQName().getLocalName())) {
358                 attach = child;
359             } else if ("create".equals(child.getQName().getLocalName())) {
360                 create = child;
361             } else if ("destroy".equals(child.getQName().getLocalName())) {
362                 destroy = child;
363             }
364         }
365         assertNotNull(attach);
366         assertNotNull(create);
367         assertNotNull(destroy);
368
369         assertTrue(attach.isAugmenting());
370         assertTrue(create.isAugmenting());
371         assertTrue(destroy.isAugmenting());
372
373         SchemaPath expectedPath;
374         QName[] qnames = new QName[4];
375         qnames[0] = submitQName;
376         qnames[1] = inputQName;
377         qnames[2] = argumentsQName;
378
379         // case attach
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());
386
387         // case create
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());
394
395         // case attach
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());
402
403     }
404
405 }