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.findings.test;
23 import static org.junit.Assert.assertTrue;
26 import java.util.ArrayList;
27 import java.util.Collections;
28 import java.util.List;
31 import org.junit.Before;
32 import org.junit.Test;
34 import org.oran.smo.yangtools.parser.ParserExecutionContext;
35 import org.oran.smo.yangtools.parser.YangDeviceModel;
36 import org.oran.smo.yangtools.parser.findings.Finding;
37 import org.oran.smo.yangtools.parser.findings.FindingSeverity;
38 import org.oran.smo.yangtools.parser.findings.FindingsManager;
39 import org.oran.smo.yangtools.parser.findings.ModifyableFindingSeverityCalculator;
40 import org.oran.smo.yangtools.parser.findings.ModuleAndFindingTypeAndSchemaNodePathFilterPredicate;
41 import org.oran.smo.yangtools.parser.findings.ModuleAndSeverityFilterPredicate;
42 import org.oran.smo.yangtools.parser.findings.ParserFindingType;
43 import org.oran.smo.yangtools.parser.input.FileBasedYangInput;
44 import org.oran.smo.yangtools.parser.model.ConformanceType;
45 import org.oran.smo.yangtools.parser.model.YangModel;
46 import org.oran.smo.yangtools.parser.model.statements.yang.YLeaf;
48 public class FindingsManagerTest {
50 private YangDeviceModel yangDeviceModel;
51 private ModifyableFindingSeverityCalculator severityCalculator;
52 private FindingsManager findingsManager;
53 private ParserExecutionContext context;
57 yangDeviceModel = new YangDeviceModel("Yang Parser JAR Test Device Model");
58 severityCalculator = new ModifyableFindingSeverityCalculator();
59 findingsManager = new FindingsManager(severityCalculator);
60 context = new ParserExecutionContext(findingsManager);
62 final List<YangModel> yangFiles = new ArrayList<>();
63 yangFiles.add(new YangModel(new FileBasedYangInput(new File("src/test/resources/findings/module1.yang")),
64 ConformanceType.IMPLEMENT));
65 yangDeviceModel.parseIntoYangModels(context, yangFiles);
69 public void test_severity_calculator() {
71 final ModifyableFindingSeverityCalculator severityCalculator = new ModifyableFindingSeverityCalculator();
73 severityCalculator.errorForFinding(ParserFindingType.P101_EMPTY_DOCUMENTATION_VALUE.toString());
74 severityCalculator.warningForFinding(ParserFindingType.P102_INVALID_STATUS.toString());
75 severityCalculator.infoForFinding(ParserFindingType.P103_ILLEGAL_IF_FEATURE_SYNTAX.toString());
76 severityCalculator.suppressFinding(ParserFindingType.P104_USAGE_OF_DEPRECATED_ELEMENT.toString());
78 severityCalculator.setSeverityForFindingType(ParserFindingType.P111_CIRCULAR_TYPEDEF_REFERENCES.toString(),
79 FindingSeverity.WARNING);
81 assertTrue(severityCalculator.calculateSeverity("something else") == FindingSeverity.ERROR);
83 assertTrue(severityCalculator.calculateSeverity(ParserFindingType.P101_EMPTY_DOCUMENTATION_VALUE
84 .toString()) == FindingSeverity.ERROR);
85 assertTrue(severityCalculator.calculateSeverity(ParserFindingType.P102_INVALID_STATUS
86 .toString()) == FindingSeverity.WARNING);
87 assertTrue(severityCalculator.calculateSeverity(ParserFindingType.P103_ILLEGAL_IF_FEATURE_SYNTAX
88 .toString()) == FindingSeverity.INFO);
89 assertTrue(severityCalculator.calculateSeverity(ParserFindingType.P104_USAGE_OF_DEPRECATED_ELEMENT
90 .toString()) == FindingSeverity.SUPPRESS);
92 assertTrue(severityCalculator.calculateSeverity(ParserFindingType.P111_CIRCULAR_TYPEDEF_REFERENCES
93 .toString()) == FindingSeverity.WARNING);
97 public void test_fine_grained_2options_all() {
99 addFineGrainedFilter("*;*");
101 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
104 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
105 assertTrue(findingsManager.getAllFindings().size() == 0);
109 public void test_fine_grained_2options_module1() {
111 addFineGrainedFilter("module1;*");
113 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
116 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
117 assertTrue(findingsManager.getAllFindings().size() == 0);
121 public void test_fine_grained_2options_mod_star() {
123 addFineGrainedFilter("mod*;*");
125 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
128 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
129 assertTrue(findingsManager.getAllFindings().size() == 0);
133 public void test_fine_grained_2options_module1_and_others() {
135 addFineGrainedFilter("module1,module2;*");
137 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
140 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
141 assertTrue(findingsManager.getAllFindings().size() == 0);
145 public void test_fine_grained_2options_moduleXXX_all() {
147 addFineGrainedFilter("moduleXXX;*");
149 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
152 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
153 assertTrue(findingsManager.getAllFindings().size() == 1);
157 public void test_fine_grained_2options_warnings() {
159 severityCalculator.warningForFinding(ParserFindingType.P102_INVALID_STATUS.toString());
161 addFineGrainedFilter("*;WARNING");
163 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
166 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
167 assertTrue(findingsManager.getAllFindings().size() == 0);
171 public void test_fine_grained_2options_info() {
173 severityCalculator.warningForFinding(ParserFindingType.P102_INVALID_STATUS.toString());
175 addFineGrainedFilter("*;INFO");
177 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
180 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
181 assertTrue(findingsManager.getAllFindings().size() == 1);
185 public void test_fine_grained_2options_warnings_info() {
187 severityCalculator.warningForFinding(ParserFindingType.P102_INVALID_STATUS.toString());
189 addFineGrainedFilter("*;WARNING,INFO");
191 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
194 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
195 assertTrue(findingsManager.getAllFindings().size() == 0);
199 public void test_fine_grained_2options_module1_warnings() {
201 severityCalculator.warningForFinding(ParserFindingType.P102_INVALID_STATUS.toString());
203 addFineGrainedFilter("module1;WARNING");
205 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
208 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
209 assertTrue(findingsManager.getAllFindings().size() == 0);
213 public void test_fine_grained_2options_moduleXXX_warnings() {
215 severityCalculator.warningForFinding(ParserFindingType.P102_INVALID_STATUS.toString());
217 addFineGrainedFilter("moduleXXX;WARNING");
219 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
222 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
223 assertTrue(findingsManager.getAllFindings().size() == 1);
227 public void test_fine_grained_3options_all() {
229 addFineGrainedFilter("*;*;*");
231 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
234 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
235 assertTrue(findingsManager.getAllFindings().size() == 0);
239 public void test_fine_grained_3options_module1() {
241 addFineGrainedFilter("module1;*;*");
243 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
246 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
247 assertTrue(findingsManager.getAllFindings().size() == 0);
251 public void test_fine_grained_3options_module1_moduleXXX() {
253 addFineGrainedFilter("module1,moduleXXX;*;*");
255 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
258 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
259 assertTrue(findingsManager.getAllFindings().size() == 0);
263 public void test_fine_grained_3options_moduleXXX() {
265 addFineGrainedFilter("moduleXXX;*;*");
267 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
270 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
271 assertTrue(findingsManager.getAllFindings().size() == 1);
275 public void test_fine_grained_3options_mod_star() {
277 addFineGrainedFilter("mod*;*;*");
279 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
282 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
283 assertTrue(findingsManager.getAllFindings().size() == 0);
287 public void test_fine_grained_3options_invalidstatus() {
289 addFineGrainedFilter("*;P102_INVALID_STATUS;*");
291 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
294 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
295 assertTrue(findingsManager.getAllFindings().size() == 0);
299 public void test_fine_grained_3options_p1_star() {
301 addFineGrainedFilter("*;P1*;*");
303 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
306 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
307 assertTrue(findingsManager.getAllFindings().size() == 0);
311 public void test_fine_grained_3options_p0_star() {
313 addFineGrainedFilter("*;P0*;*");
315 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
318 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
319 assertTrue(findingsManager.getAllFindings().size() == 1);
323 public void test_fine_grained_3options_p000_star_invalidstatus() {
325 addFineGrainedFilter("*;P000*,P102_INVALID_STATUS;*");
327 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
330 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
331 assertTrue(findingsManager.getAllFindings().size() == 0);
335 public void test_fine_grained_3options_module1_p1_star() {
337 addFineGrainedFilter("module1;P1*;*");
339 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
342 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
343 assertTrue(findingsManager.getAllFindings().size() == 0);
347 public void test_fine_grained_3options_moduleXXX_p1_star() {
349 addFineGrainedFilter("moduleXXX;P1*;*");
351 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
354 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
355 assertTrue(findingsManager.getAllFindings().size() == 1);
359 public void test_fine_grained_3options_moduelXXX_p1_star() {
361 addFineGrainedFilter("moduleXXX;P1*;*");
363 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
366 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
367 assertTrue(findingsManager.getAllFindings().size() == 1);
371 public void test_fine_grained_3options_path_module_module1() {
373 addFineGrainedFilter("*;*;/module=module1");
375 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
378 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
379 assertTrue(findingsManager.getAllFindings().size() == 0);
383 public void test_fine_grained_3options_path_module_moduleXXX() {
385 addFineGrainedFilter("*;*;/module=moduleXXX");
387 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
390 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
391 assertTrue(findingsManager.getAllFindings().size() == 1);
395 public void test_fine_grained_3options_path_module_module1_leaf_leaf1() {
397 addFineGrainedFilter("*;*;/module=module1/leaf=leaf1");
399 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
402 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
403 assertTrue(findingsManager.getAllFindings().size() == 0);
407 public void test_fine_grained_3options_path_module_module1_leaf_leaf2() {
409 addFineGrainedFilter("*;*;/module=module1/leaf=leaf2");
411 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
414 findingsManager.addFinding(new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
415 assertTrue(findingsManager.getAllFindings().size() == 1);
419 public void test_fine_grained_3options_path_module_module1_leaf_leaf1_not_on_leaf() {
421 addFineGrainedFilter("*;*;/module=module1/leaf=leaf1");
423 findingsManager.addFinding(new Finding(ParserFindingType.P102_INVALID_STATUS.toString(), "message"));
424 assertTrue(findingsManager.getAllFindings().size() == 1);
428 public void test_finding_general_finding() {
430 final Finding finding1 = new Finding(ParserFindingType.P101_EMPTY_DOCUMENTATION_VALUE.toString(), "Missing Value");
431 final Finding finding2 = new Finding(ParserFindingType.P101_EMPTY_DOCUMENTATION_VALUE.toString(), "Missing Value");
433 final Finding finding3 = new Finding(ParserFindingType.P102_INVALID_STATUS.toString(), "Missing Value");
434 final Finding finding4 = new Finding(ParserFindingType.P102_INVALID_STATUS.toString(), "Other Missing Value");
436 assertTrue(finding1.getDataDomNode() == null);
437 assertTrue(finding1.getFindingType().equals(ParserFindingType.P101_EMPTY_DOCUMENTATION_VALUE.toString()));
438 assertTrue(finding1.getLineNumber() == 0);
439 assertTrue(finding1.getMessage().equals("Missing Value"));
440 assertTrue(finding1.getStatement() == null);
441 assertTrue(finding1.getYangData() == null);
442 assertTrue(finding1.getYangModel() == null);
444 assertTrue(finding1.isYangModelRelated() == false);
445 assertTrue(finding1.isInstanceDataRelated() == false);
446 assertTrue(finding1.isGeneralFinding() == true);
447 assertTrue(finding1.toString().equals(" P101_EMPTY_DOCUMENTATION_VALUE: Missing Value"));
449 assertTrue(finding1.equals(null) == false);
450 assertTrue(finding1.equals(finding2) == true);
451 assertTrue(finding1.equals(finding3) == false);
452 assertTrue(finding3.equals(finding4) == false);
456 public void test_finding_module_finding() {
458 final YLeaf leaf1 = yangDeviceModel.getModuleRegistry().getAllYangModels().get(0).getYangModelRoot().getModule()
461 final Finding finding8 = new Finding(leaf1, ParserFindingType.P102_INVALID_STATUS.toString(), "message");
463 assertTrue(finding8.getDataDomNode() == null);
464 assertTrue(finding8.getFindingType().equals(ParserFindingType.P102_INVALID_STATUS.toString()));
465 assertTrue(finding8.getLineNumber() == 14);
466 assertTrue(finding8.getMessage().equals("message"));
467 assertTrue(finding8.getStatement() == leaf1);
468 assertTrue(finding8.getYangData() == null);
469 assertTrue(finding8.getYangModel() == yangDeviceModel.getModuleRegistry().getAllYangModels().get(0));
471 assertTrue(finding8.isYangModelRelated() == true);
472 assertTrue(finding8.isInstanceDataRelated() == false);
473 assertTrue(finding8.isGeneralFinding() == false);
474 assertTrue(finding8.toString().equals("module1.yang / line 14 P102_INVALID_STATUS: message"));
478 public void test_getFiltered_allow_all() {
480 final Finding finding1 = new Finding(ParserFindingType.P102_INVALID_STATUS.toString(), "message");
481 Set<Finding> findings = Collections.singleton(finding1);
483 final Set<Finding> filteredFindings = findingsManager.getFilteredFindings(findings);
485 assertTrue(filteredFindings.size() == 1);
489 public void test_getFiltered_suppless_all() {
491 final Finding finding1 = new Finding(ParserFindingType.P102_INVALID_STATUS.toString(), "message");
492 Set<Finding> findings = Collections.singleton(finding1);
494 findingsManager.setSuppressAll(true);
495 final Set<Finding> filteredFindings = findingsManager.getFilteredFindings(findings);
497 assertTrue(filteredFindings.size() == 0);
501 public void test_getFiltered_suppless_invalid_status() {
503 final Finding finding1 = new Finding(ParserFindingType.P102_INVALID_STATUS.toString(), "message");
504 Set<Finding> findings = Collections.singleton(finding1);
506 severityCalculator.suppressFinding(ParserFindingType.P102_INVALID_STATUS.toString());
507 final Set<Finding> filteredFindings = findingsManager.getFilteredFindings(findings);
509 assertTrue(filteredFindings.size() == 0);
512 private void addFineGrainedFilter(final String filterString) {
513 if (filterString.split(";").length == 2) {
514 findingsManager.addFilterPredicate(ModuleAndSeverityFilterPredicate.fromString(filterString, findingsManager
515 .getFindingSeverityCalculator()));
517 findingsManager.addFilterPredicate(ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString(