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.IOException;
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.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;
52 public final class TestUtils {
53 private static final Logger LOG = LoggerFactory.getLogger(TestUtils.class);
58 public static Set<Module> loadModules(final URI resourceDirectory)
59 throws SourceException, ReactorException, IOException, YangSyntaxErrorException {
60 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
62 File[] files = new File(resourceDirectory).listFiles();
64 for (File file : files) {
65 if (file.getName().endsWith(YangConstants.RFC6020_YANG_FILE_EXTENSION)) {
66 reactor.addSource(YangStatementStreamSource.create(YangTextSchemaSource.forFile(file)));
68 LOG.info("Ignoring non-yang file {}", file);
72 EffectiveSchemaContext ctx = reactor.buildEffective();
73 return ctx.getModules();
76 public static Set<Module> loadModules(final List<InputStream> streams)
77 throws SourceException, ReactorException {
78 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
80 for (InputStream inputStream : streams) {
81 reactor.addSource(new YangStatementSourceImpl(inputStream));
84 EffectiveSchemaContext ctx = reactor.buildEffective();
85 return ctx.getModules();
88 public static Set<Module> loadYinModules(final URI resourceDirectory) throws ReactorException {
89 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
91 for (File file : new File(resourceDirectory).listFiles()) {
92 reactor.addSource(new YinStatementSourceImpl(file.getPath(), true));
95 EffectiveSchemaContext ctx = reactor.buildEffective();
96 return ctx.getModules();
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));
105 EffectiveSchemaContext ctx = reactor.buildEffective();
106 return ctx.getModules();
109 public static Module loadModule(final InputStream stream)
110 throws SourceException, ReactorException {
111 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
113 reactor.addSource(new YangStatementSourceImpl(stream));
114 EffectiveSchemaContext ctx = reactor.buildEffective();
115 return ctx.getModules().iterator().next();
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();
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)) {
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;
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)) {
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));
168 return SchemaPath.create(path, absolute);
171 public static Date createDate(final String date) {
173 final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
175 result = simpleDateFormat.parse(date);
176 } catch (ParseException e) {
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.
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)
197 checkIsAugmenting(child, expected);
199 } else if (node instanceof ChoiceSchemaNode) {
200 for (ChoiceCaseNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
201 checkIsAugmenting(caseNode, expected);
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.
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)
221 checkIsAddedByUses(child, expected);
223 } else if (node instanceof ChoiceSchemaNode) {
224 for (ChoiceCaseNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
225 checkIsAddedByUses(caseNode, expected);
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);
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)) {
248 public static SchemaContext parseYangSources(final StatementStreamSource... sources) throws SourceException,
251 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
253 reactor.addSources(sources);
255 return reactor.buildEffective();
258 public static SchemaContext parseYangSources(final File... files)
259 throws SourceException, ReactorException, IOException, YangSyntaxErrorException {
261 StatementStreamSource[] sources = new StatementStreamSource[files.length];
263 for (int i = 0; i < files.length; i++) {
264 sources[i] = YangStatementStreamSource.create(YangTextSchemaSource.forFile(files[i]));
267 return parseYangSources(sources);
270 public static SchemaContext parseYangSources(final Collection<File> files)
271 throws SourceException, ReactorException, IOException, YangSyntaxErrorException {
272 return parseYangSources(files.toArray(new File[files.size()]));
275 public static SchemaContext parseYangSources(final String yangSourcesDirectoryPath)
276 throws SourceException, ReactorException, URISyntaxException, IOException, YangSyntaxErrorException {
278 URL resourceDir = StmtTestUtils.class
279 .getResource(yangSourcesDirectoryPath);
280 File testSourcesDir = new File(resourceDir.toURI());
282 return parseYangSources(testSourcesDir.listFiles());
285 public static SchemaContext parseYangSource(final String yangSourceFilePath)
286 throws SourceException, ReactorException, URISyntaxException, IOException, YangSyntaxErrorException {
288 URL resourceFile = StmtTestUtils.class.getResource(yangSourceFilePath);
289 File testSourcesFile = new File(resourceFile.toURI());
291 return parseYangSources(testSourcesFile);