Enable junits to work with the archetype template
[policy/drools-applications.git] / controlloop / templates / template.demo / src / test / java / org / onap / policy / template / demo / VDNSControlLoopTest.java
index 9608f7c..c64764b 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.policy.template.demo;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -30,6 +29,8 @@ import java.io.IOException;
 import java.net.URLEncoder;
 import java.time.Instant;
 import java.util.HashMap;
+import java.util.List;
+import java.util.Properties;
 import java.util.UUID;
 
 import org.junit.AfterClass;
@@ -39,30 +40,56 @@ import org.kie.api.runtime.KieSession;
 import org.kie.api.runtime.rule.FactHandle;
 import org.onap.policy.controlloop.ControlLoopEventStatus;
 import org.onap.policy.controlloop.ControlLoopNotificationType;
-import org.onap.policy.controlloop.ControlLoopTargetType;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
 import org.onap.policy.controlloop.policy.ControlLoopPolicy;
-import org.onap.policy.controlloop.policy.TargetType;
+import org.onap.policy.drools.event.comm.TopicEndpoint;
+import org.onap.policy.drools.event.comm.TopicListener;
+import org.onap.policy.drools.event.comm.TopicSink;
+import org.onap.policy.drools.event.comm.Topic.CommInfrastructure;
 import org.onap.policy.drools.http.server.HttpServletServer;
-import org.onap.policy.drools.impl.PolicyEngineJUnitImpl;
-import org.onap.policy.guard.PolicyGuard;
+import org.onap.policy.drools.properties.PolicyProperties;
+import org.onap.policy.drools.protocol.coders.EventProtocolCoder;
+import org.onap.policy.drools.protocol.coders.JsonProtocolFilter;
+import org.onap.policy.drools.system.PolicyEngine;
+import org.onap.policy.so.SORequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class VDNSControlLoopTest {
+public class VDNSControlLoopTest implements TopicListener {
 
     private static final Logger logger = LoggerFactory.getLogger(VDNSControlLoopTest.class);
     
+    private static List<? extends TopicSink> noopTopics;
+    
     private KieSession kieSession;
     private Util.Pair<ControlLoopPolicy, String> pair;
-    private PolicyEngineJUnitImpl engine;     
+    private UUID requestID;
+    
+    static {
+        /* Set environment properties */
+        Util.setAAIProps();
+        Util.setSOProps();
+        Util.setGuardProps();
+        Util.setPUProp();
+    }
     
        @BeforeClass
        public static void setUpSimulator() {
+               PolicyEngine.manager.configure(new Properties());
+       assertTrue(PolicyEngine.manager.start());
+       Properties noopSinkProperties = new Properties();
+       noopSinkProperties.put(PolicyProperties.PROPERTY_NOOP_SINK_TOPICS, "POLICY-CL-MGT");
+       noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events", "org.onap.policy.controlloop.VirtualControlLoopNotification");
+       noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events.custom.gson", "org.onap.policy.controlloop.util.Serialization,gsonPretty");
+       noopTopics = TopicEndpoint.manager.addTopicSinks(noopSinkProperties);
+       
+       EventProtocolCoder.manager.addEncoder("junit.groupId", "junit.artifactId", "POLICY-CL-MGT", "org.onap.policy.controlloop.VirtualControlLoopNotification", new JsonProtocolFilter(), null, null, 1111);
+
                try {
                        Util.buildAaiSim();
                        Util.buildSoSim();
+                       Util.buildGuardSim();
                } catch (Exception e) {
                        fail(e.getMessage());
                }
@@ -71,6 +98,7 @@ public class VDNSControlLoopTest {
        @AfterClass
        public static void tearDownSimulator() {
                HttpServletServer.factory.destroy();
+               PolicyEngine.manager.shutdown();
        }
 
     @Test
@@ -80,7 +108,7 @@ public class VDNSControlLoopTest {
          * Start the kie session
          */
         try {
-            kieSession = startSession("src/main/resources/ControlLoop_Template_xacml_guard.drl", 
+            kieSession = startSession("../archetype-cl-amsterdam/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl", 
                         "src/test/resources/yaml/policy_ControlLoop_SO-test.yaml",
                         "type=operational", 
                         "CL_vDNS", 
@@ -92,81 +120,28 @@ public class VDNSControlLoopTest {
         }
         
         /*
-         * Create a thread to continuously fire rules 
-         * until main thread calls halt
-         */      
-        new Thread( new Runnable() {
-            @Override
-            public void run() {
-                kieSession.fireUntilHalt();
-            }
-          } ).start();
-        
-        /*
-         * Create a unique requestId and a unique trigger source
+         * Allows the PolicyEngine to callback to this object to
+         * notify that there is an event ready to be pulled 
+         * from the queue
          */
-        UUID requestID = UUID.randomUUID();
-        String triggerSourceName = "foobartriggersource36";
+        for (TopicSink sink : noopTopics) {
+            assertTrue(sink.start());
+            sink.register(this);
+        }
         
         /*
-         * This will be the object returned from the PolicyEngine
+         * Create a unique requestId
          */
-        Object obj = null;
+        requestID = UUID.randomUUID();
         
         /* 
          * Simulate an onset event the policy engine will 
          * receive from DCAE to kick off processing through
          * the rules
          */
-        try {
-            sendOnset(pair.a, requestID, triggerSourceName);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-            logger.debug("Unable to send onset event");
-            fail("Unable to send onset event");
-        }
-        
-        /*
-         * Pull the object that was sent out and make
-         * sure it is a ControlLoopNoticiation of type active
-         */
-        obj = engine.subscribe("UEB", "POLICY-CL-MGT");
-        assertNotNull(obj);
-        assertTrue(obj instanceof VirtualControlLoopNotification);
-        assertTrue(((VirtualControlLoopNotification)obj).notification.equals(ControlLoopNotificationType.ACTIVE));
+        sendEvent(pair.a, requestID, ControlLoopEventStatus.ONSET);
         
-
-        /*
-         * Give the control loop time to acquire a lock
-         */
-        try {
-            Thread.sleep(4000);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-            logger.debug("An interrupt Exception was thrown");
-            fail("An interrupt Exception was thrown");
-        }
-
-      /*
-      * Give time to finish processing
-      */
-     try {
-         Thread.sleep(10000);
-     } catch (InterruptedException e) {
-         e.printStackTrace();
-         logger.debug("An interrupt Exception was thrown");
-         fail("An interrupt Exception was thrown");
-     }     
-
-           /*
-            * One final check to make sure the lock is released 
-            */
-           assertFalse(PolicyGuard.isLocked(TargetType.VNF, triggerSourceName, requestID));
-
-        /*
-         * This will stop the thread that is firing the rules
-         */
-        kieSession.halt();
+        kieSession.fireUntilHalt();
         
         /*
          * The only fact in memory should be Params
@@ -230,7 +205,6 @@ public class VDNSControlLoopTest {
         /*
          * Retrieve the Policy Engine
          */
-        engine = (PolicyEngineJUnitImpl) kieSession.getGlobal("Engine");
         
         logger.debug("============");
         logger.debug(URLEncoder.encode(pair.b, "UTF-8"));
@@ -238,55 +212,94 @@ public class VDNSControlLoopTest {
         
         return kieSession;
     }
-
-    /**
-     * This method is used to simulate event messages from DCAE
-     * that start the control loop (onset message).
-     * 
-     * @param policy the controlLoopName comes from the policy 
-     * @param requestID the requestId for this event
-     * @param triggerSourceName 
-     * @throws InterruptedException
+    
+    /*
+     * (non-Javadoc)
+     * @see org.onap.policy.drools.PolicyEngineListener#newEventNotification(java.lang.String)
      */
-    protected void sendOnset(ControlLoopPolicy policy, UUID requestID, String triggerSourceName) throws InterruptedException {
-        VirtualControlLoopEvent event = new VirtualControlLoopEvent();
-        event.closedLoopControlName = policy.getControlLoop().getControlLoopName();
-        event.requestID = requestID;
-        event.target = "VNF_NAME";
-               event.target_type = ControlLoopTargetType.VNF;
-        event.closedLoopAlarmStart = Instant.now();
-        event.AAI = new HashMap<>();
-        event.AAI.put("cloud-region.identity-url", "foo");
-        event.AAI.put("vserver.selflink", "bar");
-        event.AAI.put("vserver.is-closed-loop-disabled", "false");
-        event.AAI.put("vserver.vserver-name", "vserver-name-16102016-aai3255-data-11-1");
-        event.closedLoopEventStatus = ControlLoopEventStatus.ONSET;
-        kieSession.insert(event);
-        Thread.sleep(2000);
+    public void onTopicEvent(CommInfrastructure commType, String topic, String event) {
+        /*
+         * Pull the object that was sent out to DMAAP and make
+         * sure it is a ControlLoopNoticiation of type active
+         */
+       Object obj = null;
+        if ("POLICY-CL-MGT".equals(topic)) {
+               obj = org.onap.policy.controlloop.util.Serialization.gsonJunit.fromJson(event, org.onap.policy.controlloop.VirtualControlLoopNotification.class);
+       }
+        assertNotNull(obj);
+        if (obj instanceof VirtualControlLoopNotification) {
+            VirtualControlLoopNotification notification = (VirtualControlLoopNotification) obj;
+            String policyName = notification.policyName;
+            if (policyName.endsWith("EVENT")) {
+                logger.debug("Rule Fired: " + notification.policyName);
+                assertTrue(ControlLoopNotificationType.ACTIVE.equals(notification.notification));
+            }
+            else if (policyName.endsWith("GUARD_NOT_YET_QUERIED")) {
+                logger.debug("Rule Fired: " + notification.policyName);
+                assertTrue(ControlLoopNotificationType.OPERATION.equals(notification.notification));
+                assertNotNull(notification.message);
+                assertTrue(notification.message.startsWith("Sending guard query"));
+            }
+            else if (policyName.endsWith("GUARD.RESPONSE")) {
+                logger.debug("Rule Fired: " + notification.policyName);
+                assertTrue(ControlLoopNotificationType.OPERATION.equals(notification.notification));
+                assertNotNull(notification.message);
+                assertTrue(notification.message.toLowerCase().endsWith("permit"));
+            }
+            else if (policyName.endsWith("GUARD_PERMITTED")) {
+                logger.debug("Rule Fired: " + notification.policyName);
+                assertTrue(ControlLoopNotificationType.OPERATION.equals(notification.notification));
+                assertNotNull(notification.message);
+                assertTrue(notification.message.startsWith("actor=SO"));
+            }
+            else if (policyName.endsWith("OPERATION.TIMEOUT")) {
+                logger.debug("Rule Fired: " + notification.policyName);
+                kieSession.halt();
+                logger.debug("The operation timed out");
+                fail("Operation Timed Out");
+            }
+            else if (policyName.endsWith("SO.RESPONSE")) {
+                logger.debug("Rule Fired: " + notification.policyName);
+                assertTrue(ControlLoopNotificationType.OPERATION_SUCCESS.equals(notification.notification));
+                assertNotNull(notification.message);
+                assertTrue(notification.message.startsWith("actor=SO"));
+            }
+            else if (policyName.endsWith("EVENT.MANAGER")) {
+                logger.debug("Rule Fired: " + notification.policyName);
+                assertTrue(ControlLoopNotificationType.FINAL_SUCCESS.equals(notification.notification));
+                kieSession.halt();
+            }
+            else if (policyName.endsWith("EVENT.MANAGER.TIMEOUT")) {
+                logger.debug("Rule Fired: " + notification.policyName);
+                kieSession.halt();
+                logger.debug("The control loop timed out");
+                fail("Control Loop Timed Out");
+            }
+        }
+        else if (obj instanceof SORequest) {
+            logger.debug("\n============ SO received the request!!! ===========\n");
+        }        
     }
     
     /**
      * This method is used to simulate event messages from DCAE
-     * that end the control loop (abatement message).
+     * that start the control loop (onset message) or end the
+     * control loop (abatement message).
      * 
      * @param policy the controlLoopName comes from the policy 
      * @param requestID the requestId for this event
-     * @param triggerSourceName 
-     * @throws InterruptedException
+     * @param status could be onset or abated
      */
-    protected void sendAbatement(ControlLoopPolicy policy, UUID requestID, String triggerSourceName) throws InterruptedException {
+    protected void sendEvent(ControlLoopPolicy policy, UUID requestID, ControlLoopEventStatus status) {
         VirtualControlLoopEvent event = new VirtualControlLoopEvent();
         event.closedLoopControlName = policy.getControlLoop().getControlLoopName();
         event.requestID = requestID;
-        event.target = "generic-vnf.vnf-id";
-        event.closedLoopAlarmStart = Instant.now().minusSeconds(5);
-        event.closedLoopAlarmEnd = Instant.now();
+        event.target = "vserver.vserver-name";
+        event.closedLoopAlarmStart = Instant.now();
         event.AAI = new HashMap<>();
-        event.AAI.put("cloud-region.identity-url", "foo");
-        event.AAI.put("vserver.selflink", "bar");
+        event.AAI.put("vserver.vserver-name", "dfw1lb01lb01");
         event.AAI.put("vserver.is-closed-loop-disabled", "false");
-        event.AAI.put("generic-vnf.vnf-id", "testGenericVnfID");
-        event.closedLoopEventStatus = ControlLoopEventStatus.ABATED;
+        event.closedLoopEventStatus = status;
         kieSession.insert(event);
     }