From 8d0516fd693ae0224100b74a81d09e62cea8ba62 Mon Sep 17 00:00:00 2001 From: Taka Cho Date: Mon, 3 Aug 2020 19:49:45 -0400 Subject: Refactor BaseRuleTest for Drools apps 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 --- .../common/rules/test/BaseRuleTestTest.java | 607 --------------------- .../common/rules/test/BaseTestTest.java | 575 +++++++++++++++++++ .../common/rules/test/DroolsRuleTestTest.java | 294 ++++++++++ 3 files changed, 869 insertions(+), 607 deletions(-) delete mode 100644 controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseRuleTestTest.java create mode 100644 controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseTestTest.java create mode 100644 controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/DroolsRuleTestTest.java (limited to 'controlloop/common/rules-test/src/test') 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/BaseRuleTestTest.java deleted file mode 100644 index 9f313ca39..000000000 --- a/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseRuleTestTest.java +++ /dev/null @@ -1,607 +0,0 @@ -/*- - * ============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.spy; -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.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; -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.CommonHeader; -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.PciBody; -import org.onap.policy.sdnr.PciCommonHeader; -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"; - private static final String POLICY_NAME = "my-policy-name"; - - // saved values - private static Function ruleMaker; - private static Supplier httpClientMaker; - private static Supplier simMaker; - private static Supplier topicMaker; - - private BaseRuleTest base; - private LinkedList clMgtQueue; - private Queue appcLcmQueue; - private Queue appcLegacyQueue; - private Queue sdnrQueue; - 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 policyClMgt; - @Mock - private Listener appcClSink; - @Mock - private Listener appcLcmRead; - @Mock - private Listener 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(BaseRuleTest.class, "ruleMaker"); - httpClientMaker = Whitebox.getInternalState(BaseRuleTest.class, "httpClientMaker"); - simMaker = Whitebox.getInternalState(BaseRuleTest.class, "simMaker"); - topicMaker = Whitebox.getInternalState(BaseRuleTest.class, "topicMaker"); - } - - /** - * Restores static values. - */ - @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); - } - - /** - * 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(BaseRuleTest.POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class, controller)) - .thenReturn(policyClMgt); - when(topics.createListener(eq(BaseRuleTest.APPC_LCM_READ_TOPIC), eq(AppcLcmDmaapWrapper.class), - any(StandardCoder.class))).thenReturn(appcLcmRead); - when(topics.createListener(eq(BaseRuleTest.APPC_CL_TOPIC), eq(Request.class), - any(StandardCoderInstantAsMillis.class))).thenReturn(appcClSink); - when(topics.createListener(eq(BaseRuleTest.SDNR_CL_TOPIC), eq(PciMessage.class), - any(StandardCoder.class))).thenReturn(sdnrClSink); - - Function ruleMaker = this::makeRules; - Supplier httpClientMaker = this::makeHttpClients; - Supplier simMaker = this::makeSim; - Supplier 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); - - clMgtQueue = new LinkedList<>(); - appcLcmQueue = new LinkedList<>(); - appcLegacyQueue = new LinkedList<>(); - sdnrQueue = new LinkedList<>(); - - when(policyClMgt.await(any())).thenAnswer(args -> { - VirtualControlLoopNotification notif = clMgtQueue.remove(); - Predicate pred = args.getArgument(0); - assertTrue(pred.test(notif)); - return notif; - }); - - when(appcLcmRead.await(any())).thenAnswer(args -> { - AppcLcmDmaapWrapper req = appcLcmQueue.remove(); - Predicate pred = args.getArgument(0); - assertTrue(pred.test(req)); - return req; - }); - - when(appcClSink.await(any())).thenAnswer(args -> { - Request req = appcLegacyQueue.remove(); - Predicate pred = args.getArgument(0); - assertTrue(pred.test(req)); - return req; - }); - - when(sdnrClSink.await(any())).thenAnswer(args -> { - PciMessage pcireq = sdnrQueue.remove(); - Predicate pred = args.getArgument(0); - assertTrue(pred.test(pcireq)); - return pcireq; - }); - - permitCount = 0; - finalCount = 0; - - base = new MyTest(); - - BaseRuleTest.initStatics(CONTROLLER_NAME); - base.init(); - } - - @Test - public void testInitStatics() { - assertSame(rules, BaseRuleTest.rules); - assertSame(httpClients, BaseRuleTest.httpClients); - assertSame(simulators, BaseRuleTest.simulators); - } - - @Test - public void testFinishStatics() { - BaseRuleTest.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 testFinish() { - base.finish(); - - verify(topics).destroy(); - verify(rules).resetFacts(); - } - - @Test - public void testTestService123Compliant() { - enqueueAppcLcm("restart", "restart", "restart", "restart", "rebuild", "migrate"); - enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); - enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); - - base.testService123Compliant(); - - assertEquals(1, permitCount); - assertEquals(1, finalCount); - - assertTrue(appcLcmQueue.isEmpty()); - assertTrue(clMgtQueue.isEmpty()); - - // initial event - verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any()); - - // replies to each APPC request - verify(topics, times(6)).inject(eq(BaseRuleTest.APPC_LCM_WRITE_TOPIC), any(), any()); - } - - @Test - public void testTestDuplicatesEvents() { - // the test expects the count to be incremented by 2 between calls - AtomicLong count = new AtomicLong(5); - base = spy(base); - when(base.getCreateCount()).thenAnswer(args -> count.getAndAdd(2)); - - enqueueAppcLcm("restart", "restart"); - enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); - enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); - - clMgtQueue.get(0).setAai(Map.of("generic-vnf.vnf-id", "duplicate-VNF")); - clMgtQueue.get(1).setAai(Map.of("generic-vnf.vnf-id", "vCPE_Infrastructure_vGMUX_demo_app")); - - base.testDuplicatesEvents(); - - assertEquals(0, permitCount); - assertEquals(2, finalCount); - - assertTrue(appcLcmQueue.isEmpty()); - assertTrue(clMgtQueue.isEmpty()); - - // initial events - verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any()); - verify(topics, times(2)).inject(eq(BaseRuleTest.DCAE_TOPIC), any(), any()); - - // two restarts - verify(topics, times(2)).inject(eq(BaseRuleTest.APPC_LCM_WRITE_TOPIC), any(), any()); - } - - @Test - public void testTestVcpeSunnyDayLegacy() { - checkAppcLcmPolicy("restart", base::testVcpeSunnyDayLegacy); - } - - @Test - public void testTestVcpeSunnyDayCompliant() { - checkAppcLcmPolicy("restart", base::testVcpeSunnyDayCompliant); - } - - @Test - public void testTestVcpeOnsetFloodPrevention() { - enqueueAppcLcm("restart"); - enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); - enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); - - base.testVcpeOnsetFloodPrevention(); - - assertEquals(1, permitCount); - assertEquals(1, finalCount); - - assertTrue(appcLcmQueue.isEmpty()); - assertTrue(clMgtQueue.isEmpty()); - - // initial events - verify(topics, times(3)).inject(eq(BaseRuleTest.DCAE_TOPIC), any()); - - // one restart - verify(topics).inject(eq(BaseRuleTest.APPC_LCM_WRITE_TOPIC), any(), any()); - } - - @Test - public void testTestVdnsSunnyDayLegacy() { - checkHttpPolicy(base::testVdnsSunnyDayLegacy); - } - - @Test - public void testTestVdnsSunnyDayCompliant() { - checkHttpPolicy(base::testVdnsSunnyDayCompliant); - } - - @Test - public void testTestVdnsRainyDayCompliant() { - checkHttpPolicyCompliantFailure(base::testVdnsRainyDayCompliant); - } - - @Test - public void testTestVfwSunnyDayLegacy() { - checkAppcLegacyPolicy("ModifyConfig", base::testVfwSunnyDayLegacy); - } - - @Test - public void testTestVfwSunnyDayCompliant() { - checkAppcLegacyPolicy("ModifyConfig", base::testVfwSunnyDayCompliant); - } - - @Test - public void testTestVfwRainyDayLegacyFailure() { - checkAppcLegacyPolicyOperationFailure("ModifyConfig", base::testVfwRainyDayLegacyFailure); - } - - @Test - public void testTestVfwRainyDayOverallTimeout() { - checkAppcLegacyPolicyFinalFailure("ModifyConfig", base::testVfwRainyDayOverallTimeout); - } - - @Test - public void testTestVfwRainyDayCompliantTimeout() { - checkAppcLegacyPolicyFinalFailure("ModifyConfig", base::testVfwRainyDayCompliantTimeout); - } - - @Test - public void testTestVpciSunnyDayLegacy() { - checkSdnrPolicy("ModifyConfig", base::testVpciSunnyDayLegacy); - } - - @Test - public void testTestVpciSunnyDayCompliant() { - checkSdnrPolicy("ModifyConfig", base::testVpciSunnyDayCompliant); - } - - @Test - public void testTestVsonhSunnyDayLegacy() { - checkSdnrPolicy("ModifyConfigANR", base::testVsonhSunnyDayLegacy); - } - - @Test - public void testTestVsonhSunnyDayCompliant() { - checkSdnrPolicy("ModifyConfigANR", base::testVsonhSunnyDayCompliant); - } - - protected void checkAppcLcmPolicy(String operation, Runnable test) { - enqueueAppcLcm(operation); - enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); - enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); - - test.run(); - - assertEquals(1, permitCount); - assertEquals(1, finalCount); - - assertTrue(appcLcmQueue.isEmpty()); - assertTrue(clMgtQueue.isEmpty()); - - // initial event - verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any()); - - // reply to each APPC request - verify(topics).inject(eq(BaseRuleTest.APPC_LCM_WRITE_TOPIC), any(), any()); - } - - protected void checkAppcLegacyPolicy(String operation, Runnable test) { - enqueueAppcLegacy(operation); - enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); - enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); - - test.run(); - - assertEquals(1, permitCount); - assertEquals(1, finalCount); - - assertTrue(appcLcmQueue.isEmpty()); - assertTrue(clMgtQueue.isEmpty()); - - // initial event - verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any()); - - // reply to each APPC request - verify(topics).inject(eq(BaseRuleTest.APPC_CL_TOPIC), any(), any()); - } - - protected void checkAppcLegacyPolicyOperationFailure(String operation, Runnable test) { - enqueueAppcLegacy(operation); - enqueueClMgt(ControlLoopNotificationType.OPERATION_FAILURE); - enqueueClMgt(ControlLoopNotificationType.FINAL_FAILURE); - - test.run(); - - assertEquals(1, permitCount); - assertEquals(1, finalCount); - - assertTrue(appcLcmQueue.isEmpty()); - assertTrue(clMgtQueue.isEmpty()); - - // initial event - verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any()); - - // reply to each APPC request - verify(topics).inject(eq(BaseRuleTest.APPC_CL_TOPIC), any(), any()); - } - - protected void checkAppcLegacyPolicyFinalFailure(String operation, Runnable test) { - enqueueAppcLegacy(operation); - enqueueClMgt(ControlLoopNotificationType.FINAL_FAILURE); - - test.run(); - - assertEquals(1, permitCount); - assertEquals(1, finalCount); - - assertTrue(appcLcmQueue.isEmpty()); - assertTrue(clMgtQueue.isEmpty()); - - // initial event - verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any()); - - // There were no requests sent - } - - protected void checkSdnrPolicy(String operation, Runnable test) { - enqueueSdnr(operation); - enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); - enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); - - test.run(); - - assertEquals(1, permitCount); - assertEquals(1, finalCount); - - assertTrue(sdnrQueue.isEmpty()); - assertTrue(clMgtQueue.isEmpty()); - - // initial event - verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any()); - - // reply to each SDNR request - verify(topics).inject(eq(BaseRuleTest.SDNR_CL_RSP_TOPIC), any(), any()); - } - - protected void checkHttpPolicy(Runnable test) { - enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); - enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); - - test.run(); - - assertEquals(1, permitCount); - assertEquals(1, finalCount); - - assertTrue(clMgtQueue.isEmpty()); - - // initial event - verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), any()); - } - - protected void checkHttpPolicyCompliantFailure(Runnable test) { - enqueueClMgt(ControlLoopNotificationType.OPERATION_FAILURE); - enqueueClMgt(ControlLoopNotificationType.FINAL_FAILURE); - - test.run(); - - assertEquals(1, permitCount); - assertEquals(1, finalCount); - - assertTrue(clMgtQueue.isEmpty()); - - // initial event - verify(topics).inject(eq(BaseRuleTest.DCAE_TOPIC), 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 void enqueueAppcLegacy(String... operationNames) { - for (String oper : operationNames) { - Request req = new Request(); - req.setAction(oper); - - CommonHeader header = new CommonHeader(); - req.setCommonHeader(header); - - header.setSubRequestId("my-subrequest-id"); - - appcLegacyQueue.add(req); - } - } - - private void enqueueSdnr(String... operationNames) { - for (String oper : operationNames) { - PciMessage pcimessage = new PciMessage(); - PciRequest req = new PciRequest(); - PciBody body = new PciBody(); - body.setInput(req); - pcimessage.setBody(body); - pcimessage.getBody().getInput().setAction(oper); - PciCommonHeader header = new PciCommonHeader(); - pcimessage.getBody().getInput().setCommonHeader(header); - - header.setSubRequestId("my-subrequest-id"); - - sdnrQueue.add(pcimessage); - } - } - - 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 MyTest extends BaseRuleTest { - - @Override - protected void waitForLockAndPermit(ToscaPolicy policy, Listener policyClMgt) { - permitCount++; - } - - @Override - protected VirtualControlLoopNotification waitForFinal(ToscaPolicy policy, - Listener policyClMgt, ControlLoopNotificationType finalType) { - finalCount++; - return policyClMgt.await(notif -> notif.getNotification() == finalType); - } - } -} diff --git a/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseTestTest.java b/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseTestTest.java new file mode 100644 index 000000000..ecff7e0bb --- /dev/null +++ b/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/BaseTestTest.java @@ -0,0 +1,575 @@ +/*- + * ============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.spy; +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.Map; +import java.util.Queue; +import java.util.concurrent.atomic.AtomicLong; +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.CommonHeader; +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.models.tosca.authorative.concepts.ToscaPolicy; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier; +import org.onap.policy.sdnr.PciBody; +import org.onap.policy.sdnr.PciCommonHeader; +import org.onap.policy.sdnr.PciMessage; +import org.onap.policy.sdnr.PciRequest; +import org.powermock.reflect.Whitebox; + +public class BaseTestTest { + private static final String POLICY_NAME = "my-policy-name"; + + // saved values + private static Supplier httpClientMaker; + private static Supplier simMaker; + private static Supplier topicMaker; + + private BaseTest base; + private LinkedList clMgtQueue; + private Queue appcLcmQueue; + private Queue appcLegacyQueue; + private Queue sdnrQueue; + private int permitCount; + private int finalCount; + + @Mock + private HttpClients httpClients; + @Mock + private Simulators simulators; + @Mock + private Topics topics; + @Mock + private Listener policyClMgt; + @Mock + private Listener appcClSink; + @Mock + private Listener appcLcmRead; + @Mock + private Listener sdnrClSink; + @Mock + private DroolsController drools; + @Mock + private ToscaPolicy policy; + @Mock + private ToscaPolicyIdentifier policyIdent; + + + /** + * Saves static values from the class. + */ + @BeforeClass + public static void setUpBeforeClass() { + httpClientMaker = Whitebox.getInternalState(BaseTest.class, "httpClientMaker"); + simMaker = Whitebox.getInternalState(BaseTest.class, "simMaker"); + topicMaker = Whitebox.getInternalState(BaseTest.class, "topicMaker"); + } + + /** + * Restores static values. + */ + @AfterClass + public static void tearDownAfterClass() { + Whitebox.setInternalState(BaseTest.class, "httpClientMaker", httpClientMaker); + Whitebox.setInternalState(BaseTest.class, "simMaker", simMaker); + Whitebox.setInternalState(BaseTest.class, "topicMaker", topicMaker); + } + + /** + * Sets up. + */ + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + when(policy.getIdentifier()).thenReturn(policyIdent); + when(policyIdent.getName()).thenReturn(POLICY_NAME); + + 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(BaseTest.APPC_CL_TOPIC), eq(Request.class), + any(StandardCoderInstantAsMillis.class))).thenReturn(appcClSink); + when(topics.createListener(eq(BaseTest.SDNR_CL_TOPIC), eq(PciMessage.class), + any(StandardCoder.class))).thenReturn(sdnrClSink); + + Supplier httpClientMaker = this::makeHttpClients; + Supplier simMaker = this::makeSim; + Supplier topicMaker = this::makeTopics; + + Whitebox.setInternalState(BaseTest.class, "httpClientMaker", httpClientMaker); + Whitebox.setInternalState(BaseTest.class, "simMaker", simMaker); + Whitebox.setInternalState(BaseTest.class, "topicMaker", topicMaker); + + clMgtQueue = new LinkedList<>(); + appcLcmQueue = new LinkedList<>(); + appcLegacyQueue = new LinkedList<>(); + sdnrQueue = new LinkedList<>(); + + when(policyClMgt.await(any())).thenAnswer(args -> { + VirtualControlLoopNotification notif = clMgtQueue.remove(); + Predicate pred = args.getArgument(0); + assertTrue(pred.test(notif)); + return notif; + }); + + when(appcLcmRead.await(any())).thenAnswer(args -> { + AppcLcmDmaapWrapper req = appcLcmQueue.remove(); + Predicate pred = args.getArgument(0); + assertTrue(pred.test(req)); + return req; + }); + + when(appcClSink.await(any())).thenAnswer(args -> { + Request req = appcLegacyQueue.remove(); + Predicate pred = args.getArgument(0); + assertTrue(pred.test(req)); + return req; + }); + + when(sdnrClSink.await(any())).thenAnswer(args -> { + PciMessage pcireq = sdnrQueue.remove(); + Predicate pred = args.getArgument(0); + assertTrue(pred.test(pcireq)); + return pcireq; + }); + + permitCount = 0; + finalCount = 0; + + base = new MyTest(); + + BaseTest.initStatics(); + base.init(); + } + + @Test + public void testInitStatics() { + assertSame(httpClients, BaseTest.httpClients); + assertSame(simulators, BaseTest.simulators); + } + + @Test + public void testFinishStatics() { + BaseTest.finishStatics(); + verify(httpClients).destroy(); + verify(simulators).destroy(); + } + + @Test + public void testInit() { + assertSame(topics, base.getTopics()); + } + + @Test + public void testFinish() { + base.finish(); + verify(topics).destroy(); + } + + @Test + public void testTestService123Compliant() { + enqueueAppcLcm("restart", "restart", "restart", "restart", "rebuild", "migrate"); + enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); + enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); + + base.testService123Compliant(); + + assertEquals(1, permitCount); + assertEquals(1, finalCount); + + assertTrue(appcLcmQueue.isEmpty()); + assertTrue(clMgtQueue.isEmpty()); + + // initial event + verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any()); + + // replies to each APPC request + verify(topics, times(6)).inject(eq(BaseTest.APPC_LCM_WRITE_TOPIC), any(), any()); + } + + @Test + public void testTestDuplicatesEvents() { + // the test expects the count to be incremented by 2 between calls + AtomicLong count = new AtomicLong(5); + base = spy(base); + when(base.getCreateCount()).thenAnswer(args -> count.getAndAdd(2)); + + enqueueAppcLcm("restart", "restart"); + enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); + enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); + + clMgtQueue.get(0).setAai(Map.of("generic-vnf.vnf-id", "duplicate-VNF")); + clMgtQueue.get(1).setAai(Map.of("generic-vnf.vnf-id", "vCPE_Infrastructure_vGMUX_demo_app")); + + base.testDuplicatesEvents(); + + assertEquals(0, permitCount); + assertEquals(2, finalCount); + + assertTrue(appcLcmQueue.isEmpty()); + assertTrue(clMgtQueue.isEmpty()); + + // initial events + 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(BaseTest.APPC_LCM_WRITE_TOPIC), any(), any()); + } + + @Test + public void testTestVcpeSunnyDayLegacy() { + checkAppcLcmPolicy("restart", base::testVcpeSunnyDayLegacy); + } + + @Test + public void testTestVcpeSunnyDayCompliant() { + checkAppcLcmPolicy("restart", base::testVcpeSunnyDayCompliant); + } + + @Test + public void testTestVcpeOnsetFloodPrevention() { + enqueueAppcLcm("restart"); + enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); + enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); + + base.testVcpeOnsetFloodPrevention(); + + assertEquals(1, permitCount); + assertEquals(1, finalCount); + + assertTrue(appcLcmQueue.isEmpty()); + assertTrue(clMgtQueue.isEmpty()); + + // initial events + verify(topics, times(3)).inject(eq(BaseTest.DCAE_TOPIC), any()); + + // one restart + verify(topics).inject(eq(BaseTest.APPC_LCM_WRITE_TOPIC), any(), any()); + } + + @Test + public void testTestVdnsSunnyDayLegacy() { + checkHttpPolicy(base::testVdnsSunnyDayLegacy); + } + + @Test + public void testTestVdnsSunnyDayCompliant() { + checkHttpPolicy(base::testVdnsSunnyDayCompliant); + } + + @Test + public void testTestVdnsRainyDayCompliant() { + checkHttpPolicyCompliantFailure(base::testVdnsRainyDayCompliant); + } + + @Test + public void testTestVfwSunnyDayLegacy() { + checkAppcLegacyPolicy("ModifyConfig", base::testVfwSunnyDayLegacy); + } + + @Test + public void testTestVfwSunnyDayCompliant() { + checkAppcLegacyPolicy("ModifyConfig", base::testVfwSunnyDayCompliant); + } + + @Test + public void testTestVfwRainyDayLegacyFailure() { + checkAppcLegacyPolicyOperationFailure("ModifyConfig", base::testVfwRainyDayLegacyFailure); + } + + @Test + public void testTestVfwRainyDayOverallTimeout() { + checkAppcLegacyPolicyFinalFailure("ModifyConfig", base::testVfwRainyDayOverallTimeout); + } + + @Test + public void testTestVfwRainyDayCompliantTimeout() { + checkAppcLegacyPolicyFinalFailure("ModifyConfig", base::testVfwRainyDayCompliantTimeout); + } + + @Test + public void testTestVpciSunnyDayLegacy() { + checkSdnrPolicy("ModifyConfig", base::testVpciSunnyDayLegacy); + } + + @Test + public void testTestVpciSunnyDayCompliant() { + checkSdnrPolicy("ModifyConfig", base::testVpciSunnyDayCompliant); + } + + @Test + public void testTestVsonhSunnyDayLegacy() { + checkSdnrPolicy("ModifyConfigANR", base::testVsonhSunnyDayLegacy); + } + + @Test + public void testTestVsonhSunnyDayCompliant() { + checkSdnrPolicy("ModifyConfigANR", base::testVsonhSunnyDayCompliant); + } + + protected void checkAppcLcmPolicy(String operation, Runnable test) { + enqueueAppcLcm(operation); + enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); + enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); + + test.run(); + + assertEquals(1, permitCount); + assertEquals(1, finalCount); + + assertTrue(appcLcmQueue.isEmpty()); + assertTrue(clMgtQueue.isEmpty()); + + // initial event + verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any()); + + // reply to each APPC request + verify(topics).inject(eq(BaseTest.APPC_LCM_WRITE_TOPIC), any(), any()); + } + + protected void checkAppcLegacyPolicy(String operation, Runnable test) { + enqueueAppcLegacy(operation); + enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); + enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); + + test.run(); + + assertEquals(1, permitCount); + assertEquals(1, finalCount); + + assertTrue(appcLcmQueue.isEmpty()); + assertTrue(clMgtQueue.isEmpty()); + + // initial event + verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any()); + + // reply to each APPC request + verify(topics).inject(eq(BaseTest.APPC_CL_TOPIC), any(), any()); + } + + protected void checkAppcLegacyPolicyOperationFailure(String operation, Runnable test) { + enqueueAppcLegacy(operation); + enqueueClMgt(ControlLoopNotificationType.OPERATION_FAILURE); + enqueueClMgt(ControlLoopNotificationType.FINAL_FAILURE); + + test.run(); + + assertEquals(1, permitCount); + assertEquals(1, finalCount); + + assertTrue(appcLcmQueue.isEmpty()); + assertTrue(clMgtQueue.isEmpty()); + + // initial event + verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any()); + + // reply to each APPC request + verify(topics).inject(eq(BaseTest.APPC_CL_TOPIC), any(), any()); + } + + protected void checkAppcLegacyPolicyFinalFailure(String operation, Runnable test) { + enqueueAppcLegacy(operation); + enqueueClMgt(ControlLoopNotificationType.FINAL_FAILURE); + + test.run(); + + assertEquals(1, permitCount); + assertEquals(1, finalCount); + + assertTrue(appcLcmQueue.isEmpty()); + assertTrue(clMgtQueue.isEmpty()); + + // initial event + verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any()); + + // There were no requests sent + } + + protected void checkSdnrPolicy(String operation, Runnable test) { + enqueueSdnr(operation); + enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); + enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); + + test.run(); + + assertEquals(1, permitCount); + assertEquals(1, finalCount); + + assertTrue(sdnrQueue.isEmpty()); + assertTrue(clMgtQueue.isEmpty()); + + // initial event + verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any()); + + // reply to each SDNR request + verify(topics).inject(eq(BaseTest.SDNR_CL_RSP_TOPIC), any(), any()); + } + + protected void checkHttpPolicy(Runnable test) { + enqueueClMgt(ControlLoopNotificationType.OPERATION_SUCCESS); + enqueueClMgt(ControlLoopNotificationType.FINAL_SUCCESS); + + test.run(); + + assertEquals(1, permitCount); + assertEquals(1, finalCount); + + assertTrue(clMgtQueue.isEmpty()); + + // initial event + verify(topics).inject(eq(BaseTest.DCAE_TOPIC), any()); + } + + protected void checkHttpPolicyCompliantFailure(Runnable test) { + enqueueClMgt(ControlLoopNotificationType.OPERATION_FAILURE); + enqueueClMgt(ControlLoopNotificationType.FINAL_FAILURE); + + test.run(); + + assertEquals(1, permitCount); + assertEquals(1, finalCount); + + assertTrue(clMgtQueue.isEmpty()); + + // initial event + verify(topics).inject(eq(BaseTest.DCAE_TOPIC), 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 void enqueueAppcLegacy(String... operationNames) { + for (String oper : operationNames) { + Request req = new Request(); + req.setAction(oper); + + CommonHeader header = new CommonHeader(); + req.setCommonHeader(header); + + header.setSubRequestId("my-subrequest-id"); + + appcLegacyQueue.add(req); + } + } + + private void enqueueSdnr(String... operationNames) { + for (String oper : operationNames) { + PciMessage pcimessage = new PciMessage(); + PciRequest req = new PciRequest(); + PciBody body = new PciBody(); + body.setInput(req); + pcimessage.setBody(body); + pcimessage.getBody().getInput().setAction(oper); + PciCommonHeader header = new PciCommonHeader(); + pcimessage.getBody().getInput().setCommonHeader(header); + + header.setSubRequestId("my-subrequest-id"); + + sdnrQueue.add(pcimessage); + } + } + + 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 MyTest extends BaseTest { + + @Override + protected void waitForLockAndPermit(ToscaPolicy policy, Listener policyClMgt) { + permitCount++; + } + + @Override + protected VirtualControlLoopNotification waitForFinal(ToscaPolicy policy, + Listener policyClMgt, ControlLoopNotificationType finalType) { + finalCount++; + return policyClMgt.await(notif -> notif.getNotification() == finalType); + } + } +} 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 ruleMaker; + private static Supplier httpClientMaker; + private static Supplier simMaker; + private static Supplier topicMaker; + + private DroolsRuleTest base; + private LinkedList clMgtQueue; + private Queue 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 policyClMgt; + @Mock + private Listener appcClSink; + @Mock + private Listener appcLcmRead; + @Mock + private Listener 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 ruleMaker = this::makeRules; + Supplier httpClientMaker = this::makeHttpClients; + Supplier simMaker = this::makeSim; + Supplier 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 pred = args.getArgument(0); + assertTrue(pred.test(notif)); + return notif; + }); + + when(appcLcmRead.await(any())).thenAnswer(args -> { + AppcLcmDmaapWrapper req = appcLcmQueue.remove(); + Predicate 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 policyClMgt) { + permitCount++; + } + + @Override + protected VirtualControlLoopNotification waitForFinal(ToscaPolicy policy, + Listener policyClMgt, ControlLoopNotificationType finalType) { + finalCount++; + return policyClMgt.await(notif -> notif.getNotification() == finalType); + } + } +} \ No newline at end of file -- cgit 1.2.3-korg