From 1b44134b16ac74e8326ba14e1764a9023cc6f0cf Mon Sep 17 00:00:00 2001 From: Maciej Malewski Date: Thu, 10 Dec 2020 14:38:00 +0100 Subject: [PATCH] Integration tests for validating PM_Dictionary. Checking compliance content of the PM_Dictionary file against it's schema. Issue-ID: SDC-3390 Change-Id: I8e20f977c7d6838005bc84fc6c7c8ab197152a53 Signed-off-by: Maciej Malewski --- .../impl/validation/PMDictionaryValidator.java | 2 +- .../impl/validation/PMDictionaryValidatorTest.java | 2 +- integration-tests/pom.xml | 7 ++ .../tests/validation/pmdictionary/CsarLoader.java | 54 +++++++++++++ .../pmdictionary/CsarValidationTest.java | 73 +++++++++++++++++ .../validation/pmdictionary/ZipValidationTest.java | 90 +++++++++++++++++++++ .../invalidPnfCompliantWithSOL004.csar | Bin 0 -> 104109 bytes .../pmdictionary/validPnfCompliantWithSOL004.csar | Bin 0 -> 104106 bytes .../VNFs/validation/pmdictionary/invalidPmDict.zip | Bin 0 -> 3234 bytes .../VNFs/validation/pmdictionary/validPmDict.zip | Bin 0 -> 3233 bytes .../validation/util/ValidationManagerUtilTest.java | 2 +- .../csar/validation/PMDictionaryValidator.java | 9 ++- .../csar/validation/PMDictionaryValidatorTest.java | 4 +- 13 files changed, 237 insertions(+), 6 deletions(-) create mode 100644 integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/CsarLoader.java create mode 100644 integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/CsarValidationTest.java create mode 100644 integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/ZipValidationTest.java create mode 100644 integration-tests/src/test/resources/Files/PNFs/validation/pmdictionary/invalidPnfCompliantWithSOL004.csar create mode 100644 integration-tests/src/test/resources/Files/PNFs/validation/pmdictionary/validPnfCompliantWithSOL004.csar create mode 100644 integration-tests/src/test/resources/Files/VNFs/validation/pmdictionary/invalidPmDict.zip create mode 100644 integration-tests/src/test/resources/Files/VNFs/validation/pmdictionary/validPmDict.zip diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/validation/PMDictionaryValidator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/validation/PMDictionaryValidator.java index 84bebe3bf6..eee84bb14b 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/validation/PMDictionaryValidator.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/validation/PMDictionaryValidator.java @@ -64,7 +64,7 @@ public class PMDictionaryValidator { } private String formatErrorMessage(YamlDocumentValidationError error) { - return String.format("Line number: %d, Path: %s, Message: %s", + return String.format("Document number: %d, Path: %s, Message: %s", error.getYamlDocumentNumber(), error.getPath(), error.getMessage()); diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/validation/PMDictionaryValidatorTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/validation/PMDictionaryValidatorTest.java index 7e62e6dace..67c310e5bf 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/validation/PMDictionaryValidatorTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/validation/PMDictionaryValidatorTest.java @@ -68,7 +68,7 @@ class PMDictionaryValidatorTest { // then assertTrue(errors.isPresent()); - assertThat(errors.get(), is("Line number: 1, Path: /, Message: error")); + assertThat(errors.get(), is("Document number: 1, Path: /, Message: error")); } @Test diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index c990ef2836..76b6b039d4 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -3,6 +3,7 @@ SDC ================================================================================ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. +Modifications copyright (c) 2020 Nokia ================================================================================ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -104,6 +105,12 @@ limitations under the License. ${project.version} test + + org.openecomp.sdc + openecomp-sdc-vendor-software-product-manager + ${project.version} + test + com.aventstack extentreports diff --git a/integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/CsarLoader.java b/integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/CsarLoader.java new file mode 100644 index 0000000000..ca80ecee4c --- /dev/null +++ b/integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/CsarLoader.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.sdc.backend.ci.tests.validation.pmdictionary; + +import org.apache.commons.io.IOUtils; +import org.openecomp.core.utilities.file.FileContentHandler; +import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum; +import org.openecomp.sdc.vendorsoftwareproduct.exception.OnboardPackageException; +import org.openecomp.sdc.vendorsoftwareproduct.types.OnboardPackage; +import org.openecomp.sdc.vendorsoftwareproduct.types.OnboardPackageInfo; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; + +class CsarLoader { + + private CsarLoader() { + } + + static FileContentHandler load(String csarFileName, String csarFilePath) throws IOException, OnboardPackageException { + InputStream inputStream = CsarLoader.class.getResourceAsStream(csarFilePath); + OnboardPackage onboardPackage = getOnboardPackage(csarFileName, inputStream); + return onboardPackage.getFileContentHandler(); + } + + private static OnboardPackage getOnboardPackage(String csarFileName, InputStream inputStream) throws OnboardPackageException, IOException { + OnboardPackageInfo onboardPackageInfo = new OnboardPackageInfo(csarFileName, OnboardingTypesEnum.CSAR.name(), + convertFileInputStream(inputStream), OnboardingTypesEnum.CSAR); + return onboardPackageInfo.getOnboardPackage(); + } + + private static ByteBuffer convertFileInputStream(final InputStream fileInputStream) throws IOException { + byte[] fileContent = IOUtils.toByteArray(fileInputStream); + return ByteBuffer.wrap(fileContent); + } +} diff --git a/integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/CsarValidationTest.java b/integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/CsarValidationTest.java new file mode 100644 index 0000000000..e12e058d6c --- /dev/null +++ b/integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/CsarValidationTest.java @@ -0,0 +1,73 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.sdc.backend.ci.tests.validation.pmdictionary; + +import org.junit.jupiter.api.Test; +import org.openecomp.core.utilities.file.FileContentHandler; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.datatypes.error.ErrorMessage; +import org.openecomp.sdc.vendorsoftwareproduct.exception.OnboardPackageException; +import org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.ValidatorFactory; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +class CsarValidationTest { + + @Test + void shouldNotReturnErrors_whenPnfCsarIsValid() throws OnboardPackageException, IOException { + //given + FileContentHandler pnfFileContent = CsarLoader.load("validPnfCompliantWithSOL004.csar", "/Files/PNFs/validation/pmdictionary/validPnfCompliantWithSOL004.csar"); + + //when + Map> errorsMap = ValidatorFactory.getValidator(pnfFileContent).validateContent(pnfFileContent); + + //then + assertThat(errorsMap, is(anEmptyMap())); + } + + @Test + void shouldReturnError_whenPMDictionaryContentIsNotCompliantWithSchema() throws OnboardPackageException, IOException { + //given + String expectedErrorMessage = "Document number: 1, Path: /pmMetaData/, Message: Key not found: pmHeader"; + FileContentHandler pnfFileContent = CsarLoader.load("invalidPnfCompliantWithSOL004.csar", "/Files/PNFs/validation/pmdictionary/invalidPnfCompliantWithSOL004.csar"); + + //when + Map> errorMap = ValidatorFactory.getValidator(pnfFileContent).validateContent(pnfFileContent); + List errorList = errorMap.get("uploadFile"); + + //then + assertThat(errorList, is(not(empty()))); + assertThat(getActualErrorMessage(errorList), is(equalTo(expectedErrorMessage))); + assertThat(getActualErrorLevel(errorList), is(ErrorLevel.ERROR)); + } + + private String getActualErrorMessage(List errorList) { + return errorList.get(0).getMessage(); + } + + private ErrorLevel getActualErrorLevel(List errorList) { + return errorList.get(0).getLevel(); + } +} diff --git a/integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/ZipValidationTest.java b/integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/ZipValidationTest.java new file mode 100644 index 0000000000..d3287d29b6 --- /dev/null +++ b/integration-tests/src/test/java/org/onap/sdc/backend/ci/tests/validation/pmdictionary/ZipValidationTest.java @@ -0,0 +1,90 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.sdc.backend.ci.tests.validation.pmdictionary; + +import org.junit.jupiter.api.Test; +import org.openecomp.core.utilities.file.FileContentHandler; +import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum; +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.datatypes.error.ErrorMessage; +import org.openecomp.sdc.validation.util.ValidationManagerUtil; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; + +class ZipValidationTest { + + private static final String PM_DICTIONARY_FILE = "pmdict.yaml"; + private static final String ZIPS_PATH = "Files/VNFs/validation/pmdictionary"; + + @Test + void shouldReportOnlyFileNotReferenced_whenValidPmDictionaryZip() throws IOException { + // given + FileContentHandler fileContentHandler = getFileContentHandler("validPmDict.zip"); + + // when + Map> errors = ValidationManagerUtil.initValidationManager(fileContentHandler) + .validate(); + List pmDictValidationErrors = extractPmDictValidationErrors(errors); + + // then + assertThat(pmDictValidationErrors).isEmpty(); + } + + @Test + void shouldReportPmDictionaryErrors_whenInvalidPmDictionaryZip() throws IOException { + // given + FileContentHandler fileContentHandler = getFileContentHandler("invalidPmDict.zip"); + ErrorMessage errorMessage = new ErrorMessage(ErrorLevel.ERROR, + "ERROR: [PM_DICT]: Document Number: 1, Path: /pmMetaData/, Problem: Key not found: pmHeader"); + + + // when + Map> errors = ValidationManagerUtil.initValidationManager(fileContentHandler) + .validate(); + List pmDictValidationErrors = extractPmDictValidationErrors(errors); + + // then + assertThat(pmDictValidationErrors) + .hasSize(1) + .containsExactly(errorMessage); + } + + private FileContentHandler getFileContentHandler(String filename) throws IOException { + return CommonUtil.validateAndUploadFileContent(OnboardingTypesEnum.ZIP, + Objects.requireNonNull(this.getClass() + .getClassLoader() + .getResourceAsStream(ZIPS_PATH + "/" + filename)) + .readAllBytes()); + } + + private List extractPmDictValidationErrors(Map> errors) { + return errors.getOrDefault(PM_DICTIONARY_FILE, List.of()) + .stream() + .filter(error -> error.getMessage().contains("[PM_DICT]")) + .collect(Collectors.toList()); + } +} diff --git a/integration-tests/src/test/resources/Files/PNFs/validation/pmdictionary/invalidPnfCompliantWithSOL004.csar b/integration-tests/src/test/resources/Files/PNFs/validation/pmdictionary/invalidPnfCompliantWithSOL004.csar new file mode 100644 index 0000000000000000000000000000000000000000..292984382557721ea1cf74db2e5af7c088b3f983 GIT binary patch literal 104109 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 literal 0 HcmV?d00001 diff --git a/integration-tests/src/test/resources/Files/PNFs/validation/pmdictionary/validPnfCompliantWithSOL004.csar b/integration-tests/src/test/resources/Files/PNFs/validation/pmdictionary/validPnfCompliantWithSOL004.csar new file mode 100644 index 0000000000000000000000000000000000000000..3574b723930f958f438305ed2938f2b8c78f54dd GIT binary patch literal 104106 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 validationErrors = new YamlContentValidator().validate(fileContent); validationErrors.stream() - .map(YamlDocumentValidationError::getMessage) + .map(this::formatErrorMessage) .forEach(errors::add); } catch (Exception e) { errors.add(e.getMessage()); } return errors; } + + private String formatErrorMessage(YamlDocumentValidationError error) { + return String.format("Document number: %d, Path: %s, Message: %s", + error.getYamlDocumentNumber(), + error.getPath(), + error.getMessage()); + } } diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/PMDictionaryValidatorTest.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/PMDictionaryValidatorTest.java index 22ef7720dc..1aec5570a2 100644 --- a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/PMDictionaryValidatorTest.java +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/PMDictionaryValidatorTest.java @@ -58,7 +58,7 @@ class PMDictionaryValidatorTest { // then assertThat(errors.size(), is(1)); - assertThat(errors.get(0), is("Key not found: pmDictionaryHeader")); + assertThat(errors.get(0), is("Document number: 1, Path: /pmDictionary/, Message: Key not found: pmDictionaryHeader")); } @Test @@ -74,4 +74,4 @@ class PMDictionaryValidatorTest { assertThat(errors.size(), is(1)); assertThat(errors.get(0), is("PM_Dictionary YAML file is empty")); } -} \ No newline at end of file +} -- 2.16.6