diff options
Diffstat (limited to 'controlloop/common/rules-test/src')
-rw-r--r-- | controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/BaseTest.java (renamed from controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/BaseRuleTest.java) | 130 | ||||
-rw-r--r-- | controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTest.java | 97 | ||||
-rw-r--r-- | controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/Rules.java | 5 | ||||
-rw-r--r-- | controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseTestTest.java (renamed from controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseRuleTestTest.java) | 110 | ||||
-rw-r--r-- | controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTestTest.java | 294 |
5 files changed, 498 insertions, 138 deletions
diff --git a/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/BaseRuleTest.java b/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/BaseTest.java index 7c34fc875..725057661 100644 --- a/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/BaseRuleTest.java +++ b/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/BaseTest.java @@ -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 index 000000000..a57395cb6 --- /dev/null +++ b/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTest.java @@ -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); + } +} diff --git a/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/Rules.java b/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/Rules.java index 62632e9d2..64f088070 100644 --- a/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/Rules.java +++ b/controlloop/common/rules-test/src/main/java/org/onap/policy/controlloop/common/rules/test/Rules.java @@ -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)); diff --git a/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseRuleTestTest.java b/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseTestTest.java index 9f313ca39..ecff7e0bb 100644 --- a/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseRuleTestTest.java +++ b/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseTestTest.java @@ -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; @@ -83,10 +79,6 @@ public class BaseRuleTestTest { private int finalCount; @Mock - private PolicyController controller; - @Mock - private Rules rules; - @Mock private HttpClients httpClients; @Mock private Simulators simulators; @@ -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 index 000000000..a21fa0a93 --- /dev/null +++ b/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTestTest.java @@ -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 |