1 package org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation;
3 import org.apache.commons.collections.CollectionUtils;
4 import org.junit.Before;
6 import org.openecomp.core.utilities.file.FileContentHandler;
7 import org.openecomp.sdc.common.utils.SdcCommon;
8 import org.openecomp.sdc.datatypes.error.ErrorLevel;
9 import org.openecomp.sdc.datatypes.error.ErrorMessage;
10 import java.io.IOException;
11 import java.nio.charset.StandardCharsets;
12 import java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.List;
17 import static org.junit.Assert.assertEquals;
18 import static org.junit.Assert.assertTrue;
19 import static org.junit.Assert.fail;
20 import static org.openecomp.sdc.tosca.csar.CSARConstants.SEPARATOR_MF_ATTRIBUTE;
21 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ENTRY_DEFINITIONS;
22 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_CERTIFICATE;
23 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_CHANGE_LOG;
24 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_LICENSES;
25 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_MANIFEST;
26 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_TESTS;
27 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_PATH_FILE_NAME;
28 import static org.openecomp.sdc.tosca.csar.CSARConstants.PNFD_NAME;
29 import static org.openecomp.sdc.tosca.csar.CSARConstants.PNFD_PROVIDER;
30 import static org.openecomp.sdc.tosca.csar.CSARConstants.PNFD_ARCHIVE_VERSION;
31 import static org.openecomp.sdc.tosca.csar.CSARConstants.PNFD_RELEASE_DATE_TIME;
32 import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_PRODUCT_NAME;
33 import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_PROVIDER_ID;
34 import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_PACKAGE_VERSION;
35 import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_RELEASE_DATE_TIME;
37 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.*;
39 public class SOL004MetaDirectoryValidatorTest {
41 private SOL004MetaDirectoryValidator sol004MetaDirectoryValidator;
42 private FileContentHandler handler;
43 private String metaFile;
47 sol004MetaDirectoryValidator = new SOL004MetaDirectoryValidator();
48 handler = new FileContentHandler();
50 "TOSCA-Meta-File-Version: 1.0\n"+
51 "CSAR-Version: 1.1\n"+
52 "Created-by: Vendor\n"+
53 TOSCA_META_ENTRY_DEFINITIONS + SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.yaml\n"+
54 TOSCA_META_ETSI_ENTRY_MANIFEST + SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.mf\n"+
55 TOSCA_META_ETSI_ENTRY_CHANGE_LOG + SEPARATOR_MF_ATTRIBUTE + "Artifacts/changeLog.text\n";
59 public void testGivenTOSCAMetaFile_whenEntryHasNoValue_thenErrorIsReturned() {
60 final String metaFileWithInvalidEntry = "TOSCA-Meta-File-Version: \n" +
61 "Entry-Definitions: Definitions/MainServiceTemplate.yaml";
63 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileWithInvalidEntry.getBytes(StandardCharsets.UTF_8));
64 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(TestConstants.SAMPLE_DEFINITION_FILE_PATH));
66 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
67 assertExpectedErrors("TOSCA Meta file with no entries", errors, 1);
71 public void testGivenTOSCAMeta_withAllSupportedEntries_thenNoErrorsReturned() {
73 final String entryTestFilePath = "Files/Tests";
74 final String entryLicenseFilePath = "Files/Licenses";
76 final List<String> folderList = new ArrayList<>();
77 folderList.add("Files/Tests/");
78 folderList.add("Files/Licenses/");
81 TOSCA_META_ETSI_ENTRY_TESTS + SEPARATOR_MF_ATTRIBUTE + entryTestFilePath + "\n" +
82 TOSCA_META_ETSI_ENTRY_LICENSES + SEPARATOR_MF_ATTRIBUTE + entryLicenseFilePath +"\n";
84 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
85 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
86 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
88 handler.addFile(SAMPLE_SOURCE, "".getBytes());
89 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
90 handler.addFile(entryTestFilePath, "".getBytes());
91 handler.addFile(entryLicenseFilePath, "".getBytes());
93 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder()
94 .withSource(TOSCA_META_PATH_FILE_NAME)
95 .withSource(TOSCA_DEFINITION_FILEPATH)
96 .withSource(TOSCA_CHANGELOG_FILEPATH)
97 .withSource(TOSCA_MANIFEST_FILEPATH).withSource(SAMPLE_SOURCE)
98 .withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH)
99 .withSource(entryTestFilePath)
100 .withSource(entryLicenseFilePath);
102 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
104 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, folderList);
105 assertTrue(errors.size() == 0);
109 public void testGivenTOSCAMeta_withUnsupportedEntry_thenWarningIsReturned() {
110 metaFile = "Entry-Events: Definitions/events.log";
112 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
113 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
114 List<ErrorMessage> errorMessages = errors.get(SdcCommon.UPLOAD_FILE);
115 assertTrue(errors.size() == 1 && errorMessages.size() == 1);
116 assertTrue(errorMessages.get(0).getLevel() == ErrorLevel.ERROR);
120 * Tests if the meta file contains invalid versions in TOSCA-Meta-File-Version and CSAR-Version attributes.
123 public void testGivenTOSCAMetaFile_withInvalidTOSCAMetaFileVersionAndCSARVersion_thenErrorIsReturned() {
124 final String metaFile =
125 "TOSCA-Meta-File-Version: " + Integer.MAX_VALUE +
126 "\nCSAR-Version: " + Integer.MAX_VALUE +
127 "\nCreated-by: Bilal Iqbal\n" +
128 TOSCA_META_ENTRY_DEFINITIONS+ SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.yaml\n" +
129 TOSCA_META_ETSI_ENTRY_MANIFEST + SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.mf\n"+
130 TOSCA_META_ETSI_ENTRY_CHANGE_LOG + SEPARATOR_MF_ATTRIBUTE + "Artifacts/changeLog.text";
132 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
134 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
135 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
137 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(TestConstants.SAMPLE_DEFINITION_FILE_PATH));
138 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
140 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
141 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
143 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
144 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
146 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
147 assertExpectedErrors("Invalid TOSCA-Meta-File-Version and CSAR-Version attributes", errors, 2);
151 public void testGivenTOSCAMetaFile_withNonExistentFileReferenced_thenErrorsReturned() {
152 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
154 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
155 List<ErrorMessage> errorMessages = errors.get(SdcCommon.UPLOAD_FILE);
156 assertTrue(errors.size() == 1 && errorMessages.size() == 3);
161 public void testGivenDefinitionFile_whenValidImportStatementExist_thenNoErrorsReturned() {
162 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
164 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
165 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
167 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
168 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
170 handler.addFile(SAMPLE_SOURCE, "".getBytes());
171 manifestBuilder.withSource(SAMPLE_SOURCE);
173 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml", getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
174 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml");
176 final String definitionFileWithValidImports = "/validation.files/definition/definitionFileWithValidImports.yaml";
177 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(definitionFileWithValidImports));
178 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
180 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
181 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
183 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
184 assertTrue(errors.size() == 0);
188 public void testGivenDefinitionFile_whenMultipleDefinitionsImportStatementExist_thenNoErrorsReturned() {
189 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
191 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
192 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
194 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
195 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
197 handler.addFile(SAMPLE_SOURCE, "".getBytes());
198 manifestBuilder.withSource(SAMPLE_SOURCE);
200 final byte [] sampleDefinitionFile1 = getResourceBytes("/validation.files/definition/sampleDefinitionFile1.yaml");
201 handler.addFile(TOSCA_DEFINITION_FILEPATH, sampleDefinitionFile1);
202 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
204 final byte [] sampleDefinitionFile2 = getResourceBytes("/validation.files/definition/sampleDefinitionFile2.yaml");
205 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml", sampleDefinitionFile2);
206 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml");
208 final byte [] sampleDefinitionFile3 = getResourceBytes("/validation.files/definition/sampleDefinitionFile3.yaml");
209 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml", sampleDefinitionFile3);
210 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml");
212 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
213 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
215 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
216 assertTrue(errors.size() == 0);
220 public void testGivenDefinitionFile_whenInvalidImportStatementExist_thenErrorIsReturned() {
221 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
223 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
224 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
226 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
227 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
229 handler.addFile(SAMPLE_SOURCE, "".getBytes());
230 manifestBuilder.withSource(SAMPLE_SOURCE);
232 final String definitionFileWithInvalidImports = "/validation.files/definition/definitionFileWithInvalidImport.yaml";
233 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(definitionFileWithInvalidImports));
234 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
236 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
237 String manifest = manifestBuilder.build();
238 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifest.getBytes(StandardCharsets.UTF_8));
240 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
241 assertExpectedErrors("", errors, 1);
245 * Manifest referenced import file missing
248 public void testGivenDefinitionFile_whenReferencedImportDoesNotExist_thenErrorIsReturned() {
249 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
251 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
252 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
254 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
255 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
257 handler.addFile(SAMPLE_SOURCE, "".getBytes());
258 manifestBuilder.withSource(SAMPLE_SOURCE);
260 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml", "".getBytes());
261 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml");
263 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
264 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes("/validation.files/definition/sampleDefinitionFile2.yaml"));
266 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
267 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
269 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
270 assertExpectedErrors("Manifest referenced import file missing", errors, 1);
274 * Reference with invalid YAML format.
277 public void testGivenDefinitionFile_withInvalidYAML_thenErrorIsReturned() {
278 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
280 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
281 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
283 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
284 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
286 handler.addFile(SAMPLE_SOURCE, "".getBytes());
287 manifestBuilder.withSource(SAMPLE_SOURCE);
289 final String definitionFileWithInvalidYAML = "/validation.files/definition/invalidDefinitionFile.yaml";
290 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(definitionFileWithInvalidYAML));
291 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
293 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
294 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
296 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
297 assertExpectedErrors("Reference with invalid YAML format", errors, 1);
301 public void testGivenManifestFile_withValidSourceAndNonManoSources_thenNoErrorIsReturned() {
302 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
304 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
305 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
307 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
308 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
310 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
311 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
313 handler.addFile(SAMPLE_SOURCE, "".getBytes());
314 manifestBuilder.withSource(SAMPLE_SOURCE);
316 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
317 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
319 final String nonManoSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml";
320 handler.addFile(nonManoSource, "".getBytes());
321 manifestBuilder.withNonManoArtifact("onap_pm_events", nonManoSource);
323 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
324 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
326 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
327 assertTrue(errors.size() == 0);
331 * Manifest with non existent source files should return error.
334 public void testGivenManifestFile_withNonExistentSourceFile_thenErrorIsReturned() {
335 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
336 //non existent reference
337 manifestBuilder.withSource("Artifacts/Deployment/Events/RadioNode_pnf_v1.yaml");
339 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
340 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
342 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
343 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
345 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
346 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
348 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
349 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
351 String nonManoSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml";
352 handler.addFile(nonManoSource, "".getBytes());
353 manifestBuilder.withNonManoArtifact("onap_pm_events", nonManoSource);
355 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
356 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
358 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
359 assertExpectedErrors("Manifest with non existent source files", errors, 1);
363 * Tests the validation for a TOSCA Manifest with invalid data.
366 public void testGivenManifestFile_withInvalidData_thenErrorIsReturned() {
367 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
368 handler.addFile(TOSCA_MANIFEST_FILEPATH, getResourceBytes("/validation.files/manifest/invalidManifest.mf"));
369 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
370 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
371 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
373 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
374 assertExpectedErrors("TOSCA manifest with invalid data", errors, 1);
378 public void testGivenManifestAndDefinitionFile_withSameNames_thenNoErrorReturned() {
379 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
381 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
382 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
384 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
385 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
387 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
388 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
390 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
391 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
393 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
394 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
396 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
397 assertTrue(errors.size() == 0);
401 * Main TOSCA definitions file and Manifest file with different name should return error.
404 public void testGivenManifestAndMainDefinitionFile_withDifferentNames_thenErrorIsReturned() {
406 "TOSCA-Meta-File-Version: 1.0\n"+
407 "CSAR-Version: 1.1\n"+
408 "Created-by: Vendor\n"+
409 TOSCA_META_ENTRY_DEFINITIONS + SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.yaml\n"+
410 TOSCA_META_ETSI_ENTRY_MANIFEST + SEPARATOR_MF_ATTRIBUTE +"Definitions/MainServiceTemplate2.mf\n"+
411 TOSCA_META_ETSI_ENTRY_CHANGE_LOG + SEPARATOR_MF_ATTRIBUTE +"Artifacts/changeLog.text\n";
413 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
415 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
416 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
418 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
419 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
421 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
422 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
424 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
425 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
427 manifestBuilder.withSource("Definitions/MainServiceTemplate2.mf");
428 handler.addFile("Definitions/MainServiceTemplate2.mf", manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
430 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
431 assertExpectedErrors("Main TOSCA definitions file and Manifest file with different name should return error",
436 public void testGivenManifestFile_withDifferentExtension_thenErrorIsReturned() {
438 "TOSCA-Meta-File-Version: 1.0\n"+
439 "CSAR-Version: 1.1\n"+
440 "Created-by: Vendor\n"+
441 "Entry-Definitions: Definitions/MainServiceTemplate.yaml\n"+
442 TOSCA_META_ETSI_ENTRY_MANIFEST + SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.txt\n"+
443 TOSCA_META_ETSI_ENTRY_CHANGE_LOG + SEPARATOR_MF_ATTRIBUTE + "Artifacts/changeLog.text\n";
445 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
447 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
448 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
450 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
451 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
453 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
454 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
456 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
457 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
459 manifestBuilder.withSource("Definitions/MainServiceTemplate.txt");
460 handler.addFile("Definitions/MainServiceTemplate.txt", manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
462 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
463 assertExpectedErrors("Manifest file with different extension than .mf should return error",
468 public void testGivenManifestFile_withValidVnfMetadata_thenNoErrorsReturned() {
469 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
471 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
472 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
473 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
474 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
475 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
476 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
478 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
479 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
481 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
482 assertExpectedErrors("Manifest with valid vnf mandatory values should not return any errors", errors, 0);
486 public void testGivenManifestFile_withValidPnfMetadata_thenNoErrorsReturned() {
487 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
489 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
490 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
492 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
493 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
495 manifestBuilder.withSignedSource(TOSCA_DEFINITION_FILEPATH
496 , "SHA-abc", "09e5a788acb180162c51679ae4c998039fa6644505db2415e35107d1ee213943");
497 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
499 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
500 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
502 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
503 assertExpectedErrors("Manifest with valid pnf mandatory values should not return any errors", errors, 0);
507 * Manifest with mixed metadata should return error.
510 public void testGivenManifestFile_withMetadataContainingMixedPnfVnfMetadata_thenErrorIsReturned() {
511 final ManifestBuilder manifestBuilder = new ManifestBuilder()
512 .withMetaData(PNFD_NAME, "RadioNode")
513 .withMetaData(VNF_PROVIDER_ID, "Bilal Iqbal")
514 .withMetaData(PNFD_ARCHIVE_VERSION, "1.0")
515 .withMetaData(VNF_RELEASE_DATE_TIME, "2019-12-14T11:25:00+00:00");
517 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
518 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
519 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
520 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
521 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
522 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
524 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
525 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
527 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
528 assertExpectedErrors("Manifest with mixed metadata should return error", errors, 1);
533 public void testGivenManifestFile_withMetadataMissingPnfOrVnfMandatoryEntries_thenErrorIsReturned() {
534 final ManifestBuilder manifestBuilder = new ManifestBuilder()
535 .withMetaData("invalid_product_name", "RadioNode")
536 .withMetaData("invalid_provider_id", "Bilal Iqbal")
537 .withMetaData("invalid_package_version", "1.0")
538 .withMetaData("invalid_release_date_time", "2019-12-14T11:25:00+00:00");
540 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
541 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
543 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
544 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
546 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
547 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
549 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
550 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
552 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
553 assertExpectedErrors("Manifest with missing vnf or pnf mandatory entries should return error", errors, 1);
557 public void testGivenManifestFile_withMetadataMissingMandatoryPnfEntries_thenErrorIsReturned() {
558 final ManifestBuilder manifestBuilder = new ManifestBuilder();
560 manifestBuilder.withMetaData(PNFD_NAME, "RadioNode");
561 manifestBuilder.withMetaData(PNFD_RELEASE_DATE_TIME, "2019-12-14T11:25:00+00:00");
563 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
564 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
566 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
567 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
569 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
570 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
572 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
573 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
575 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
576 assertExpectedErrors("Manifest with metadata missing pnf mandatory entries should return error", errors, 3);
581 public void testGivenManifestFile_withMetadataMissingMandatoryVnfEntries_thenErrorIsReturned() {
582 final ManifestBuilder manifestBuilder = new ManifestBuilder();
584 manifestBuilder.withMetaData(VNF_PRODUCT_NAME, "RadioNode");
586 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
587 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
589 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
590 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
592 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
593 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
595 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
596 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
598 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
599 assertExpectedErrors("Manifest with metadata missing vnf mandatory entries should return error", errors, 4);
604 * Manifest with more than 4 metadata entries should return error.
607 public void testGivenManifestFile_withMetadataEntriesExceedingTheLimit_thenErrorIsReturned() {
608 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder()
609 .withMetaData(PNFD_NAME, "RadioNode")
610 .withMetaData(PNFD_PROVIDER, "Bilal Iqbal")
611 .withMetaData(PNFD_ARCHIVE_VERSION, "1.0")
612 .withMetaData(PNFD_RELEASE_DATE_TIME, "2019-03-11T11:25:00+00:00");
614 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
615 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
617 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
618 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
620 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
621 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
623 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
624 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
626 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
627 assertExpectedErrors("Manifest with more than 4 metadata entries should return error", errors, 2);
631 public void testGivenManifestFile_withPnfMetadataAndVfEntries_thenErrorIsReturned() {
632 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
634 metaFile = metaFile +
635 TOSCA_META_ETSI_ENTRY_TESTS + SEPARATOR_MF_ATTRIBUTE + "Files/Tests\n" +
636 TOSCA_META_ETSI_ENTRY_LICENSES + SEPARATOR_MF_ATTRIBUTE + "Files/Licenses\n" +
637 TOSCA_META_ETSI_ENTRY_CERTIFICATE + SEPARATOR_MF_ATTRIBUTE + "Files/Certificates";
639 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
640 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
642 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
643 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
645 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
646 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
648 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
649 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
651 final List<String> folderList = new ArrayList<>();
652 folderList.add("Files/Certificates/");
653 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, folderList);
654 assertExpectedErrors("Tosca.meta should not have entries applicable only to VF", errors, 2);
658 private void assertExpectedErrors(final String testCase, final Map<String, List<ErrorMessage>> errors, final int expectedErrors){
659 final List<ErrorMessage> errorMessages = errors.get(SdcCommon.UPLOAD_FILE);
660 printErrorMessages(errorMessages);
661 if (expectedErrors > 0) {
662 assertEquals(testCase, errorMessages.size(), expectedErrors);
664 assertEquals(testCase, errors.size(), expectedErrors);
668 private void printErrorMessages(final List<ErrorMessage> errorMessages) {
669 if (CollectionUtils.isNotEmpty(errorMessages)) {
670 errorMessages.forEach(errorMessage -> {
671 System.out.println(String.format("%s: %s", errorMessage.getLevel(), errorMessage.getMessage()));
676 private byte[] getResourceBytes(final String resourcePath) {
678 return ValidatorUtil.getFileResource(resourcePath);
679 } catch (final IOException e) {
680 fail(String.format("Could not load resource '%s'", resourcePath));
687 private ManifestBuilder getPnfManifestSampleBuilder() {
688 return new ManifestBuilder()
689 .withMetaData(PNFD_NAME, "myPnf")
690 .withMetaData(PNFD_PROVIDER, "ACME")
691 .withMetaData(PNFD_ARCHIVE_VERSION, "1.0")
692 .withMetaData(PNFD_RELEASE_DATE_TIME, "2019-03-11T11:25:00+00:00");
695 private ManifestBuilder getVnfManifestSampleBuilder() {
696 return new ManifestBuilder()
697 .withMetaData(VNF_PRODUCT_NAME, "RadioNode")
698 .withMetaData(VNF_PROVIDER_ID, "ACME")
699 .withMetaData(VNF_PACKAGE_VERSION, "1.0")
700 .withMetaData(VNF_RELEASE_DATE_TIME, "2019-03-11T11:25:00+00:00");