2 * Copyright (c) 2013 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.retest;
10 import static org.junit.Assert.assertEquals;
13 import java.io.FileInputStream;
14 import java.io.FileNotFoundException;
15 import java.io.InputStream;
17 import java.net.URISyntaxException;
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;
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;
48 public final class TestUtils {
53 public static Set<Module> loadModules(final URI resourceDirectory)
54 throws SourceException, ReactorException {
55 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
57 File[] files = new File(resourceDirectory).listFiles();
59 for (File file : files) {
60 addSources(reactor, new YangStatementSourceImpl(file.getPath(),
64 EffectiveSchemaContext ctx = reactor.buildEffective();
65 return ctx.getModules();
68 public static Set<Module> loadYinModules(final URI resourceDirectory) throws ReactorException {
69 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
71 for (File file : new File(resourceDirectory).listFiles()) {
72 addYinSources(reactor, new YinStatementSourceImpl(file.getPath(), true));
75 EffectiveSchemaContext ctx = reactor.buildEffective();
76 return ctx.getModules();
79 public static Set<Module> loadModules(final List<InputStream> streams)
80 throws SourceException, ReactorException {
81 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
83 for (InputStream inputStream : streams) {
84 addSources(reactor, new YangStatementSourceImpl(inputStream));
87 EffectiveSchemaContext ctx = reactor.buildEffective();
88 return ctx.getModules();
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));
97 EffectiveSchemaContext ctx = reactor.buildEffective();
98 return ctx.getModules();
101 public static Module loadModule(final InputStream stream)
102 throws SourceException, ReactorException {
103 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
105 addSources(reactor, new YangStatementSourceImpl(stream));
106 EffectiveSchemaContext ctx = reactor.buildEffective();
107 return ctx.getModules().iterator().next();
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();
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)) {
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;
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)) {
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));
160 return SchemaPath.create(path, absolute);
163 public static Date createDate(final String date) {
165 final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
167 result = simpleDateFormat.parse(date);
168 } catch (ParseException e) {
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.
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)
189 checkIsAugmenting(child, expected);
191 } else if (node instanceof ChoiceSchemaNode) {
192 for (ChoiceCaseNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
193 checkIsAugmenting(caseNode, expected);
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.
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)
213 checkIsAddedByUses(child, expected);
215 } else if (node instanceof ChoiceSchemaNode) {
216 for (ChoiceCaseNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
217 checkIsAddedByUses(caseNode, expected);
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);
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)) {
241 private static void addSources(
242 CrossSourceStatementReactor.BuildAction reactor,
243 YangStatementSourceImpl... sources) {
244 for (YangStatementSourceImpl source : sources) {
245 reactor.addSource(source);
249 public static SchemaContext parseYangSources(
250 StatementStreamSource... sources) throws SourceException,
253 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
255 reactor.addSources(sources);
257 return reactor.buildEffective();
260 public static SchemaContext parseYangSources(File... files)
261 throws SourceException, ReactorException, FileNotFoundException {
263 StatementStreamSource[] sources = new StatementStreamSource[files.length];
265 for (int i = 0; i < files.length; i++) {
266 sources[i] = new YangStatementSourceImpl(new FileInputStream(
270 return parseYangSources(sources);
273 public static SchemaContext parseYangSources(Collection<File> files)
274 throws SourceException, ReactorException, FileNotFoundException {
275 return parseYangSources(files.toArray(new File[files.size()]));
278 public static SchemaContext parseYangSources(String yangSourcesDirectoryPath)
279 throws SourceException, ReactorException, FileNotFoundException,
282 URL resourceDir = StmtTestUtils.class
283 .getResource(yangSourcesDirectoryPath);
284 File testSourcesDir = new File(resourceDir.toURI());
286 return parseYangSources(testSourcesDir.listFiles());
289 public static SchemaContext parseYangSource(String yangSourceFilePath)
290 throws SourceException, ReactorException, FileNotFoundException,
293 URL resourceFile = StmtTestUtils.class
294 .getResource(yangSourceFilePath);
295 File testSourcesFile = new File(resourceFile.toURI());
297 return parseYangSources(testSourcesFile);
300 private static void addYinSources(CrossSourceStatementReactor.BuildAction reactor, YinStatementSourceImpl...
302 for (YinStatementSourceImpl source : sources) {
303 reactor.addSource(source);