c7b56198a5fb793ee59f4f810946a3d2d4252fd1
[smo/teiv.git] /
1 /*
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
9  *
10  *        http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  *  SPDX-License-Identifier: Apache-2.0
19  *  ============LICENSE_END=========================================================
20  */
21 package org.oran.smo.yangtools.parser.test;
22
23 import java.util.Arrays;
24
25 import org.junit.Test;
26
27 import org.oran.smo.yangtools.parser.findings.ModuleAndFindingTypeAndSchemaNodePathFilterPredicate;
28 import org.oran.smo.yangtools.parser.findings.ParserFindingType;
29 import org.oran.smo.yangtools.parser.testutils.YangTestCommon;
30
31 public class YangDeviceModelTest extends YangTestCommon {
32
33     @Test
34     public void test_correct_modules_supplied() {
35
36         severityCalculator.suppressFinding(ParserFindingType.P115_TYPEDEF_USED_ONCE_ONLY.toString());
37         severityCalculator.suppressFinding(ParserFindingType.P133_GROUPING_USED_ONCE_ONLY.toString());
38
39         parseAbsoluteImplementsYangModels(Arrays.asList("src/test/resources/basics/yang-device-model-test/module1.yang",
40                 "src/test/resources/basics/yang-device-model-test/module2.yang"));
41
42         assertNoFindings();
43     }
44
45     @Test
46     public void test_only_one_correct_module_supplied() {
47
48         suppressAllExcept(Arrays.asList(ParserFindingType.P033_UNRESOLVEABLE_PREFIX.toString(),
49                 ParserFindingType.P131_UNRESOLVABLE_GROUPING.toString(), ParserFindingType.P113_UNRESOLVABLE_DERIVED_TYPE
50                         .toString(), ParserFindingType.P034_UNRESOLVABLE_IMPORT.toString()));
51
52         parseAbsoluteImplementsYangModels(Arrays.asList("src/test/resources/basics/yang-device-model-test/module1.yang"));
53
54         assertHasFindingOfType(ParserFindingType.P033_UNRESOLVEABLE_PREFIX.toString());
55         assertHasFindingOfType(ParserFindingType.P131_UNRESOLVABLE_GROUPING.toString());
56         assertHasFindingOfType(ParserFindingType.P113_UNRESOLVABLE_DERIVED_TYPE.toString());
57         assertHasFindingOfType(ParserFindingType.P034_UNRESOLVABLE_IMPORT.toString());
58     }
59
60     @Test
61     public void test_empty_module_not_filtered() {
62
63         severityCalculator.suppressFinding(ParserFindingType.P005_NO_IMPLEMENTS.toString());
64
65         /*
66          * The module is empty, but no exception will be thrown.
67          */
68         parseAbsoluteImplementsYangModels(Arrays.asList(
69                 "src/test/resources/basics/yang-device-model-test/empty-file.yang"));
70
71         assertHasFindingOfType(ParserFindingType.P013_INVALID_SYNTAX_AT_DOCUMENT_ROOT.toString());
72     }
73
74     @Test
75     public void test_empty_module_filtered() {
76
77         /*
78          * Will not be swallowed - a P013 cannot be suppressed.
79          */
80         severityCalculator.suppressFinding(ParserFindingType.P013_INVALID_SYNTAX_AT_DOCUMENT_ROOT.toString());
81         findingsManager.addFilterPredicate(ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString(
82                 "empty-file*;*;*"));
83
84         parseAbsoluteImplementsYangModels(Arrays.asList(
85                 "src/test/resources/basics/yang-device-model-test/empty-file.yang"));
86
87         assertHasFindingOfType(ParserFindingType.P013_INVALID_SYNTAX_AT_DOCUMENT_ROOT.toString());
88     }
89
90     @Test
91     public void test_missing_prefix_not_filtered() {
92
93         severityCalculator.suppressFinding(ParserFindingType.P005_NO_IMPLEMENTS.toString());
94
95         /*
96          * This is missing the prefix statement, which is absolutely vital. This will provoke a NPE during
97          * parsing. The NPE should be swallowed, at the same time there should be a finding on the missing prefix.
98          */
99
100         parseAbsoluteImplementsYangModels(Arrays.asList(
101                 "src/test/resources/basics/yang-device-model-test/module-missing-prefix.yang"));
102
103         assertHasFindingOfType(ParserFindingType.P019_MISSING_REQUIRED_CHILD_STATEMENT.toString());
104     }
105
106     @Test
107     public void test_missing_prefix_filtered() {
108
109         severityCalculator.suppressFinding(ParserFindingType.P005_NO_IMPLEMENTS.toString());
110
111         /*
112          * As before, now filtered.
113          */
114         findingsManager.addFilterPredicate(ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString(
115                 "module-missing-prefix*;*;*"));
116
117         parseAbsoluteImplementsYangModels(Arrays.asList(
118                 "src/test/resources/basics/yang-device-model-test/module-missing-prefix.yang"));
119
120         assertNoFindings();
121     }
122
123     @Test
124     public void test_correct_modules_plus_missing_prefix_filtered() {
125
126         severityCalculator.suppressFinding(ParserFindingType.P115_TYPEDEF_USED_ONCE_ONLY.toString());
127         severityCalculator.suppressFinding(ParserFindingType.P133_GROUPING_USED_ONCE_ONLY.toString());
128
129         /*
130          * The two modules are fine, the one with the missing prefix will be filtered.
131          */
132         findingsManager.addFilterPredicate(ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString(
133                 "module-missing-prefix*;*;*"));
134
135         parseAbsoluteImplementsYangModels(Arrays.asList("src/test/resources/basics/yang-device-model-test/module1.yang",
136                 "src/test/resources/basics/yang-device-model-test/module2.yang",
137                 "src/test/resources/basics/yang-device-model-test/module-missing-prefix.yang"));
138
139         assertNoFindings();
140     }
141
142     @Test
143     public void test_one_correct_module_plus_missing_prefix_filtered() {
144
145         severityCalculator.suppressFinding(ParserFindingType.P115_TYPEDEF_USED_ONCE_ONLY.toString());
146         severityCalculator.suppressFinding(ParserFindingType.P133_GROUPING_USED_ONCE_ONLY.toString());
147
148         /*
149          * The fine-grained-filter takes care of the issues inside the module-missing-prefix,
150          * the rest is still correctly processed.
151          */
152         findingsManager.addFilterPredicate(ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString(
153                 "module-missing-prefix*;*;*"));
154
155         parseAbsoluteImplementsYangModels(Arrays.asList("src/test/resources/basics/yang-device-model-test/module1.yang",
156                 "src/test/resources/basics/yang-device-model-test/module-missing-prefix.yang"));
157
158         assertHasFindingOfType(ParserFindingType.P033_UNRESOLVEABLE_PREFIX.toString());
159         assertHasFindingOfType(ParserFindingType.P131_UNRESOLVABLE_GROUPING.toString());
160         assertHasFindingOfType(ParserFindingType.P113_UNRESOLVABLE_DERIVED_TYPE.toString());
161         assertHasFindingOfType(ParserFindingType.P034_UNRESOLVABLE_IMPORT.toString());
162     }
163 }