From 527fe8bdac1f1c7c59738c598996dc8c842a22e3 Mon Sep 17 00:00:00 2001 From: "andre.schmid" Date: Wed, 31 Jul 2019 13:40:17 +0000 Subject: Validation to ThreadsLocalHolder instead stdout Fix one validation error that was going to stdout instead of normal handling through ThreadsLocalHolder singleton. Issue-ID: SDC-2344 Change-Id: I34827aa1314f2b65eff7b92fce7890eeddbca0e6 Signed-off-by: andre.schmid --- pom.xml | 13 +++++ .../onap/sdc/toscaparser/api/TopologyTemplate.java | 5 +- .../api/common/JToscaValidationIssue.java | 20 +++++++ .../sdc/toscaparser/api/JToscaMetadataParse.java | 58 ++++++++++++++++++--- .../csars/tmpCSAR_Huawei_vSPGW_fixed.csar | Bin 43627 -> 45116 bytes ...pCSAR_Huawei_vSPGW_without_required_inputs.csar | Bin 0 -> 43627 bytes 6 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 src/test/resources/csars/tmpCSAR_Huawei_vSPGW_without_required_inputs.csar diff --git a/pom.xml b/pom.xml index c619031..8e02299 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,7 @@ + 2.1 @@ -64,6 +65,18 @@ + + org.hamcrest + hamcrest + ${hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${hamcrest.version} + test + junit junit diff --git a/src/main/java/org/onap/sdc/toscaparser/api/TopologyTemplate.java b/src/main/java/org/onap/sdc/toscaparser/api/TopologyTemplate.java index 2160527..efc6948 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/TopologyTemplate.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/TopologyTemplate.java @@ -119,7 +119,10 @@ public class TopologyTemplate { } if ((parsedParams != null && parsedParams.get(input.getName()) == null || parsedParams == null) && input.isRequired() && input.getDefault() == null) { - System.out.format("Log warning: The required parameter \"%s\" is not provided\n", input.getName()); + ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE003", + String.format("MissingRequiredFieldError: The required input \"%s\" was not provided" + , input.getName())) + ); } alInputs.add(input); } diff --git a/src/main/java/org/onap/sdc/toscaparser/api/common/JToscaValidationIssue.java b/src/main/java/org/onap/sdc/toscaparser/api/common/JToscaValidationIssue.java index 19c9583..cd5cbc5 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/common/JToscaValidationIssue.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/common/JToscaValidationIssue.java @@ -20,6 +20,8 @@ package org.onap.sdc.toscaparser.api.common; +import java.util.Objects; + public class JToscaValidationIssue { private String code; @@ -52,4 +54,22 @@ public class JToscaValidationIssue { public String toString() { return "JToscaError [code=" + code + ", message=" + message + "]"; } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final JToscaValidationIssue that = (JToscaValidationIssue) o; + return Objects.equals(code, that.code) && + Objects.equals(message, that.message); + } + + @Override + public int hashCode() { + return Objects.hash(code, message); + } } diff --git a/src/test/java/org/onap/sdc/toscaparser/api/JToscaMetadataParse.java b/src/test/java/org/onap/sdc/toscaparser/api/JToscaMetadataParse.java index 3f5290d..2ec41b2 100644 --- a/src/test/java/org/onap/sdc/toscaparser/api/JToscaMetadataParse.java +++ b/src/test/java/org/onap/sdc/toscaparser/api/JToscaMetadataParse.java @@ -20,15 +20,23 @@ package org.onap.sdc.toscaparser.api; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.File; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedHashMap; +import java.util.Map; import org.junit.Test; import org.onap.sdc.toscaparser.api.common.JToscaException; +import org.onap.sdc.toscaparser.api.common.JToscaValidationIssue; import org.onap.sdc.toscaparser.api.utils.JToscaErrorCodes; import org.onap.sdc.toscaparser.api.utils.ThreadLocalsHolder; @@ -36,8 +44,7 @@ public class JToscaMetadataParse { @Test public void testMetadataParsedCorrectly() throws JToscaException { - String fileStr = JToscaMetadataParse.class.getClassLoader().getResource("csars/csar_hello_world.csar").getFile(); - File file = new File(fileStr); + final File file = loadCsar("csars/csar_hello_world.csar"); ToscaTemplate toscaTemplate = new ToscaTemplate(file.getAbsolutePath(), null, true, null); LinkedHashMap metadataProperties = toscaTemplate.getMetaProperties("TOSCA.meta"); assertNotNull(metadataProperties); @@ -48,17 +55,49 @@ public class JToscaMetadataParse { @Test public void noWarningsAfterParse() throws JToscaException { - String fileStr = JToscaMetadataParse.class.getClassLoader().getResource("csars/tmpCSAR_Huawei_vSPGW_fixed.csar").getFile(); - File file = new File(fileStr); + final File file = loadCsar("csars/tmpCSAR_Huawei_vSPGW_fixed.csar"); ToscaTemplate toscaTemplate = new ToscaTemplate(file.getAbsolutePath(), null, true, null); int validationIssuesCaught = ThreadLocalsHolder.getCollector().validationIssuesCaught(); assertTrue(validationIssuesCaught == 0); } + @Test + public void requiredInputErrorsAfterParse() throws JToscaException { + final File file = loadCsar("csars/tmpCSAR_Huawei_vSPGW_without_required_inputs.csar"); + new ToscaTemplate(file.getAbsolutePath(), null, true, null); + + final Map validationIssues = ThreadLocalsHolder.getCollector() + .getValidationIssues(); + final Collection actualValidationIssueList = validationIssues.values(); + + final Collection expectedValidationIssueList = new ArrayList<>(); + final String errorCode = "JE003"; + final String errorFormat = "MissingRequiredFieldError: The required input \"%s\" was not provided"; + expectedValidationIssueList.add(new JToscaValidationIssue(errorCode + , String.format(errorFormat, "nf_naming_code"))); + expectedValidationIssueList.add(new JToscaValidationIssue(errorCode + , String.format(errorFormat, "nf_type"))); + expectedValidationIssueList.add(new JToscaValidationIssue(errorCode + , String.format(errorFormat, "nf_role"))); + expectedValidationIssueList.add(new JToscaValidationIssue(errorCode + , String.format(errorFormat, "min_instances"))); + expectedValidationIssueList.add(new JToscaValidationIssue(errorCode + , String.format(errorFormat, "max_instances"))); + expectedValidationIssueList.add(new JToscaValidationIssue(errorCode + , String.format(errorFormat, "nf_function"))); + + assertThat("The actual and the expected validation issue lists should have the same size" + , actualValidationIssueList, hasSize(expectedValidationIssueList.size()) + ); + + assertThat("The actual and the expected validation issue lists should be the same" + , actualValidationIssueList, containsInAnyOrder(expectedValidationIssueList.toArray(new JToscaValidationIssue[0])) + ); + } + @Test public void testEmptyCsar() throws JToscaException { - String fileStr = JToscaMetadataParse.class.getClassLoader().getResource("csars/emptyCsar.csar").getFile(); - File file = new File(fileStr); + final File file = loadCsar("csars/emptyCsar.csar"); try { ToscaTemplate toscaTemplate = new ToscaTemplate(file.getAbsolutePath(), null, true, null); } catch (JToscaException e) { @@ -78,4 +117,11 @@ public class JToscaMetadataParse { assertTrue(e.getCode().equals(JToscaErrorCodes.PATH_NOT_VALID.getValue())); } } + + private File loadCsar(final String csarFilePath) { + final URL resourceUrl = JToscaMetadataParse.class.getClassLoader().getResource(csarFilePath); + assertNotNull(String.format("Could not load CSAR file '%s'", csarFilePath), resourceUrl); + + return new File(resourceUrl.getFile()); + } } diff --git a/src/test/resources/csars/tmpCSAR_Huawei_vSPGW_fixed.csar b/src/test/resources/csars/tmpCSAR_Huawei_vSPGW_fixed.csar index 194fabb..9dc29c7 100644 Binary files a/src/test/resources/csars/tmpCSAR_Huawei_vSPGW_fixed.csar and b/src/test/resources/csars/tmpCSAR_Huawei_vSPGW_fixed.csar differ diff --git a/src/test/resources/csars/tmpCSAR_Huawei_vSPGW_without_required_inputs.csar b/src/test/resources/csars/tmpCSAR_Huawei_vSPGW_without_required_inputs.csar new file mode 100644 index 0000000..194fabb Binary files /dev/null and b/src/test/resources/csars/tmpCSAR_Huawei_vSPGW_without_required_inputs.csar differ -- cgit 1.2.3-korg