Merge "do strict validation before domain conversion"
diff --git a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleStateRunning.java b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleStateRunning.java
index f762bff..503c0c1 100644
--- a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleStateRunning.java
+++ b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleStateRunning.java
@@ -168,7 +168,7 @@
                 continue;
             }
 
-            success = sync.test(controller, policy) && success;
+            success = fsm.getDomainMaker().isConformant(policy) && sync.test(controller, policy) && success;
         }
 
         return success;
diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java
index 54f7d68..54f4b6a 100644
--- a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java
+++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java
@@ -28,6 +28,7 @@
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -53,6 +54,15 @@
  */
 public class LifecycleStateActiveTest extends LifecycleStateRunningTest {
 
+    private static final String POLICY_COMPLIANT_VCPE_BAD_INTEGER_JSON =
+            "src/test/resources/tosca-policy-compliant-vcpe-bad-integer.json";
+    private static final String POLICY_OPERATIONAL_FIREWALL_JSON =
+            "src/test/resources/tosca-policy-operational-firewall.json";
+    private static final String POLICY_OPERATIONAL_RESTART_V_2_JSON =
+            "src/test/resources/tosca-policy-operational-restart.v2.json";
+    private static final String POLICY_OPERATIONAL_RESTART_JSON =
+            "src/test/resources/tosca-policy-operational-restart.json";
+
     /**
      * Start tests in the Active state.
      */
@@ -199,7 +209,7 @@
         assertEquals("w", fsm.getSubgroup());
 
         String restartV1 =
-            new String(Files.readAllBytes(Paths.get("src/test/resources/tosca-policy-operational-restart.json")));
+            Files.readString(Paths.get(POLICY_OPERATIONAL_RESTART_JSON), StandardCharsets.UTF_8);
         ToscaPolicy toscaPolicyRestartV1 = new StandardCoder().decode(restartV1, ToscaPolicy.class);
         update.setPolicies(Arrays.asList(toscaPolicyRestartV1));
 
@@ -237,7 +247,6 @@
             .decode(fsm.client.getSink().getRecentEvents()[qlength + 1], PdpStatus.class);
         assertEquals(new ArrayList<>(fsm.policiesMap.keySet()), cachedStatus.getPolicies());
 
-
         factPolicies = controllerSupport.getFacts(ToscaPolicy.class);
         assertEquals(1, factPolicies.size());
         assertEquals(toscaPolicyRestartV1, factPolicies.get(0));
@@ -275,7 +284,7 @@
         // deploy a new version of the operational.restart policy
 
         String restartV2 =
-            new String(Files.readAllBytes(Paths.get("src/test/resources/tosca-policy-operational-restart.v2.json")));
+            Files.readString(Paths.get(POLICY_OPERATIONAL_RESTART_V_2_JSON), StandardCharsets.UTF_8);
         ToscaPolicy toscaPolicyRestartV2 = new StandardCoder().decode(restartV2, ToscaPolicy.class);
         update.setPolicies(Arrays.asList(toscaPolicyRestartV2));
         assertTrue(fsm.update(update));
@@ -294,7 +303,7 @@
         // deploy another policy : firewall
 
         String firewall =
-            new String(Files.readAllBytes(Paths.get("src/test/resources/tosca-policy-operational-firewall.json")));
+            Files.readString(Paths.get(POLICY_OPERATIONAL_FIREWALL_JSON), StandardCharsets.UTF_8);
         ToscaPolicy toscaPolicyFirewall = new StandardCoder().decode(firewall, ToscaPolicy.class);
         update.setPolicies(Arrays.asList(toscaPolicyRestartV2, toscaPolicyFirewall));
         assertTrue(fsm.update(update));
@@ -320,6 +329,14 @@
         assertEquals(PdpState.ACTIVE, fsm.state());
         assertEquals(interval, fsm.getStatusTimerSeconds());
 
+        // bad policy deployment
+
+        String badIntegerPolicy =
+            Files.readString(Paths.get(POLICY_COMPLIANT_VCPE_BAD_INTEGER_JSON), StandardCharsets.UTF_8);
+        ToscaPolicy toscaPolicyRestartBad = new StandardCoder().decode(badIntegerPolicy, ToscaPolicy.class);
+        update.setPolicies(Arrays.asList(toscaPolicyRestartBad));
+        assertFalse(fsm.update(update));
+
         assertTrue(controllerSupport.getController().getDrools().delete(ToscaPolicy.class));
 
         fsm.shutdown();
diff --git a/feature-lifecycle/src/test/resources/tosca-policy-compliant-vcpe-bad-integer.json b/feature-lifecycle/src/test/resources/tosca-policy-compliant-vcpe-bad-integer.json
new file mode 100644
index 0000000..3ff7dbb
--- /dev/null
+++ b/feature-lifecycle/src/test/resources/tosca-policy-compliant-vcpe-bad-integer.json
@@ -0,0 +1,36 @@
+{
+    "type": "onap.policies.controlloop.operational.common.Drools",
+    "type_version": "1.0.0",
+    "name": "vcpe.timeout.integer.as.string",
+    "version": "1.0.0",
+    "metadata": {
+        "policy-id": "vcpe.timeout.integer.as.string"
+    },
+    "properties": {
+        "id": "ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e",
+        "timeout": "3600",
+        "abatement": true,
+        "trigger": "unique-policy-id-1-restart",
+        "operations": [
+            {
+                "id": "unique-policy-id-1-restart",
+                "description": "Restart the VM",
+                "operation": {
+                    "actor": "APPC",
+                    "operation": "Restart",
+                    "target": {
+                        "targetType": "VNF"
+                    }
+                },
+                "timeout": "1200",
+                "retries": 3,
+                "success": "final_success",
+                "failure": "final_failure",
+                "failure_timeout": "final_failure_timeout",
+                "failure_retries": "final_failure_retries",
+                "failure_exception": "final_failure_exception",
+                "failure_guard": "final_failure_guard"
+            }
+        ]
+    }
+}