Bug 2496: Implement parser support for parsing YIN input
[yangtools.git] / yang / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / stmt / retest / TestUtils.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.yang.stmt.retest;
9
10 import static org.junit.Assert.assertEquals;
11
12 import java.io.File;
13 import java.io.FileInputStream;
14 import java.io.FileNotFoundException;
15 import java.io.InputStream;
16 import java.net.URI;
17 import java.net.URISyntaxException;
18 import java.net.URL;
19 import java.text.DateFormat;
20 import java.text.ParseException;
21 import java.text.SimpleDateFormat;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Date;
25 import java.util.List;
26 import java.util.Set;
27 import org.opendaylight.yangtools.yang.common.QName;
28 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
29 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
31 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
33 import org.opendaylight.yangtools.yang.model.api.Module;
34 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
35 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
36 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
37 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
38 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
39 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
40 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
41 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
42 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
43 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl;
44 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YinStatementSourceImpl;
45 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.EffectiveSchemaContext;
46 import org.opendaylight.yangtools.yang.stmt.test.StmtTestUtils;
47
48 public final class TestUtils {
49
50     private TestUtils() {
51     }
52
53     public static Set<Module> loadModules(final URI resourceDirectory)
54             throws SourceException, ReactorException {
55         final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
56                 .newBuild();
57         File[] files = new File(resourceDirectory).listFiles();
58
59         for (File file : files) {
60             addSources(reactor, new YangStatementSourceImpl(file.getPath(),
61                     true));
62         }
63
64         EffectiveSchemaContext ctx = reactor.buildEffective();
65         return ctx.getModules();
66     }
67
68     public static Set<Module> loadYinModules(final URI resourceDirectory) throws ReactorException {
69         final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
70
71         for (File file : new File(resourceDirectory).listFiles()) {
72             addYinSources(reactor, new YinStatementSourceImpl(file.getPath(), true));
73         }
74
75         EffectiveSchemaContext ctx = reactor.buildEffective();
76         return ctx.getModules();
77     }
78
79     public static Set<Module> loadModules(final List<InputStream> streams)
80         throws SourceException, ReactorException {
81         final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
82             .newBuild();
83         for (InputStream inputStream : streams) {
84             addSources(reactor, new YangStatementSourceImpl(inputStream));
85         }
86
87         EffectiveSchemaContext ctx = reactor.buildEffective();
88         return ctx.getModules();
89     }
90
91     public static Set<Module> loadYinModules(final List<InputStream> streams) throws SourceException, ReactorException {
92         final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
93         for (InputStream inputStream : streams) {
94             addYinSources(reactor, new YinStatementSourceImpl(inputStream));
95         }
96
97         EffectiveSchemaContext ctx = reactor.buildEffective();
98         return ctx.getModules();
99     }
100
101     public static Module loadModule(final InputStream stream)
102         throws SourceException, ReactorException {
103         final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
104             .newBuild();
105         addSources(reactor, new YangStatementSourceImpl(stream));
106         EffectiveSchemaContext ctx = reactor.buildEffective();
107         return ctx.getModules().iterator().next();
108     }
109
110     public static Module loadYinModule(final InputStream stream) throws SourceException, ReactorException {
111         final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
112         addYinSources(reactor, new YinStatementSourceImpl(stream));
113         EffectiveSchemaContext ctx = reactor.buildEffective();
114         return ctx.getModules().iterator().next();
115     }
116
117     public static Module findModule(final Set<Module> modules,
118         final String moduleName) {
119         Module result = null;
120         for (Module module : modules) {
121             if (module.getName().equals(moduleName)) {
122                 result = module;
123                 break;
124             }
125         }
126         return result;
127     }
128
129     public static ModuleImport findImport(final Set<ModuleImport> imports,
130             final String prefix) {
131         ModuleImport result = null;
132         for (ModuleImport moduleImport : imports) {
133             if (moduleImport.getPrefix().equals(prefix)) {
134                 result = moduleImport;
135                 break;
136             }
137         }
138         return result;
139     }
140
141     public static TypeDefinition<?> findTypedef(
142             final Set<TypeDefinition<?>> typedefs, final String name) {
143         TypeDefinition<?> result = null;
144         for (TypeDefinition<?> td : typedefs) {
145             if (td.getQName().getLocalName().equals(name)) {
146                 result = td;
147                 break;
148             }
149         }
150         return result;
151     }
152
153     public static SchemaPath createPath(final boolean absolute,
154             final URI namespace, final Date revision, final String prefix,
155             final String... names) {
156         List<QName> path = new ArrayList<>();
157         for (String name : names) {
158             path.add(QName.create(namespace, revision, name));
159         }
160         return SchemaPath.create(path, absolute);
161     }
162
163     public static Date createDate(final String date) {
164         Date result;
165         final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
166         try {
167             result = simpleDateFormat.parse(date);
168         } catch (ParseException e) {
169             result = null;
170         }
171         return result;
172     }
173
174     /**
175      * Test if node has augmenting flag set to expected value. In case this is
176      * DataNodeContainer/ChoiceNode, check its child nodes/case nodes too.
177      *
178      * @param node
179      *            node to check
180      * @param expected
181      *            expected value
182      */
183     public static void checkIsAugmenting(final DataSchemaNode node,
184             final boolean expected) {
185         assertEquals(expected, node.isAugmenting());
186         if (node instanceof DataNodeContainer) {
187             for (DataSchemaNode child : ((DataNodeContainer) node)
188                     .getChildNodes()) {
189                 checkIsAugmenting(child, expected);
190             }
191         } else if (node instanceof ChoiceSchemaNode) {
192             for (ChoiceCaseNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
193                 checkIsAugmenting(caseNode, expected);
194             }
195         }
196     }
197
198     /**
199      * Check if node has addedByUses flag set to expected value. In case this is
200      * DataNodeContainer/ChoiceNode, check its child nodes/case nodes too.
201      *
202      * @param node
203      *            node to check
204      * @param expected
205      *            expected value
206      */
207     public static void checkIsAddedByUses(final DataSchemaNode node,
208             final boolean expected) {
209         assertEquals(expected, node.isAddedByUses());
210         if (node instanceof DataNodeContainer) {
211             for (DataSchemaNode child : ((DataNodeContainer) node)
212                     .getChildNodes()) {
213                 checkIsAddedByUses(child, expected);
214             }
215         } else if (node instanceof ChoiceSchemaNode) {
216             for (ChoiceCaseNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
217                 checkIsAddedByUses(caseNode, expected);
218             }
219         }
220     }
221
222     public static void checkIsAddedByUses(final GroupingDefinition node,
223             final boolean expected) {
224         assertEquals(expected, node.isAddedByUses());
225         for (DataSchemaNode child : ((DataNodeContainer) node).getChildNodes()) {
226             checkIsAddedByUses(child, expected);
227         }
228     }
229
230     public static List<Module> findModules(final Set<Module> modules,
231             final String moduleName) {
232         List<Module> result = new ArrayList<>();
233         for (Module module : modules) {
234             if (module.getName().equals(moduleName)) {
235                 result.add(module);
236             }
237         }
238         return result;
239     }
240
241     private static void addSources(
242             CrossSourceStatementReactor.BuildAction reactor,
243             YangStatementSourceImpl... sources) {
244         for (YangStatementSourceImpl source : sources) {
245             reactor.addSource(source);
246         }
247     }
248
249     public static SchemaContext parseYangSources(
250             StatementStreamSource... sources) throws SourceException,
251             ReactorException {
252
253         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
254                 .newBuild();
255         reactor.addSources(sources);
256
257         return reactor.buildEffective();
258     }
259
260     public static SchemaContext parseYangSources(File... files)
261             throws SourceException, ReactorException, FileNotFoundException {
262
263         StatementStreamSource[] sources = new StatementStreamSource[files.length];
264
265         for (int i = 0; i < files.length; i++) {
266             sources[i] = new YangStatementSourceImpl(new FileInputStream(
267                     files[i]));
268         }
269
270         return parseYangSources(sources);
271     }
272
273     public static SchemaContext parseYangSources(Collection<File> files)
274             throws SourceException, ReactorException, FileNotFoundException {
275         return parseYangSources(files.toArray(new File[files.size()]));
276     }
277
278     public static SchemaContext parseYangSources(String yangSourcesDirectoryPath)
279             throws SourceException, ReactorException, FileNotFoundException,
280             URISyntaxException {
281
282         URL resourceDir = StmtTestUtils.class
283                 .getResource(yangSourcesDirectoryPath);
284         File testSourcesDir = new File(resourceDir.toURI());
285
286         return parseYangSources(testSourcesDir.listFiles());
287     }
288
289     public static SchemaContext parseYangSource(String yangSourceFilePath)
290             throws SourceException, ReactorException, FileNotFoundException,
291             URISyntaxException {
292
293         URL resourceFile = StmtTestUtils.class
294                 .getResource(yangSourceFilePath);
295         File testSourcesFile = new File(resourceFile.toURI());
296
297         return parseYangSources(testSourcesFile);
298     }
299
300     private static void addYinSources(CrossSourceStatementReactor.BuildAction reactor, YinStatementSourceImpl...
301             sources) {
302         for (YinStatementSourceImpl source : sources) {
303             reactor.addSource(source);
304         }
305     }
306
307 }