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