Validation to ThreadsLocalHolder instead stdout
authorandre.schmid <andre.schmid@est.tech>
Wed, 31 Jul 2019 13:40:17 +0000 (13:40 +0000)
committerandre.schmid <andre.schmid@est.tech>
Wed, 31 Jul 2019 13:40:17 +0000 (13:40 +0000)
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 <andre.schmid@est.tech>
pom.xml
src/main/java/org/onap/sdc/toscaparser/api/TopologyTemplate.java
src/main/java/org/onap/sdc/toscaparser/api/common/JToscaValidationIssue.java
src/test/java/org/onap/sdc/toscaparser/api/JToscaMetadataParse.java
src/test/resources/csars/tmpCSAR_Huawei_vSPGW_fixed.csar
src/test/resources/csars/tmpCSAR_Huawei_vSPGW_without_required_inputs.csar [new file with mode: 0644]

diff --git a/pom.xml b/pom.xml
index c619031..8e02299 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -23,6 +23,7 @@
 
                <!-- ==================== -->
                <!-- Versions -->
+               <hamcrest.version>2.1</hamcrest.version>
                <!-- ==================== -->
                <!-- Global project version -->
 
                <!-- <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId>
             <version>1.1.2</version> <scope>test</scope> </dependency> -->
 
+               <dependency>
+                       <groupId>org.hamcrest</groupId>
+                       <artifactId>hamcrest</artifactId>
+                       <version>${hamcrest.version}</version>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.hamcrest</groupId>
+                       <artifactId>hamcrest-library</artifactId>
+                       <version>${hamcrest.version}</version>
+                       <scope>test</scope>
+               </dependency>
                <dependency>
                        <groupId>junit</groupId>
                        <artifactId>junit</artifactId>
index 2160527..efc6948 100644 (file)
@@ -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);
         }
index 19c9583..cd5cbc5 100644 (file)
@@ -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);
+    }
 }
index 3f5290d..2ec41b2 100644 (file)
 
 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<String, Object> 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<String, JToscaValidationIssue> validationIssues = ThreadLocalsHolder.getCollector()
+            .getValidationIssues();
+        final Collection<JToscaValidationIssue> actualValidationIssueList = validationIssues.values();
+
+        final Collection<JToscaValidationIssue> 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());
+    }
 }
index 194fabb..9dc29c7 100644 (file)
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 (file)
index 0000000..194fabb
Binary files /dev/null and b/src/test/resources/csars/tmpCSAR_Huawei_vSPGW_without_required_inputs.csar differ