Bug 4540: Yang parser exceptions should follow consistent path
[yangtools.git] / yang / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / stmt / test / ControllerStmtParserTest.java
1 /*
2  * Copyright (c) 2015 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.stmt.test;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import java.io.FileNotFoundException;
14 import java.net.URI;
15 import java.net.URISyntaxException;
16 import java.text.ParseException;
17 import java.util.List;
18 import java.util.Set;
19 import org.junit.Test;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.common.QNameModule;
22 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
23 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
24 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
25 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
28 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.Module;
31 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
32 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.UsesNode;
34 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
35 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
36
37 public class ControllerStmtParserTest {
38
39     @Test
40     public void test() throws SourceException, FileNotFoundException,
41             ReactorException, URISyntaxException, ParseException {
42         SchemaContext context = StmtTestUtils
43                 .parseYangSources("/sal-broker-impl");
44         assertNotNull(context);
45
46         salDomBrokerImplModuleTest(context);
47         configModuleTest(context);
48     }
49
50     private static void salDomBrokerImplModuleTest(final SchemaContext context)
51             throws ParseException {
52         Module module = context.findModuleByName(
53                 "opendaylight-sal-dom-broker-impl", SimpleDateFormatUtil
54                         .getRevisionFormat().parse("2013-10-28"));
55         assertNotNull(module);
56
57         Set<AugmentationSchema> augmentations = module.getAugmentations();
58         boolean checked = false;
59         for (AugmentationSchema augmentationSchema : augmentations) {
60             DataSchemaNode dataNode = augmentationSchema
61                     .getDataChildByName("dom-broker-impl");
62             if (dataNode instanceof ChoiceCaseNode) {
63                 ChoiceCaseNode caseNode = (ChoiceCaseNode) dataNode;
64                 DataSchemaNode dataNode2 = caseNode
65                         .getDataChildByName("async-data-broker");
66                 if (dataNode2 instanceof ContainerSchemaNode) {
67                     ContainerSchemaNode containerNode = (ContainerSchemaNode) dataNode2;
68                     DataSchemaNode leaf = containerNode
69                             .getDataChildByName("type");
70                     List<UnknownSchemaNode> unknownSchemaNodes = leaf
71                             .getUnknownSchemaNodes();
72                     assertEquals(1, unknownSchemaNodes.size());
73
74                     UnknownSchemaNode unknownSchemaNode = unknownSchemaNodes
75                             .get(0);
76                     assertEquals("dom-async-data-broker", unknownSchemaNode
77                             .getQName().getLocalName());
78                     assertEquals(unknownSchemaNode.getQName(),
79                             unknownSchemaNode.getPath().getLastComponent());
80
81                     checked = true;
82                 }
83             }
84         }
85         assertTrue(checked);
86     }
87
88     private static void configModuleTest(final SchemaContext context) throws ParseException,
89             URISyntaxException {
90         Module configModule = context.findModuleByName("config",
91                 SimpleDateFormatUtil.getRevisionFormat().parse("2013-04-05"));
92         assertNotNull(configModule);
93
94         DataSchemaNode dataNode = configModule.getDataChildByName("modules");
95         assertTrue(dataNode instanceof ContainerSchemaNode);
96
97         ContainerSchemaNode moduleContainer = (ContainerSchemaNode) dataNode;
98         DataSchemaNode dataChildList = moduleContainer
99                 .getDataChildByName("module");
100
101         assertTrue(dataChildList instanceof ListSchemaNode);
102
103         ListSchemaNode listModule = (ListSchemaNode) dataChildList;
104         DataSchemaNode dataChildChoice = listModule
105                 .getDataChildByName("configuration");
106
107         assertTrue(dataChildChoice instanceof ChoiceSchemaNode);
108
109         ChoiceSchemaNode confChoice = (ChoiceSchemaNode) dataChildChoice;
110         ChoiceCaseNode caseNodeByName = confChoice
111                 .getCaseNodeByName("dom-broker-impl");
112
113         assertNotNull(caseNodeByName);
114         DataSchemaNode dataNode2 = caseNodeByName
115                 .getDataChildByName("async-data-broker");
116         assertTrue(dataNode2 instanceof ContainerSchemaNode);
117
118         ContainerSchemaNode containerNode = (ContainerSchemaNode) dataNode2;
119         DataSchemaNode leaf = containerNode.getDataChildByName("type");
120         List<UnknownSchemaNode> unknownSchemaNodes = leaf
121                 .getUnknownSchemaNodes();
122
123         assertEquals(1, unknownSchemaNodes.size());
124
125         UnknownSchemaNode unknownSchemaNode = unknownSchemaNodes.get(0);
126
127         assertEquals(unknownSchemaNode.getQName(), unknownSchemaNode.getPath()
128                 .getLastComponent());
129         assertEquals("dom-async-data-broker", unknownSchemaNode.getQName()
130                 .getLocalName());
131
132         ChoiceCaseNode domInmemoryDataBroker = confChoice
133                 .getCaseNodeByName("dom-inmemory-data-broker");
134
135         assertNotNull(domInmemoryDataBroker);
136         DataSchemaNode schemaService = domInmemoryDataBroker
137                 .getDataChildByName("schema-service");
138         assertTrue(schemaService instanceof ContainerSchemaNode);
139
140         ContainerSchemaNode schemaServiceContainer = (ContainerSchemaNode) schemaService;
141
142         assertEquals(1, schemaServiceContainer.getUses().size());
143         UsesNode uses = schemaServiceContainer.getUses().iterator().next();
144         QName groupingQName = QName.create("urn:opendaylight:params:xml:ns:yang:controller:config","2013-04-05","service-ref");
145         QName usesGroupingPathLastComponent = uses.getGroupingPath().getLastComponent();
146         assertEquals(groupingQName, usesGroupingPathLastComponent);
147         assertEquals(0, getChildNodeSizeWithoutUses(schemaServiceContainer));
148
149         DataSchemaNode type = schemaServiceContainer.getDataChildByName("type");
150         List<UnknownSchemaNode> typeUnknownSchemaNodes = type
151                 .getUnknownSchemaNodes();
152
153         assertEquals(1, typeUnknownSchemaNodes.size());
154
155         UnknownSchemaNode typeUnknownSchemaNode = typeUnknownSchemaNodes.get(0);
156
157         QNameModule qNameModule = QNameModule
158                 .create(new URI(
159                         "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom"),
160                         SimpleDateFormatUtil.getRevisionFormat().parse(
161                                 "2013-10-28"));
162         QName qName = QName.create(qNameModule, "schema-service");
163
164         assertEquals(qName, typeUnknownSchemaNode.getQName());
165         assertEquals(typeUnknownSchemaNode.getQName(), typeUnknownSchemaNode
166                 .getPath().getLastComponent());
167     }
168
169     private static int getChildNodeSizeWithoutUses(final DataNodeContainer csn) {
170         int result = 0;
171         for (DataSchemaNode dsn : csn.getChildNodes()) {
172             if (dsn.isAddedByUses() == false) {
173                 result++;
174             }
175         }
176         return result;
177     }
178
179 }