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