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.Collections;
18 import java.util.Date;
19 import java.util.List;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
26 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
27 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
28 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
31 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.Module;
33 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
34 import org.opendaylight.yangtools.yang.model.util.BaseTypes;
36 import com.google.common.collect.Lists;
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 expectedPath = null;
73 QName[] qnames = null;
76 Module module1 = TestUtils.findModule(modules, "nodes");
77 Set<AugmentationSchema> augmentations = module1.getAugmentations();
78 assertEquals(1, augmentations.size());
79 AugmentationSchema augment = augmentations.iterator().next();
81 Set<DataSchemaNode> augmentChildren = augment.getChildNodes();
82 assertEquals(5, augmentChildren.size());
83 for(DataSchemaNode dsn : augmentChildren) {
84 assertTrue(dsn.isAugmenting());
87 LeafSchemaNode ds0ChannelNumber = (LeafSchemaNode) augment.getDataChildByName("ds0ChannelNumber");
88 LeafSchemaNode interfaceId = (LeafSchemaNode) augment.getDataChildByName("interface-id");
89 LeafSchemaNode myType = (LeafSchemaNode) augment.getDataChildByName("my-type");
90 ContainerSchemaNode schemas = (ContainerSchemaNode) augment.getDataChildByName("schemas");
91 ChoiceNode odl = (ChoiceNode)augment.getDataChildByName("odl");
93 assertNotNull(ds0ChannelNumber);
94 assertNotNull(interfaceId);
95 assertNotNull(myType);
96 assertNotNull(schemas);
99 qnames = new QName[4];
104 // leaf ds0ChannelNumber
105 qnames[3] = new QName(types1NS, types1Rev, t1, "ds0ChannelNumber");
106 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
107 assertEquals(expectedPath, ds0ChannelNumber.getPath());
108 // type of leaf ds0ChannelNumber
109 QName typeQName = BaseTypes.constructQName("string");
110 List<QName> typePath = Collections.singletonList(typeQName);
111 expectedPath = new SchemaPath(typePath, true);
112 assertEquals(expectedPath, ds0ChannelNumber.getType().getPath());
115 qnames[3] = new QName(types1NS, types1Rev, t1, "interface-id");
116 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
117 assertEquals(expectedPath, interfaceId.getPath());
120 qnames[3] = new QName(types1NS, types1Rev, t1, "my-type");
121 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
122 assertEquals(expectedPath, myType.getPath());
125 qnames[3] = new QName(types1NS, types1Rev, t1, "schemas");
126 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
127 assertEquals(expectedPath, schemas.getPath());
130 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
131 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
132 assertEquals(expectedPath, odl.getPath());
136 Module module3 = TestUtils.findModule(modules, "custom");
137 augmentations = module3.getAugmentations();
138 assertEquals(2, augmentations.size());
139 AugmentationSchema augment1 = null;
140 AugmentationSchema augment2 = null;
141 for (AugmentationSchema as : augmentations) {
142 if("if:ifType='ds0'".equals(as.getWhenCondition().toString())) {
144 } else if("if:ifType='ds2'".equals(as.getWhenCondition().toString())) {
148 assertNotNull(augment1);
149 assertNotNull(augment2);
151 assertEquals(1, augment1.getChildNodes().size());
152 ContainerSchemaNode augmentHolder = (ContainerSchemaNode) augment1.getDataChildByName("augment-holder");
153 assertTrue(augmentHolder.isAugmenting());
155 assertEquals(1, augment2.getChildNodes().size());
156 ContainerSchemaNode augmentHolder2 = (ContainerSchemaNode) augment2.getDataChildByName("augment-holder2");
157 assertTrue(augmentHolder2.isAugmenting());
161 public void testAugmentResolving() throws ParseException {
162 SchemaPath expectedPath = null;
163 QName[] qnames = null;
165 Module module2 = TestUtils.findModule(modules, "types");
166 ContainerSchemaNode interfaces = (ContainerSchemaNode) module2.getDataChildByName("interfaces");
167 ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName("ifEntry");
168 ContainerSchemaNode augmentedContainer = (ContainerSchemaNode) ifEntry.getDataChildByName("augment-holder");
171 // augment "/data:interfaces/data:ifEntry/t3:augment-holder"
172 LeafSchemaNode ds0ChannelNumber = (LeafSchemaNode) augmentedContainer.getDataChildByName("ds0ChannelNumber");
173 LeafSchemaNode interfaceId = (LeafSchemaNode) augmentedContainer.getDataChildByName("interface-id");
174 LeafSchemaNode myType = (LeafSchemaNode) augmentedContainer.getDataChildByName("my-type");
175 ContainerSchemaNode schemas = (ContainerSchemaNode) augmentedContainer.getDataChildByName("schemas");
176 ChoiceNode odl = (ChoiceNode)augmentedContainer.getDataChildByName("odl");
178 assertNotNull(ds0ChannelNumber);
179 assertNotNull(interfaceId);
180 assertNotNull(myType);
181 assertNotNull(schemas);
184 qnames = new QName[4];
189 // leaf ds0ChannelNumber
190 qnames[3] = new QName(types1NS, types1Rev, t1, "ds0ChannelNumber");
191 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
192 assertEquals(expectedPath, ds0ChannelNumber.getPath());
195 qnames[3] = new QName(types1NS, types1Rev, t1, "interface-id");
196 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
197 assertEquals(expectedPath, interfaceId.getPath());
200 qnames[3] = new QName(types1NS, types1Rev, t1, "my-type");
201 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
202 assertEquals(expectedPath, myType.getPath());
205 qnames[3] = new QName(types1NS, types1Rev, t1, "schemas");
206 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
207 assertEquals(expectedPath, schemas.getPath());
210 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
211 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
212 assertEquals(expectedPath, odl.getPath());
216 public void testAugmentChoice() throws ParseException {
217 SchemaPath expectedPath = null;
218 QName[] qnames = null;
220 Module module2 = TestUtils.findModule(modules, "types");
221 ContainerSchemaNode interfaces = (ContainerSchemaNode) module2.getDataChildByName("interfaces");
222 ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName("ifEntry");
223 ContainerSchemaNode augmentedContainer = (ContainerSchemaNode) ifEntry.getDataChildByName("augment-holder");
226 // augment "/data:interfaces/data:ifEntry/t3:augment-holder"
227 ChoiceNode odl = (ChoiceNode)augmentedContainer.getDataChildByName("odl");
229 Set<ChoiceCaseNode> cases = odl.getCases();
230 assertEquals(4, cases.size());
232 ChoiceCaseNode id = null;
233 ChoiceCaseNode node1 = null;
234 ChoiceCaseNode node2 = null;
235 ChoiceCaseNode node3 = null;
237 for(ChoiceCaseNode ccn : cases) {
238 if("id".equals(ccn.getQName().getLocalName())) {
240 } else if("node1".equals(ccn.getQName().getLocalName())) {
242 } else if("node2".equals(ccn.getQName().getLocalName())) {
244 } else if("node3".equals(ccn.getQName().getLocalName())) {
250 assertNotNull(node1);
251 assertNotNull(node2);
252 assertNotNull(node3);
254 qnames = new QName[5];
258 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
261 qnames[4] = new QName(types1NS, types1Rev, t1, "id");
262 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
263 assertEquals(expectedPath, id.getPath());
264 Set<DataSchemaNode> idChildren = id.getChildNodes();
265 assertEquals(1, idChildren.size());
268 qnames[4] = new QName(types1NS, types1Rev, t1, "node1");
269 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
270 assertEquals(expectedPath, node1.getPath());
271 Set<DataSchemaNode> node1Children = node1.getChildNodes();
272 assertTrue(node1Children.isEmpty());
275 qnames[4] = new QName(types1NS, types1Rev, t1, "node2");
276 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
277 assertEquals(expectedPath, node2.getPath());
278 Set<DataSchemaNode> node2Children = node2.getChildNodes();
279 assertTrue(node2Children.isEmpty());
282 qnames[4] = new QName(types1NS, types1Rev, t1, "node3");
283 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
284 assertEquals(expectedPath, node3.getPath());
285 Set<DataSchemaNode> node3Children = node3.getChildNodes();
286 assertEquals(1, node3Children.size());
289 qnames = new QName[6];
293 qnames[3] = new QName(types1NS, types1Rev, t1, "odl");
296 qnames[4] = new QName(types1NS, types1Rev, t1, "id");
297 qnames[5] = new QName(types1NS, types1Rev, t1, "id");
298 LeafSchemaNode caseIdChild = (LeafSchemaNode)idChildren.iterator().next();
299 assertNotNull(caseIdChild);
300 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
301 assertEquals(expectedPath, caseIdChild.getPath());
304 qnames[4] = new QName(types1NS, types1Rev, t1, "node3");
305 qnames[5] = new QName(types1NS, types1Rev, t1, "node3");
306 ContainerSchemaNode caseNode3Child = (ContainerSchemaNode)node3Children.iterator().next();
307 assertNotNull(caseNode3Child);
308 expectedPath = new SchemaPath(Lists.newArrayList(qnames), true);
309 assertEquals(expectedPath, caseNode3Child.getPath());