Checking compliance content of the PM_Dictionary file against it's schema.
Issue-ID: SDC-3390
Change-Id: I8e20f977c7d6838005bc84fc6c7c8ab197152a53
Signed-off-by: Maciej Malewski <maciej.malewski@nokia.com>
}
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());
// 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
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.
<version>${project.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.openecomp.sdc</groupId>
+ <artifactId>openecomp-sdc-vendor-software-product-manager</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
--- /dev/null
+/*-
+ * ============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);
+ }
+}
--- /dev/null
+/*-
+ * ============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<String, List<ErrorMessage>> 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<String, List<ErrorMessage>> errorMap = ValidatorFactory.getValidator(pnfFileContent).validateContent(pnfFileContent);
+ List<ErrorMessage> 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<ErrorMessage> errorList) {
+ return errorList.get(0).getMessage();
+ }
+
+ private ErrorLevel getActualErrorLevel(List<ErrorMessage> errorList) {
+ return errorList.get(0).getLevel();
+ }
+}
--- /dev/null
+/*-
+ * ============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<String, List<ErrorMessage>> errors = ValidationManagerUtil.initValidationManager(fileContentHandler)
+ .validate();
+ List<ErrorMessage> 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<String, List<ErrorMessage>> errors = ValidationManagerUtil.initValidationManager(fileContentHandler)
+ .validate();
+ List<ErrorMessage> 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<ErrorMessage> extractPmDictValidationErrors(Map<String, List<ErrorMessage>> errors) {
+ return errors.getOrDefault(PM_DICTIONARY_FILE, List.of())
+ .stream()
+ .filter(error -> error.getMessage().contains("[PM_DICT]"))
+ .collect(Collectors.toList());
+ }
+}
assertEquals(errors.get(SdcCommon.MANIFEST_NAME).get(0).getMessage(), "Manifest doesn't exist");
}
-}
\ No newline at end of file
+}
try {
List<YamlDocumentValidationError> 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());
+ }
}
// 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
assertThat(errors.size(), is(1));
assertThat(errors.get(0), is("PM_Dictionary YAML file is empty"));
}
-}
\ No newline at end of file
+}