Refactor BaseRuleTest for Drools apps 67/110867/13
authorTaka Cho <takamune.cho@att.com>
Mon, 3 Aug 2020 23:49:45 +0000 (19:49 -0400)
committerTaka Cho <takamune.cho@att.com>
Tue, 11 Aug 2020 12:27:58 +0000 (08:27 -0400)
1, rename BaseRuleTest to BaseTest.
2, remove drools related code in BaseTest that would use
   for tdjam controller.
3, DroolsRuleTest extends BaseTest
   that would use for frankfurt controller for drools base.

Issue-ID: POLICY-2750
Change-Id: Ica9637a850de6e929f09532f077ae3e997aa2045
Signed-off-by: Taka Cho <takamune.cho@att.com>
controlloop/common/controller-frankfurt/src/test/java/org/onap/policy/controlloop/FrankfurtTest.java
controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/BaseTest.java [moved from controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/BaseRuleTest.java with 86% similarity]
controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTest.java [new file with mode: 0644]
controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/Rules.java
controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseTestTest.java [moved from controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseRuleTestTest.java with 79% similarity]
controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTestTest.java [new file with mode: 0644]

index 7b8b99a..fd9847b 100644 (file)
@@ -25,7 +25,7 @@ import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.runner.RunWith;
-import org.onap.policy.controlloop.common.rules.test.BaseRuleTest;
+import org.onap.policy.controlloop.common.rules.test.DroolsRuleTest;
 import org.onap.policy.controlloop.common.rules.test.Listener;
 import org.onap.policy.controlloop.common.rules.test.NamedRunner;
 import org.onap.policy.controlloop.common.rules.test.TestNames;
@@ -41,7 +41,7 @@ import org.onap.policy.simulators.Util;
 @RunWith(NamedRunner.class)
 @TestNames(prefixes = {"test"})
 
-public class FrankfurtTest extends BaseRuleTest {
+public class FrankfurtTest extends DroolsRuleTest {
     protected static final String CONTROLLER_NAME = "frankfurt";
 
 
@@ -24,7 +24,6 @@ import static org.junit.Assert.assertEquals;
 
 import java.util.List;
 import java.util.UUID;
-import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import lombok.AccessLevel;
@@ -33,19 +32,19 @@ import org.junit.Test;
 import org.onap.policy.appc.Request;
 import org.onap.policy.appclcm.AppcLcmDmaapWrapper;
 import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;
 import org.onap.policy.common.utils.coder.StandardCoderInstantAsMillis;
 import org.onap.policy.controlloop.ControlLoopNotificationType;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
 import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager2;
-import org.onap.policy.drools.system.PolicyController;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 import org.onap.policy.sdnr.PciMessage;
 
 /**
  * Superclass used for rule tests.
  */
-public abstract class BaseRuleTest {
+public abstract class BaseTest {
     private static final String APPC_RESTART_OP = "restart";
     private static final String APPC_MODIFY_CONFIG_OP = "ModifyConfig";
 
@@ -114,8 +113,9 @@ public abstract class BaseRuleTest {
     /*
      * Coders used to decode requests and responses.
      */
-    private static final Coder APPC_LEGACY_CODER = new StandardCoderInstantAsMillis();
-    private static final Coder APPC_LCM_CODER = new StandardCoder();
+    protected static final Coder APPC_LEGACY_CODER = new StandardCoderInstantAsMillis();
+    protected static final Coder APPC_LCM_CODER = new StandardCoder();
+    protected static final Coder POLICY_CL_MGT_CODER = new PolicyClMgtCoder();
 
     /*
      * Coders used to decode requests and responses.
@@ -123,10 +123,9 @@ public abstract class BaseRuleTest {
     private static final Coder SDNR_CODER = new StandardCoder();
 
     // these may be overridden by junit tests
-    private static Function<String, Rules> ruleMaker = Rules::new;
-    private static Supplier<HttpClients> httpClientMaker = HttpClients::new;
-    private static Supplier<Simulators> simMaker = Simulators::new;
-    private static Supplier<Topics> topicMaker = Topics::new;
+    protected static Supplier<HttpClients> httpClientMaker = HttpClients::new;
+    protected static Supplier<Simulators> simMaker = Simulators::new;
+    protected static Supplier<Topics> topicMaker = Topics::new;
 
     protected static Rules rules;
     protected static HttpClients httpClients;
@@ -134,7 +133,7 @@ public abstract class BaseRuleTest {
 
     // used to inject and wait for messages
     @Getter(AccessLevel.PROTECTED)
-    private Topics topics;
+    protected static Topics topics;
 
     // used to wait for messages on SINK topics
     protected Listener<VirtualControlLoopNotification> policyClMgt;
@@ -142,21 +141,15 @@ public abstract class BaseRuleTest {
     protected Listener<AppcLcmDmaapWrapper> appcLcmRead;
     protected Listener<PciMessage> sdnrClSink;
 
-    protected PolicyController controller;
-
     /*
      * Tosca Policy that was loaded.
      */
     protected ToscaPolicy policy;
 
-
     /**
      * Initializes {@link #rules}, {@link #httpClients}, and {@link #simulators}.
-     *
-     * @param controllerName the rule controller name
      */
-    public static void initStatics(String controllerName) {
-        rules = ruleMaker.apply(controllerName);
+    public static void initStatics() {
         httpClients = httpClientMaker.get();
         simulators = simMaker.get();
     }
@@ -167,7 +160,6 @@ public abstract class BaseRuleTest {
     public static void finishStatics() {
         httpClients.destroy();
         simulators.destroy();
-        rules.destroy();
     }
 
     /**
@@ -175,7 +167,6 @@ public abstract class BaseRuleTest {
      */
     public void init() {
         topics = topicMaker.get();
-        controller = rules.getController();
     }
 
     /**
@@ -183,7 +174,6 @@ public abstract class BaseRuleTest {
      */
     public void finish() {
         topics.destroy();
-        rules.resetFacts();
     }
 
     // Service123 (i.e., Policy with multiple operations)
@@ -193,17 +183,14 @@ public abstract class BaseRuleTest {
      */
     @Test
     public void testService123Compliant() {
-        policyClMgt = topics.createListener(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class, controller);
+        policyClMgt = createNoficationTopicListener();
         appcLcmRead = topics.createListener(APPC_LCM_READ_TOPIC, AppcLcmDmaapWrapper.class, APPC_LCM_CODER);
-
-        assertEquals(0, controller.getDrools().factCount(rules.getControllerName()));
-        policy = rules.setupPolicyFromFile(SERVICE123_TOSCA_COMPLIANT_POLICY);
-        assertEquals(2, controller.getDrools().factCount(rules.getControllerName()));
+        policy = checkPolicy(SERVICE123_TOSCA_COMPLIANT_POLICY);
 
         // inject an ONSET event over the DCAE topic
         topics.inject(DCAE_TOPIC, SERVICE123_ONSET);
-
         /* Wait to acquire a LOCK and a PDP-X PERMIT */
+
         waitForLockAndPermit(policy, policyClMgt);
 
         // restart request should be sent and fail four times (i.e., because retry=3)
@@ -213,23 +200,16 @@ public abstract class BaseRuleTest {
             topics.inject(APPC_LCM_WRITE_TOPIC, SERVICE123_APPC_RESTART_FAILURE,
                             appcreq.getBody().getInput().getCommonHeader().getSubRequestId());
         }
-
         // rebuild request should be sent and fail once
         AppcLcmDmaapWrapper appcreq = appcLcmRead.await(req -> "rebuild".equals(req.getRpcName()));
-
         topics.inject(APPC_LCM_WRITE_TOPIC, SERVICE123_APPC_REBUILD_FAILURE,
                         appcreq.getBody().getInput().getCommonHeader().getSubRequestId());
-
         // migrate request should be sent and succeed
         appcreq = appcLcmRead.await(req -> "migrate".equals(req.getRpcName()));
-
         topics.inject(APPC_LCM_WRITE_TOPIC, SERVICE123_APPC_MIGRATE_SUCCESS,
                         appcreq.getBody().getInput().getCommonHeader().getSubRequestId());
-
         /* --- Operation Completed --- */
-
         waitForOperationSuccess();
-
         /* --- Transaction Completed --- */
         waitForFinalSuccess(policy, policyClMgt);
     }
@@ -247,12 +227,10 @@ public abstract class BaseRuleTest {
      */
     @Test
     public void testDuplicatesEvents() {
-        policyClMgt = topics.createListener(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class, controller);
+        policyClMgt = createNoficationTopicListener();
         appcLcmRead = topics.createListener(APPC_LCM_READ_TOPIC, AppcLcmDmaapWrapper.class, APPC_LCM_CODER);
 
-        assertEquals(0, controller.getDrools().factCount(rules.getControllerName()));
-        policy = rules.setupPolicyFromFile(DUPLICATES_TOSCA_COMPLIANT_POLICY);
-        assertEquals(2, controller.getDrools().factCount(rules.getControllerName()));
+        policy = checkPolicy(DUPLICATES_TOSCA_COMPLIANT_POLICY);
 
         final long initCount = getCreateCount();
 
@@ -439,12 +417,11 @@ public abstract class BaseRuleTest {
      * @param operation expected APPC operation request
      */
     protected void appcLcmSunnyDay(String policyFile, List<String> onsetFiles, String operation) {
-        policyClMgt = topics.createListener(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class, controller);
+        policyClMgt = createNoficationTopicListener();
         appcLcmRead = topics.createListener(APPC_LCM_READ_TOPIC, AppcLcmDmaapWrapper.class, APPC_LCM_CODER);
 
-        assertEquals(0, controller.getDrools().factCount(rules.getControllerName()));
-        policy = rules.setupPolicyFromFile(policyFile);
-        assertEquals(2, controller.getDrools().factCount(rules.getControllerName()));
+        policy = checkPolicy(policyFile);
+
 
         // inject several ONSET events over the DCAE topic
         for (String onsetFile : onsetFiles) {
@@ -482,12 +459,10 @@ public abstract class BaseRuleTest {
      * @param operation expected APPC operation request
      */
     protected void appcLegacySunnyDay(String policyFile, String onsetFile, String operation) {
-        policyClMgt = topics.createListener(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class, controller);
+        policyClMgt = createNoficationTopicListener();
         appcClSink = topics.createListener(APPC_CL_TOPIC, Request.class, APPC_LEGACY_CODER);
 
-        assertEquals(0, controller.getDrools().factCount(rules.getControllerName()));
-        policy = rules.setupPolicyFromFile(policyFile);
-        assertEquals(2, controller.getDrools().factCount(rules.getControllerName()));
+        policy = checkPolicy(policyFile);
 
         /* Inject an ONSET event over the DCAE topic */
         topics.inject(DCAE_TOPIC, onsetFile);
@@ -523,12 +498,10 @@ public abstract class BaseRuleTest {
      * @param checkOperation flag to determine whether or not to wait for operation timeout
      */
     protected void appcLegacyRainyDay(String policyFile, String onsetFile, String operation) {
-        policyClMgt = topics.createListener(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class, controller);
+        policyClMgt = createNoficationTopicListener();
         appcClSink = topics.createListener(APPC_CL_TOPIC, Request.class, APPC_LEGACY_CODER);
 
-        assertEquals(0, controller.getDrools().factCount(rules.getControllerName()));
-        policy = rules.setupPolicyFromFile(policyFile);
-        assertEquals(2, controller.getDrools().factCount(rules.getControllerName()));
+        policy = checkPolicy(policyFile);
 
         /* Inject an ONSET event over the DCAE topic */
         topics.inject(DCAE_TOPIC, onsetFile);
@@ -563,12 +536,10 @@ public abstract class BaseRuleTest {
      * @param operation expected APPC operation request
      */
     protected void appcLegacyRainyDayNoResponse(String policyFile, String onsetFile, String operation) {
-        policyClMgt = topics.createListener(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class, controller);
+        policyClMgt = createNoficationTopicListener();
         appcClSink = topics.createListener(APPC_CL_TOPIC, Request.class, APPC_LEGACY_CODER);
 
-        assertEquals(0, controller.getDrools().factCount(rules.getControllerName()));
-        policy = rules.setupPolicyFromFile(policyFile);
-        assertEquals(2, controller.getDrools().factCount(rules.getControllerName()));
+        policy = checkPolicy(policyFile);
 
         /* Inject an ONSET event over the DCAE topic */
         topics.inject(DCAE_TOPIC, onsetFile);
@@ -597,13 +568,10 @@ public abstract class BaseRuleTest {
      * @param operation expected SDNR operation request
      */
     protected void sdnrSunnyDay(String policyFile, String onsetFile, String successFile, String operation) {
-        policyClMgt = topics.createListener(POLICY_CL_MGT_TOPIC,
-            VirtualControlLoopNotification.class, controller);
+        policyClMgt = createNoficationTopicListener();
         sdnrClSink = topics.createListener(SDNR_CL_TOPIC, PciMessage.class, SDNR_CODER);
 
-        assertEquals(0, controller.getDrools().factCount(rules.getControllerName()));
-        policy = rules.setupPolicyFromFile(policyFile);
-        assertEquals(2, controller.getDrools().factCount(rules.getControllerName()));
+        policy = checkPolicy(policyFile);
 
         /* Inject an ONSET event over the DCAE topic */
         topics.inject(DCAE_TOPIC, onsetFile);
@@ -637,11 +605,9 @@ public abstract class BaseRuleTest {
      * @param operation expected APPC operation request
      */
     protected void httpSunnyDay(String policyFile, String onsetFile) {
-        policyClMgt = topics.createListener(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class, controller);
+        policyClMgt = createNoficationTopicListener();
 
-        assertEquals(0, controller.getDrools().factCount(rules.getControllerName()));
-        policy = rules.setupPolicyFromFile(policyFile);
-        assertEquals(2, controller.getDrools().factCount(rules.getControllerName()));
+        policy = checkPolicy(policyFile);
 
         /* Inject an ONSET event over the DCAE topic */
         topics.inject(DCAE_TOPIC, onsetFile);
@@ -665,11 +631,9 @@ public abstract class BaseRuleTest {
      * @param operation expected APPC operation request
      */
     protected void httpRainyDay(String policyFile, String onsetFile) {
-        policyClMgt = topics.createListener(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class, controller);
+        policyClMgt = createNoficationTopicListener();
 
-        assertEquals(0, controller.getDrools().factCount(rules.getControllerName()));
-        policy = rules.setupPolicyFromFile(policyFile);
-        assertEquals(2, controller.getDrools().factCount(rules.getControllerName()));
+        policy = checkPolicy(policyFile);
 
         /* Inject an ONSET event over the DCAE topic */
         topics.inject(DCAE_TOPIC, onsetFile);
@@ -740,4 +704,38 @@ public abstract class BaseRuleTest {
      */
     protected abstract VirtualControlLoopNotification waitForFinal(ToscaPolicy policy,
                     Listener<VirtualControlLoopNotification> policyClMgt, ControlLoopNotificationType finalType);
+
+    /**
+     * Returns ToscaPolicy from File.
+     *
+     * @param fileName a path name
+     * @return ToscaPolicy
+     */
+    protected ToscaPolicy checkPolicy(String fileName)  {
+        try {
+            return Rules.getPolicyFromFile(fileName);
+        } catch (CoderException e) {
+            throw new IllegalArgumentException(fileName, e);
+        }
+    }
+
+    /**
+     * Creates a Coder for PolicyClMgt from StandardCoder.
+     *
+     */
+    public static class PolicyClMgtCoder extends StandardCoder {
+        public PolicyClMgtCoder() {
+            super(org.onap.policy.controlloop.util.Serialization.gson,
+                  org.onap.policy.controlloop.util.Serialization.gsonPretty);
+        }
+    }
+
+    /**
+     * Returns Listener from createListner based on Coder.
+     * @return the Listener
+     */
+    protected Listener<VirtualControlLoopNotification> createNoficationTopicListener() {
+        return topics.createListener(POLICY_CL_MGT_TOPIC,
+            VirtualControlLoopNotification.class, POLICY_CL_MGT_CODER);
+    }
 }
diff --git a/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTest.java b/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTest.java
new file mode 100644 (file)
index 0000000..a57395c
--- /dev/null
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. 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.policy.controlloop.common.rules.test;
+
+import java.util.function.Function;
+import org.onap.policy.controlloop.ControlLoopNotificationType;
+import org.onap.policy.controlloop.VirtualControlLoopNotification;
+import org.onap.policy.drools.system.PolicyController;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
+
+/**
+ * Superclass used for rule tests.
+ */
+public abstract class DroolsRuleTest extends BaseTest {
+
+    // these may be overridden by junit tests
+    private static Function<String, Rules> ruleMaker = Rules::new;
+
+    protected static Rules rules;
+
+    protected PolicyController controller;
+
+    /**
+     * Initializes {@link #rules}, {@link #httpClients}, and {@link #simulators}.
+     *
+     * @param controllerName the rule controller name
+     */
+    public static void initStatics(String controllerName) {
+        rules = ruleMaker.apply(controllerName);
+        BaseTest.initStatics();
+    }
+
+    /**
+     * Destroys {@link #httpClients}, {@link #simulators}, and {@link #rules}.
+     */
+    public static void finishStatics() {
+        BaseTest.finishStatics();
+        rules.destroy();
+    }
+
+    /**
+     * Initializes {@link #topics} and {@link #controller}.
+     */
+    @Override
+    public void init() {
+        super.init();
+        controller = rules.getController();
+    }
+
+    /**
+     * Destroys {@link #topics} and resets the rule facts.
+     */
+    @Override
+    public void finish() {
+        super.finish();
+        rules.resetFacts();
+    }
+
+    /**
+     * Returns ToscaPolicy from File.
+     *
+     * @param fileName a path name
+     * @return ToscaPolicy
+     */
+    @Override
+    protected ToscaPolicy checkPolicy(String fileName)  {
+        return rules.setupPolicyFromFile(fileName);
+    }
+
+    /**
+     * Returns Listener from createListener based on Coder.
+     * @return the Listener
+     */
+    @Override
+    protected Listener<VirtualControlLoopNotification> createNoficationTopicListener() {
+        return topics.createListener(POLICY_CL_MGT_TOPIC,
+            VirtualControlLoopNotification.class, controller);
+    }
+}
index 62632e9..64f0880 100644 (file)
@@ -223,7 +223,10 @@ public class Rules {
         }
     }
 
-    private ToscaPolicy getPolicyFromFile(String policyPath) throws CoderException {
+    /**
+     * Get policy from file.
+     */
+    public static ToscaPolicy getPolicyFromFile(String policyPath) throws CoderException {
         String policyJson = ResourceUtils.getResourceAsString(policyPath);
         if (policyJson == null) {
             throw new CoderException(new FileNotFoundException(policyPath));
@@ -34,7 +34,6 @@ import java.util.LinkedList;
 import java.util.Map;
 import java.util.Queue;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
 import org.junit.AfterClass;
@@ -55,7 +54,6 @@ import org.onap.policy.common.utils.coder.StandardCoderInstantAsMillis;
 import org.onap.policy.controlloop.ControlLoopNotificationType;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
 import org.onap.policy.drools.controller.DroolsController;
-import org.onap.policy.drools.system.PolicyController;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
 import org.onap.policy.sdnr.PciBody;
@@ -64,17 +62,15 @@ import org.onap.policy.sdnr.PciMessage;
 import org.onap.policy.sdnr.PciRequest;
 import org.powermock.reflect.Whitebox;
 
-public class BaseRuleTestTest {
-    private static final String CONTROLLER_NAME = "my-controller-name";
+public class BaseTestTest {
     private static final String POLICY_NAME = "my-policy-name";
 
     // saved values
-    private static Function<String, Rules> ruleMaker;
     private static Supplier<HttpClients> httpClientMaker;
     private static Supplier<Simulators> simMaker;
     private static Supplier<Topics> topicMaker;
 
-    private BaseRuleTest base;
+    private BaseTest base;
     private LinkedList<VirtualControlLoopNotification> clMgtQueue;
     private Queue<AppcLcmDmaapWrapper> appcLcmQueue;
     private Queue<Request> appcLegacyQueue;
@@ -82,10 +78,6 @@ public class BaseRuleTestTest {
     private int permitCount;
     private int finalCount;
 
-    @Mock
-    private PolicyController controller;
-    @Mock
-    private Rules rules;
     @Mock
     private HttpClients httpClients;
     @Mock
@@ -113,10 +105,9 @@ public class BaseRuleTestTest {
      */
     @BeforeClass
     public static void setUpBeforeClass() {
-        ruleMaker = Whitebox.getInternalState(BaseRuleTest.class, "ruleMaker");
-        httpClientMaker = Whitebox.getInternalState(BaseRuleTest.class, "httpClientMaker");
-        simMaker = Whitebox.getInternalState(BaseRuleTest.class, "simMaker");
-        topicMaker = Whitebox.getInternalState(BaseRuleTest.class, "topicMaker");
+        httpClientMaker = Whitebox.getInternalState(BaseTest.class, "httpClientMaker");
+        simMaker = Whitebox.getInternalState(BaseTest.class, "simMaker");
+        topicMaker = Whitebox.getInternalState(BaseTest.class, "topicMaker");
     }
 
     /**
@@ -124,10 +115,9 @@ public class BaseRuleTestTest {
      */
     @AfterClass
     public static void tearDownAfterClass() {
-        Whitebox.setInternalState(BaseRuleTest.class, "ruleMaker", ruleMaker);
-        Whitebox.setInternalState(BaseRuleTest.class, "httpClientMaker", httpClientMaker);
-        Whitebox.setInternalState(BaseRuleTest.class, "simMaker", simMaker);
-        Whitebox.setInternalState(BaseRuleTest.class, "topicMaker", topicMaker);
+        Whitebox.setInternalState(BaseTest.class, "httpClientMaker", httpClientMaker);
+        Whitebox.setInternalState(BaseTest.class, "simMaker", simMaker);
+        Whitebox.setInternalState(BaseTest.class, "topicMaker", topicMaker);
     }
 
     /**
@@ -140,34 +130,22 @@ public class BaseRuleTestTest {
         when(policy.getIdentifier()).thenReturn(policyIdent);
         when(policyIdent.getName()).thenReturn(POLICY_NAME);
 
-        when(drools.factCount(CONTROLLER_NAME)).thenReturn(0L);
-        when(controller.getDrools()).thenReturn(drools);
-
-        when(rules.getControllerName()).thenReturn(CONTROLLER_NAME);
-        when(rules.getController()).thenReturn(controller);
-        when(rules.setupPolicyFromFile(any())).thenAnswer(args -> {
-            when(drools.factCount(CONTROLLER_NAME)).thenReturn(2L);
-            return policy;
-        });
-
-        when(topics.createListener(BaseRuleTest.POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class, controller))
-                        .thenReturn(policyClMgt);
-        when(topics.createListener(eq(BaseRuleTest.APPC_LCM_READ_TOPIC), eq(AppcLcmDmaapWrapper.class),
+        when(topics.createListener(eq(BaseTest.POLICY_CL_MGT_TOPIC), eq(VirtualControlLoopNotification.class),
+                        any(StandardCoder.class))).thenReturn(policyClMgt);
+        when(topics.createListener(eq(BaseTest.APPC_LCM_READ_TOPIC), eq(AppcLcmDmaapWrapper.class),
                         any(StandardCoder.class))).thenReturn(appcLcmRead);
-        when(topics.createListener(eq(BaseRuleTest.APPC_CL_TOPIC), eq(Request.class),
+        when(topics.createListener(eq(BaseTest.APPC_CL_TOPIC), eq(Request.class),
                         any(StandardCoderInstantAsMillis.class))).thenReturn(appcClSink);
-        when(topics.createListener(eq(BaseRuleTest.SDNR_CL_TOPIC), eq(PciMessage.class),
+        when(topics.createListener(eq(BaseTest.SDNR_CL_TOPIC), eq(PciMessage.class),
             any(StandardCoder.class))).thenReturn(sdnrClSink);
 
-        Function<String, Rules> ruleMaker = this::makeRules;
         Supplier<HttpClients> httpClientMaker = this::makeHttpClients;
         Supplier<Simulators> simMaker = this::makeSim;
         Supplier<Topics> topicMaker = this::makeTopics;
 
-        Whitebox.setInternalState(BaseRuleTest.class, "ruleMaker", ruleMaker);
-        Whitebox.setInternalState(BaseRuleTest.class, "httpClientMaker", httpClientMaker);
-        Whitebox.setInternalState(BaseRuleTest.class, "simMaker", simMaker);
-        Whitebox.setInternalState(BaseRuleTest.class, "topicMaker", topicMaker);
+        Whitebox.setInternalState(BaseTest.class, "httpClientMaker", httpClientMaker);
+        Whitebox.setInternalState(BaseTest.class, "simMaker", simMaker);
+        Whitebox.setInternalState(BaseTest.class, "topicMaker", topicMaker);
 
         clMgtQueue = new LinkedList<>();
         appcLcmQueue = new LinkedList<>();
@@ -207,22 +185,19 @@ public class BaseRuleTestTest {
 
         base = new MyTest();
 
-        BaseRuleTest.initStatics(CONTROLLER_NAME);
+        BaseTest.initStatics();
         base.init();
     }
 
     @Test
     public void testInitStatics() {
-        assertSame(rules, BaseRuleTest.rules);
-        assertSame(httpClients, BaseRuleTest.httpClients);
-        assertSame(simulators, BaseRuleTest.simulators);
+        assertSame(httpClients, BaseTest.httpClients);
+        assertSame(simulators, BaseTest.simulators);
     }
 
     @Test
     public void testFinishStatics() {
-        BaseRuleTest.finishStatics();
-
-        verify(rules).destroy();
+        BaseTest.finishStatics();
         verify(httpClients).destroy();
         verify(simulators).destroy();
     }
@@ -230,15 +205,12 @@ public class BaseRuleTestTest {
     @Test
     public void testInit() {
         assertSame(topics, base.getTopics());
-        assertSame(controller, base.controller);
     }
 
     @Test
     public void testFinish() {
         base.finish();
-
         verify(topics).destroy();
-        verify(rules).resetFacts();
     }
 
     @Test
@@ -256,10 +228,10 @@ public class BaseRuleTestTest {
         assertTrue(clMgtQueue.isEmpty());
 
         // initial event
-        verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any());
+        verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any());
 
         // replies to each APPC request
-        verify(topics, times(6)).inject(eq(BaseRuleTest.APPC_LCM_WRITE_TOPIC), any(), any());
+        verify(topics, times(6)).inject(eq(BaseTest.APPC_LCM_WRITE_TOPIC), any(), any());
     }
 
     @Test
@@ -285,11 +257,11 @@ public class BaseRuleTestTest {
         assertTrue(clMgtQueue.isEmpty());
 
         // initial events
-        verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any());
-        verify(topics, times(2)).inject(eq(BaseRuleTest.DCAE_TOPIC), any(), any());
+        verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any());
+        verify(topics, times(2)).inject(eq(BaseTest.DCAE_TOPIC), any(), any());
 
         // two restarts
-        verify(topics, times(2)).inject(eq(BaseRuleTest.APPC_LCM_WRITE_TOPIC), any(), any());
+        verify(topics, times(2)).inject(eq(BaseTest.APPC_LCM_WRITE_TOPIC), any(), any());
     }
 
     @Test
@@ -317,10 +289,10 @@ public class BaseRuleTestTest {
         assertTrue(clMgtQueue.isEmpty());
 
         // initial events
-        verify(topics, times(3)).inject(eq(BaseRuleTest.DCAE_TOPIC), any());
+        verify(topics, times(3)).inject(eq(BaseTest.DCAE_TOPIC), any());
 
         // one restart
-        verify(topics).inject(eq(BaseRuleTest.APPC_LCM_WRITE_TOPIC), any(), any());
+        verify(topics).inject(eq(BaseTest.APPC_LCM_WRITE_TOPIC), any(), any());
     }
 
     @Test
@@ -397,10 +369,10 @@ public class BaseRuleTestTest {
         assertTrue(clMgtQueue.isEmpty());
 
         // initial event
-        verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any());
+        verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any());
 
         // reply to each APPC request
-        verify(topics).inject(eq(BaseRuleTest.APPC_LCM_WRITE_TOPIC), any(), any());
+        verify(topics).inject(eq(BaseTest.APPC_LCM_WRITE_TOPIC), any(), any());
     }
 
     protected void checkAppcLegacyPolicy(String operation, Runnable test) {
@@ -417,10 +389,10 @@ public class BaseRuleTestTest {
         assertTrue(clMgtQueue.isEmpty());
 
         // initial event
-        verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any());
+        verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any());
 
         // reply to each APPC request
-        verify(topics).inject(eq(BaseRuleTest.APPC_CL_TOPIC), any(), any());
+        verify(topics).inject(eq(BaseTest.APPC_CL_TOPIC), any(), any());
     }
 
     protected void checkAppcLegacyPolicyOperationFailure(String operation, Runnable test) {
@@ -437,10 +409,10 @@ public class BaseRuleTestTest {
         assertTrue(clMgtQueue.isEmpty());
 
         // initial event
-        verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any());
+        verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any());
 
         // reply to each APPC request
-        verify(topics).inject(eq(BaseRuleTest.APPC_CL_TOPIC), any(), any());
+        verify(topics).inject(eq(BaseTest.APPC_CL_TOPIC), any(), any());
     }
 
     protected void checkAppcLegacyPolicyFinalFailure(String operation, Runnable test) {
@@ -456,7 +428,7 @@ public class BaseRuleTestTest {
         assertTrue(clMgtQueue.isEmpty());
 
         // initial event
-        verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any());
+        verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any());
 
         // There were no requests sent
     }
@@ -475,10 +447,10 @@ public class BaseRuleTestTest {
         assertTrue(clMgtQueue.isEmpty());
 
         // initial event
-        verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any());
+        verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any());
 
         // reply to each SDNR request
-        verify(topics).inject(eq(BaseRuleTest.SDNR_CL_RSP_TOPIC), any(), any());
+        verify(topics).inject(eq(BaseTest.SDNR_CL_RSP_TOPIC), any(), any());
     }
 
     protected void checkHttpPolicy(Runnable test) {
@@ -493,7 +465,7 @@ public class BaseRuleTestTest {
         assertTrue(clMgtQueue.isEmpty());
 
         // initial event
-        verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any());
+        verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any());
     }
 
     protected void checkHttpPolicyCompliantFailure(Runnable test) {
@@ -508,7 +480,7 @@ public class BaseRuleTestTest {
         assertTrue(clMgtQueue.isEmpty());
 
         // initial event
-        verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any());
+        verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any());
     }
 
     private void enqueueClMgt(ControlLoopNotificationType type) {
@@ -570,10 +542,6 @@ public class BaseRuleTestTest {
         }
     }
 
-    private Rules makeRules(String controllerName) {
-        return rules;
-    }
-
     private HttpClients makeHttpClients() {
         return httpClients;
     }
@@ -590,7 +558,7 @@ public class BaseRuleTestTest {
      * We don't want junit trying to run this, so it's marked "Ignore".
      */
     @Ignore
-    private class MyTest extends BaseRuleTest {
+    private class MyTest extends BaseTest {
 
         @Override
         protected void waitForLockAndPermit(ToscaPolicy policy, Listener<VirtualControlLoopNotification> policyClMgt) {
diff --git a/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTestTest.java b/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTestTest.java
new file mode 100644 (file)
index 0000000..a21fa0a
--- /dev/null
@@ -0,0 +1,294 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. 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.policy.controlloop.common.rules.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.policy.appc.Request;
+import org.onap.policy.appclcm.AppcLcmBody;
+import org.onap.policy.appclcm.AppcLcmCommonHeader;
+import org.onap.policy.appclcm.AppcLcmDmaapWrapper;
+import org.onap.policy.appclcm.AppcLcmInput;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.StandardCoderInstantAsMillis;
+import org.onap.policy.controlloop.ControlLoopNotificationType;
+import org.onap.policy.controlloop.VirtualControlLoopNotification;
+import org.onap.policy.drools.controller.DroolsController;
+import org.onap.policy.drools.system.PolicyController;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
+import org.onap.policy.sdnr.PciMessage;
+import org.powermock.reflect.Whitebox;
+
+public class DroolsRuleTestTest {
+
+    private static final String CONTROLLER_NAME = "my-controller-name";
+    private static final String POLICY_NAME = "my-policy-name";
+
+    // saved values
+    private static Function<String, Rules> ruleMaker;
+    private static Supplier<HttpClients> httpClientMaker;
+    private static Supplier<Simulators> simMaker;
+    private static Supplier<Topics> topicMaker;
+
+    private DroolsRuleTest base;
+    private LinkedList<VirtualControlLoopNotification> clMgtQueue;
+    private Queue<AppcLcmDmaapWrapper> appcLcmQueue;
+    private int permitCount;
+    private int finalCount;
+
+    @Mock
+    private PolicyController controller;
+    @Mock
+    private Rules rules;
+    @Mock
+    private HttpClients httpClients;
+    @Mock
+    private Simulators simulators;
+    @Mock
+    private Topics topics;
+    @Mock
+    private Listener<VirtualControlLoopNotification> policyClMgt;
+    @Mock
+    private Listener<Request> appcClSink;
+    @Mock
+    private Listener<AppcLcmDmaapWrapper> appcLcmRead;
+    @Mock
+    private Listener<PciMessage> sdnrClSink;
+    @Mock
+    private DroolsController drools;
+    @Mock
+    private ToscaPolicy policy;
+    @Mock
+    private ToscaPolicyIdentifier policyIdent;
+
+
+    /**
+     * Saves static values from the class.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        ruleMaker = Whitebox.getInternalState(DroolsRuleTest.class, "ruleMaker");
+        httpClientMaker = Whitebox.getInternalState(DroolsRuleTest.class, "httpClientMaker");
+        simMaker = Whitebox.getInternalState(DroolsRuleTest.class, "simMaker");
+        topicMaker = Whitebox.getInternalState(DroolsRuleTest.class, "topicMaker");
+    }
+
+    /**
+     * Restores static values.
+     */
+    @AfterClass
+    public static void tearDownAfterClass() {
+        Whitebox.setInternalState(DroolsRuleTest.class, "ruleMaker", ruleMaker);
+        Whitebox.setInternalState(DroolsRuleTest.class, "httpClientMaker", httpClientMaker);
+        Whitebox.setInternalState(DroolsRuleTest.class, "simMaker", simMaker);
+        Whitebox.setInternalState(DroolsRuleTest.class, "topicMaker", topicMaker);
+    }
+
+    /**
+     * Sets up.
+     */
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        when(policy.getIdentifier()).thenReturn(policyIdent);
+        when(policyIdent.getName()).thenReturn(POLICY_NAME);
+
+        when(drools.factCount(CONTROLLER_NAME)).thenReturn(0L);
+        when(controller.getDrools()).thenReturn(drools);
+
+        when(rules.getControllerName()).thenReturn(CONTROLLER_NAME);
+        when(rules.getController()).thenReturn(controller);
+        when(rules.setupPolicyFromFile(any())).thenAnswer(args -> {
+            when(drools.factCount(CONTROLLER_NAME)).thenReturn(2L);
+            return policy;
+        });
+
+        when(topics.createListener(DroolsRuleTest.POLICY_CL_MGT_TOPIC,
+             VirtualControlLoopNotification.class, controller)).thenReturn(policyClMgt);
+        when(topics.createListener(eq(DroolsRuleTest.APPC_LCM_READ_TOPIC), eq(AppcLcmDmaapWrapper.class),
+                        any(StandardCoder.class))).thenReturn(appcLcmRead);
+        when(topics.createListener(eq(DroolsRuleTest.APPC_CL_TOPIC), eq(Request.class),
+                        any(StandardCoderInstantAsMillis.class))).thenReturn(appcClSink);
+        when(topics.createListener(eq(DroolsRuleTest.SDNR_CL_TOPIC), eq(PciMessage.class),
+            any(StandardCoder.class))).thenReturn(sdnrClSink);
+
+        Function<String, Rules> ruleMaker = this::makeRules;
+        Supplier<HttpClients> httpClientMaker = this::makeHttpClients;
+        Supplier<Simulators> simMaker = this::makeSim;
+        Supplier<Topics> topicMaker = this::makeTopics;
+
+        Whitebox.setInternalState(DroolsRuleTest.class, "ruleMaker", ruleMaker);
+        Whitebox.setInternalState(DroolsRuleTest.class, "httpClientMaker", httpClientMaker);
+        Whitebox.setInternalState(DroolsRuleTest.class, "simMaker", simMaker);
+        Whitebox.setInternalState(DroolsRuleTest.class, "topicMaker", topicMaker);
+
+        clMgtQueue = new LinkedList<>();
+        appcLcmQueue = new LinkedList<>();
+
+        when(policyClMgt.await(any())).thenAnswer(args -> {
+            VirtualControlLoopNotification notif = clMgtQueue.remove();
+            Predicate<VirtualControlLoopNotification> pred = args.getArgument(0);
+            assertTrue(pred.test(notif));
+            return notif;
+        });
+
+        when(appcLcmRead.await(any())).thenAnswer(args -> {
+            AppcLcmDmaapWrapper req = appcLcmQueue.remove();
+            Predicate<AppcLcmDmaapWrapper> pred = args.getArgument(0);
+            assertTrue(pred.test(req));
+            return req;
+        });
+
+        permitCount = 0;
+        finalCount = 0;
+
+        base = new MyDroolsTest();
+        DroolsRuleTest.initStatics(CONTROLLER_NAME);
+        base.init();
+    }
+
+    @Test
+    public void testInitStatics() {
+        assertSame(rules, DroolsRuleTest.rules);
+        assertSame(httpClients, DroolsRuleTest.httpClients);
+        assertSame(simulators, DroolsRuleTest.simulators);
+    }
+
+    @Test
+    public void testFinishStatics() {
+        DroolsRuleTest.finishStatics();
+
+        verify(rules).destroy();
+        verify(httpClients).destroy();
+        verify(simulators).destroy();
+    }
+
+    @Test
+    public void testInit() {
+        assertSame(topics, base.getTopics());
+        assertSame(controller, base.controller);
+    }
+
+    @Test
+    public void testDroolsTestService123Compliant() {
+        enqueueAppcLcm("restart", "restart", "restart", "restart", "rebuild", "migrate");
+        enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS);
+        enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS);
+        System.out.println("Drools TestTest Here");
+        base.testService123Compliant();
+
+        assertEquals(1, permitCount);
+        assertEquals(1, finalCount);
+
+        assertTrue(appcLcmQueue.isEmpty());
+        assertTrue(clMgtQueue.isEmpty());
+
+        // initial event
+        verify(topics).inject(eq(DroolsRuleTest.DCAE_TOPIC), any());
+
+        // replies to each APPC request
+        verify(topics, times(6)).inject(eq(DroolsRuleTest.APPC_LCM_WRITE_TOPIC), any(), any());
+    }
+
+    private void enqueueClMgt(ControlLoopNotificationType type) {
+        VirtualControlLoopNotification notif = new VirtualControlLoopNotification();
+        notif.setNotification(type);
+        notif.setPolicyName(POLICY_NAME + ".EVENT.MANAGER.FINAL");
+
+        clMgtQueue.add(notif);
+    }
+
+    private void enqueueAppcLcm(String... operationNames) {
+        for (String oper : operationNames) {
+            AppcLcmDmaapWrapper req = new AppcLcmDmaapWrapper();
+            req.setRpcName(oper);
+
+            AppcLcmBody body = new AppcLcmBody();
+            req.setBody(body);
+
+            AppcLcmInput input = new AppcLcmInput();
+            body.setInput(input);
+
+            AppcLcmCommonHeader header = new AppcLcmCommonHeader();
+            input.setCommonHeader(header);
+
+            header.setSubRequestId("my-subrequest-id");
+
+            appcLcmQueue.add(req);
+        }
+    }
+
+    private Rules makeRules(String controllerName) {
+        return rules;
+    }
+
+    private HttpClients makeHttpClients() {
+        return httpClients;
+    }
+
+    private Simulators makeSim() {
+        return simulators;
+    }
+
+    private Topics makeTopics() {
+        return topics;
+    }
+    /*
+     * We don't want junit trying to run this, so it's marked "Ignore".
+     */
+
+    @Ignore
+    private class MyDroolsTest extends DroolsRuleTest {
+
+        @Override
+        protected void waitForLockAndPermit(ToscaPolicy policy, Listener<VirtualControlLoopNotification> policyClMgt) {
+            permitCount++;
+        }
+
+        @Override
+        protected VirtualControlLoopNotification waitForFinal(ToscaPolicy policy,
+                        Listener<VirtualControlLoopNotification> policyClMgt, ControlLoopNotificationType finalType) {
+            finalCount++;
+            return policyClMgt.await(notif -> notif.getNotification() == finalType);
+        }
+    }
+}
\ No newline at end of file