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