diff options
Diffstat (limited to 'controlloop/common/rules-test/src/test')
-rw-r--r-- | controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/RulesTest.java | 107 | ||||
-rw-r--r-- | controlloop/common/rules-test/src/test/resources/logback-test.xml | 44 |
2 files changed, 139 insertions, 12 deletions
diff --git a/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/RulesTest.java b/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/RulesTest.java index 28cb977fc..89b1a1b69 100644 --- a/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/RulesTest.java +++ b/controlloop/common/rules-test/src/test/java/org/onap/policy/controlloop/common/rules/test/RulesTest.java @@ -20,6 +20,7 @@ package org.onap.policy.controlloop.common.rules.test; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -32,12 +33,18 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import ch.qos.logback.classic.Logger; import java.io.File; import java.util.LinkedList; import java.util.List; import java.util.Properties; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import org.junit.AfterClass; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.kie.api.definition.rule.Rule; import org.kie.api.event.rule.AfterMatchFiredEvent; @@ -53,6 +60,7 @@ import org.kie.api.runtime.KieSession; import org.kie.api.runtime.rule.Match; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.onap.policy.common.utils.test.log.logback.ExtractAppender; import org.onap.policy.controlloop.ControlLoopEvent; import org.onap.policy.controlloop.drl.legacy.ControlLoopParams; import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager2; @@ -62,8 +70,10 @@ import org.onap.policy.drools.system.PolicyController; import org.onap.policy.drools.system.PolicyControllerFactory; import org.onap.policy.drools.system.PolicyEngine; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; +import org.slf4j.LoggerFactory; public class RulesTest { + private static final String EXPECTED_EXCEPTION = "expected exception"; private static final String CONTROLLER_NAME = "rulesTest"; private static final String POLICY_FILE = "src/test/resources/tosca-policy.json"; private static final String MY_POLICY = "operational.restart"; @@ -71,6 +81,12 @@ public class RulesTest { private static final String MY_RULE_NAME = "my-rule-name"; private static final String MY_TEXT = "my text"; + /** + * Used to attach an appender to the class' logger. + */ + private static final Logger logger = (Logger) LoggerFactory.getLogger(Rules.class); + private static final ExtractAppender appender = new ExtractAppender(); + @Mock private PolicyEngine engine; @Mock @@ -93,6 +109,28 @@ public class RulesTest { private Rules rules; /** + * Attaches the appender to the logger. + */ + @BeforeClass + public static void setUpBeforeClass() throws Exception { + /** + * Attach appender to the logger. + */ + appender.setContext(logger.getLoggerContext()); + appender.start(); + + logger.addAppender(appender); + } + + /** + * Stops the appender. + */ + @AfterClass + public static void tearDownAfterClass() { + appender.stop(); + } + + /** * Sets up. */ @Before @@ -206,18 +244,25 @@ public class RulesTest { } @Test - public void testSetupPolicyFromTemplate_testGetPolicyFromTemplate() { + public void testSetupPolicyFromTemplate_testGetPolicyFromTemplate() throws InterruptedException { rules.setupPolicyFromTemplate("tosca-template.json", MY_POLICY); assertThatIllegalArgumentException() .isThrownBy(() -> rules.setupPolicyFromTemplate("missing-file.json", "a-policy")); + + // check interrupt case + checkInterrupt(() -> rules.setupPolicyFromTemplate("tosca-template.json", MY_POLICY), + "policy operational.restart"); } @Test - public void testSetupPolicyFromFile_testGetPolicyFromFile_testSetupPolicy() { + public void testSetupPolicyFromFile_testGetPolicyFromFile_testSetupPolicy() throws InterruptedException { assertNotNull(rules.setupPolicyFromFile(POLICY_FILE)); assertThatIllegalArgumentException().isThrownBy(() -> rules.setupPolicyFromFile("missing-file.json")); + + // check interrupt case + checkInterrupt(() -> rules.setupPolicyFromFile(POLICY_FILE), "policy " + POLICY_FILE); } @Test @@ -228,23 +273,23 @@ public class RulesTest { // insertions - with and without rule name ObjectInsertedEvent insert = mock(ObjectInsertedEvent.class); when(insert.getObject()).thenReturn(MY_TEXT); - ruleListeners.forEach(listener -> listener.objectInserted(insert)); + checkLogging("inserted", () -> ruleListeners.forEach(listener -> listener.objectInserted(insert))); when(insert.getRule()).thenReturn(rule); - ruleListeners.forEach(listener -> listener.objectInserted(insert)); + checkLogging("inserted", () -> ruleListeners.forEach(listener -> listener.objectInserted(insert))); // updates - with and without rule name ObjectUpdatedEvent update = mock(ObjectUpdatedEvent.class); when(update.getObject()).thenReturn(MY_TEXT); - ruleListeners.forEach(listener -> listener.objectUpdated(update)); + checkLogging("updated", () -> ruleListeners.forEach(listener -> listener.objectUpdated(update))); when(update.getRule()).thenReturn(rule); - ruleListeners.forEach(listener -> listener.objectUpdated(update)); + checkLogging("updated", () -> ruleListeners.forEach(listener -> listener.objectUpdated(update))); // deletions - with and without rule name ObjectDeletedEvent delete = mock(ObjectDeletedEvent.class); when(delete.getOldObject()).thenReturn(MY_TEXT); - ruleListeners.forEach(listener -> listener.objectDeleted(delete)); + checkLogging("deleted", () -> ruleListeners.forEach(listener -> listener.objectDeleted(delete))); when(delete.getRule()).thenReturn(rule); - ruleListeners.forEach(listener -> listener.objectDeleted(delete)); + checkLogging("deleted", () -> ruleListeners.forEach(listener -> listener.objectDeleted(delete))); } @Test @@ -258,22 +303,25 @@ public class RulesTest { // create MatchCreatedEvent create = mock(MatchCreatedEvent.class); when(create.getMatch()).thenReturn(match); - agendaListeners.forEach(listener -> listener.matchCreated(create)); + checkLogging("match created", () -> agendaListeners.forEach(listener -> listener.matchCreated(create))); // cancel MatchCancelledEvent cancel = mock(MatchCancelledEvent.class); when(cancel.getMatch()).thenReturn(match); - agendaListeners.forEach(listener -> listener.matchCancelled(cancel)); + checkLogging("match cancelled", () -> agendaListeners.forEach(listener -> listener.matchCancelled(cancel))); // before-fire BeforeMatchFiredEvent before = mock(BeforeMatchFiredEvent.class); when(before.getMatch()).thenReturn(match); - agendaListeners.forEach(listener -> listener.beforeMatchFired(before)); + // @formatter:off + checkLogging("before match fired", + () -> agendaListeners.forEach(listener -> listener.beforeMatchFired(before))); + // @formatter:on // after-fire AfterMatchFiredEvent after = mock(AfterMatchFiredEvent.class); when(after.getMatch()).thenReturn(match); - agendaListeners.forEach(listener -> listener.afterMatchFired(after)); + checkLogging("after match fired", () -> agendaListeners.forEach(listener -> listener.afterMatchFired(after))); } @Test @@ -285,6 +333,41 @@ public class RulesTest { assertNotNull(rules.getPdpdRepo()); } + private void checkInterrupt(Runnable command, String expectedMsg) throws InterruptedException { + rules = new MyRules() { + @Override + protected ToscaPolicy setupPolicy(ToscaPolicy policy) throws InterruptedException { + throw new InterruptedException(EXPECTED_EXCEPTION); + } + }; + rules.configure(RESOURCE_DIR); + rules.start(); + + BlockingQueue<IllegalArgumentException> exceptions = new LinkedBlockingQueue<>(); + + Thread thread = new Thread(() -> { + try { + command.run(); + } catch (IllegalArgumentException e) { + exceptions.add(e); + } + }); + + thread.setDaemon(true); + thread.start(); + + assertThat(exceptions.poll(10, TimeUnit.SECONDS)).isNotNull().hasMessage(expectedMsg) + .hasCauseInstanceOf(InterruptedException.class); + } + + private void checkLogging(String expectedMsg, Runnable command) { + appender.clearExtractions(); + command.run(); + List<String> messages = appender.getExtracted(); + assertEquals(1, messages.size()); + assertThat(messages.get(0)).contains(expectedMsg); + } + protected void notifyInserted(Object object) { // add it to our list facts.add(object); diff --git a/controlloop/common/rules-test/src/test/resources/logback-test.xml b/controlloop/common/rules-test/src/test/resources/logback-test.xml new file mode 100644 index 000000000..6b09022be --- /dev/null +++ b/controlloop/common/rules-test/src/test/resources/logback-test.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ============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========================================================= +--> + +<configuration> + + <contextName>RulesTest</contextName> + <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> + + <!-- USE FOR STD OUT ONLY --> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <Pattern>%d %level %msg%n</Pattern> + </encoder> + </appender> + + <root level="warn"> + <appender-ref ref="STDOUT" /> + </root> + + <!-- this is required for RulesTest --> + <logger + name="org.onap.policy.controlloop.common.rules.test.Rules" + level="info" additivity="false"> + <appender-ref ref="STDOUT" /> + </logger> +</configuration> |