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