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