2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation;
23 import org.apache.commons.collections.CollectionUtils;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.openecomp.core.utilities.file.FileContentHandler;
27 import org.openecomp.sdc.common.utils.SdcCommon;
28 import org.openecomp.sdc.datatypes.error.ErrorLevel;
29 import org.openecomp.sdc.datatypes.error.ErrorMessage;
30 import java.io.IOException;
31 import java.nio.charset.StandardCharsets;
32 import java.util.ArrayList;
33 import java.util.Collections;
34 import java.util.List;
37 import static org.junit.Assert.assertEquals;
38 import static org.junit.Assert.assertTrue;
39 import static org.junit.Assert.fail;
40 import static org.openecomp.sdc.tosca.csar.CSARConstants.SEPARATOR_MF_ATTRIBUTE;
41 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ENTRY_DEFINITIONS;
42 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_CERTIFICATE;
43 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_CHANGE_LOG;
44 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_LICENSES;
45 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_MANIFEST;
46 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_TESTS;
47 import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_PATH_FILE_NAME;
48 import static org.openecomp.sdc.tosca.csar.CSARConstants.PNFD_NAME;
49 import static org.openecomp.sdc.tosca.csar.CSARConstants.PNFD_PROVIDER;
50 import static org.openecomp.sdc.tosca.csar.CSARConstants.PNFD_ARCHIVE_VERSION;
51 import static org.openecomp.sdc.tosca.csar.CSARConstants.PNFD_RELEASE_DATE_TIME;
52 import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_PRODUCT_NAME;
53 import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_PROVIDER_ID;
54 import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_PACKAGE_VERSION;
55 import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_RELEASE_DATE_TIME;
57 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.*;
59 public class SOL004MetaDirectoryValidatorTest {
61 private SOL004MetaDirectoryValidator sol004MetaDirectoryValidator;
62 private FileContentHandler handler;
63 private String metaFile;
67 sol004MetaDirectoryValidator = new SOL004MetaDirectoryValidator();
68 handler = new FileContentHandler();
70 "TOSCA-Meta-File-Version: 1.0\n"+
71 "CSAR-Version: 1.1\n"+
72 "Created-by: Vendor\n"+
73 TOSCA_META_ENTRY_DEFINITIONS + SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.yaml\n"+
74 TOSCA_META_ETSI_ENTRY_MANIFEST + SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.mf\n"+
75 TOSCA_META_ETSI_ENTRY_CHANGE_LOG + SEPARATOR_MF_ATTRIBUTE + "Artifacts/changeLog.text\n";
79 public void testGivenTOSCAMetaFile_whenEntryHasNoValue_thenErrorIsReturned() {
80 final String metaFileWithInvalidEntry = "TOSCA-Meta-File-Version: \n" +
81 "Entry-Definitions: Definitions/MainServiceTemplate.yaml";
83 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileWithInvalidEntry.getBytes(StandardCharsets.UTF_8));
84 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(TestConstants.SAMPLE_DEFINITION_FILE_PATH));
86 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
87 assertExpectedErrors("TOSCA Meta file with no entries", errors, 1);
91 public void testGivenTOSCAMeta_withAllSupportedEntries_thenNoErrorsReturned() {
93 final String entryTestFilePath = "Files/Tests";
94 final String entryLicenseFilePath = "Files/Licenses";
96 final List<String> folderList = new ArrayList<>();
97 folderList.add("Files/Tests/");
98 folderList.add("Files/Licenses/");
100 metaFile = metaFile +
101 TOSCA_META_ETSI_ENTRY_TESTS + SEPARATOR_MF_ATTRIBUTE + entryTestFilePath + "\n" +
102 TOSCA_META_ETSI_ENTRY_LICENSES + SEPARATOR_MF_ATTRIBUTE + entryLicenseFilePath +"\n";
104 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
105 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
106 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
108 handler.addFile(SAMPLE_SOURCE, "".getBytes());
109 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
110 handler.addFile(entryTestFilePath, "".getBytes());
111 handler.addFile(entryLicenseFilePath, "".getBytes());
113 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder()
114 .withSource(TOSCA_META_PATH_FILE_NAME)
115 .withSource(TOSCA_DEFINITION_FILEPATH)
116 .withSource(TOSCA_CHANGELOG_FILEPATH)
117 .withSource(TOSCA_MANIFEST_FILEPATH).withSource(SAMPLE_SOURCE)
118 .withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH)
119 .withSource(entryTestFilePath)
120 .withSource(entryLicenseFilePath);
122 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
124 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, folderList);
125 assertTrue(errors.size() == 0);
129 public void testGivenTOSCAMeta_withUnsupportedEntry_thenWarningIsReturned() {
130 metaFile = "Entry-Events: Definitions/events.log";
132 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
133 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
134 List<ErrorMessage> errorMessages = errors.get(SdcCommon.UPLOAD_FILE);
135 assertTrue(errors.size() == 1 && errorMessages.size() == 1);
136 assertTrue(errorMessages.get(0).getLevel() == ErrorLevel.ERROR);
140 * Tests if the meta file contains invalid versions in TOSCA-Meta-File-Version and CSAR-Version attributes.
143 public void testGivenTOSCAMetaFile_withInvalidTOSCAMetaFileVersionAndCSARVersion_thenErrorIsReturned() {
144 final String metaFile =
145 "TOSCA-Meta-File-Version: " + Integer.MAX_VALUE +
146 "\nCSAR-Version: " + Integer.MAX_VALUE +
147 "\nCreated-by: Bilal Iqbal\n" +
148 TOSCA_META_ENTRY_DEFINITIONS+ SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.yaml\n" +
149 TOSCA_META_ETSI_ENTRY_MANIFEST + SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.mf\n"+
150 TOSCA_META_ETSI_ENTRY_CHANGE_LOG + SEPARATOR_MF_ATTRIBUTE + "Artifacts/changeLog.text";
152 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
154 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
155 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
157 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(TestConstants.SAMPLE_DEFINITION_FILE_PATH));
158 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
160 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
161 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
163 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
164 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
166 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
167 assertExpectedErrors("Invalid TOSCA-Meta-File-Version and CSAR-Version attributes", errors, 2);
171 public void testGivenTOSCAMetaFile_withNonExistentFileReferenced_thenErrorsReturned() {
172 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
174 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
175 List<ErrorMessage> errorMessages = errors.get(SdcCommon.UPLOAD_FILE);
176 assertTrue(errors.size() == 1 && errorMessages.size() == 3);
181 public void testGivenDefinitionFile_whenValidImportStatementExist_thenNoErrorsReturned() {
182 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
184 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
185 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
187 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
188 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
190 handler.addFile(SAMPLE_SOURCE, "".getBytes());
191 manifestBuilder.withSource(SAMPLE_SOURCE);
193 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml", getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
194 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml");
196 final String definitionFileWithValidImports = "/validation.files/definition/definitionFileWithValidImports.yaml";
197 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(definitionFileWithValidImports));
198 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
200 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
201 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
203 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
204 assertTrue(errors.size() == 0);
208 public void testGivenDefinitionFile_whenMultipleDefinitionsImportStatementExist_thenNoErrorsReturned() {
209 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
211 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
212 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
214 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
215 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
217 handler.addFile(SAMPLE_SOURCE, "".getBytes());
218 manifestBuilder.withSource(SAMPLE_SOURCE);
220 final byte [] sampleDefinitionFile1 = getResourceBytes("/validation.files/definition/sampleDefinitionFile1.yaml");
221 handler.addFile(TOSCA_DEFINITION_FILEPATH, sampleDefinitionFile1);
222 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
224 final byte [] sampleDefinitionFile2 = getResourceBytes("/validation.files/definition/sampleDefinitionFile2.yaml");
225 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml", sampleDefinitionFile2);
226 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml");
228 final byte [] sampleDefinitionFile3 = getResourceBytes("/validation.files/definition/sampleDefinitionFile3.yaml");
229 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml", sampleDefinitionFile3);
230 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml");
232 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
233 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
235 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
236 assertTrue(errors.size() == 0);
240 public void testGivenDefinitionFile_whenInvalidImportStatementExist_thenErrorIsReturned() {
241 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
243 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
244 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
246 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
247 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
249 handler.addFile(SAMPLE_SOURCE, "".getBytes());
250 manifestBuilder.withSource(SAMPLE_SOURCE);
252 final String definitionFileWithInvalidImports = "/validation.files/definition/definitionFileWithInvalidImport.yaml";
253 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(definitionFileWithInvalidImports));
254 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
256 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
257 String manifest = manifestBuilder.build();
258 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifest.getBytes(StandardCharsets.UTF_8));
260 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
261 assertExpectedErrors("", errors, 1);
265 * Manifest referenced import file missing
268 public void testGivenDefinitionFile_whenReferencedImportDoesNotExist_thenErrorIsReturned() {
269 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
271 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
272 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
274 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
275 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
277 handler.addFile(SAMPLE_SOURCE, "".getBytes());
278 manifestBuilder.withSource(SAMPLE_SOURCE);
280 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml", "".getBytes());
281 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml");
283 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
284 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes("/validation.files/definition/sampleDefinitionFile2.yaml"));
286 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
287 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
289 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
290 assertExpectedErrors("Manifest referenced import file missing", errors, 1);
294 * Reference with invalid YAML format.
297 public void testGivenDefinitionFile_withInvalidYAML_thenErrorIsReturned() {
298 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
300 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
301 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
303 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
304 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
306 handler.addFile(SAMPLE_SOURCE, "".getBytes());
307 manifestBuilder.withSource(SAMPLE_SOURCE);
309 final String definitionFileWithInvalidYAML = "/validation.files/definition/invalidDefinitionFile.yaml";
310 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(definitionFileWithInvalidYAML));
311 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
313 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
314 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
316 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
317 assertExpectedErrors("Reference with invalid YAML format", errors, 1);
321 public void testGivenManifestFile_withValidSourceAndNonManoSources_thenNoErrorIsReturned() {
322 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
324 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
325 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
327 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
328 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
330 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
331 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
333 handler.addFile(SAMPLE_SOURCE, "".getBytes());
334 manifestBuilder.withSource(SAMPLE_SOURCE);
336 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
337 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
339 final String nonManoSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml";
340 handler.addFile(nonManoSource, "".getBytes());
341 manifestBuilder.withNonManoArtifact("onap_pm_events", nonManoSource);
343 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
344 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
346 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
347 assertTrue(errors.size() == 0);
351 * Manifest with non existent source files should return error.
354 public void testGivenManifestFile_withNonExistentSourceFile_thenErrorIsReturned() {
355 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
356 //non existent reference
357 manifestBuilder.withSource("Artifacts/Deployment/Events/RadioNode_pnf_v1.yaml");
359 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
360 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
362 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
363 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
365 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
366 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
368 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
369 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
371 String nonManoSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml";
372 handler.addFile(nonManoSource, "".getBytes());
373 manifestBuilder.withNonManoArtifact("onap_pm_events", nonManoSource);
375 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
376 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
378 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
379 assertExpectedErrors("Manifest with non existent source files", errors, 1);
383 * Tests the validation for a TOSCA Manifest with invalid data.
386 public void testGivenManifestFile_withInvalidData_thenErrorIsReturned() {
387 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
388 handler.addFile(TOSCA_MANIFEST_FILEPATH, getResourceBytes("/validation.files/manifest/invalidManifest.mf"));
389 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
390 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
391 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
393 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
394 assertExpectedErrors("TOSCA manifest with invalid data", errors, 1);
398 public void testGivenManifestAndDefinitionFile_withSameNames_thenNoErrorReturned() {
399 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
401 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
402 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
404 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
405 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
407 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
408 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
410 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
411 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
413 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
414 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
416 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
417 assertTrue(errors.size() == 0);
421 * Main TOSCA definitions file and Manifest file with different name should return error.
424 public void testGivenManifestAndMainDefinitionFile_withDifferentNames_thenErrorIsReturned() {
426 "TOSCA-Meta-File-Version: 1.0\n"+
427 "CSAR-Version: 1.1\n"+
428 "Created-by: Vendor\n"+
429 TOSCA_META_ENTRY_DEFINITIONS + SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.yaml\n"+
430 TOSCA_META_ETSI_ENTRY_MANIFEST + SEPARATOR_MF_ATTRIBUTE +"Definitions/MainServiceTemplate2.mf\n"+
431 TOSCA_META_ETSI_ENTRY_CHANGE_LOG + SEPARATOR_MF_ATTRIBUTE +"Artifacts/changeLog.text\n";
433 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
435 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
436 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
438 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
439 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
441 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
442 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
444 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
445 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
447 manifestBuilder.withSource("Definitions/MainServiceTemplate2.mf");
448 handler.addFile("Definitions/MainServiceTemplate2.mf", manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
450 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
451 assertExpectedErrors("Main TOSCA definitions file and Manifest file with different name should return error",
456 public void testGivenManifestFile_withDifferentExtension_thenErrorIsReturned() {
458 "TOSCA-Meta-File-Version: 1.0\n"+
459 "CSAR-Version: 1.1\n"+
460 "Created-by: Vendor\n"+
461 "Entry-Definitions: Definitions/MainServiceTemplate.yaml\n"+
462 TOSCA_META_ETSI_ENTRY_MANIFEST + SEPARATOR_MF_ATTRIBUTE + "Definitions/MainServiceTemplate.txt\n"+
463 TOSCA_META_ETSI_ENTRY_CHANGE_LOG + SEPARATOR_MF_ATTRIBUTE + "Artifacts/changeLog.text\n";
465 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
467 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
468 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
470 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
471 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
473 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
474 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
476 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
477 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
479 manifestBuilder.withSource("Definitions/MainServiceTemplate.txt");
480 handler.addFile("Definitions/MainServiceTemplate.txt", manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
482 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
483 assertExpectedErrors("Manifest file with different extension than .mf should return error",
488 public void testGivenManifestFile_withValidVnfMetadata_thenNoErrorsReturned() {
489 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
491 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
492 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
493 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
494 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
495 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
496 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
498 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
499 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
501 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
502 assertExpectedErrors("Manifest with valid vnf mandatory values should not return any errors", errors, 0);
506 public void testGivenManifestFile_withValidPnfMetadata_thenNoErrorsReturned() {
507 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
509 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
510 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
512 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
513 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
515 manifestBuilder.withSignedSource(TOSCA_DEFINITION_FILEPATH
516 , "SHA-abc", "09e5a788acb180162c51679ae4c998039fa6644505db2415e35107d1ee213943");
517 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
519 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
520 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
522 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
523 assertExpectedErrors("Manifest with valid pnf mandatory values should not return any errors", errors, 0);
527 * Manifest with mixed metadata should return error.
530 public void testGivenManifestFile_withMetadataContainingMixedPnfVnfMetadata_thenErrorIsReturned() {
531 final ManifestBuilder manifestBuilder = new ManifestBuilder()
532 .withMetaData(PNFD_NAME, "RadioNode")
533 .withMetaData(VNF_PROVIDER_ID, "Bilal Iqbal")
534 .withMetaData(PNFD_ARCHIVE_VERSION, "1.0")
535 .withMetaData(VNF_RELEASE_DATE_TIME, "2019-12-14T11:25:00+00:00");
537 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
538 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
539 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
540 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
541 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
542 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
544 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
545 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
547 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
548 assertExpectedErrors("Manifest with mixed metadata should return error", errors, 1);
553 public void testGivenManifestFile_withMetadataMissingPnfOrVnfMandatoryEntries_thenErrorIsReturned() {
554 final ManifestBuilder manifestBuilder = new ManifestBuilder()
555 .withMetaData("invalid_product_name", "RadioNode")
556 .withMetaData("invalid_provider_id", "Bilal Iqbal")
557 .withMetaData("invalid_package_version", "1.0")
558 .withMetaData("invalid_release_date_time", "2019-12-14T11:25:00+00:00");
560 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
561 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
563 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
564 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
566 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
567 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
569 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
570 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
572 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
573 assertExpectedErrors("Manifest with missing vnf or pnf mandatory entries should return error", errors, 1);
577 public void testGivenManifestFile_withMetadataMissingMandatoryPnfEntries_thenErrorIsReturned() {
578 final ManifestBuilder manifestBuilder = new ManifestBuilder();
580 manifestBuilder.withMetaData(PNFD_NAME, "RadioNode");
581 manifestBuilder.withMetaData(PNFD_RELEASE_DATE_TIME, "2019-12-14T11:25:00+00:00");
583 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
584 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
586 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
587 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
589 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
590 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
592 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
593 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
595 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
596 assertExpectedErrors("Manifest with metadata missing pnf mandatory entries should return error", errors, 3);
601 public void testGivenManifestFile_withMetadataMissingMandatoryVnfEntries_thenErrorIsReturned() {
602 final ManifestBuilder manifestBuilder = new ManifestBuilder();
604 manifestBuilder.withMetaData(VNF_PRODUCT_NAME, "RadioNode");
606 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
607 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
609 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
610 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
612 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
613 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
615 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
616 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
618 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
619 assertExpectedErrors("Manifest with metadata missing vnf mandatory entries should return error", errors, 4);
624 * Manifest with more than 4 metadata entries should return error.
627 public void testGivenManifestFile_withMetadataEntriesExceedingTheLimit_thenErrorIsReturned() {
628 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder()
629 .withMetaData(PNFD_NAME, "RadioNode")
630 .withMetaData(PNFD_PROVIDER, "Bilal Iqbal")
631 .withMetaData(PNFD_ARCHIVE_VERSION, "1.0")
632 .withMetaData(PNFD_RELEASE_DATE_TIME, "2019-03-11T11:25:00+00:00");
634 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
635 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
637 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
638 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
640 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
641 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
643 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
644 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
646 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList());
647 assertExpectedErrors("Manifest with more than 4 metadata entries should return error", errors, 2);
651 public void testGivenManifestFile_withPnfMetadataAndVfEntries_thenErrorIsReturned() {
652 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
654 metaFile = metaFile +
655 TOSCA_META_ETSI_ENTRY_TESTS + SEPARATOR_MF_ATTRIBUTE + "Files/Tests\n" +
656 TOSCA_META_ETSI_ENTRY_LICENSES + SEPARATOR_MF_ATTRIBUTE + "Files/Licenses\n" +
657 TOSCA_META_ETSI_ENTRY_CERTIFICATE + SEPARATOR_MF_ATTRIBUTE + "Files/Certificates";
659 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8));
660 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
662 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
663 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
665 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH));
666 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
668 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
669 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
671 final List<String> folderList = new ArrayList<>();
672 folderList.add("Files/Certificates/");
673 final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, folderList);
674 assertExpectedErrors("Tosca.meta should not have entries applicable only to VF", errors, 2);
678 private void assertExpectedErrors(final String testCase, final Map<String, List<ErrorMessage>> errors, final int expectedErrors){
679 final List<ErrorMessage> errorMessages = errors.get(SdcCommon.UPLOAD_FILE);
680 printErrorMessages(errorMessages);
681 if (expectedErrors > 0) {
682 assertEquals(testCase, errorMessages.size(), expectedErrors);
684 assertEquals(testCase, errors.size(), expectedErrors);
688 private void printErrorMessages(final List<ErrorMessage> errorMessages) {
689 if (CollectionUtils.isNotEmpty(errorMessages)) {
690 errorMessages.forEach(errorMessage -> {
691 System.out.println(String.format("%s: %s", errorMessage.getLevel(), errorMessage.getMessage()));
696 private byte[] getResourceBytes(final String resourcePath) {
698 return ValidatorUtil.getFileResource(resourcePath);
699 } catch (final IOException e) {
700 fail(String.format("Could not load resource '%s'", resourcePath));
707 private ManifestBuilder getPnfManifestSampleBuilder() {
708 return new ManifestBuilder()
709 .withMetaData(PNFD_NAME, "myPnf")
710 .withMetaData(PNFD_PROVIDER, "ACME")
711 .withMetaData(PNFD_ARCHIVE_VERSION, "1.0")
712 .withMetaData(PNFD_RELEASE_DATE_TIME, "2019-03-11T11:25:00+00:00");
715 private ManifestBuilder getVnfManifestSampleBuilder() {
716 return new ManifestBuilder()
717 .withMetaData(VNF_PRODUCT_NAME, "RadioNode")
718 .withMetaData(VNF_PROVIDER_ID, "ACME")
719 .withMetaData(VNF_PACKAGE_VERSION, "1.0")
720 .withMetaData(VNF_RELEASE_DATE_TIME, "2019-03-11T11:25:00+00:00");