30ddc944458f35d5b8dacc4e4aa57aac888ccb47
[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.io.File;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.Collections;
27 import java.util.List;
28 import java.util.Set;
29
30 import org.junit.Test;
31
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;
39
40 public class CheckYangLibraryAgainstSchemaTest extends YangTestCommon {
41
42     private static final String ROOT = "src/test/resources/basics/check-yl-against-schema/";
43
44     private static final List<File> SIMPLE_MODULE = Collections.singletonList(new File(ROOT + "simple-module.yang"));
45
46     private static final List<File> YANG_LIBRARY_MODULE_AND_DEPENDENCIES = Arrays.asList(new File(
47             ROOT + "yang-library-module-and-dependencies"));
48
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"));
51
52     @Test
53     public void test_make_sure_models_are_ok() {
54
55         final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(
56                 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE);
57         final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
58
59         final List<YangModel> yangFiles = new ArrayList<>();
60         for (final YangInput absoluteImplements : resolvedYangInput) {
61             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
62         }
63         yangDeviceModel.parseIntoYangModels(context, yangFiles);
64
65         assertNoFindings();
66     }
67
68     @Test
69     public void test___yang_lib___input_simple_and_dependencies___yl_only_lists_simple() {
70
71         final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(
72                 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE);
73         final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
74
75         final List<YangModel> yangFiles = new ArrayList<>();
76
77         for (final YangInput absoluteImplements : resolvedYangInput) {
78             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
79         }
80
81         yangDeviceModel.parseIntoYangModels(context, yangFiles);
82
83         // - - - - - - - - -
84
85         final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
86                 ROOT + "data-yang-library-simple-module-only.xml")));
87
88         yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
89
90         /*
91          * The YL and dependencies are not listed in the data, so we expect findings for each of the dependent models (4x).
92          */
93         assertHasFindingOfType(ParserFindingType.P085_MISMATCH_BETWEEN_INPUT_MODULES_AND_YANG_LIBRARY.toString());
94         assertFindingCount(4);
95     }
96
97     @Test
98     public void test___yang_lib___input_simple_and_dependencies___yl_lists_all() {
99
100         final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(
101                 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE);
102         final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
103
104         final List<YangModel> yangFiles = new ArrayList<>();
105
106         for (final YangInput absoluteImplements : resolvedYangInput) {
107             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
108         }
109
110         yangDeviceModel.parseIntoYangModels(context, yangFiles);
111
112         // - - - - - - - - -
113
114         final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
115                 ROOT + "data-yang-library-all-listed.xml")));
116
117         yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
118
119         /*
120          * All should be good - all modules supplied, all inside the data file.
121          */
122         assertNoFindings();
123     }
124
125     @Test
126     public void test___yang_lib___input_simple___yl_lists_simple_and_dependencies() {
127
128         final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(SIMPLE_MODULE);
129         final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
130
131         final List<YangModel> yangFiles = new ArrayList<>();
132
133         for (final YangInput absoluteImplements : resolvedYangInput) {
134             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
135         }
136
137         yangDeviceModel.parseIntoYangModels(context, yangFiles);
138
139         // - - - - - - - - -
140
141         final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
142                 ROOT + "data-yang-library-all-listed.xml")));
143
144         yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
145
146         /*
147          * The YL-related modules are listed in the data, but don't exist in the input. Mismatch.
148          */
149         assertHasFindingOfType(ParserFindingType.P085_MISMATCH_BETWEEN_INPUT_MODULES_AND_YANG_LIBRARY.toString());
150         assertFindingCount(4);
151     }
152
153     @Test
154     public void test___yang_lib___input_simple___yl_lists_simple() {
155
156         final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(SIMPLE_MODULE);
157         final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
158
159         final List<YangModel> yangFiles = new ArrayList<>();
160
161         for (final YangInput absoluteImplements : resolvedYangInput) {
162             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
163         }
164
165         yangDeviceModel.parseIntoYangModels(context, yangFiles);
166
167         // - - - - - - - - -
168
169         final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
170                 ROOT + "data-yang-library-simple-module-only.xml")));
171
172         yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
173
174         /*
175          * Only the module listed in the YL, and only the module is in the input.
176          */
177         assertNoFindings();
178     }
179
180     @Test
181     public void test___yang_lib___input_simple___yl_lists_simple___conformance_mismatch() {
182
183         final Set<YangInput> resolvedYangInput1 = new FileBasedYangInputResolver(YANG_LIBRARY_MODULE_AND_DEPENDENCIES)
184                 .getResolvedYangInput();
185         final Set<YangInput> resolvedYangInput2 = new FileBasedYangInputResolver(SIMPLE_MODULE).getResolvedYangInput();
186
187         final List<YangModel> yangFiles = new ArrayList<>();
188
189         for (final YangInput absoluteImplements : resolvedYangInput1) {
190             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
191         }
192         for (final YangInput absoluteImplements : resolvedYangInput2) {
193             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPORT));
194         }
195
196         yangDeviceModel.parseIntoYangModels(context, yangFiles);
197
198         // - - - - - - - - -
199
200         final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
201                 ROOT + "data-yang-library-all-listed-conformance-mismatch.xml")));
202
203         yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
204
205         /*
206          * The conformance type for the "simple module" is wrong. Note that 2 findings will be issued for mismatches...
207          */
208         assertHasFindingOfType(ParserFindingType.P085_MISMATCH_BETWEEN_INPUT_MODULES_AND_YANG_LIBRARY.toString());
209         assertFindingCount(2);
210     }
211
212     @Test
213     public void test___yang_lib___input_simple___yl_lists_simple___namespace_mismatch() {
214
215         final Set<YangInput> resolvedYangInput1 = new FileBasedYangInputResolver(
216                 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE).getResolvedYangInput();
217
218         final List<YangModel> yangFiles = new ArrayList<>();
219         for (final YangInput absoluteImplements : resolvedYangInput1) {
220             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
221         }
222
223         yangDeviceModel.parseIntoYangModels(context, yangFiles);
224
225         // - - - - - - - - -
226
227         final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
228                 ROOT + "data-yang-library-all-listed-namespace-mismatch.xml")));
229
230         yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
231
232         /*
233          * The namespace for the "simple module" is wrong.
234          */
235         assertHasFindingOfType(ParserFindingType.P081_INCORRECT_YANG_LIBRARY_DATA.toString());
236         assertFindingCount(1);
237     }
238
239     @Test
240     public void test___yang_lib___input_simple___yl_lists_simple___feature_mismatch() {
241
242         final Set<YangInput> resolvedYangInput1 = new FileBasedYangInputResolver(
243                 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE).getResolvedYangInput();
244
245         final List<YangModel> yangFiles = new ArrayList<>();
246         for (final YangInput absoluteImplements : resolvedYangInput1) {
247             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
248         }
249
250         yangDeviceModel.parseIntoYangModels(context, yangFiles);
251
252         // - - - - - - - - -
253
254         final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
255                 ROOT + "data-yang-library-all-listed-feature-mismatch.xml")));
256
257         yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
258
259         /*
260          * The feature for the "simple module" is wrong.
261          */
262         assertHasFindingOfType(ParserFindingType.P083_FEATURE_LISTED_IN_YANG_LIBRARY_NOT_FOUND.toString());
263         assertFindingCount(1);
264     }
265
266     @Test
267     public void test___yang_lib___input_simple___yl_lists_simple___features_ok() {
268
269         final Set<YangInput> resolvedYangInput1 = new FileBasedYangInputResolver(
270                 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE).getResolvedYangInput();
271
272         final List<YangModel> yangFiles = new ArrayList<>();
273         for (final YangInput absoluteImplements : resolvedYangInput1) {
274             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
275         }
276
277         yangDeviceModel.parseIntoYangModels(context, yangFiles);
278
279         // - - - - - - - - -
280
281         final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
282                 ROOT + "data-yang-library-all-listed-features-ok.xml")));
283
284         yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
285
286         assertNoFindings();
287     }
288
289     @Test
290     public void test_all_supplied___module_data_only() {
291
292         final FileBasedYangInputResolver resolver = new FileBasedYangInputResolver(
293                 YANG_LIBRARY_MODULE_AND_DEPENDENCIES_AND_SIMPLE_MODULE);
294         final Set<YangInput> resolvedYangInput = resolver.getResolvedYangInput();
295
296         final List<YangModel> yangFiles = new ArrayList<>();
297
298         for (final YangInput absoluteImplements : resolvedYangInput) {
299             yangFiles.add(new YangModel(absoluteImplements, ConformanceType.IMPLEMENT));
300         }
301
302         yangDeviceModel.parseIntoYangModels(context, yangFiles);
303
304         final FileBasedYangInputResolver dataResolver = new FileBasedYangInputResolver(Collections.singletonList(new File(
305                 ROOT + "data-module-data-only.xml")));
306
307         yangDeviceModel.parseYangData(context, dataResolver, DataTreeBuilderPredicate.ALLOW_ALL);
308
309         /*
310          * No YL data supplied at all. The data should parse fine. Should be no findings.
311          */
312         assertNoFindings();
313     }
314
315 }