2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.stmt;
10 import static org.junit.Assert.assertEquals;
13 import java.io.FileNotFoundException;
14 import java.io.InputStream;
16 import java.net.URISyntaxException;
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;
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.parser.util.NamedFileInputStream;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
49 public final class TestUtils {
50 private static final Logger LOG = LoggerFactory.getLogger(TestUtils.class);
55 public static Set<Module> loadModules(final URI resourceDirectory)
56 throws SourceException, ReactorException {
57 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
59 File[] files = new File(resourceDirectory).listFiles();
61 for (File file : files) {
62 if (file.getName().endsWith(".yang")) {
63 addSources(reactor, new YangStatementSourceImpl(file.getPath(), true));
65 LOG.info("Ignoring non-yang file {}", file);
69 EffectiveSchemaContext ctx = reactor.buildEffective();
70 return ctx.getModules();
73 public static Set<Module> loadModules(final List<InputStream> streams)
74 throws SourceException, ReactorException {
75 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
77 for (InputStream inputStream : streams) {
78 addSources(reactor, new YangStatementSourceImpl(inputStream));
81 EffectiveSchemaContext ctx = reactor.buildEffective();
82 return ctx.getModules();
85 public static Set<Module> loadYinModules(final URI resourceDirectory) throws ReactorException {
86 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
88 for (File file : new File(resourceDirectory).listFiles()) {
89 addYinSources(reactor, new YinStatementSourceImpl(file.getPath(), true));
92 EffectiveSchemaContext ctx = reactor.buildEffective();
93 return ctx.getModules();
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));
102 EffectiveSchemaContext ctx = reactor.buildEffective();
103 return ctx.getModules();
106 public static Module loadModule(final InputStream stream)
107 throws SourceException, ReactorException {
108 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
110 addSources(reactor, new YangStatementSourceImpl(stream));
111 EffectiveSchemaContext ctx = reactor.buildEffective();
112 return ctx.getModules().iterator().next();
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();
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)) {
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;
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)) {
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));
165 return SchemaPath.create(path, absolute);
168 public static Date createDate(final String date) {
170 final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
172 result = simpleDateFormat.parse(date);
173 } catch (ParseException e) {
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.
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)
194 checkIsAugmenting(child, expected);
196 } else if (node instanceof ChoiceSchemaNode) {
197 for (ChoiceCaseNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
198 checkIsAugmenting(caseNode, expected);
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.
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)
218 checkIsAddedByUses(child, expected);
220 } else if (node instanceof ChoiceSchemaNode) {
221 for (ChoiceCaseNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
222 checkIsAddedByUses(caseNode, expected);
227 public static void checkIsAddedByUses(final GroupingDefinition node,
228 final boolean expected) {
229 assertEquals(expected, node.isAddedByUses());
230 for (DataSchemaNode child : node.getChildNodes()) {
231 checkIsAddedByUses(child, expected);
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)) {
246 private static void addSources(
247 final CrossSourceStatementReactor.BuildAction reactor,
248 final YangStatementSourceImpl... sources) {
249 for (YangStatementSourceImpl source : sources) {
250 reactor.addSource(source);
254 public static SchemaContext parseYangSources(
255 final StatementStreamSource... sources) throws SourceException,
258 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
260 reactor.addSources(sources);
262 return reactor.buildEffective();
265 public static SchemaContext parseYangSources(final File... files)
266 throws SourceException, ReactorException, FileNotFoundException {
268 StatementStreamSource[] sources = new StatementStreamSource[files.length];
270 for (int i = 0; i < files.length; i++) {
271 sources[i] = new YangStatementSourceImpl(new NamedFileInputStream(files[i], files[i].getPath()));
274 return parseYangSources(sources);
277 public static SchemaContext parseYangSources(final Collection<File> files)
278 throws SourceException, ReactorException, FileNotFoundException {
279 return parseYangSources(files.toArray(new File[files.size()]));
282 public static SchemaContext parseYangSources(final String yangSourcesDirectoryPath)
283 throws SourceException, ReactorException, FileNotFoundException,
286 URL resourceDir = StmtTestUtils.class
287 .getResource(yangSourcesDirectoryPath);
288 File testSourcesDir = new File(resourceDir.toURI());
290 return parseYangSources(testSourcesDir.listFiles());
293 public static SchemaContext parseYangSource(final String yangSourceFilePath)
294 throws SourceException, ReactorException, FileNotFoundException,
297 URL resourceFile = StmtTestUtils.class
298 .getResource(yangSourceFilePath);
299 File testSourcesFile = new File(resourceFile.toURI());
301 return parseYangSources(testSourcesFile);
304 private static void addYinSources(final CrossSourceStatementReactor.BuildAction reactor,
305 final YinStatementSourceImpl... sources) {
306 for (YinStatementSourceImpl source : sources) {
307 reactor.addSource(source);