2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2024 Ericsson
4 * Modifications Copyright (C) 2024 OpenInfra Foundation Europe
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
21 package org.oran.smo.yangtools.parser.test;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.Collections;
27 import java.util.List;
30 import org.junit.Test;
32 import org.oran.smo.yangtools.parser.data.instance.DataTreeBuilderPredicate;
33 import org.oran.smo.yangtools.parser.findings.ParserFindingType;
34 import org.oran.smo.yangtools.parser.input.FileBasedYangInputResolver;
35 import org.oran.smo.yangtools.parser.input.YangInput;
36 import org.oran.smo.yangtools.parser.model.ConformanceType;
37 import org.oran.smo.yangtools.parser.model.YangModel;
38 import org.oran.smo.yangtools.parser.testutils.YangTestCommon;
40 public class CheckYangLibraryAgainstSchemaTest extends YangTestCommon {
42 private static final String ROOT = "src/test/resources/basics/check-yl-against-schema/";
44 private static final List<File> SIMPLE_MODULE = Collections.singletonList(new File(ROOT + "simple-module.yang"));
46 private static final List<File> YANG_LIBRARY_MODULE_AND_DEPENDENCIES = Arrays.asList(new File(
47 ROOT + "yang-library-module-and-dependencies"));
49 private static final List<File> YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE = Arrays.asList(new File(
50 ROOT + "yang-library-module-and-dependencies"), new File(ROOT + "simple-module.yang"));
53 public void test_make_sure_models_are_ok() {
55 final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(
56 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE);
57 final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
59 final List<YangModel> yangFiles = new ArrayList<>();
60 for (final YangInput absoluteImplements : resolvedYangInput) {
61 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
63 yangDeviceModel.parseIntoYangModels(context, yangFiles);
69 public void test___yang_lib___input_simple_and_dependencies___yl_only_lists_simple() {
71 final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(
72 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE);
73 final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
75 final List<YangModel> yangFiles = new ArrayList<>();
77 for (final YangInput absoluteImplements : resolvedYangInput) {
78 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
81 yangDeviceModel.parseIntoYangModels(context, yangFiles);
85 final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
86 ROOT + "data-yang-library-simple-module-only.xml")));
88 yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
91 * The YL and dependencies are not listed in the data, so we expect findings for each of the dependent models (4x).
93 assertHasFindingOfType(ParserFindingType.P085_MISMATCH_BETWEEN_INPUT_MODULES_AND_YANG_LIBRARY.toString());
94 assertFindingCount(4);
98 public void test___yang_lib___input_simple_and_dependencies___yl_lists_all() {
100 final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(
101 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE);
102 final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
104 final List<YangModel> yangFiles = new ArrayList<>();
106 for (final YangInput absoluteImplements : resolvedYangInput) {
107 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
110 yangDeviceModel.parseIntoYangModels(context, yangFiles);
114 final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
115 ROOT + "data-yang-library-all-listed.xml")));
117 yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
120 * All should be good - all modules supplied, all inside the data file.
126 public void test___yang_lib___input_simple___yl_lists_simple_and_dependencies() {
128 final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(SIMPLE_MODULE);
129 final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
131 final List<YangModel> yangFiles = new ArrayList<>();
133 for (final YangInput absoluteImplements : resolvedYangInput) {
134 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
137 yangDeviceModel.parseIntoYangModels(context, yangFiles);
141 final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
142 ROOT + "data-yang-library-all-listed.xml")));
144 yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
147 * The YL-related modules are listed in the data, but don't exist in the input. Mismatch.
149 assertHasFindingOfType(ParserFindingType.P085_MISMATCH_BETWEEN_INPUT_MODULES_AND_YANG_LIBRARY.toString());
150 assertFindingCount(4);
154 public void test___yang_lib___input_simple___yl_lists_simple() {
156 final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(SIMPLE_MODULE);
157 final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
159 final List<YangModel> yangFiles = new ArrayList<>();
161 for (final YangInput absoluteImplements : resolvedYangInput) {
162 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
165 yangDeviceModel.parseIntoYangModels(context, yangFiles);
169 final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
170 ROOT + "data-yang-library-simple-module-only.xml")));
172 yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
175 * Only the module listed in the YL, and only the module is in the input.
181 public void test___yang_lib___input_simple___yl_lists_simple___conformance_mismatch() {
183 final Set<YangInput> resolvedYangInput1 = new FileBasedYangInputResolver(YANG_LIBRARY_MODULE_AND_DEPENDENCIES)
184 .getResolvedYangInput();
185 final Set<YangInput> resolvedYangInput2 = new FileBasedYangInputResolver(SIMPLE_MODULE).getResolvedYangInput();
187 final List<YangModel> yangFiles = new ArrayList<>();
189 for (final YangInput absoluteImplements : resolvedYangInput1) {
190 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
192 for (final YangInput absoluteImplements : resolvedYangInput2) {
193 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPORT));
196 yangDeviceModel.parseIntoYangModels(context, yangFiles);
200 final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
201 ROOT + "data-yang-library-all-listed-conformance-mismatch.xml")));
203 yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
206 * The conformance type for the "simple module" is wrong. Note that 2 findings will be issued for mismatches...
208 assertHasFindingOfType(ParserFindingType.P085_MISMATCH_BETWEEN_INPUT_MODULES_AND_YANG_LIBRARY.toString());
209 assertFindingCount(2);
213 public void test___yang_lib___input_simple___yl_lists_simple___namespace_mismatch() {
215 final Set<YangInput> resolvedYangInput1 = new FileBasedYangInputResolver(
216 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE).getResolvedYangInput();
218 final List<YangModel> yangFiles = new ArrayList<>();
219 for (final YangInput absoluteImplements : resolvedYangInput1) {
220 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
223 yangDeviceModel.parseIntoYangModels(context, yangFiles);
227 final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
228 ROOT + "data-yang-library-all-listed-namespace-mismatch.xml")));
230 yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
233 * The namespace for the "simple module" is wrong.
235 assertHasFindingOfType(ParserFindingType.P081_INCORRECT_YANG_LIBRARY_DATA.toString());
236 assertFindingCount(1);
240 public void test___yang_lib___input_simple___yl_lists_simple___feature_mismatch() {
242 final Set<YangInput> resolvedYangInput1 = new FileBasedYangInputResolver(
243 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE).getResolvedYangInput();
245 final List<YangModel> yangFiles = new ArrayList<>();
246 for (final YangInput absoluteImplements : resolvedYangInput1) {
247 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
250 yangDeviceModel.parseIntoYangModels(context, yangFiles);
254 final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
255 ROOT + "data-yang-library-all-listed-feature-mismatch.xml")));
257 yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
260 * The feature for the "simple module" is wrong.
262 assertHasFindingOfType(ParserFindingType.P083_FEATURE_LISTED_IN_YANG_LIBRARY_NOT_FOUND.toString());
263 assertFindingCount(1);
267 public void test___yang_lib___input_simple___yl_lists_simple___features_ok() {
269 final Set<YangInput> resolvedYangInput1 = new FileBasedYangInputResolver(
270 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE).getResolvedYangInput();
272 final List<YangModel> yangFiles = new ArrayList<>();
273 for (final YangInput absoluteImplements : resolvedYangInput1) {
274 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
277 yangDeviceModel.parseIntoYangModels(context, yangFiles);
281 final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
282 ROOT + "data-yang-library-all-listed-features-ok.xml")));
284 yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
290 public void test_all_supplied___module_data_only() {
292 final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(
293 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE);
294 final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
296 final List<YangModel> yangFiles = new ArrayList<>();
298 for (final YangInput absoluteImplements : resolvedYangInput) {
299 yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
302 yangDeviceModel.parseIntoYangModels(context, yangFiles);
304 final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
305 ROOT + "data-module-data-only.xml")));
307 yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
310 * No YL data supplied at all. The data should parse fine. Should be no findings.