diff options
author | liamfallon <liam.fallon@est.tech> | 2019-07-10 19:44:39 +0000 |
---|---|---|
committer | liamfallon <liam.fallon@est.tech> | 2019-07-10 19:44:39 +0000 |
commit | adf67497761295115dc75b525500d687518fc4fd (patch) | |
tree | c5c5b5e737ac08256e9f782b5dccbd3ddc08d3c3 /testsuites/integration/integration-uservice-test/src/test/java | |
parent | 5c384fb2888029c2babb859c30318749e1ce828c (diff) |
Add integration tests for executor properties
Added integration test that sets properties in a dummy plugin and amends
them in tasks in a policy. Variosu tests added to check combinations of
where properties are set in plugins or in tasks or both.
Implementaiton changed to:
- Always pass in a Properies object, the properties object coming into
the policy cannot be null because the task/TSL/SFL may wish to set it
- Fix a bug where the properties were not passed from the ApexEvent to
the engine event in the ApexEventUnmarshaller class
Issue-ID: POLICY-1743
Change-Id: I6aa152b28d46cf3cc6fa56a1a95b76a8e55f5a49
Signed-off-by: liamfallon <liam.fallon@est.tech>
Diffstat (limited to 'testsuites/integration/integration-uservice-test/src/test/java')
5 files changed, 562 insertions, 0 deletions
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyApexEventConsumer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyApexEventConsumer.java new file mode 100644 index 000000000..e5a88a365 --- /dev/null +++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyApexEventConsumer.java @@ -0,0 +1,136 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 Nordix Foundation. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.apex.testsuites.integration.uservice.executionproperties; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.EnumMap; +import java.util.Map; +import java.util.Properties; + +import org.onap.policy.apex.service.engine.event.ApexEventConsumer; +import org.onap.policy.apex.service.engine.event.ApexEventException; +import org.onap.policy.apex.service.engine.event.ApexEventReceiver; +import org.onap.policy.apex.service.engine.event.ApexEventRuntimeException; +import org.onap.policy.apex.service.engine.event.PeeredReference; +import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerParameters; +import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerPeeredMode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Dummy Apex event consumer for testing event properties. + * + * @author Liam Fallon (liam.fallon@est.tech) + */ +public class DummyApexEventConsumer implements ApexEventConsumer { + // Get a reference to the logger + private static final Logger LOGGER = LoggerFactory.getLogger(DummyApexEventConsumer.class); + + // The event receiver that will receive events from this consumer + private ApexEventReceiver eventReceiver; + + // The name for this consumer + private String name = null; + + // The peer references for this event handler + private Map<EventHandlerPeeredMode, PeeredReference> peerReferenceMap = new EnumMap<>(EventHandlerPeeredMode.class); + + private DummyCarrierTechnologyParameters dummyConsumerProperties = null; + + @Override + public void init(final String consumerName, final EventHandlerParameters consumerParameters, + final ApexEventReceiver incomingEventReceiver) throws ApexEventException { + this.eventReceiver = incomingEventReceiver; + this.name = consumerName; + + + // Check and get the properties + if (!(consumerParameters.getCarrierTechnologyParameters() instanceof DummyCarrierTechnologyParameters)) { + String message = "specified consumer properties of type \"" + + consumerParameters.getCarrierTechnologyParameters().getClass().getCanonicalName() + + "\" are not applicable to a dummy consumer"; + LOGGER.warn(message); + throw new ApexEventException(message); + } + + dummyConsumerProperties = + (DummyCarrierTechnologyParameters) consumerParameters.getCarrierTechnologyParameters(); + } + + @Override + public void start() { + new Thread(new RunTestEventSender()).start(); + } + + /** + * {@inheritDoc}. + */ + @Override + public String getName() { + return name; + } + + /** + * {@inheritDoc}. + */ + @Override + public PeeredReference getPeeredReference(final EventHandlerPeeredMode peeredMode) { + return peerReferenceMap.get(peeredMode); + } + + /** + * {@inheritDoc}. + */ + @Override + public void setPeeredReference(final EventHandlerPeeredMode peeredMode, final PeeredReference peeredReference) { + peerReferenceMap.put(peeredMode, peeredReference); + } + + @Override + public void stop() {} + + private class RunTestEventSender implements Runnable { + @Override + public void run() { + Properties executionProperties = new Properties(); + try { + executionProperties.load(new FileInputStream(new File(dummyConsumerProperties.getPropertyFileName()))); + } catch (IOException e1) { + String message = "reading of executor properties for testing failed from file: " + + dummyConsumerProperties.getPropertyFileName(); + LOGGER.warn(message); + throw new ApexEventRuntimeException(message); + } + + RunTestEvent event = new RunTestEvent(); + event.setTestToRun(dummyConsumerProperties.getTestToRun()); + try { + eventReceiver.receiveEvent(executionProperties, event.toJson()); + } catch (Exception e) { + String message = "event processing for executor properties testing failed: " + e.getMessage(); + LOGGER.warn(message, e); + throw new ApexEventRuntimeException(message, e); + } + } + } +} diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyApexEventProducer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyApexEventProducer.java new file mode 100644 index 000000000..0c2ac32fa --- /dev/null +++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyApexEventProducer.java @@ -0,0 +1,145 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 Nordix Foundation. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.apex.testsuites.integration.uservice.executionproperties; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.EnumMap; +import java.util.Map; +import java.util.Properties; + +import org.onap.policy.apex.service.engine.event.ApexEventException; +import org.onap.policy.apex.service.engine.event.ApexEventProducer; +import org.onap.policy.apex.service.engine.event.ApexEventRuntimeException; +import org.onap.policy.apex.service.engine.event.PeeredReference; +import org.onap.policy.apex.service.engine.event.SynchronousEventCache; +import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerParameters; +import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerPeeredMode; +import org.onap.policy.common.utils.coder.CoderException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Dummy Apex event producer for testing event properties. + * + * @author Liam Fallon (liam.fallon@est.tech) + */ +public class DummyApexEventProducer implements ApexEventProducer { + // Get a reference to the logger + private static final Logger LOGGER = LoggerFactory.getLogger(DummyApexEventProducer.class); + + // The parameters read from the parameter service + private DummyCarrierTechnologyParameters dummyProducerProperties; + + // The name for this producer + private String name = null; + + // The peer references for this event handler + private Map<EventHandlerPeeredMode, PeeredReference> peerReferenceMap = new EnumMap<>(EventHandlerPeeredMode.class); + + @Override + public void init(final String producerName, final EventHandlerParameters producerParameters) + throws ApexEventException { + this.name = producerName; + + // Check and get the Properties + if (!(producerParameters.getCarrierTechnologyParameters() instanceof DummyCarrierTechnologyParameters)) { + String message = "specified producer properties are not applicable to a dummy producer (" + this.name + ")"; + LOGGER.warn(message); + throw new ApexEventException(message); + } + dummyProducerProperties = + (DummyCarrierTechnologyParameters) producerParameters.getCarrierTechnologyParameters(); + + new File(dummyProducerProperties.getPropertyFileName()).delete(); + } + + /** + * {@inheritDoc}. + */ + @Override + public String getName() { + return name; + } + + /** + * {@inheritDoc}. + */ + @Override + public PeeredReference getPeeredReference(final EventHandlerPeeredMode peeredMode) { + return peerReferenceMap.get(peeredMode); + } + + /** + * {@inheritDoc}. + */ + @Override + public void setPeeredReference(final EventHandlerPeeredMode peeredMode, final PeeredReference peeredReference) { + peerReferenceMap.put(peeredMode, peeredReference); + } + + /** + * {@inheritDoc}. + */ + @Override + public void sendEvent(final long executionId, final Properties executionProperties, final String eventName, + final Object eventAsJsonString) { + // Check if this is a synchronized event, if so we have received a reply + final SynchronousEventCache synchronousEventCache = + (SynchronousEventCache) peerReferenceMap.get(EventHandlerPeeredMode.SYNCHRONOUS); + if (synchronousEventCache != null) { + synchronousEventCache.removeCachedEventToApexIfExists(executionId); + } + + RunTestEvent testEvent = new RunTestEvent(); + try { + testEvent.fromJson((String) eventAsJsonString); + } catch (CoderException ce) { + String message = "could not decode event from JSON"; + LOGGER.warn(message, ce); + throw new ApexEventRuntimeException(message, ce); + } + if (!dummyProducerProperties.getTestToRun().equals(testEvent.getTestToRun())) { + String message = "tests in received test event and parameters do not match " + testEvent.getTestToRun() + + ":" + dummyProducerProperties.getTestToRun(); + LOGGER.warn(message); + throw new ApexEventRuntimeException(message); + } + + + try { + executionProperties.store(new FileOutputStream(new File(dummyProducerProperties.getPropertyFileName())), + ""); + } catch (IOException ioe) { + String message = "writing of executor properties for testing failed from file: " + + dummyProducerProperties.getPropertyFileName(); + LOGGER.warn(message, ioe); + throw new ApexEventRuntimeException(message, ioe); + } + } + + /** + * {@inheritDoc}. + */ + @Override + public void stop() {} +} diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyCarrierTechnologyParameters.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyCarrierTechnologyParameters.java new file mode 100644 index 000000000..08d78daaf --- /dev/null +++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyCarrierTechnologyParameters.java @@ -0,0 +1,88 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 Nordix Foundation. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.apex.testsuites.integration.uservice.executionproperties; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import org.apache.commons.lang3.StringUtils; +import org.onap.policy.apex.service.parameters.carriertechnology.CarrierTechnologyParameters; +import org.onap.policy.common.parameters.GroupValidationResult; +import org.onap.policy.common.parameters.ValidationStatus; + +/** + * Dummy carrier technology parameters. + * + * <p>The parameters for this plugin are: + * <ol> + * <li>testToRun: The name of the test to run. + * </ol> + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class DummyCarrierTechnologyParameters extends CarrierTechnologyParameters { + + /** The label of this carrier technology. */ + public static final String DUMMY_CARRIER_TECHNOLOGY_LABEL = "DUMMY"; + + /** The producer plugin class for the dummy carrier technology. */ + public static final String DUMMY_EVENT_PRODUCER_PLUGIN_CLASS = DummyApexEventProducer.class.getName(); + + /** The consumer plugin class for the dummy carrier technology. */ + public static final String DUMMY_EVENT_CONSUMER_PLUGIN_CLASS = DummyApexEventConsumer.class.getName(); + + private String testToRun = null; + private String propertyFileName = null; + + /** + * Constructor to create a dummy carrier technology parameters instance and register the instance with the parameter + * service. + */ + public DummyCarrierTechnologyParameters() { + super(); + + // Set the carrier technology properties for the web socket carrier technology + this.setLabel(DUMMY_CARRIER_TECHNOLOGY_LABEL); + this.setEventProducerPluginClass(DUMMY_EVENT_PRODUCER_PLUGIN_CLASS); + this.setEventConsumerPluginClass(DUMMY_EVENT_CONSUMER_PLUGIN_CLASS); + + } + + /** + * {@inheritDoc}. + */ + @Override + public GroupValidationResult validate() { + final GroupValidationResult result = super.validate(); + + if (StringUtils.isEmpty(testToRun)) { + result.setResult("testToRun", ValidationStatus.INVALID, + "no test has been specified on the dummy carrier technology plugin"); + } + + if (StringUtils.isEmpty(propertyFileName)) { + result.setResult("propertyFileName", ValidationStatus.INVALID, + "no propertyFileName has been specified on the dummy carrier technology plugin"); + } + + return result; + } +} diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/RunTestEvent.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/RunTestEvent.java new file mode 100644 index 000000000..f740468ab --- /dev/null +++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/RunTestEvent.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 Nordix Foundation. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.apex.testsuites.integration.uservice.executionproperties; + +import lombok.Data; + +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; + +/** + * Test event fgor execution properties. + * + * @author Liam Fallon (liam.fallon@est.tech) + */ +@Data +public class RunTestEvent { + private String testToRun; + private String propertyFileName; + + public String toJson() throws CoderException { + return new StandardCoder().encode(this); + } + + /** + * Set fields of this event from a JSON string. + * + * @param jsonString the JSON string + * @throws CoderException on JSON exceptions + */ + public void fromJson(final String jsonString) throws CoderException { + RunTestEvent jsonTestEvent = new StandardCoder().decode(jsonString, RunTestEvent.class); + this.testToRun = jsonTestEvent.testToRun; + this.propertyFileName = jsonTestEvent.propertyFileName; + } +} diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/TestExecutionProperties.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/TestExecutionProperties.java new file mode 100644 index 000000000..9327748b8 --- /dev/null +++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/TestExecutionProperties.java @@ -0,0 +1,140 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 Nordix Foundation. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.apex.testsuites.integration.uservice.executionproperties; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.FileInputStream; +import java.util.Properties; +import java.util.concurrent.TimeUnit; + +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.policy.apex.auth.clieditor.ApexCommandLineEditorMain; +import org.onap.policy.apex.service.engine.main.ApexMain; + +/** + * This class runs integration tests for execution properties. + */ +public class TestExecutionProperties { + /** + * Compile the policy. + */ + @BeforeClass + public static void compilePolicy() { + // @formatter:off + final String[] cliArgs = { + "-c", + "src/test/resources/policies/executionproperties/policy/ExecutionPropertiesTestPolicyModel.apex", + "-l", + "target/ExecutionPropertiesTestPolicyModel.log", + "-o", + "target/ExecutionPropertiesTestPolicyModel.json" + }; + // @formatter:on + + new ApexCommandLineEditorMain(cliArgs); + } + + /** + * Clear relative file root environment variable. + */ + @Before + public void clearRelativeFileRoot() { + System.clearProperty("APEX_RELATIVE_FILE_ROOT"); + } + + /** + * Test read only execution properties are returned from policy. + */ + @Test + public void testReadOnly() throws Exception { + testExecutionProperties("readOnly"); + } + + /** + * Test where execution properties set in task. + */ + @Test + public void testEmptyToDefined() throws Exception { + testExecutionProperties("emptyToDefined"); + } + + /** + * Test where execution properties cleared in task. + */ + @Test + public void testDefinedToEmpty() throws Exception { + testExecutionProperties("definedToEmpty"); + } + + /** + * Test where an execution properties added in task. + */ + @Test + public void testAddProperty() throws Exception { + testExecutionProperties("addProperty"); + } + + /** + * Test empty properties are transferred correctly. + */ + @Test + public void testEmptyToEmpty() throws Exception { + testExecutionProperties("emptyToEmpty"); + } + + private void testExecutionProperties(final String testName) throws Exception { + File compiledPolicyFile = new File("target/ExecutionPropertiesTestPolicyModel.json"); + assertTrue(compiledPolicyFile.exists()); + + new File("target/" + testName + "_out.properties").delete(); + + // @formatter:off + final String[] args = { + "-rfr", + "target", + "-c", + "src/test/resources/testdata/executionproperties/" + testName + "_conf.json" + }; + // @formatter:on + final ApexMain apexMain = new ApexMain(args); + + // TODO: Set back to 10 seconds + await().atMost(10000, TimeUnit.SECONDS) + .until(() -> new File("target/" + testName + "_out.properties").exists()); + + apexMain.shutdown(); + + Properties expectedProperties = new Properties(); + expectedProperties.load(new FileInputStream( + new File("src/test/resources/testdata/executionproperties/" + testName + "_out_expected.properties"))); + + Properties actualProperties = new Properties(); + actualProperties.load(new FileInputStream(new File("target/" + testName + "_out.properties"))); + + assertEquals(expectedProperties, actualProperties); + } +} |