2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Modifications copyright (c) 2020 Nokia
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
23 package org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation;
25 import static org.hamcrest.MatcherAssert.assertThat;
26 import static org.hamcrest.Matchers.empty;
27 import static org.hamcrest.Matchers.hasSize;
28 import static org.hamcrest.Matchers.is;
29 import static org.junit.jupiter.api.Assertions.assertEquals;
30 import static org.junit.jupiter.api.Assertions.assertTrue;
31 import static org.mockito.ArgumentMatchers.any;
32 import static org.mockito.Mockito.mock;
33 import static org.mockito.Mockito.when;
34 import static org.openecomp.sdc.be.config.NonManoArtifactType.ONAP_PM_DICTIONARY;
35 import static org.openecomp.sdc.be.config.NonManoArtifactType.ONAP_SW_INFORMATION;
36 import static org.openecomp.sdc.be.config.NonManoArtifactType.ONAP_VES_EVENTS;
37 import static org.openecomp.sdc.be.test.util.TestResourcesHandler.getResourceBytesOrFail;
38 import static org.openecomp.sdc.tosca.csar.ManifestTokenType.ATTRIBUTE_VALUE_SEPARATOR;
39 import static org.openecomp.sdc.tosca.csar.ManifestTokenType.PNFD_ARCHIVE_VERSION;
40 import static org.openecomp.sdc.tosca.csar.ManifestTokenType.PNFD_NAME;
41 import static org.openecomp.sdc.tosca.csar.ManifestTokenType.PNFD_RELEASE_DATE_TIME;
42 import static org.openecomp.sdc.tosca.csar.ManifestTokenType.VNF_PRODUCT_NAME;
43 import static org.openecomp.sdc.tosca.csar.ManifestTokenType.VNF_PROVIDER_ID;
44 import static org.openecomp.sdc.tosca.csar.ManifestTokenType.VNF_RELEASE_DATE_TIME;
45 import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.CREATED_BY_ENTRY;
46 import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.CSAR_VERSION_ENTRY;
47 import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.ENTRY_DEFINITIONS;
48 import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.ETSI_ENTRY_CERTIFICATE;
49 import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.ETSI_ENTRY_CHANGE_LOG;
50 import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.ETSI_ENTRY_LICENSES;
51 import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.ETSI_ENTRY_MANIFEST;
52 import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.ETSI_ENTRY_TESTS;
53 import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.TOSCA_META_FILE_VERSION_ENTRY;
54 import static org.openecomp.sdc.tosca.csar.ToscaMetadataFileInfo.TOSCA_META_PATH_FILE_NAME;
55 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.EMPTY_YAML_FILE_PATH;
56 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.INVALID_YAML_FILE_PATH;
57 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.SAMPLE_DEFINITION_FILE_PATH;
58 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.SAMPLE_DEFINITION_IMPORT_FILE_PATH;
59 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.SAMPLE_SOURCE;
60 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.TOSCA_CHANGELOG_FILEPATH;
61 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.TOSCA_DEFINITION_FILEPATH;
62 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.TOSCA_MANIFEST_FILEPATH;
64 import java.io.IOException;
65 import java.nio.charset.StandardCharsets;
66 import java.util.ArrayList;
67 import java.util.Collections;
68 import java.util.List;
70 import java.util.function.Predicate;
71 import java.util.stream.Collectors;
72 import java.util.stream.Stream;
73 import org.apache.commons.collections.CollectionUtils;
74 import org.junit.jupiter.api.BeforeEach;
75 import org.junit.jupiter.api.Test;
76 import org.openecomp.sdc.common.errors.Messages;
77 import org.openecomp.sdc.common.utils.SdcCommon;
78 import org.openecomp.sdc.datatypes.error.ErrorLevel;
79 import org.openecomp.sdc.datatypes.error.ErrorMessage;
80 import org.openecomp.sdc.tosca.csar.ManifestTokenType;
81 import org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding.OnboardingPackageContentHandler;
82 import org.openecomp.sdc.vendorsoftwareproduct.security.SecurityManager;
83 import org.openecomp.sdc.vendorsoftwareproduct.security.SecurityManagerException;
85 class SOL004MetaDirectoryValidatorTest {
87 protected SOL004MetaDirectoryValidator sol004MetaDirectoryValidator;
88 protected OnboardingPackageContentHandler handler;
89 protected StringBuilder metaFileBuilder;
93 sol004MetaDirectoryValidator = getSOL004MetaDirectoryValidator();
94 handler = new OnboardingPackageContentHandler();
95 metaFileBuilder = getMetaFileBuilder();
98 protected SOL004MetaDirectoryValidator getSOL004MetaDirectoryValidator() {
99 return new SOL004MetaDirectoryValidator();
102 protected SOL004MetaDirectoryValidator getSol004WithSecurity(SecurityManager securityManagerMock) {
103 return new SOL004MetaDirectoryValidator(securityManagerMock);
106 protected StringBuilder getMetaFileBuilder() {
107 return new StringBuilder()
108 .append(TOSCA_META_FILE_VERSION_ENTRY.getName())
109 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" 1.0").append("\n")
110 .append(CSAR_VERSION_ENTRY.getName())
111 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" 1.1").append("\n")
112 .append(CREATED_BY_ENTRY.getName())
113 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" Vendor").append("\n")
114 .append(ENTRY_DEFINITIONS.getName())
115 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(TOSCA_DEFINITION_FILEPATH).append("\n")
116 .append(ETSI_ENTRY_MANIFEST.getName())
117 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(TOSCA_MANIFEST_FILEPATH).append("\n")
118 .append(ETSI_ENTRY_CHANGE_LOG.getName())
119 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(TOSCA_CHANGELOG_FILEPATH).append("\n");
122 protected ManifestBuilder getPnfManifestSampleBuilder() {
123 return new ManifestBuilder()
124 .withMetaData(PNFD_NAME.getToken(), "myPnf")
125 .withMetaData(ManifestTokenType.PNFD_PROVIDER.getToken(), "ACME")
126 .withMetaData(PNFD_ARCHIVE_VERSION.getToken(), "1.0")
127 .withMetaData(PNFD_RELEASE_DATE_TIME.getToken(), "2019-03-11T11:25:00+00:00");
130 protected ManifestBuilder getVnfManifestSampleBuilder() {
131 return new ManifestBuilder()
132 .withMetaData(ManifestTokenType.VNF_PRODUCT_NAME.getToken(), "RadioNode")
133 .withMetaData(ManifestTokenType.VNF_PROVIDER_ID.getToken(), "ACME")
134 .withMetaData(ManifestTokenType.VNF_PACKAGE_VERSION.getToken(), "1.0")
135 .withMetaData(ManifestTokenType.VNF_RELEASE_DATE_TIME.getToken(), "2019-03-11T11:25:00+00:00");
139 * ETSI Version 2.7.1 below contains one Definition File reference
140 * ETSI Version 2.7.1 onwards contains two possible Definition File reference
142 protected int getManifestDefinitionErrorCount() {
147 void testGivenTOSCAMetaFile_whenEntryHasNoValue_thenErrorIsReturned() {
148 final String metaFileWithInvalidEntry = "TOSCA-Meta-File-Version: \n" +
149 "Entry-Definitions: " + TOSCA_DEFINITION_FILEPATH;
151 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileWithInvalidEntry.getBytes(StandardCharsets.UTF_8));
152 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
154 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
155 assertExpectedErrors("TOSCA Meta file with no entries", validationResult.getErrors(), 1);
159 void testGivenTOSCAMeta_withAllSupportedEntries_thenNoErrorsReturned() {
161 final String entryTestFilePath = "Files/Tests";
162 final String entryLicenseFilePath = "Files/Licenses";
164 handler.addFolder("Files/Tests/");
165 handler.addFolder("Files/Licenses/");
167 .append(ETSI_ENTRY_TESTS.getName())
168 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(entryTestFilePath).append("\n")
169 .append(ETSI_ENTRY_LICENSES.getName())
170 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(entryLicenseFilePath).append("\n");
172 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
173 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
174 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
176 handler.addFile(SAMPLE_SOURCE, "".getBytes());
177 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
178 handler.addFile(entryTestFilePath, "".getBytes());
179 handler.addFile(entryLicenseFilePath, "".getBytes());
181 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder()
182 .withSource(TOSCA_META_PATH_FILE_NAME)
183 .withSource(TOSCA_DEFINITION_FILEPATH)
184 .withSource(TOSCA_CHANGELOG_FILEPATH)
185 .withSource(TOSCA_MANIFEST_FILEPATH).withSource(SAMPLE_SOURCE)
186 .withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH)
187 .withSource(entryTestFilePath)
188 .withSource(entryLicenseFilePath);
190 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
192 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
194 assertTrue(validationResult.getErrors().isEmpty());
198 void testGivenTOSCAMeta_withUnsupportedEntry_thenNoErrorIsReturned() {
200 .append("a-unknown-entry")
201 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ")
202 .append("Definitions/events.log");
204 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
205 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
206 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
207 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder()
208 .withSource(TOSCA_META_PATH_FILE_NAME)
209 .withSource(TOSCA_DEFINITION_FILEPATH)
210 .withSource(TOSCA_CHANGELOG_FILEPATH)
211 .withSource(TOSCA_MANIFEST_FILEPATH);
213 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
214 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
215 assertThat("Validation should produce no errors", validationResult.getErrors(), is(empty()));
219 * Tests if the meta file contains invalid versions in TOSCA-Meta-File-Version and CSAR-Version attributes.
222 void testGivenTOSCAMetaFile_withInvalidTOSCAMetaFileVersionAndCSARVersion_thenErrorIsReturned() {
223 final StringBuilder metaFileBuilder = new StringBuilder()
224 .append(TOSCA_META_FILE_VERSION_ENTRY.getName())
225 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(Integer.MAX_VALUE).append("\n")
226 .append(CSAR_VERSION_ENTRY.getName())
227 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(Integer.MAX_VALUE).append("\n")
228 .append(CREATED_BY_ENTRY.getName())
229 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" Vendor").append("\n")
230 .append(ENTRY_DEFINITIONS.getName())
231 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(TOSCA_DEFINITION_FILEPATH).append("\n")
232 .append(ETSI_ENTRY_MANIFEST.getName())
233 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(TOSCA_MANIFEST_FILEPATH).append("\n")
234 .append(ETSI_ENTRY_CHANGE_LOG.getName())
235 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(TOSCA_CHANGELOG_FILEPATH);
236 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
238 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
239 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
241 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
242 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
244 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
245 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
247 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
248 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
250 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
251 assertExpectedErrors("Invalid TOSCA-Meta-File-Version and CSAR-Version attributes", validationResult.getErrors(), 2);
255 void testGivenTOSCAMetaFile_withNonExistentFileReferenced_thenErrorsReturned() {
256 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
258 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
259 final List<ErrorMessage> errors = validationResult.getErrors();
260 assertThat("Total of errors messages should be as expected", errors.size(), is((2 + getManifestDefinitionErrorCount())));
265 void testGivenDefinitionFile_whenValidImportStatementExist_thenNoErrorsReturned() {
266 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
268 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
269 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
271 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
272 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
274 handler.addFile(SAMPLE_SOURCE, "".getBytes());
275 manifestBuilder.withSource(SAMPLE_SOURCE);
277 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml",
278 getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
279 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml");
281 final String definitionFileWithValidImports = "validation.files/definition/definitionFileWithValidImports.yaml";
282 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(definitionFileWithValidImports));
283 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
285 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
286 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
288 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
289 assertEquals(0, validationResult.getErrors().size());
293 void testGivenDefinitionFile_whenMultipleDefinitionsImportStatementExist_thenNoErrorsReturned() {
294 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
296 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
297 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
299 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
300 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
302 handler.addFile(SAMPLE_SOURCE, "".getBytes());
303 manifestBuilder.withSource(SAMPLE_SOURCE);
305 final byte[] sampleDefinitionFile1 =
306 getResourceBytesOrFail("validation.files/definition/sampleDefinitionFile1.yaml");
307 handler.addFile(TOSCA_DEFINITION_FILEPATH, sampleDefinitionFile1);
308 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
310 final byte[] sampleDefinitionFile2 =
311 getResourceBytesOrFail("validation.files/definition/sampleDefinitionFile2.yaml");
312 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml", sampleDefinitionFile2);
313 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml");
315 final byte[] sampleDefinitionFile3 =
316 getResourceBytesOrFail("validation.files/definition/sampleDefinitionFile1.yaml");
317 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml", sampleDefinitionFile3);
318 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml");
320 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
321 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
323 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
324 assertTrue(validationResult.isValid());
325 assertTrue(validationResult.getErrors().isEmpty());
329 void testGivenDefinitionFile_whenInvalidImportStatementExist_thenErrorIsReturned() {
330 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
332 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
333 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
335 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
336 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
338 handler.addFile(SAMPLE_SOURCE, "".getBytes());
339 manifestBuilder.withSource(SAMPLE_SOURCE);
341 final String definitionFileWithInvalidImports =
342 "validation.files/definition/definitionFileWithInvalidImport.yaml";
343 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(definitionFileWithInvalidImports));
344 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
346 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
347 String manifest = manifestBuilder.build();
348 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifest.getBytes(StandardCharsets.UTF_8));
350 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
351 assertExpectedErrors("", validationResult.getErrors(), getManifestDefinitionErrorCount());
355 * Manifest referenced import file missing
358 void testGivenDefinitionFile_whenReferencedImportDoesNotExist_thenErrorIsReturned() {
359 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
361 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
362 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
364 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
365 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
367 handler.addFile(SAMPLE_SOURCE, "".getBytes());
368 manifestBuilder.withSource(SAMPLE_SOURCE);
370 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml", "".getBytes());
371 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_1_types.yaml");
373 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
374 handler.addFile(TOSCA_DEFINITION_FILEPATH,
375 getResourceBytesOrFail("validation.files/definition/sampleDefinitionFile2.yaml"));
377 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
378 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
380 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
381 assertExpectedErrors("Manifest referenced import file missing", validationResult.getErrors(), getManifestDefinitionErrorCount());
385 void testGivenDefinitionFile_whenFileInPackageNotInManifest_thenErrorIsReturned() {
386 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
388 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
389 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
391 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
392 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
394 handler.addFile(SAMPLE_SOURCE, "".getBytes());
396 final byte[] sampleDefinitionFile =
397 getResourceBytesOrFail("validation.files/definition/sampleDefinitionFile2.yaml");
398 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml", sampleDefinitionFile);
399 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml");
401 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
402 handler.addFile(TOSCA_DEFINITION_FILEPATH,
403 getResourceBytesOrFail("validation.files/definition/sampleDefinitionFile2.yaml"));
405 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
407 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
408 assertExpectedErrors("Artifact is not being referenced in manifest file", validationResult.getErrors(), 1);
412 void testGivenDefinitionFile_whenManifestNotreferencedInManifest_thenNoErrorIsReturned() {
413 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
415 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
416 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
418 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
419 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
421 handler.addFile(SAMPLE_SOURCE, "".getBytes());
422 manifestBuilder.withSource(SAMPLE_SOURCE);
424 final byte[] sampleDefinitionFile =
425 getResourceBytesOrFail("validation.files/definition/sampleDefinitionFile2.yaml");
426 handler.addFile("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml", sampleDefinitionFile);
427 manifestBuilder.withSource("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml");
429 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
430 handler.addFile(TOSCA_DEFINITION_FILEPATH,
431 getResourceBytesOrFail("validation.files/definition/sampleDefinitionFile2.yaml"));
433 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
435 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
436 assertTrue(validationResult.isValid());
437 assertTrue(validationResult.getErrors().isEmpty());
441 * Reference with invalid YAML format.
444 void testGivenDefinitionFile_withInvalidYAML_thenErrorIsReturned() {
445 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
447 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
448 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
450 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
451 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
453 handler.addFile(SAMPLE_SOURCE, "".getBytes());
454 manifestBuilder.withSource(SAMPLE_SOURCE);
456 final String definitionFileWithInvalidYAML = "validation.files/definition/invalidDefinitionFile.yaml";
457 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(definitionFileWithInvalidYAML));
458 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
460 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
461 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
463 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
464 assertExpectedErrors("Reference with invalid YAML format", validationResult.getErrors(), getManifestDefinitionErrorCount());
468 void testGivenManifestFile_withValidSourceAndNonManoSources_thenNoErrorIsReturned() throws IOException {
469 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
471 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
472 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
474 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
475 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
477 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
478 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
480 handler.addFile(SAMPLE_SOURCE, "".getBytes());
481 manifestBuilder.withSource(SAMPLE_SOURCE);
483 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
484 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
486 final String nonManoSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml";
487 handler.addFile(nonManoSource, getResourceBytesOrFail("validation.files/measurements/pmEvents-valid.yaml"));
488 manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoSource);
490 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
491 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
493 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
494 assertTrue(validationResult.isValid());
495 assertTrue(validationResult.getErrors().isEmpty());
499 * Manifest with non existent source files should return error.
502 void testGivenManifestFile_withNonExistentSourceFile_thenErrorIsReturned() throws IOException {
503 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
504 //non existent reference
505 manifestBuilder.withSource("Artifacts/Deployment/Events/RadioNode_pnf_v1.yaml");
507 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
508 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
510 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
511 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
513 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
514 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
516 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
517 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
519 String nonManoSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml";
520 handler.addFile(nonManoSource, getResourceBytesOrFail("validation.files/measurements/pmEvents-valid.yaml"));
521 manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoSource);
523 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
524 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
526 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
527 assertExpectedErrors("Manifest with non existent source files", validationResult.getErrors(), 1);
531 * Tests the validation for a TOSCA Manifest with invalid data.
534 void testGivenManifestFile_withInvalidData_thenErrorIsReturned() {
535 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
536 handler.addFile(TOSCA_MANIFEST_FILEPATH, getResourceBytesOrFail("validation.files/manifest/invalidManifest.mf"));
537 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
538 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
539 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
541 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
542 assertExpectedErrors("TOSCA manifest with invalid data", validationResult.getErrors(), 1);
546 void testGivenManifestAndDefinitionFile_withSameNames_thenNoErrorReturned() {
547 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
549 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
550 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
552 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
553 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
555 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
556 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
558 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
559 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
561 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
562 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
564 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
565 assertTrue(validationResult.isValid());
566 assertTrue(validationResult.getErrors().isEmpty());
570 * Main TOSCA definitions file and Manifest file with different name should return error.
573 void testGivenManifestAndMainDefinitionFile_withDifferentNames_thenErrorIsReturned() {
574 metaFileBuilder = new StringBuilder()
575 .append(TOSCA_META_FILE_VERSION_ENTRY.getName())
576 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" 1.0").append("\n")
577 .append(CSAR_VERSION_ENTRY.getName())
578 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" 1.1").append("\n")
579 .append(CREATED_BY_ENTRY.getName())
580 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" Vendor").append("\n")
581 .append(ENTRY_DEFINITIONS.getName())
582 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(TOSCA_DEFINITION_FILEPATH).append("\n")
583 .append(ETSI_ENTRY_MANIFEST.getName())
584 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" Definitions/MainServiceTemplate2.mf\n")
585 .append(ETSI_ENTRY_CHANGE_LOG.getName())
586 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(TOSCA_CHANGELOG_FILEPATH).append("\n");
588 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
590 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
591 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
593 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
594 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
596 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
597 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
599 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
600 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
602 manifestBuilder.withSource("Definitions/MainServiceTemplate2.mf");
603 handler.addFile("Definitions/MainServiceTemplate2.mf", manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
605 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
606 assertExpectedErrors("Main TOSCA definitions file and Manifest file with different name should return error",
607 validationResult.getErrors(), 1);
611 void testGivenManifestFile_withDifferentExtension_thenErrorIsReturned() {
612 metaFileBuilder = new StringBuilder()
613 .append(TOSCA_META_FILE_VERSION_ENTRY.getName())
614 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" 1.0").append("\n")
615 .append(CSAR_VERSION_ENTRY.getName())
616 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" 1.1").append("\n")
617 .append(CREATED_BY_ENTRY.getName())
618 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" Vendor").append("\n")
619 .append(ENTRY_DEFINITIONS.getName())
620 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(TOSCA_DEFINITION_FILEPATH).append("\n")
621 .append(ETSI_ENTRY_MANIFEST.getName())
622 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" Definitions/MainServiceTemplate.txt\n")
623 .append(ETSI_ENTRY_CHANGE_LOG.getName())
624 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(TOSCA_CHANGELOG_FILEPATH).append("\n");
626 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
628 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
629 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
631 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
632 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
634 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
635 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
637 handler.addFile(SAMPLE_DEFINITION_IMPORT_FILE_PATH, "".getBytes());
638 manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH);
640 manifestBuilder.withSource("Definitions/MainServiceTemplate.txt");
641 handler.addFile("Definitions/MainServiceTemplate.txt", manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
643 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
644 assertExpectedErrors("Manifest file with different extension than .mf should return error",
645 validationResult.getErrors(), 1);
649 void testGivenManifestFile_withValidVnfMetadata_thenNoErrorsReturned() {
650 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
652 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
653 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
654 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
655 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
656 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
657 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
659 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
660 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
662 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
663 assertTrue(validationResult.isValid(), "Manifest with valid vnf mandatory values should be valid");
664 assertExpectedErrors("Manifest with valid vnf mandatory values should not return any errors", validationResult.getErrors(), 0);
668 void testGivenManifestFile_withValidPnfMetadata_thenNoErrorsReturned() {
669 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
671 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
672 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
674 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
675 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
677 manifestBuilder.withSignedSource(TOSCA_DEFINITION_FILEPATH
678 , "SHA-abc", "09e5a788acb180162c51679ae4c998039fa6644505db2415e35107d1ee213943");
679 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
681 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
682 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
684 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
685 assertExpectedErrors("Manifest with valid pnf mandatory values should not return any errors", validationResult.getErrors(), 0);
689 * Manifest with mixed metadata should return error.
692 void testGivenManifestFile_withMetadataContainingMixedPnfVnfMetadata_thenErrorIsReturned() {
693 final ManifestBuilder manifestBuilder = new ManifestBuilder()
694 .withMetaData(PNFD_NAME.getToken(), "RadioNode")
695 .withMetaData(VNF_PROVIDER_ID.getToken(), "Bilal Iqbal")
696 .withMetaData(PNFD_ARCHIVE_VERSION.getToken(), "1.0")
697 .withMetaData(VNF_RELEASE_DATE_TIME.getToken(), "2019-12-14T11:25:00+00:00");
699 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
700 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
701 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
702 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
703 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
704 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
706 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
707 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
709 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
710 assertExpectedErrors("Manifest with mixed metadata should return error", validationResult.getErrors(), 1);
715 void testGivenManifestFile_withMetadataMissingPnfOrVnfMandatoryEntries_thenErrorIsReturned() {
716 final ManifestBuilder manifestBuilder = new ManifestBuilder()
717 .withMetaData("invalid_product_name", "RadioNode")
718 .withMetaData("invalid_provider_id", "Bilal Iqbal")
719 .withMetaData("invalid_package_version", "1.0")
720 .withMetaData("invalid_release_date_time", "2019-12-14T11:25:00+00:00");
722 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
723 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
725 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
726 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
728 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
729 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
731 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
732 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
734 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
735 assertExpectedErrors("Manifest with missing vnf or pnf mandatory entries should return error", validationResult.getErrors(), 1);
739 void testGivenManifestFile_withMetadataMissingMandatoryPnfEntries_thenErrorIsReturned() {
740 final ManifestBuilder manifestBuilder = new ManifestBuilder();
742 manifestBuilder.withMetaData(PNFD_NAME.getToken(), "RadioNode");
743 manifestBuilder.withMetaData(PNFD_RELEASE_DATE_TIME.getToken(), "2019-12-14T11:25:00+00:00");
745 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
746 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
748 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
749 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
751 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
752 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
754 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
755 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
757 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
759 assertExpectedErrors("Manifest with metadata missing pnf mandatory entries should return error", validationResult.getErrors(), 1);
763 void testGivenManifestFile_withMetadataMissingMandatoryVnfEntries_thenErrorIsReturned() {
764 final ManifestBuilder manifestBuilder = new ManifestBuilder();
766 manifestBuilder.withMetaData(VNF_PRODUCT_NAME.getToken(), "RadioNode");
768 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
769 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
771 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
772 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
774 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
775 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
777 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
778 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
780 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
782 assertExpectedErrors("Manifest with metadata missing vnf mandatory entries should return error", validationResult.getErrors(), 1);
787 * Manifest with more than 4 metadata entries should return error.
790 void testGivenManifestFile_withMetadataEntriesExceedingTheLimit_thenErrorIsReturned() {
791 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder()
792 .withMetaData(PNFD_NAME.getToken(), "RadioNode")
793 .withMetaData(ManifestTokenType.PNFD_PROVIDER.getToken(), "Bilal Iqbal")
794 .withMetaData(PNFD_ARCHIVE_VERSION.getToken(), "1.0")
795 .withMetaData(PNFD_RELEASE_DATE_TIME.getToken(), "2019-03-11T11:25:00+00:00");
797 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
798 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
800 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
801 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
803 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
804 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
806 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
807 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
809 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
810 assertExpectedErrors("Manifest with more than 4 metadata entries should return error", validationResult.getErrors(), 1);
814 void testGivenManifestFile_withPnfMetadataAndVfEntries_thenErrorIsReturned() {
815 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
817 .append(ETSI_ENTRY_TESTS.getName())
818 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" Files/Tests").append("\n")
819 .append(ETSI_ENTRY_LICENSES.getName())
820 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" Files/Licenses");
822 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
823 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
825 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes());
826 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
828 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
829 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
831 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
832 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
834 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
835 assertExpectedErrors("Tosca.meta should not have entries applicable only to VF", validationResult.getErrors(), 2);
840 * Tests an imported descriptor with a missing imported file.
843 void testGivenDefinitionFileWithImportedDescriptor_whenImportedDescriptorImportsMissingFile_thenMissingImportErrorOccur() {
844 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
846 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
847 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
849 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
850 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
852 handler.addFile(SAMPLE_SOURCE, "".getBytes());
853 manifestBuilder.withSource(SAMPLE_SOURCE);
855 final String definitionImportOne = "Definitions/importOne.yaml";
856 handler.addFile(definitionImportOne,
857 getResourceBytesOrFail("validation.files/definition/sampleDefinitionFile2.yaml"));
858 manifestBuilder.withSource(definitionImportOne);
860 final String definitionFileWithValidImports = "validation.files/definition/definitionFileWithOneImport.yaml";
861 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(definitionFileWithValidImports));
862 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
864 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
865 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
867 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
869 final List<ErrorMessage> expectedErrorList = new ArrayList<>();
870 for (int i =0;i < getManifestDefinitionErrorCount();i++)
871 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
872 , Messages.MISSING_IMPORT_FILE.formatMessage("Definitions/etsi_nfv_sol001_pnfd_2_5_2_types.yaml"))
875 assertExpectedErrors(validationResult.getErrors(), expectedErrorList);
879 * Tests an imported descriptor with invalid import statement.
882 void testGivenDefinitionFileWithImportedDescriptor_whenInvalidImportStatementExistInImportedDescriptor_thenInvalidImportErrorOccur() {
883 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
885 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
886 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
888 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
889 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
891 handler.addFile(SAMPLE_SOURCE, "".getBytes());
892 manifestBuilder.withSource(SAMPLE_SOURCE);
894 final String definitionImportOne = "Definitions/importOne.yaml";
895 handler.addFile(definitionImportOne,
896 getResourceBytesOrFail("validation.files/definition/definitionFileWithInvalidImport.yaml"));
897 manifestBuilder.withSource(definitionImportOne);
899 final String definitionFileWithValidImports = "validation.files/definition/definitionFileWithOneImport.yaml";
900 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(definitionFileWithValidImports));
901 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
903 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
904 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
906 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
908 final List<ErrorMessage> expectedErrorList = new ArrayList<>();
909 for (int i =0;i < getManifestDefinitionErrorCount();i++)
910 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
911 , Messages.INVALID_IMPORT_STATEMENT.formatMessage(definitionImportOne, "null"))
914 assertExpectedErrors(validationResult.getErrors(), expectedErrorList);
918 void givenManifestWithNonManoPmAndVesArtifacts_whenNonManoArtifactsAreValid_thenNoErrorsOccur() {
919 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
921 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
922 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
924 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
925 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
927 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
928 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
930 final String nonManoPmEventsSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml";
931 handler.addFile(nonManoPmEventsSource,
932 getResourceBytesOrFail("validation.files/measurements/pmEvents-valid.yaml"));
933 manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoPmEventsSource);
935 final String nonManoVesEventsSource = "Artifacts/Deployment/Events/ves_events.yaml";
936 handler.addFile(nonManoVesEventsSource,
937 getResourceBytesOrFail("validation.files/events/vesEvents-valid.yaml"));
938 manifestBuilder.withNonManoArtifact(ONAP_VES_EVENTS.getType(), nonManoVesEventsSource);
940 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
941 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
943 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
945 assertExpectedErrors(validationResult.getErrors(), Collections.emptyList());
949 void givenManifestWithNonManoPmOrVesArtifacts_whenNonManoArtifactsYamlAreInvalid_thenInvalidYamlErrorOccur() {
950 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
952 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
953 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
955 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
956 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
958 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
959 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
961 final String nonManoPmEventsSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml";
962 handler.addFile(nonManoPmEventsSource, getResourceBytesOrFail(INVALID_YAML_FILE_PATH));
963 manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoPmEventsSource);
965 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
966 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
968 final List<ErrorMessage> expectedErrorList = new ArrayList<>();
969 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
970 , Messages.INVALID_YAML_FORMAT_1.formatMessage(nonManoPmEventsSource, "while scanning a simple key in 'reader', line 2, column 1: key {} ^could not find expected ':' in 'reader', line 2, column 7: key {} ^"))
972 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR, "while scanning a simple key in 'reader', line 2, column 1: key {} ^could not find expected ':' in 'reader', line 2, column 7: key {} ^")
975 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
976 assertExpectedErrors(validationResult.getErrors(), expectedErrorList);
980 void givenManifestWithNonManoPmOrVesArtifacts_whenNonManoArtifactsYamlAreEmpty_thenEmptyYamlErrorOccur() {
981 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
983 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
984 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
986 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
987 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
989 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
990 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
992 final String nonManoPmEventsSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml";
993 handler.addFile(nonManoPmEventsSource, getResourceBytesOrFail(EMPTY_YAML_FILE_PATH));
994 manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoPmEventsSource);
996 final String nonManoVesEventsSource = "Artifacts/Deployment/Events/ves_events.yaml";
997 handler.addFile(nonManoVesEventsSource, getResourceBytesOrFail(EMPTY_YAML_FILE_PATH));
998 manifestBuilder.withNonManoArtifact(ONAP_VES_EVENTS.getType(), nonManoVesEventsSource);
1000 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
1001 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
1003 final List<ErrorMessage> expectedErrorList = new ArrayList<>();
1004 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
1005 , Messages.EMPTY_YAML_FILE_1.formatMessage(nonManoPmEventsSource))
1007 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
1008 , Messages.EMPTY_YAML_FILE_1.formatMessage(nonManoVesEventsSource))
1010 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
1011 , "PM_Dictionary YAML file is empty")
1014 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
1015 assertExpectedErrors(validationResult.getErrors(), expectedErrorList);
1019 void givenManifestWithNonManoPmOrVesArtifacts_whenNonManoArtifactsHaveNotYamlExtension_thenInvalidYamlExtensionErrorOccur() {
1020 final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder();
1022 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
1023 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
1025 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
1026 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
1028 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
1029 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
1031 final String nonManoPmEventsSource = "Artifacts/Deployment/Measurements/PM_Dictionary.y1";
1032 handler.addFile(nonManoPmEventsSource, "".getBytes());
1033 manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoPmEventsSource);
1035 final String nonManoVesEventsSource = "Artifacts/Deployment/Events/ves_events.y2";
1036 handler.addFile(nonManoVesEventsSource, "".getBytes());
1037 manifestBuilder.withNonManoArtifact(ONAP_VES_EVENTS.getType(), nonManoVesEventsSource);
1039 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
1040 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
1042 final List<ErrorMessage> expectedErrorList = new ArrayList<>();
1043 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
1044 , Messages.INVALID_YAML_EXTENSION.formatMessage(nonManoPmEventsSource))
1046 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
1047 , Messages.INVALID_YAML_EXTENSION.formatMessage(nonManoVesEventsSource))
1049 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
1050 , "PM_Dictionary YAML file is empty")
1054 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
1056 assertExpectedErrors(validationResult.getErrors(), expectedErrorList);
1060 void givenPackageWithValidSoftwareInformationNonMano_whenThePackageIsValidated_thenNoErrorsAreReturned() {
1061 //given a package with software information non-mano artifact
1062 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
1063 final String nonManoSoftwareInformationPath = "Artifacts/software-information/pnf-sw-information-valid.yaml";
1064 handler.addFile(nonManoSoftwareInformationPath,
1065 getResourceBytesOrFail("validation.files/non-mano/pnf-sw-information-valid.yaml"));
1066 manifestBuilder.withNonManoArtifact(ONAP_SW_INFORMATION.getType(), nonManoSoftwareInformationPath);
1067 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString()
1068 .getBytes(StandardCharsets.UTF_8));
1069 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
1070 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
1071 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
1072 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
1073 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
1075 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
1076 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
1077 //when package is validated
1078 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
1080 assertExpectedErrors(validationResult.getErrors(), Collections.emptyList());
1084 void givenPackageWithUnparsableSwInformationNonMano_whenThePackageIsValidated_thenInvalidErrorIsReturned() {
1085 //given a package with unparsable software information non-mano artifact
1086 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
1087 final String nonManoSoftwareInformationPath = "Artifacts/software-information/pnf-sw-information-valid.yaml";
1088 handler.addFile(nonManoSoftwareInformationPath,
1089 getResourceBytesOrFail("validation.files/invalid.yaml"));
1090 manifestBuilder.withNonManoArtifact(ONAP_SW_INFORMATION.getType(), nonManoSoftwareInformationPath);
1091 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString()
1092 .getBytes(StandardCharsets.UTF_8));
1093 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
1094 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
1095 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
1096 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
1097 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
1099 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
1100 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
1101 //when package is validated
1102 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
1103 //then invalid error returned
1104 final List<ErrorMessage> expectedErrorList = new ArrayList<>();
1105 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
1106 , Messages.INVALID_SW_INFORMATION_NON_MANO_ERROR.formatMessage(nonManoSoftwareInformationPath))
1108 assertExpectedErrors(validationResult.getErrors(), expectedErrorList);
1112 void givenPackageWithIncorrectSwInformationNonMano_whenThePackageIsValidated_thenInvalidErrorIsReturned() {
1113 //given a package with incorrect software information non-mano artifact
1114 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
1115 final String nonManoSoftwareInformationPath = "Artifacts/software-information/pnf-sw-information-invalid.yaml";
1116 handler.addFile(nonManoSoftwareInformationPath,
1117 getResourceBytesOrFail("validation.files/non-mano/pnf-sw-information-invalid.yaml"));
1118 manifestBuilder.withNonManoArtifact(ONAP_SW_INFORMATION.getType(), nonManoSoftwareInformationPath);
1119 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString()
1120 .getBytes(StandardCharsets.UTF_8));
1121 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
1122 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
1123 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
1124 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
1125 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
1127 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
1128 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
1129 //when package is validated
1130 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
1131 //then incorrect error returned
1132 final List<ErrorMessage> expectedErrorList = new ArrayList<>();
1133 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
1134 , Messages.INCORRECT_SW_INFORMATION_NON_MANO_ERROR.formatMessage(nonManoSoftwareInformationPath))
1136 assertExpectedErrors(validationResult.getErrors(), expectedErrorList);
1140 void givenPackageWithTwoSoftwareInformationNonMano_whenThePackageIsValidated_thenUniqueErrorIsReturned() {
1141 //given a package with two software information non-mano artifacts
1142 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
1143 final String nonManoSoftwareInformation1Path = "Artifacts/software-information/pnf-sw-information-valid1.yaml";
1144 handler.addFile(nonManoSoftwareInformation1Path,
1145 getResourceBytesOrFail("validation.files/non-mano/pnf-sw-information-valid.yaml"));
1146 manifestBuilder.withNonManoArtifact(ONAP_SW_INFORMATION.getType(), nonManoSoftwareInformation1Path);
1147 final String nonManoSoftwareInformation2Path = "Artifacts/software-information/pnf-sw-information-valid2.yaml";
1148 handler.addFile(nonManoSoftwareInformation2Path,
1149 getResourceBytesOrFail("validation.files/non-mano/pnf-sw-information-valid.yaml"));
1150 manifestBuilder.withNonManoArtifact(ONAP_SW_INFORMATION.getType(), nonManoSoftwareInformation2Path);
1151 handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFileBuilder.toString()
1152 .getBytes(StandardCharsets.UTF_8));
1153 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
1154 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
1155 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
1156 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
1157 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
1159 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
1160 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
1161 //when package is validated
1162 final ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
1163 //then unique error returned
1164 final List<ErrorMessage> expectedErrorList = new ArrayList<>();
1165 final String errorFiles = Stream.of(nonManoSoftwareInformation1Path, nonManoSoftwareInformation2Path)
1166 .map(s -> String.format("'%s'", s))
1167 .collect(Collectors.joining(", "));
1168 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
1169 , Messages.UNIQUE_SW_INFORMATION_NON_MANO_ERROR.formatMessage(errorFiles))
1171 assertExpectedErrors(validationResult.getErrors(), expectedErrorList);
1175 void signedPackage() throws SecurityManagerException {
1177 final ManifestBuilder manifestBuilder = getPnfManifestSampleBuilder();
1178 final String fakeArtifactPath = "Artifacts/aArtifact.yaml";
1179 final String fakeArtifactCmsPath = "Artifacts/aArtifact.cms";
1180 final String fakeCertificatePath = "certificate.cert";
1181 handler.addFile(fakeArtifactPath, new byte[0]);
1182 manifestBuilder.withSource(fakeArtifactPath);
1183 handler.addFile(fakeArtifactCmsPath, new byte[0]);
1184 manifestBuilder.withSource(fakeArtifactCmsPath);
1185 handler.addFile(fakeCertificatePath, new byte[0]);
1186 manifestBuilder.withSource(fakeCertificatePath);
1187 handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8));
1188 manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH);
1189 handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytesOrFail(SAMPLE_DEFINITION_FILE_PATH));
1190 manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH);
1192 metaFileBuilder.append(ETSI_ENTRY_CERTIFICATE.getName())
1193 .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" ").append(fakeCertificatePath).append("\n");
1194 handler.addFile(TOSCA_META_PATH_FILE_NAME,
1195 metaFileBuilder.toString().getBytes(StandardCharsets.UTF_8));
1196 manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME);
1198 manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH);
1199 handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8));
1201 final SecurityManager securityManagerMock = mock(SecurityManager.class);
1202 when(securityManagerMock.verifySignedData(any(), any(), any())).thenReturn(true);
1203 sol004MetaDirectoryValidator = getSol004WithSecurity(securityManagerMock);
1206 ValidationResult validationResult = sol004MetaDirectoryValidator.validate(handler);
1208 assertExpectedErrors(validationResult.getErrors(), Collections.emptyList());
1211 sol004MetaDirectoryValidator = getSol004WithSecurity(securityManagerMock);
1212 when(securityManagerMock.verifySignedData(any(), any(), any())).thenReturn(false);
1215 validationResult = sol004MetaDirectoryValidator.validate(handler);
1218 List<ErrorMessage> expectedErrorList = new ArrayList<>();
1219 expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR
1220 , Messages.ARTIFACT_INVALID_SIGNATURE.formatMessage(fakeArtifactCmsPath, fakeArtifactPath))
1222 assertExpectedErrors(validationResult.getErrors(), expectedErrorList);
1225 sol004MetaDirectoryValidator = getSol004WithSecurity(securityManagerMock);
1226 when(securityManagerMock.verifySignedData(any(), any(), any()))
1227 .thenThrow(new SecurityManagerException("SecurityManagerException"));
1229 validationResult = sol004MetaDirectoryValidator.validate(handler);
1232 expectedErrorList = new ArrayList<>();
1233 expectedErrorList.add(
1234 new ErrorMessage(ErrorLevel.ERROR,
1235 Messages.ARTIFACT_SIGNATURE_VALIDATION_ERROR.formatMessage(fakeArtifactCmsPath,
1236 fakeArtifactPath, fakeCertificatePath, "SecurityManagerException")
1239 assertExpectedErrors(validationResult.getErrors(), expectedErrorList);
1242 protected void assertExpectedErrors(final String testCase, final Map<String, List<ErrorMessage>> errors, final int expectedErrors){
1243 assertExpectedErrors(testCase, errors.get(SdcCommon.UPLOAD_FILE), expectedErrors);
1246 protected void assertExpectedErrors(final String testCase, final List<ErrorMessage> errorMessages, final int expectedErrors){
1247 printErrorMessages(errorMessages);
1248 if (expectedErrors > 0) {
1249 assertEquals(expectedErrors, errorMessages.size(), testCase);
1251 assertTrue(errorMessages.isEmpty(), testCase);
1255 private void printErrorMessages(final List<ErrorMessage> errorMessages) {
1256 if (CollectionUtils.isNotEmpty(errorMessages)) {
1257 errorMessages.forEach(errorMessage ->
1258 System.out.printf("%s: %s%n", errorMessage.getLevel(), errorMessage.getMessage())
1263 private void assertExpectedErrors(List<ErrorMessage> actualErrorList, final List<ErrorMessage> expectedErrorList) {
1264 if (actualErrorList == null) {
1265 actualErrorList = new ArrayList<>();
1268 printErrorMessages(actualErrorList);
1270 assertThat("The actual error list should have the same size as the expected error list"
1271 , actualErrorList, hasSize(expectedErrorList.size())
1274 actualErrorList.forEach(error -> {
1275 Predicate<ErrorMessage> matching = e -> e.getLevel() == error.getLevel() && sanitize(e.getMessage()).equalsIgnoreCase(sanitize(error.getMessage()));
1276 assertTrue(expectedErrorList.stream().anyMatch(matching), "The actual error and expected error lists should be the same");
1280 private static String sanitize(String s) {
1281 return s.trim().replaceAll("\n", "").replaceAll("\r", "").replaceAll("\\s{2,}", " ").trim();