Refactored base yang-java types.
[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.SchemaPath;
35 import org.opendaylight.yangtools.yang.model.util.BaseTypes;
36
37 import com.google.common.collect.Lists;
38
39 public class AugmentTest {
40
41     private final URI types1NS = URI.create("urn:simple.nodes.test");
42     private final URI types2NS = URI.create("urn:simple.types.test");
43     private final URI types3NS = URI.create("urn:custom.nodes.test");
44     private Date types1Rev;
45     private Date types2Rev;
46     private Date types3Rev;
47     private final String t1 = "n";
48     private final String t2 = "t";
49     private final String t3 = "c";
50     private QName q0;
51     private QName q1;
52     private QName q2;
53
54     private final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
55     private Set<Module> modules;
56
57     @Before
58     public void init() throws FileNotFoundException, ParseException {
59         types1Rev = simpleDateFormat.parse("2013-02-27");
60         types2Rev = simpleDateFormat.parse("2013-07-03");
61         types3Rev = simpleDateFormat.parse("2013-02-27");
62
63         q0 = new QName(types2NS, types2Rev, t2, "interfaces");
64         q1 = new QName(types2NS, types2Rev, t2, "ifEntry");
65         q2 = new QName(types3NS, types3Rev, t3, "augment-holder");
66
67         modules = TestUtils.loadModules(getClass().getResource("/model").getPath());
68         assertEquals(3, modules.size());
69     }
70
71     @Test
72     public void testAugmentParsing() {
73         SchemaPath expectedPath = null;
74         QName[] qnames = null;
75
76         // testfile1
77         Module module1 = TestUtils.findModule(modules, "nodes");
78         Set<AugmentationSchema> augmentations = module1.getAugmentations();
79         assertEquals(1, augmentations.size());
80         AugmentationSchema augment = augmentations.iterator().next();
81
82         Set<DataSchemaNode> augmentChildren = augment.getChildNodes();
83         assertEquals(5, augmentChildren.size());
84         for(DataSchemaNode dsn : augmentChildren) {
85             assertTrue(dsn.isAugmenting());
86         }
87
88         LeafSchemaNode ds0ChannelNumber = (LeafSchemaNode) augment.getDataChildByName("ds0ChannelNumber");
89         LeafSchemaNode interfaceId = (LeafSchemaNode) augment.getDataChildByName("interface-id");
90         LeafSchemaNode myType = (LeafSchemaNode) augment.getDataChildByName("my-type");
91         ContainerSchemaNode schemas = (ContainerSchemaNode) augment.getDataChildByName("schemas");
92         ChoiceNode odl = (ChoiceNode)augment.getDataChildByName("odl");
93
94         assertNotNull(ds0ChannelNumber);
95         assertNotNull(interfaceId);
96         assertNotNull(myType);
97         assertNotNull(schemas);
98         assertNotNull(odl);
99
100         qnames = new QName[4];
101         qnames[0] = q0;
102         qnames[1] = q1;
103         qnames[2] = q2;
104
105         // leaf ds0ChannelNumber
106         qnames[3] = new QName(types1NS, types1Rev, t1, "ds0ChannelNumber");
107         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
108         assertEquals(expectedPath, ds0ChannelNumber.getPath());
109         // type of leaf ds0ChannelNumber
110         QName typeQName = BaseTypes.constructQName("string");
111         List<QName> typePath = Collections.singletonList(typeQName);
112         expectedPath = new SchemaPath(typePath, true);
113         assertEquals(expectedPath, ds0ChannelNumber.getType().getPath());
114
115         // leaf interface-id
116         qnames[3] = new QName(types1NS, types1Rev, t1, "interface-id");
117         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
118         assertEquals(expectedPath, interfaceId.getPath());
119
120         // leaf my-type
121         qnames[3] = new QName(types1NS, types1Rev, t1, "my-type");
122         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
123         assertEquals(expectedPath, myType.getPath());
124
125         // container schemas
126         qnames[3] = new QName(types1NS, types1Rev, t1, "schemas");
127         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
128         assertEquals(expectedPath, schemas.getPath());
129
130         // choice odl
131         qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
132         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
133         assertEquals(expectedPath, odl.getPath());
134
135
136         // testfile3
137         Module module3 = TestUtils.findModule(modules, "custom");
138         augmentations = module3.getAugmentations();
139         assertEquals(3, augmentations.size());
140         AugmentationSchema augment1 = null;
141         AugmentationSchema augment2 = null;
142         AugmentationSchema augment3 = null;
143         for (AugmentationSchema as : augmentations) {
144             if("if:ifType='ds0'".equals(as.getWhenCondition().toString())) {
145                 augment1 = as;
146             } else if("if:ifType='ds2'".equals(as.getWhenCondition().toString())) {
147                 augment2 = as;
148             } else if ("if:leafType='ds1'".equals(as.getWhenCondition().toString())) {
149                 augment3 = as;
150             }
151         }
152         assertNotNull(augment1);
153         assertNotNull(augment2);
154         assertNotNull(augment3);
155
156         assertEquals(1, augment1.getChildNodes().size());
157         ContainerSchemaNode augmentHolder = (ContainerSchemaNode) augment1.getDataChildByName("augment-holder");
158         assertTrue(augmentHolder.isAugmenting());
159
160         assertEquals(1, augment2.getChildNodes().size());
161         ContainerSchemaNode augmentHolder2 = (ContainerSchemaNode) augment2.getDataChildByName("augment-holder2");
162         assertTrue(augmentHolder2.isAugmenting());
163
164         assertEquals(1, augment3.getChildNodes().size());
165         LeafSchemaNode linkleaf = (LeafSchemaNode) augment3.getDataChildByName("linkleaf");
166         assertTrue(linkleaf.isAugmenting());
167     }
168
169     @Test
170     public void testAugmentResolving() throws ParseException {
171         SchemaPath expectedPath = null;
172         QName[] qnames = null;
173
174         Module module2 = TestUtils.findModule(modules, "types");
175         ContainerSchemaNode interfaces = (ContainerSchemaNode) module2.getDataChildByName("interfaces");
176         ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName("ifEntry");
177         ContainerSchemaNode augmentedContainer = (ContainerSchemaNode) ifEntry.getDataChildByName("augment-holder");
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         qnames = new QName[4];
194         qnames[0] = q0;
195         qnames[1] = q1;
196         qnames[2] = q2;
197
198         // leaf ds0ChannelNumber
199         qnames[3] = new QName(types1NS, types1Rev, t1, "ds0ChannelNumber");
200         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
201         assertEquals(expectedPath, ds0ChannelNumber.getPath());
202
203         // leaf interface-id
204         qnames[3] = new QName(types1NS, types1Rev, t1, "interface-id");
205         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
206         assertEquals(expectedPath, interfaceId.getPath());
207
208         // leaf my-type
209         qnames[3] = new QName(types1NS, types1Rev, t1, "my-type");
210         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
211         assertEquals(expectedPath, myType.getPath());
212
213         // container schemas
214         qnames[3] = new QName(types1NS, types1Rev, t1, "schemas");
215         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
216         assertEquals(expectedPath, schemas.getPath());
217
218         // choice odl
219         qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
220         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
221         assertEquals(expectedPath, odl.getPath());
222
223         // custom.yang
224         // augment "/data:interfaces/data:ifEntry/t3:augment-holder/t1:schemas"
225         LeafSchemaNode linkleaf = (LeafSchemaNode) schemas.getDataChildByName("linkleaf");
226         assertNotNull(linkleaf);
227
228         qnames = new QName[5];
229         qnames[0] = q0;
230         qnames[1] = q1;
231         qnames[2] = q2;
232         qnames[3] = new QName(types1NS, types1Rev, t1, "schemas");
233         qnames[4] = new QName(types3NS, types3Rev, t3, "linkleaf");
234         expectedPath = new SchemaPath(Arrays.asList(qnames), true);
235         assertEquals(expectedPath, linkleaf.getPath());
236     }
237
238     @Test
239     public void testAugmentChoice() throws ParseException {
240         SchemaPath expectedPath = null;
241         QName[] qnames = null;
242
243         Module module2 = TestUtils.findModule(modules, "types");
244         ContainerSchemaNode interfaces = (ContainerSchemaNode) module2.getDataChildByName("interfaces");
245         ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName("ifEntry");
246         ContainerSchemaNode augmentedContainer = (ContainerSchemaNode) ifEntry.getDataChildByName("augment-holder");
247
248         // testfile1.yang
249         // augment "/data:interfaces/data:ifEntry/t3:augment-holder"
250         ChoiceNode odl = (ChoiceNode)augmentedContainer.getDataChildByName("odl");
251         assertNotNull(odl);
252         Set<ChoiceCaseNode> cases = odl.getCases();
253         assertEquals(4, cases.size());
254
255         ChoiceCaseNode id = null;
256         ChoiceCaseNode node1 = null;
257         ChoiceCaseNode node2 = null;
258         ChoiceCaseNode node3 = null;
259
260         for(ChoiceCaseNode ccn : cases) {
261             if("id".equals(ccn.getQName().getLocalName())) {
262                 id = ccn;
263             } else if("node1".equals(ccn.getQName().getLocalName())) {
264                 node1 = ccn;
265             } else if("node2".equals(ccn.getQName().getLocalName())) {
266                 node2 = ccn;
267             } else if("node3".equals(ccn.getQName().getLocalName())) {
268                 node3 = ccn;
269             }
270         }
271
272         assertNotNull(id);
273         assertNotNull(node1);
274         assertNotNull(node2);
275         assertNotNull(node3);
276
277         qnames = new QName[5];
278         qnames[0] = q0;
279         qnames[1] = q1;
280         qnames[2] = q2;
281         qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
282
283         // case id
284         qnames[4] = new QName(types1NS, types1Rev, t1, "id");
285         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
286         assertEquals(expectedPath, id.getPath());
287         Set<DataSchemaNode> idChildren = id.getChildNodes();
288         assertEquals(1, idChildren.size());
289
290         // case node1
291         qnames[4] = new QName(types1NS, types1Rev, t1, "node1");
292         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
293         assertEquals(expectedPath, node1.getPath());
294         Set<DataSchemaNode> node1Children = node1.getChildNodes();
295         assertTrue(node1Children.isEmpty());
296
297         // case node2
298         qnames[4] = new QName(types1NS, types1Rev, t1, "node2");
299         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
300         assertEquals(expectedPath, node2.getPath());
301         Set<DataSchemaNode> node2Children = node2.getChildNodes();
302         assertTrue(node2Children.isEmpty());
303
304         // case node3
305         qnames[4] = new QName(types1NS, types1Rev, t1, "node3");
306         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
307         assertEquals(expectedPath, node3.getPath());
308         Set<DataSchemaNode> node3Children = node3.getChildNodes();
309         assertEquals(1, node3Children.size());
310
311         // test cases
312         qnames = new QName[6];
313         qnames[0] = q0;
314         qnames[1] = q1;
315         qnames[2] = q2;
316         qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
317
318         // case id child
319         qnames[4] = new QName(types1NS, types1Rev, t1, "id");
320         qnames[5] = new QName(types1NS, types1Rev, t1, "id");
321         LeafSchemaNode caseIdChild = (LeafSchemaNode)idChildren.iterator().next();
322         assertNotNull(caseIdChild);
323         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
324         assertEquals(expectedPath, caseIdChild.getPath());
325
326         // case node3 child
327         qnames[4] = new QName(types1NS, types1Rev, t1, "node3");
328         qnames[5] = new QName(types1NS, types1Rev, t1, "node3");
329         ContainerSchemaNode caseNode3Child = (ContainerSchemaNode)node3Children.iterator().next();
330         assertNotNull(caseNode3Child);
331         expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
332         assertEquals(expectedPath, caseNode3Child.getPath());
333     }
334
335 }