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