Yang parser refactoring.
[yangtools.git] / code-generator / binding-generator-impl / src / test / java / org / opendaylight / yangtools / sal / binding / generator / impl / RefineTest.java
1 /*
2  * Copyright (c) 2013 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.sal.binding.generator.impl;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14
15 import java.io.*;
16 import java.lang.reflect.InvocationTargetException;
17 import java.lang.reflect.Method;
18 import java.net.URI;
19 import java.net.URISyntaxException;
20 import java.util.*;
21
22 import org.junit.Test;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
25 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
26 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.impl.*;
29 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
30 import org.opendaylight.yangtools.yang.parser.util.RefineHolder;
31 import org.opendaylight.yangtools.yang.parser.util.RefineUtils;
32
33 import com.google.common.collect.Lists;
34 import com.google.common.collect.Maps;
35
36 //Test for class RefineUtils
37 public class RefineTest {
38
39     private static List<File> testModels = new ArrayList<>();
40
41     private void loadTestResources() {
42         final File listModelFile = new File(RefineTest.class.getResource("/refine.yang").getPath());
43         testModels.add(listModelFile);
44     }
45
46     private void findUnknownNode(DataSchemaNodeBuilder childNode, String unknownNodeValue, String unknownNodeName) {
47         List<UnknownSchemaNodeBuilder> unknownSchemaNodesBuilder = childNode.getUnknownNodes();
48         boolean refinedUnknownNodeLflstFound = false;
49
50         for (UnknownSchemaNodeBuilder unknownSchemaNodeBuilders : unknownSchemaNodesBuilder) {
51             if (unknownSchemaNodeBuilders.getNodeType().getLocalName().equals(unknownNodeName)
52                     && unknownSchemaNodeBuilders.getQName().getLocalName().equals(unknownNodeValue)) {
53                 refinedUnknownNodeLflstFound = true;
54             }
55         }
56         assertTrue("Unknown node " + unknownNodeName + " with value " + unknownNodeValue + " wasn't found.",
57                 refinedUnknownNodeLflstFound);
58     }
59
60     private void findMustConstraint(ConstraintsBuilder conDef, String mustValue) {
61         boolean mustLflstFound = false;
62         for (MustDefinition mustDef : conDef.getMustDefinitions()) {
63             if (mustDef.toString().equals(mustValue)) {
64                 mustLflstFound = true;
65                 break;
66             }
67         }
68         assertTrue("Must element in 'lflst' is missing.", mustLflstFound);
69     }
70
71     @Test
72     public void usesInGroupingDependenciesTest() {
73         loadTestResources();
74         assertEquals("Incorrect number of test files.", 1, testModels.size());
75
76         Set<UsesNodeBuilder> usesNodeBuilders = getModuleBuilder().getUsesNodes();
77         List<RefineHolder> refineHolders = null;
78         Set<DataSchemaNodeBuilder> dataSchemaNodeBuilders = null;
79         for (UsesNodeBuilder usesNodeBuilder : usesNodeBuilders) {
80             if (usesNodeBuilder.getGroupingPathAsString().equals("grp")) {
81                 refineHolders = usesNodeBuilder.getRefines();
82                 // FIXME
83                 //GroupingUtils.updateUsesParent(usesNodeBuilder);
84                 dataSchemaNodeBuilders = usesNodeBuilder.getParent().getChildNodes();
85                 break;
86             }
87         }
88
89         assertNotNull("List of refine holders wasn't initialized.", refineHolders);
90         assertEquals("Incorrect number of refine holders", 4, refineHolders.size());
91
92         checkLflstRefineHolderAndSchemaNodeBuilder("lflst", refineHolders, dataSchemaNodeBuilders);
93         checkChcRefineHolderAndSchemaNodeBuilder("chc", refineHolders, dataSchemaNodeBuilders);
94         checkChc2RefineHolderAndSchemaNodeBuilder("chc2", refineHolders, dataSchemaNodeBuilders);
95         checkAnyXmlRefineHolderAndSchemaNodeBuilder("data", refineHolders, dataSchemaNodeBuilders);
96     }
97
98     private ModuleBuilder getModuleBuilder() {
99         Class<YangParserImpl> cl = YangParserImpl.class;
100
101         YangParserImpl yangParserImpl = null;
102         yangParserImpl = new YangParserImpl();
103         assertNotNull("Instance of YangParserImpl isn't created", yangParserImpl);
104
105         Method methodResolveModuleBuilders = null;
106         try {
107             methodResolveModuleBuilders = cl.getDeclaredMethod("resolveModuleBuilders", List.class, Map.class);
108         } catch (NoSuchMethodException | SecurityException e1) {
109         }
110         assertNotNull("The method resolveModuleBuilders cannot be found", methodResolveModuleBuilders);
111
112         final Map<InputStream, File> inputStreams = Maps.newHashMap();
113
114         for (final File yangFile : testModels) {
115             try {
116                 inputStreams.put(new FileInputStream(yangFile), yangFile);
117             } catch (FileNotFoundException e) {
118             }
119         }
120         assertEquals("Map with input streams contains incorrect number of files.", 1, inputStreams.size());
121
122         Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();
123         Map<String, Map<Date, ModuleBuilder>> modules = null;
124         try {
125             methodResolveModuleBuilders.setAccessible(true);
126             modules = (Map<String, Map<Date, ModuleBuilder>>) methodResolveModuleBuilders.invoke(yangParserImpl,
127                     Lists.newArrayList(inputStreams.keySet()), builderToStreamMap);
128         } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
129             e.printStackTrace();
130         }
131         assertEquals("Map with modules contains incorrect number of modules", 1, modules.size());
132         Map<Date, ModuleBuilder> mapWithModuleBuilder = modules.get("module-refine");
133         assertEquals("Map with module builders contains incorrect number of modules", 1, mapWithModuleBuilder.size());
134         Date date = new GregorianCalendar(2013, GregorianCalendar.SEPTEMBER, 11).getTime();
135         ModuleBuilder moduleBuilder = mapWithModuleBuilder.get(date);
136         assertNotNull("Module builder wasn't find", moduleBuilder);
137         return moduleBuilder;
138     }
139
140     private void checkAnyXmlRefineHolderAndSchemaNodeBuilder(String string, List<RefineHolder> refineHolders,
141             Set<DataSchemaNodeBuilder> dataSchemaNodeBuilders) {
142         RefineHolder refHolderData = getRefineHolder("data", refineHolders);
143
144         QName qname = createQname();
145         DataSchemaNodeBuilder builderData = new AnyXmlBuilder("module", 4, qname, createSchemaPath(qname));
146
147         assertNotNull("Refine holder data wasn't initialized.", refHolderData);
148         RefineUtils.refineAnyxml((AnyXmlBuilder) builderData, refHolderData);
149
150         // data node
151         ConstraintsBuilder conDefData = builderData.getConstraints();
152         assertFalse("'data' has incorrect value for 'mandatory'", conDefData.isMandatory());
153
154         String unknownNodeDataValue = "some value from data";
155         String unknownNodeDataName = "new-subnode-data";
156         findUnknownNode(builderData, unknownNodeDataValue, unknownNodeDataName);
157         findMustConstraint(conDefData, "something-else = 9");
158
159     }
160
161     private void checkChc2RefineHolderAndSchemaNodeBuilder(String nodeName, List<RefineHolder> refineHolders,
162             Set<DataSchemaNodeBuilder> dataSchemaNodeBuilders) {
163         RefineHolder refHolderChc2 = getRefineHolder("chc2", refineHolders);
164
165         QName qname = createQname();
166         List<QName> path = Lists.newArrayList(qname);
167         DataSchemaNodeBuilder builderChc2 = new ChoiceBuilder("module", 4, qname, new SchemaPath(path, true));
168         assertNotNull("Refine holder chc2 wasn't initialized.", refHolderChc2);
169
170         RefineUtils.refineChoice((ChoiceBuilder) builderChc2, refHolderChc2);
171
172         // chc2 node
173         ConstraintsBuilder conDefChc2 = builderChc2.getConstraints();
174         assertFalse("'chc2' has incorrect value for 'mandatory'", conDefChc2.isMandatory());
175     }
176
177     private void checkChcRefineHolderAndSchemaNodeBuilder(String nodeName, List<RefineHolder> refineHolders,
178             Set<DataSchemaNodeBuilder> dataSchemaNodeBuilders) {
179         RefineHolder refHolderChc = getRefineHolder("chc", refineHolders);
180
181         QName qname = createQname();
182         List<QName> path = Lists.newArrayList(qname);
183         DataSchemaNodeBuilder builderChc = new ChoiceBuilder("module", 4, qname, new SchemaPath(path, true));
184
185         assertNotNull("Refine holder chc wasn't initialized.", refHolderChc);
186         assertNotNull("Data schema node builder chc wasn't initialized.", builderChc);
187         RefineUtils.refineChoice((ChoiceBuilder) builderChc, refHolderChc);
188
189         ChoiceBuilder choiceBuilder = null;
190         if (builderChc instanceof ChoiceBuilder) {
191             choiceBuilder = (ChoiceBuilder) builderChc;
192         }
193         assertNotNull("Choice node chc isn't of type ChoiceBuilder", choiceBuilder);
194         assertEquals("chc node has incorrect default node.", "first", choiceBuilder.getDefaultCase());
195         String unknownNodeChcValue = "some value from chc";
196         String unknownNodeChcName = "new-subnode-chc";
197         findUnknownNode(choiceBuilder, unknownNodeChcValue, unknownNodeChcName);
198     }
199
200     private void checkLflstRefineHolderAndSchemaNodeBuilder(String nodeName, List<RefineHolder> refineHolders,
201             Set<DataSchemaNodeBuilder> dataSchemaNodeBuilders) {
202         RefineHolder refHolderLflst = getRefineHolder(nodeName, refineHolders);
203
204         QName qname = createQname();
205         DataSchemaNodeBuilder builderLflst = new LeafListSchemaNodeBuilder("module", 4, qname, createSchemaPath(qname));
206
207         assertNotNull("Refine holder " + nodeName + " wasn't initialized.", refHolderLflst);
208         assertNotNull("Data schema node builder " + nodeName + " wasn't initialized.", builderLflst);
209         RefineUtils.refineLeafList((LeafListSchemaNodeBuilder) builderLflst, refHolderLflst);
210         // lflst node
211
212         ConstraintsBuilder conDefLflst = builderLflst.getConstraints();
213         assertEquals("Max elements number in " + nodeName + " is incorrect.", new Integer(64),
214                 conDefLflst.getMaxElements());
215         assertEquals("Max elements number in " + nodeName + " is incorrect.", new Integer(32),
216                 conDefLflst.getMinElements());
217
218         findMustConstraint(conDefLflst, "new = 57");
219
220         boolean mustLflstFound = false;
221         for (MustDefinition mustDef : conDefLflst.getMustDefinitions()) {
222             if (mustDef.toString().equals("new = 57")) {
223                 mustLflstFound = true;
224                 break;
225             }
226         }
227         assertTrue("Must element in " + nodeName + " is missing.", mustLflstFound);
228
229         findUnknownNode(builderLflst, "some value from " + nodeName, "new-subnode");
230
231     }
232
233     private RefineHolder getRefineHolder(String refHolderName, List<RefineHolder> refineHolders) {
234         for (RefineHolder refineHolder : refineHolders) {
235             if (refineHolder.getName().equals(refHolderName)) {
236                 return refineHolder;
237             }
238         }
239         return null;
240     }
241
242     private QName createQname() {
243         QName qname = null;
244         boolean uriCreated = false;
245         try {
246             qname = new QName(new URI("uri"), "q name");
247             uriCreated = true;
248         } catch (URISyntaxException e) {
249         }
250         assertTrue("Qname wasn't created sucessfully.", uriCreated);
251         return qname;
252     }
253
254     private SchemaPath createSchemaPath(QName qname) {
255         List<QName> qnames = new ArrayList<>();
256         qnames.add(createQname());
257         return new SchemaPath(qnames, true);
258     }
259
260 }