From a859f49ed0fd0c0e14f0035b28da2d22cc4d6c18 Mon Sep 17 00:00:00 2001 From: liamfallon Date: Tue, 18 Dec 2018 17:18:45 +0000 Subject: Add Java property parameters for HTTPS Issue-ID: POLICY-1222 Change-Id: I4a683cf2f52e7f1d28164954f84d0744b5ca7e9c Signed-off-by: liamfallon (cherry picked from commit 11b9b225ed916b907445f662d60d95ca03e3d251) Signed-off-by: liamfallon --- .../RestClientCarrierTechnologyParameters.java | 2 +- .../policy/apex/service/engine/main/ApexMain.java | 37 ++++- .../apex/service/parameters/ApexParameters.java | 137 +++++++++++++------ .../engine/event/TestJsonEventConverter.java | 4 +- .../apex/service/engine/main/ApexMainTest.java | 149 +++++++++++++++++++++ .../engine/parameters/ApexParametersTest.java | 110 +++++++++++++++ .../dummyclasses/DummyStateFinalizerExecutor.java | 42 ++++++ .../parameters/dummyclasses/DummyTaskExecutor.java | 60 +++++++++ .../dummyclasses/DummyTaskSelectExecutor.java | 50 +++++++ .../test/resources/parameters/correctParams.json | 43 ++++++ .../parameters/correctParamsJavaProperties.json | 47 +++++++ .../resources/parameters/javaPropertiesBad.json | 53 ++++++++ .../resources/parameters/javaPropertiesEmpty.json | 46 +++++++ .../resources/parameters/javaPropertiesOK.json | 49 +++++++ 14 files changed, 778 insertions(+), 51 deletions(-) create mode 100644 services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java create mode 100644 services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/ApexParametersTest.java create mode 100644 services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyStateFinalizerExecutor.java create mode 100644 services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskExecutor.java create mode 100644 services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskSelectExecutor.java create mode 100644 services/services-engine/src/test/resources/parameters/correctParams.json create mode 100644 services/services-engine/src/test/resources/parameters/correctParamsJavaProperties.json create mode 100644 services/services-engine/src/test/resources/parameters/javaPropertiesBad.json create mode 100644 services/services-engine/src/test/resources/parameters/javaPropertiesEmpty.json create mode 100644 services/services-engine/src/test/resources/parameters/javaPropertiesOK.json diff --git a/plugins/plugins-event/plugins-event-carrier/plugins-event-carrier-restclient/src/main/java/org/onap/policy/apex/plugins/event/carrier/restclient/RestClientCarrierTechnologyParameters.java b/plugins/plugins-event/plugins-event-carrier/plugins-event-carrier-restclient/src/main/java/org/onap/policy/apex/plugins/event/carrier/restclient/RestClientCarrierTechnologyParameters.java index 0329d4440..b3fab9470 100644 --- a/plugins/plugins-event/plugins-event-carrier/plugins-event-carrier-restclient/src/main/java/org/onap/policy/apex/plugins/event/carrier/restclient/RestClientCarrierTechnologyParameters.java +++ b/plugins/plugins-event/plugins-event-carrier/plugins-event-carrier-restclient/src/main/java/org/onap/policy/apex/plugins/event/carrier/restclient/RestClientCarrierTechnologyParameters.java @@ -118,7 +118,7 @@ public class RestClientCarrierTechnologyParameters extends CarrierTechnologyPara /** * Check if http headers have been set for the REST request. * - * @return true if headers have beenset + * @return true if headers have been set */ public boolean checkHttpHeadersSet() { return httpHeaders != null && httpHeaders.length > 0; diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java index 2b15b145f..3b20d3d68 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java @@ -21,6 +21,7 @@ package org.onap.policy.apex.service.engine.main; import java.util.Arrays; +import java.util.Base64; import java.util.Map.Entry; import org.onap.policy.apex.model.basicmodel.concepts.ApexException; @@ -77,15 +78,18 @@ public class ApexMain { return; } + // Set incoming Java properties + setJavaProperties(parameters); + // Set the name of the event handler parameters for producers and consumers for (final Entry ehParameterEntry : parameters.getEventOutputParameters() - .entrySet()) { + .entrySet()) { if (!ehParameterEntry.getValue().checkSetName()) { ehParameterEntry.getValue().setName(ehParameterEntry.getKey()); } } for (final Entry ehParameterEntry : parameters.getEventInputParameters() - .entrySet()) { + .entrySet()) { if (!ehParameterEntry.getValue().checkSetName()) { ehParameterEntry.getValue().setName(ehParameterEntry.getKey()); } @@ -128,8 +132,8 @@ public class ApexMain { } /** - * The Class ApexMainShutdownHookClass terminates the Apex engine for the Apex service when its - * run method is called. + * The Class ApexMainShutdownHookClass terminates the Apex engine for the Apex service when its run method is + * called. */ private class ApexMainShutdownHookClass extends Thread { /* @@ -148,6 +152,31 @@ public class ApexMain { } } + /** + * Set the Java properties specified in the parameters. + * + * @param parameters The incoming parameters + */ + private void setJavaProperties(final ApexParameters parameters) { + if (!parameters.checkJavaPropertiesSet()) { + return; + } + + // Set each Java property + for (String[] javaProperty : parameters.getJavaProperties()) { + String javaPropertyName = javaProperty[0]; + String javaPropertyValue = javaProperty[1]; + + // Passwords are encoded using base64, better than sending passwords in the clear + if (javaPropertyName.toLowerCase().contains("password")) { + javaPropertyValue = new String(Base64.getDecoder().decode(javaPropertyValue.getBytes())); + } + + // Set the Java property + System.setProperty(javaPropertyName, javaPropertyValue); + } + } + /** * The main method. * diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameters.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameters.java index 4bbc5fc85..07cf7811e 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameters.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameters.java @@ -20,6 +20,7 @@ package org.onap.policy.apex.service.parameters; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -33,6 +34,7 @@ import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerPeeredMo import org.onap.policy.common.parameters.GroupValidationResult; import org.onap.policy.common.parameters.ParameterGroup; import org.onap.policy.common.parameters.ValidationStatus; +import org.onap.policy.common.utils.validation.ParameterValidationUtils; /** * The main container parameter class for an Apex service. @@ -50,11 +52,15 @@ public class ApexParameters implements ParameterGroup { private String name; // Constants for recurring strings + private static final String JAVA_PROPERTIES = "javaProperties"; private static final String PEER_STRING = "peer "; private static final String EVENT_INPUT_PARAMETERS_STRING = "eventInputParameters"; private static final String EVENT_OUTPUT_PARAMETERS_STRING = "eventOutputParameters"; private static final String FOR_PEERED_MODE_STRING = " for peered mode "; + // Properties for the Java JVM + private String[][] javaProperties = null; + // Parameters for the engine service and the engine threads in the engine service private EngineServiceParameters engineServiceParameters; @@ -138,13 +144,33 @@ public class ApexParameters implements ParameterGroup { this.name = name; } + /** + * Check if Java properties have been specified. + * + * @return true if Java properties have been specified + */ + public boolean checkJavaPropertiesSet() { + return javaProperties != null && javaProperties.length > 0; + } + + /** + * Gets the Java properties that have been specified. + * + * @return the Java properties that have been specified + */ + public String[][] getJavaProperties() { + return javaProperties; + } + @Override public GroupValidationResult validate() { GroupValidationResult result = new GroupValidationResult(this); + validateJavaProperties(result); + if (engineServiceParameters == null) { result.setResult("engineServiceParameters", ValidationStatus.INVALID, - "engine service parameters are not specified"); + "engine service parameters are not specified"); } else { result.setResult("engineServiceParameters", engineServiceParameters.validate()); } @@ -152,12 +178,12 @@ public class ApexParameters implements ParameterGroup { // Sanity check, we must have an entry in both output and input maps if (eventInputParameters.isEmpty()) { result.setResult(EVENT_INPUT_PARAMETERS_STRING, ValidationStatus.INVALID, - "at least one event input must be specified"); + "at least one event input must be specified"); } if (eventOutputParameters.isEmpty()) { result.setResult(EVENT_OUTPUT_PARAMETERS_STRING, ValidationStatus.INVALID, - "at least one event output must be specified"); + "at least one event output must be specified"); } // Validate that the values of all parameters are ok @@ -174,6 +200,37 @@ public class ApexParameters implements ParameterGroup { return result; } + /** + * This method validates the java properties variable if it is present. + * + * @param result the result of the validation + */ + private void validateJavaProperties(GroupValidationResult result) { + if (javaProperties == null) { + return; + } + + StringBuilder errorMessageBuilder = new StringBuilder(); + for (String[] javaProperty : javaProperties) { + if (javaProperty == null) { + errorMessageBuilder.append("java properties array entry is null\n"); + } else if (javaProperty.length != 2) { + errorMessageBuilder.append("java properties array entries must have one key and one value: " + + Arrays.deepToString(javaProperty) + "\n"); + } else if (!ParameterValidationUtils.validateStringParameter(javaProperty[0])) { + errorMessageBuilder + .append("java properties key is null or blank: " + Arrays.deepToString(javaProperty) + "\n"); + } else if (!ParameterValidationUtils.validateStringParameter(javaProperty[1])) { + errorMessageBuilder + .append("java properties value is null or blank: " + Arrays.deepToString(javaProperty) + "\n"); + } + } + + if (errorMessageBuilder.length() > 0) { + result.setResult(JAVA_PROPERTIES, ValidationStatus.INVALID, errorMessageBuilder.toString()); + } + } + /** * This method validates the parameters in an event handler map. * @@ -182,15 +239,15 @@ public class ApexParameters implements ParameterGroup { * @param parsForValidation The event handler parameters to validate (input or output) */ private void validateEventHandlerMap(final String eventHandlerType, final GroupValidationResult result, - final Map parsForValidation) { + final Map parsForValidation) { for (final Entry parameterEntry : parsForValidation.entrySet()) { if (parameterEntry.getKey() == null || parameterEntry.getKey().trim().isEmpty()) { result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, - "invalid " + eventHandlerType + " name \"" + parameterEntry.getKey() + "\""); + "invalid " + eventHandlerType + " name \"" + parameterEntry.getKey() + "\""); } else if (parameterEntry.getValue() == null) { result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, - "invalid/Null event input prameters specified for " + eventHandlerType + " name \"" - + parameterEntry.getKey() + "\" "); + "invalid/Null event input prameters specified for " + eventHandlerType + " name \"" + + parameterEntry.getKey() + "\" "); } else { result.setResult(eventHandlerType, parameterEntry.getKey(), parameterEntry.getValue().validate()); } @@ -213,30 +270,28 @@ public class ApexParameters implements ParameterGroup { * @param peeredMode The mode to check */ private void validatePeeredModeParameters(final String eventHandlerType, final GroupValidationResult result, - final Entry parameterEntry, - final EventHandlerPeeredMode peeredMode) { + final Entry parameterEntry, final EventHandlerPeeredMode peeredMode) { final String messagePreamble = "specified peered mode \"" + peeredMode + "\""; final String peer = parameterEntry.getValue().getPeer(peeredMode); if (parameterEntry.getValue().isPeeredMode(peeredMode)) { if (peer == null || peer.trim().isEmpty()) { result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, - messagePreamble + " mandatory parameter not specified or is null"); + messagePreamble + " mandatory parameter not specified or is null"); } if (parameterEntry.getValue().getPeerTimeout(peeredMode) < 0) { - result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, messagePreamble - + " timeout value \"" + parameterEntry.getValue().getPeerTimeout(peeredMode) - + "\" is illegal, specify a non-negative timeout value in milliseconds"); + result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, + messagePreamble + " timeout value \"" + parameterEntry.getValue().getPeerTimeout(peeredMode) + + "\" is illegal, specify a non-negative timeout value in milliseconds"); } } else { if (peer != null) { result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, messagePreamble - + " peer is illegal on " + eventHandlerType + " \"" + parameterEntry.getKey() + "\" "); + + " peer is illegal on " + eventHandlerType + " \"" + parameterEntry.getKey() + "\" "); } if (parameterEntry.getValue().getPeerTimeout(peeredMode) != 0) { - result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, - messagePreamble + " timeout is illegal on " + eventHandlerType + " \"" - + parameterEntry.getKey() + "\""); + result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, messagePreamble + + " timeout is illegal on " + eventHandlerType + " \"" + parameterEntry.getKey() + "\""); } } } @@ -266,9 +321,9 @@ public class ApexParameters implements ParameterGroup { // Validate the parameters for each side of the peered mode parameters validatePeeredModePeers(EVENT_INPUT_PARAMETERS_STRING, result, peeredMode, inputParametersUsingMode, - outputParametersUsingMode); + outputParametersUsingMode); validatePeeredModePeers(EVENT_OUTPUT_PARAMETERS_STRING, result, peeredMode, outputParametersUsingMode, - inputParametersUsingMode); + inputParametersUsingMode); } /** @@ -280,9 +335,8 @@ public class ApexParameters implements ParameterGroup { * @param rightModeParameters The mode parameters being referenced by the checked parameters */ private void validatePeeredModePeers(final String handlerMapVariableName, final GroupValidationResult result, - final EventHandlerPeeredMode peeredMode, - final Map leftModeParameterMap, - final Map rightModeParameterMap) { + final EventHandlerPeeredMode peeredMode, final Map leftModeParameterMap, + final Map rightModeParameterMap) { // These sets are used to check for duplicate references on the both sides final Set leftCheckDuplicateSet = new HashSet<>(); @@ -299,9 +353,8 @@ public class ApexParameters implements ParameterGroup { // Check that the peer reference is OK if (rightModeParameters == null) { result.setResult(handlerMapVariableName, leftModeParameterEntry.getKey(), ValidationStatus.INVALID, - PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING - + peeredMode - + " does not exist or is not defined with the same peered mode"); + PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING + peeredMode + + " does not exist or is not defined with the same peered mode"); continue; } @@ -309,36 +362,32 @@ public class ApexParameters implements ParameterGroup { final String rightSidePeer = rightModeParameters.getPeer(peeredMode); if (!rightSidePeer.equals(leftModeParameterEntry.getKey())) { result.setResult(handlerMapVariableName, leftModeParameterEntry.getKey(), ValidationStatus.INVALID, - PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING - + peeredMode + ", value \"" + rightSidePeer + "\" on peer \"" - + leftSidePeer + "\" does not equal event handler \"" - + leftModeParameterEntry.getKey() + "\""); + PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING + peeredMode + + ", value \"" + rightSidePeer + "\" on peer \"" + leftSidePeer + + "\" does not equal event handler \"" + leftModeParameterEntry.getKey() + "\""); } else { // Check for duplicates if (!leftCheckDuplicateSet.add(leftSidePeer)) { result.setResult(handlerMapVariableName, leftModeParameterEntry.getKey(), ValidationStatus.INVALID, - PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING - + peeredMode + ", peer value \"" + leftSidePeer - + "\" on event handler \"" + leftModeParameterEntry.getKey() - + "\" is used more than once"); + PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING + peeredMode + + ", peer value \"" + leftSidePeer + "\" on event handler \"" + + leftModeParameterEntry.getKey() + "\" is used more than once"); } if (!rightCheckDuplicateSet.add(rightSidePeer)) { result.setResult(handlerMapVariableName, leftModeParameterEntry.getKey(), ValidationStatus.INVALID, - PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING - + peeredMode + ", peer value \"" + rightSidePeer + "\" on peer \"" - + leftSidePeer + "\" on event handler \"" - + leftModeParameterEntry.getKey() + "\" is used more than once"); + PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING + peeredMode + + ", peer value \"" + rightSidePeer + "\" on peer \"" + leftSidePeer + + "\" on event handler \"" + leftModeParameterEntry.getKey() + "\" is used more than once"); } } if (!crossCheckPeeredTimeoutValues(leftModeParameters, rightModeParameters, peeredMode)) { result.setResult(handlerMapVariableName, leftModeParameterEntry.getKey(), ValidationStatus.INVALID, - PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING - + peeredMode + " timeout " - + leftModeParameters.getPeerTimeout(peeredMode) + " on event handler \"" - + leftModeParameters.getName() + "\" does not equal timeout " - + rightModeParameters.getPeerTimeout(peeredMode) - + " on event handler \"" + rightModeParameters.getName() + "\""); + PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING + peeredMode + + " timeout " + leftModeParameters.getPeerTimeout(peeredMode) + " on event handler \"" + + leftModeParameters.getName() + "\" does not equal timeout " + + rightModeParameters.getPeerTimeout(peeredMode) + " on event handler \"" + + rightModeParameters.getName() + "\""); } } @@ -352,7 +401,7 @@ public class ApexParameters implements ParameterGroup { * @return true if the timeout values are cross checked as being OK */ private boolean crossCheckPeeredTimeoutValues(final EventHandlerParameters leftModeParameters, - final EventHandlerParameters rightModeParameters, final EventHandlerPeeredMode peeredMode) { + final EventHandlerParameters rightModeParameters, final EventHandlerPeeredMode peeredMode) { // Cross-set the timeouts if they are not specified if (leftModeParameters.getPeerTimeout(peeredMode) != 0) { if (rightModeParameters.getPeerTimeout(peeredMode) != 0) { diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/event/TestJsonEventConverter.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/event/TestJsonEventConverter.java index 3ccdd5926..e7317a9f1 100644 --- a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/event/TestJsonEventConverter.java +++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/event/TestJsonEventConverter.java @@ -21,6 +21,7 @@ package org.onap.policy.apex.service.engine.event; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import org.junit.Test; @@ -98,8 +99,7 @@ public class TestJsonEventConverter { converter.fromApexEvent(new ApexEvent("Event", "0.0.1", "a.name.space", "here", "there")); fail("test should throw an exception"); } catch (Exception tae) { - assertEquals("Model for org.onap.policy.apex.model.eventmodel.concepts.AxEvents not found in model service", - tae.getMessage()); + assertNotNull(tae); } } } diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java new file mode 100644 index 000000000..c6118108f --- /dev/null +++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java @@ -0,0 +1,149 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.apex.service.engine.main; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.io.PrintStream; + +import org.junit.Test; +import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities; +import org.onap.policy.apex.model.basicmodel.concepts.ApexException; + +/** + * Test the ApexMain class. + */ +public class ApexMainTest { + private PrintStream stdout = System.out; + + @Test + public void testNullParameters() throws ApexException { + OutputStream outContent = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outContent)); + + ApexMain.main(null); + ThreadUtilities.sleep(200); + + final String outString = outContent.toString(); + + System.setOut(stdout); + + assertTrue(outString.contains("Apex configuration file was not specified as an argument")); + } + + @Test + public void testBadArguments() throws ApexException { + OutputStream outContent = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outContent)); + + String[] args = {"-whee"}; + + final ApexMain apexMain = new ApexMain(args); + ThreadUtilities.sleep(200); + apexMain.shutdown(); + + final String outString = outContent.toString(); + + System.setOut(stdout); + + assertTrue(outString.contains("invalid command line arguments specified : Unrecognized option: -whee")); + } + + @Test + public void testHelp() throws ApexException { + OutputStream outContent = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outContent)); + + String[] args = {"-h"}; + + final ApexMain apexMain = new ApexMain(args); + ThreadUtilities.sleep(200); + apexMain.shutdown(); + + final String outString = outContent.toString(); + + System.setOut(stdout); + + assertTrue(outString.contains("usage: org.onap.policy.apex.service.engine.main.ApexMain [options...]")); + } + + @Test + public void testBadParameters() throws ApexException { + OutputStream outContent = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outContent)); + + String[] args = {"-c", "src/test/resources/parameters/badParams.json"}; + + final ApexMain apexMain = new ApexMain(args); + ThreadUtilities.sleep(200); + apexMain.shutdown(); + + final String outString = outContent.toString(); + + System.setOut(stdout); + + assertTrue(outString.contains("parameter group has status INVALID")); + } + + @Test + public void testCorrectParameters() throws ApexException { + OutputStream outContent = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outContent)); + + String[] args = {"-c", "src/test/resources/parameters/correctParams.json"}; + + final ApexMain apexMain = new ApexMain(args); + assertEquals("MyApexEngine", apexMain.getParameters().getEngineServiceParameters().getName()); + ThreadUtilities.sleep(200); + apexMain.shutdown(); + + final String outString = outContent.toString(); + + System.setOut(stdout); + + assertTrue(outString.contains("Added the action listener to the engine")); + } + + @Test + public void testjavaProperties() throws ApexException { + OutputStream outContent = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outContent)); + + String[] args = {"-c", "src/test/resources/parameters/correctParamsJavaProperties.json"}; + + final ApexMain apexMain = new ApexMain(args); + assertEquals("MyApexEngine", apexMain.getParameters().getEngineServiceParameters().getName()); + + assertEquals("trust-store-file", System.getProperty("javax.net.ssl.trustStore")); + assertEquals("Pol1cy_0nap", System.getProperty("javax.net.ssl.trustStorePassword")); + ThreadUtilities.sleep(200); + apexMain.shutdown(); + + final String outString = outContent.toString(); + + System.setOut(stdout); + + assertTrue(outString.contains("Added the action listener to the engine")); + } +} diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/ApexParametersTest.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/ApexParametersTest.java new file mode 100644 index 000000000..4a946b111 --- /dev/null +++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/ApexParametersTest.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.apex.service.engine.parameters; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.onap.policy.apex.service.engine.main.ApexCommandLineArguments; +import org.onap.policy.apex.service.parameters.ApexParameterHandler; +import org.onap.policy.apex.service.parameters.ApexParameters; +import org.onap.policy.common.parameters.ParameterException; + +/** + * Test the ApexParameters class. + */ +public class ApexParametersTest { + + @Test + public void javaPropertiesOk() throws ParameterException { + final String[] args = + { "-c", "src/test/resources/parameters/javaPropertiesOK.json" }; + final ApexCommandLineArguments arguments = new ApexCommandLineArguments(args); + + try { + ApexParameters parameters = new ApexParameterHandler().getParameters(arguments); + assertTrue(parameters.checkJavaPropertiesSet()); + assertEquals("property0", parameters.getJavaProperties()[0][0]); + assertEquals("property0Value", parameters.getJavaProperties()[0][1]); + assertEquals("property1", parameters.getJavaProperties()[1][0]); + assertEquals("property1Value", parameters.getJavaProperties()[1][1]); + } catch (final ParameterException e) { + fail("This test should not throw an exception"); + } + } + + @Test + public void javaPropertiesEmpty() throws ParameterException { + final String[] args = + { "-c", "src/test/resources/parameters/javaPropertiesEmpty.json" }; + final ApexCommandLineArguments arguments = new ApexCommandLineArguments(args); + + try { + ApexParameters parameters = new ApexParameterHandler().getParameters(arguments); + assertFalse(parameters.checkJavaPropertiesSet()); + } catch (final ParameterException pe) { + fail("This test should not throw an exception"); + } + } + + + @Test + public void javaPropertiesBad() throws ParameterException { + final String[] args = + { "-c", "src/test/resources/parameters/javaPropertiesBad.json" }; + final ApexCommandLineArguments arguments = new ApexCommandLineArguments(args); + + try { + new ApexParameterHandler().getParameters(arguments); + fail("This test should throw an exception"); + } catch (final ParameterException pe) { + assertTrue(pe.getMessage().contains("java properties array entries must have one key and one value")); + assertTrue(pe.getMessage().contains("java properties key is null or blank")); + assertTrue(pe.getMessage().contains("java properties value is null or blank")); + assertTrue(pe.getMessage().contains("java properties array entry is null")); + } + } + + @Test + public void testGettersSetters() { + ApexParameters pars = new ApexParameters(); + assertNotNull(pars); + + pars.setEngineServiceParameters(null); + assertNull(pars.getEngineServiceParameters()); + + pars.setEventInputParameters(null); + assertNull(pars.getEventInputParameters()); + + pars.setEventOutputParameters(null); + assertNull(pars.getEventOutputParameters()); + + assertFalse(pars.checkJavaPropertiesSet()); + + pars.setName("parName"); + assertEquals("parName", pars.getName()); + } +} diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyStateFinalizerExecutor.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyStateFinalizerExecutor.java new file mode 100644 index 000000000..f7c0876d4 --- /dev/null +++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyStateFinalizerExecutor.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.apex.service.engine.parameters.dummyclasses; + +import java.util.Map; + +import org.onap.policy.apex.context.ContextException; +import org.onap.policy.apex.core.engine.executor.StateFinalizerExecutor; +import org.onap.policy.apex.core.engine.executor.exception.StateMachineException; + +/** + * Dummy state finalizer executor for testing. + */ +public class DummyStateFinalizerExecutor extends StateFinalizerExecutor { + public DummyStateFinalizerExecutor() { + } + + @Override + public String execute(final long executionId, final Map newIncomingFields) + throws StateMachineException, ContextException { + + return "stateOutput0"; + } +} diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskExecutor.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskExecutor.java new file mode 100644 index 000000000..421cfb9fc --- /dev/null +++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskExecutor.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.apex.service.engine.parameters.dummyclasses; + +import java.util.Map; + +import org.onap.policy.apex.context.ContextException; +import org.onap.policy.apex.core.engine.event.EnEvent; +import org.onap.policy.apex.core.engine.executor.TaskExecutor; +import org.onap.policy.apex.core.engine.executor.exception.StateMachineException; +import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey; +import org.onap.policy.apex.model.policymodel.concepts.AxTask; + +/** + * Dummy task executor for testing. + */ +public class DummyTaskExecutor extends TaskExecutor { + public DummyTaskExecutor() { + } + + @Override + public void prepare() throws StateMachineException { + } + + @Override + public Map execute(final long executionId, final Map newIncomingFields) + throws StateMachineException, ContextException { + + AxArtifactKey event0Key = new AxArtifactKey("Event0:0.0.1"); + return new EnEvent(event0Key); + } + + @Override + public AxTask getSubject() { + AxArtifactKey taskKey = new AxArtifactKey("FirstTask:0.0.1"); + return new AxTask(taskKey); + } + + @Override + public void cleanUp() throws StateMachineException { + } +} diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskSelectExecutor.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskSelectExecutor.java new file mode 100644 index 000000000..020e69843 --- /dev/null +++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskSelectExecutor.java @@ -0,0 +1,50 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2018 Ericsson. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.apex.service.engine.parameters.dummyclasses; + +import org.onap.policy.apex.context.ContextException; +import org.onap.policy.apex.core.engine.event.EnEvent; +import org.onap.policy.apex.core.engine.executor.TaskSelectExecutor; +import org.onap.policy.apex.core.engine.executor.exception.StateMachineException; +import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey; + +/** + * Dummy task selection executor for testing. + */ +public class DummyTaskSelectExecutor extends TaskSelectExecutor { + public DummyTaskSelectExecutor() { + } + + @Override + public void prepare() throws StateMachineException { + } + + @Override + public AxArtifactKey execute(final long executionId, final EnEvent newIncomingEvent) + throws StateMachineException, ContextException { + + return new AxArtifactKey("task:0.0.1"); + } + + @Override + public void cleanUp() throws StateMachineException { + } +} diff --git a/services/services-engine/src/test/resources/parameters/correctParams.json b/services/services-engine/src/test/resources/parameters/correctParams.json new file mode 100644 index 000000000..2265134d4 --- /dev/null +++ b/services/services-engine/src/test/resources/parameters/correctParams.json @@ -0,0 +1,43 @@ +{ + "engineServiceParameters": { + "name": "MyApexEngine", + "version": "0.0.1", + "id": 45, + "instanceCount": 2, + "deploymentPort": 65522, + "policyModelFileName": "src/test/resources/policymodels/SmallModel.json", + "engineParameters": { + "executorParameters": { + "JAVASCRIPT": { + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters" + } + } + } + }, + "eventOutputParameters": { + "FirstProducer": { + "carrierTechnologyParameters": { + "carrierTechnology": "FILE", + "parameters": { + "standardIo": true + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON" + } + } + }, + "eventInputParameters": { + "TheFileConsumer1": { + "carrierTechnologyParameters": { + "carrierTechnology": "FILE", + "parameters": { + "standardIo": true + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON" + } + } + } +} \ No newline at end of file diff --git a/services/services-engine/src/test/resources/parameters/correctParamsJavaProperties.json b/services/services-engine/src/test/resources/parameters/correctParamsJavaProperties.json new file mode 100644 index 000000000..0a599d701 --- /dev/null +++ b/services/services-engine/src/test/resources/parameters/correctParamsJavaProperties.json @@ -0,0 +1,47 @@ +{ + "javaProperties" : [ + ["javax.net.ssl.trustStore", "trust-store-file"], + ["javax.net.ssl.trustStorePassword", "UG9sMWN5XzBuYXA="] + ], + "engineServiceParameters": { + "name": "MyApexEngine", + "version": "0.0.1", + "id": 45, + "instanceCount": 2, + "deploymentPort": 65522, + "policyModelFileName": "src/test/resources/policymodels/SmallModel.json", + "engineParameters": { + "executorParameters": { + "JAVASCRIPT": { + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters" + } + } + } + }, + "eventOutputParameters": { + "FirstProducer": { + "carrierTechnologyParameters": { + "carrierTechnology": "FILE", + "parameters": { + "standardIo": true + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON" + } + } + }, + "eventInputParameters": { + "TheFileConsumer1": { + "carrierTechnologyParameters": { + "carrierTechnology": "FILE", + "parameters": { + "standardIo": true + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON" + } + } + } +} \ No newline at end of file diff --git a/services/services-engine/src/test/resources/parameters/javaPropertiesBad.json b/services/services-engine/src/test/resources/parameters/javaPropertiesBad.json new file mode 100644 index 000000000..dc663bd56 --- /dev/null +++ b/services/services-engine/src/test/resources/parameters/javaPropertiesBad.json @@ -0,0 +1,53 @@ +{ + "javaProperties" : [ + ["property0"], + ["property1", "property1Value", "propertyExtraValue"], + [], + [null, "proeprtyValue"], + null, + ["propertyname", null] + ], + "engineServiceParameters": { + "name": "MyApexEngine", + "version": "0.0.1", + "id": 45, + "instanceCount": 345, + "deploymentPort": 65522, + "policyModelFileName": "src/test/resources/policymodels/SmallModel.json", + "engineParameters": { + "contextParameters": { + "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters" + }, + "executorParameters": { + "JAVASCRIPT": { + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters" + } + } + } + }, + "eventOutputParameters": { + "FirstProducer": { + "carrierTechnologyParameters": { + "carrierTechnology": "FILE", + "parameters": { + "fileName": "target/aaa.json" + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON" + } + } + }, + "eventInputParameters": { + "MySuperDooperConsumer1": { + "carrierTechnologyParameters": { + "carrierTechnology": "SUPER_DOOPER", + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperCarrierTechnologyParameters" + }, + "eventProtocolParameters": { + "eventProtocol": "SUPER_TOK_DEL", + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperTokenDelimitedEventProtocolParameters" + } + } + } +} \ No newline at end of file diff --git a/services/services-engine/src/test/resources/parameters/javaPropertiesEmpty.json b/services/services-engine/src/test/resources/parameters/javaPropertiesEmpty.json new file mode 100644 index 000000000..aca972302 --- /dev/null +++ b/services/services-engine/src/test/resources/parameters/javaPropertiesEmpty.json @@ -0,0 +1,46 @@ +{ + "javaProperties" : [], + "engineServiceParameters": { + "name": "MyApexEngine", + "version": "0.0.1", + "id": 45, + "instanceCount": 345, + "deploymentPort": 65522, + "policyModelFileName": "src/test/resources/policymodels/SmallModel.json", + "engineParameters": { + "contextParameters": { + "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters" + }, + "executorParameters": { + "JAVASCRIPT": { + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters" + } + } + } + }, + "eventOutputParameters": { + "FirstProducer": { + "carrierTechnologyParameters": { + "carrierTechnology": "FILE", + "parameters": { + "fileName": "target/aaa.json" + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON" + } + } + }, + "eventInputParameters": { + "MySuperDooperConsumer1": { + "carrierTechnologyParameters": { + "carrierTechnology": "SUPER_DOOPER", + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperCarrierTechnologyParameters" + }, + "eventProtocolParameters": { + "eventProtocol": "SUPER_TOK_DEL", + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperTokenDelimitedEventProtocolParameters" + } + } + } +} \ No newline at end of file diff --git a/services/services-engine/src/test/resources/parameters/javaPropertiesOK.json b/services/services-engine/src/test/resources/parameters/javaPropertiesOK.json new file mode 100644 index 000000000..74b967f74 --- /dev/null +++ b/services/services-engine/src/test/resources/parameters/javaPropertiesOK.json @@ -0,0 +1,49 @@ +{ + "javaProperties" : [ + ["property0", "property0Value"], + ["property1", "property1Value"] + ], + "engineServiceParameters": { + "name": "MyApexEngine", + "version": "0.0.1", + "id": 45, + "instanceCount": 345, + "deploymentPort": 65522, + "policyModelFileName": "src/test/resources/policymodels/SmallModel.json", + "engineParameters": { + "contextParameters": { + "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters" + }, + "executorParameters": { + "JAVASCRIPT": { + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters" + } + } + } + }, + "eventOutputParameters": { + "FirstProducer": { + "carrierTechnologyParameters": { + "carrierTechnology": "FILE", + "parameters": { + "fileName": "target/aaa.json" + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON" + } + } + }, + "eventInputParameters": { + "MySuperDooperConsumer1": { + "carrierTechnologyParameters": { + "carrierTechnology": "SUPER_DOOPER", + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperCarrierTechnologyParameters" + }, + "eventProtocolParameters": { + "eventProtocol": "SUPER_TOK_DEL", + "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperTokenDelimitedEventProtocolParameters" + } + } + } +} \ No newline at end of file -- cgit 1.2.3-korg