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.SchemaPath;
35 import org.opendaylight.yangtools.yang.model.util.BaseTypes;
37 import com.google.common.collect.Lists;
39 public class AugmentTest {
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";
54 private final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
55 private Set<Module> modules;
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");
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");
67 modules = TestUtils.loadModules(getClass().getResource("/model").getPath());
68 assertEquals(3, modules.size());
72 public void testAugmentParsing() {
73 SchemaPath expectedPath = null;
74 QName[] qnames = null;
77 Module module1 = TestUtils.findModule(modules, "nodes");
78 Set<AugmentationSchema> augmentations = module1.getAugmentations();
79 assertEquals(1, augmentations.size());
80 AugmentationSchema augment = augmentations.iterator().next();
82 Set<DataSchemaNode> augmentChildren = augment.getChildNodes();
83 assertEquals(5, augmentChildren.size());
84 for(DataSchemaNode dsn : augmentChildren) {
85 assertTrue(dsn.isAugmenting());
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");
94 assertNotNull(ds0ChannelNumber);
95 assertNotNull(interfaceId);
96 assertNotNull(myType);
97 assertNotNull(schemas);
100 qnames = new QName[4];
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());
116 qnames[3] = new QName(types1NS, types1Rev, t1, "interface-id");
117 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
118 assertEquals(expectedPath, interfaceId.getPath());
121 qnames[3] = new QName(types1NS, types1Rev, t1, "my-type");
122 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
123 assertEquals(expectedPath, myType.getPath());
126 qnames[3] = new QName(types1NS, types1Rev, t1, "schemas");
127 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
128 assertEquals(expectedPath, schemas.getPath());
131 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
132 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
133 assertEquals(expectedPath, odl.getPath());
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())) {
146 } else if("if:ifType='ds2'".equals(as.getWhenCondition().toString())) {
148 } else if ("if:leafType='ds1'".equals(as.getWhenCondition().toString())) {
152 assertNotNull(augment1);
153 assertNotNull(augment2);
154 assertNotNull(augment3);
156 assertEquals(1, augment1.getChildNodes().size());
157 ContainerSchemaNode augmentHolder = (ContainerSchemaNode) augment1.getDataChildByName("augment-holder");
158 assertTrue(augmentHolder.isAugmenting());
160 assertEquals(1, augment2.getChildNodes().size());
161 ContainerSchemaNode augmentHolder2 = (ContainerSchemaNode) augment2.getDataChildByName("augment-holder2");
162 assertTrue(augmentHolder2.isAugmenting());
164 assertEquals(1, augment3.getChildNodes().size());
165 LeafSchemaNode linkleaf = (LeafSchemaNode) augment3.getDataChildByName("linkleaf");
166 assertTrue(linkleaf.isAugmenting());
170 public void testAugmentResolving() throws ParseException {
171 SchemaPath expectedPath = null;
172 QName[] qnames = null;
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");
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 qnames = new QName[4];
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());
204 qnames[3] = new QName(types1NS, types1Rev, t1, "interface-id");
205 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
206 assertEquals(expectedPath, interfaceId.getPath());
209 qnames[3] = new QName(types1NS, types1Rev, t1, "my-type");
210 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
211 assertEquals(expectedPath, myType.getPath());
214 qnames[3] = new QName(types1NS, types1Rev, t1, "schemas");
215 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
216 assertEquals(expectedPath, schemas.getPath());
219 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
220 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
221 assertEquals(expectedPath, odl.getPath());
224 // augment "/data:interfaces/data:ifEntry/t3:augment-holder/t1:schemas"
225 LeafSchemaNode linkleaf = (LeafSchemaNode) schemas.getDataChildByName("linkleaf");
226 assertNotNull(linkleaf);
228 qnames = new QName[5];
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());
239 public void testAugmentChoice() throws ParseException {
240 SchemaPath expectedPath = null;
241 QName[] qnames = null;
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");
249 // augment "/data:interfaces/data:ifEntry/t3:augment-holder"
250 ChoiceNode odl = (ChoiceNode)augmentedContainer.getDataChildByName("odl");
252 Set<ChoiceCaseNode> cases = odl.getCases();
253 assertEquals(4, cases.size());
255 ChoiceCaseNode id = null;
256 ChoiceCaseNode node1 = null;
257 ChoiceCaseNode node2 = null;
258 ChoiceCaseNode node3 = null;
260 for(ChoiceCaseNode ccn : cases) {
261 if("id".equals(ccn.getQName().getLocalName())) {
263 } else if("node1".equals(ccn.getQName().getLocalName())) {
265 } else if("node2".equals(ccn.getQName().getLocalName())) {
267 } else if("node3".equals(ccn.getQName().getLocalName())) {
273 assertNotNull(node1);
274 assertNotNull(node2);
275 assertNotNull(node3);
277 qnames = new QName[5];
281 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
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());
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());
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());
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());
312 qnames = new QName[6];
316 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
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());
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());