From 1d86d11223e9c60ec65b737301b51ca9a42adff5 Mon Sep 17 00:00:00 2001 From: "a.sreekumar" Date: Tue, 26 Mar 2019 13:54:45 +0000 Subject: Adding services-onappf module to apex-pdp 1) Adding services-onappf module to apex-pdp. 2) Following the code base from policy/pap to build the module. 3) Currently PAP is using property & configuration file for bootstrap. Continuing the same in this module as well. 4) Adding relevant test cases. Change-Id: Id9740ea60ae3ecbd88e5d6d3586ee0dde1054cca Issue-ID: POLICY-1452 Signed-off-by: a.sreekumar --- services/pom.xml | 3 +- services/services-onappf/pom.xml | 67 +++++ .../policy/apex/starter/ApexStarterActivator.java | 147 ++++++++++ .../starter/ApexStarterCommandLineArguments.java | 299 +++++++++++++++++++++ .../onap/policy/apex/starter/ApexStarterMain.java | 165 ++++++++++++ .../starter/exception/ApexStarterException.java | 59 ++++ .../exception/ApexStarterRunTimeException.java | 58 ++++ .../parameters/ApexStarterParameterGroup.java | 50 ++++ .../parameters/ApexStarterParameterHandler.java | 88 ++++++ .../services-onappf/src/main/resources/version.txt | 4 + .../apex/starter/TestApexStarterActivator.java | 114 ++++++++ .../policy/apex/starter/TestApexStarterMain.java | 91 +++++++ .../apex/starter/exception/TestExceptions.java | 38 +++ .../apex/starter/parameters/CommonTestData.java | 92 +++++++ .../parameters/TestApexStarterParameterGroup.java | 104 +++++++ .../TestApexStarterParameterHandler.java | 158 +++++++++++ .../resources/ApexStarterConfigParameters.json | 4 + .../ApexStarterConfigParameters_InvalidName.json | 4 + .../src/test/resources/EmptyConfigParameters.json | 2 + .../src/test/resources/InvalidParameters.json | 3 + .../src/test/resources/NoParameters.json | 0 .../src/test/resources/topic.properties | 4 + 22 files changed, 1553 insertions(+), 1 deletion(-) create mode 100644 services/services-onappf/pom.xml create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterActivator.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterCommandLineArguments.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterMain.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterException.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterRunTimeException.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterGroup.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterHandler.java create mode 100644 services/services-onappf/src/main/resources/version.txt create mode 100644 services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterActivator.java create mode 100644 services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterMain.java create mode 100644 services/services-onappf/src/test/java/org/onap/policy/apex/starter/exception/TestExceptions.java create mode 100644 services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/CommonTestData.java create mode 100644 services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterGroup.java create mode 100644 services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterHandler.java create mode 100644 services/services-onappf/src/test/resources/ApexStarterConfigParameters.json create mode 100644 services/services-onappf/src/test/resources/ApexStarterConfigParameters_InvalidName.json create mode 100644 services/services-onappf/src/test/resources/EmptyConfigParameters.json create mode 100644 services/services-onappf/src/test/resources/InvalidParameters.json create mode 100644 services/services-onappf/src/test/resources/NoParameters.json create mode 100644 services/services-onappf/src/test/resources/topic.properties (limited to 'services') diff --git a/services/pom.xml b/services/pom.xml index 582d6ccba..6ffd63930 100644 --- a/services/pom.xml +++ b/services/pom.xml @@ -1,6 +1,7 @@ - 4.0.0 @@ -35,6 +35,7 @@ services-engine + services-onappf diff --git a/services/services-onappf/pom.xml b/services/services-onappf/pom.xml new file mode 100644 index 000000000..dd7afdc10 --- /dev/null +++ b/services/services-onappf/pom.xml @@ -0,0 +1,67 @@ + + + + 4.0.0 + + org.onap.policy.apex-pdp.services + services + 2.1.0-SNAPSHOT + + + services-onappf + + services-onappf + This module handles the registration/deregistration of apex-pdp to ONAP Policy Framework. + + + + junit + junit + test + + + org.onap.policy.apex-pdp.services + services-engine + ${project.version} + + + org.onap.policy.common + pdp-common + ${version.policy.common} + + + org.onap.policy.common + policy-endpoints + ${version.policy.common} + + + org.onap.policy.common + utils-test + ${version.policy.common} + + + org.assertj + assertj-core + test + + + diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterActivator.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterActivator.java new file mode 100644 index 000000000..e1fb88a0a --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterActivator.java @@ -0,0 +1,147 @@ +/*- + * ============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.starter; + +import java.util.Properties; + +import lombok.Getter; +import lombok.Setter; + +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.apex.starter.parameters.ApexStarterParameterGroup; +import org.onap.policy.common.endpoints.event.comm.TopicEndpoint; +import org.onap.policy.common.parameters.ParameterService; +import org.onap.policy.common.utils.services.ServiceManager; +import org.onap.policy.common.utils.services.ServiceManagerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class activates the ApexStarter as a complete service together with all its handlers. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterActivator { + + private static final Logger LOGGER = LoggerFactory.getLogger(ApexStarterActivator.class); + private final ApexStarterParameterGroup apexStarterParameterGroup; + + /** + * The current activator. + */ + @Getter + private static volatile ApexStarterActivator current = null; + + /** + * Used to manage the services. + */ + private ServiceManager manager; + + @Getter + @Setter(lombok.AccessLevel.PRIVATE) + private volatile boolean alive = false; + + public ApexStarterActivator(final ApexStarterParameterGroup apexStarterParameterGroup, + final Properties topicProperties) { + + TopicEndpoint.manager.addTopicSinks(topicProperties); + TopicEndpoint.manager.addTopicSources(topicProperties); + + this.apexStarterParameterGroup = apexStarterParameterGroup; + // @formatter:off + this.manager = new ServiceManager() + .addAction("topics", + () -> TopicEndpoint.manager.start(), () -> TopicEndpoint.manager.shutdown()) + .addAction("set alive", + () -> setAlive(true), () -> setAlive(false)) + .addAction("register parameters", + () -> registerToParameterService(apexStarterParameterGroup), + () -> deregisterToParameterService(apexStarterParameterGroup)); + // @formatter:on + current = this; + } + + /** + * Initialize ApexStarter service. + * + * @throws ApexStarterException on errors in initializing the service + */ + public void initialize() throws ApexStarterException { + if (isAlive()) { + throw new IllegalStateException("activator already initialized"); + } + + try { + LOGGER.debug("ApexStarter starting as a service . . ."); + manager.start(); + LOGGER.debug("ApexStarter started as a service"); + } catch (final ServiceManagerException exp) { + LOGGER.error("ApexStarter service startup failed"); + throw new ApexStarterException(exp.getMessage(), exp); + } + } + + /** + * Terminate ApexStarter. + * + * @throws ApexStarterException on errors in terminating the service + */ + public void terminate() throws ApexStarterException { + if (!isAlive()) { + throw new IllegalStateException("activator is not running"); + } + + try { + manager.stop(); + } catch (final ServiceManagerException exp) { + LOGGER.error("ApexStarter termination failed"); + throw new ApexStarterException(exp.getMessage(), exp); + } + } + + /** + * Get the parameters used by the activator. + * + * @return the parameters of the activator + */ + public ApexStarterParameterGroup getParameterGroup() { + return apexStarterParameterGroup; + } + + + /** + * Method to register the parameters to Common Parameter Service. + * + * @param apexStarterParameterGroup the apex starter parameter group + */ + public void registerToParameterService(final ApexStarterParameterGroup apexStarterParameterGroup) { + ParameterService.register(apexStarterParameterGroup); + } + + /** + * Method to deregister the parameters from Common Parameter Service. + * + * @param apexStarterParameterGroup the apex starter parameter group + */ + public void deregisterToParameterService(final ApexStarterParameterGroup apexStarterParameterGroup) { + ParameterService.deregister(apexStarterParameterGroup.getName()); + } +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterCommandLineArguments.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterCommandLineArguments.java new file mode 100644 index 000000000..f1d082fcb --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterCommandLineArguments.java @@ -0,0 +1,299 @@ +/*- + * ============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.starter; + +import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.URL; +import java.util.Arrays; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.apache.log4j.chainsaw.Main; +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.apex.starter.exception.ApexStarterRunTimeException; +import org.onap.policy.common.utils.resources.ResourceUtils; + +/** + * This class reads and handles command line parameters for the apex starter. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterCommandLineArguments { + + private static final String FILE_MESSAGE_PREAMBLE = " file \""; + private static final int HELP_LINE_LENGTH = 120; + + private final Options options; + private String configurationFilePath = null; + private String propertyFilePath = null; + + /** + * Construct the options for the CLI editor. + */ + public ApexStarterCommandLineArguments() { + //@formatter:off + options = new Options(); + options.addOption(Option.builder("h") + .longOpt("help") + .desc("outputs the usage of this command") + .required(false) + .type(Boolean.class) + .build()); + options.addOption(Option.builder("v") + .longOpt("version") + .desc("outputs the version of apex starter") + .required(false) + .type(Boolean.class) + .build()); + options.addOption(Option.builder("c") + .longOpt("config-file") + .desc("the full path to the configuration file to use, " + + "the configuration file must be a Json file containing the apex starter parameters") + .hasArg() + .argName("CONFIG_FILE") + .required(false) + .type(String.class) + .build()); + options.addOption(Option.builder("p") + .longOpt("property-file") + .desc("the full path to the topic property file to use, " + + "the property file contains the apex starter topic properties") + .hasArg() + .argName("PROP_FILE") + .required(false) + .type(String.class) + .build()); + //@formatter:on + } + + /** + * Construct the options for the CLI editor and parse in the given arguments. + * + * @param args The command line arguments + */ + public ApexStarterCommandLineArguments(final String[] args) { + // Set up the options with the default constructor + this(); + + // Parse the arguments + try { + parse(args); + } catch (final ApexStarterException e) { + throw new ApexStarterRunTimeException("parse error on apex starter parameters", e); + } + } + + /** + * Parse the command line options. + * + * @param args The command line arguments + * @return a string with a message for help and version, or null if there is no message + * @throws ApexStarterException on command argument errors + */ + public String parse(final String[] args) throws ApexStarterException { + // Clear all our arguments + setConfigurationFilePath(null); + setPropertyFilePath(null); + + CommandLine commandLine = null; + try { + commandLine = new DefaultParser().parse(options, args); + } catch (final ParseException e) { + throw new ApexStarterException("invalid command line arguments specified : " + e.getMessage()); + } + + // Arguments left over after Commons CLI does its stuff + final String[] remainingArgs = commandLine.getArgs(); + + if (remainingArgs.length > 0 && commandLine.hasOption('c') || remainingArgs.length > 0) { + throw new ApexStarterException("too many command line arguments specified : " + Arrays.toString(args)); + } + + if (remainingArgs.length == 1) { + configurationFilePath = remainingArgs[0]; + } + + if (commandLine.hasOption('h')) { + return help(Main.class.getCanonicalName()); + } + + if (commandLine.hasOption('v')) { + return version(); + } + + if (commandLine.hasOption('c')) { + setConfigurationFilePath(commandLine.getOptionValue('c')); + } + + if (commandLine.hasOption('p')) { + setPropertyFilePath(commandLine.getOptionValue('p')); + } + + return null; + } + + /** + * Validate the command line options. + * + * @throws ApexStarterException on command argument validation errors + */ + public void validate() throws ApexStarterException { + validateReadableFile("apex starter configuration", configurationFilePath); + validateReadableFile("apex starter properties", propertyFilePath); + } + + /** + * Print version information for apex starter. + * + * @return the version string + */ + public String version() { + return ResourceUtils.getResourceAsString("src/main/resources/version.txt"); + } + + /** + * Print help information for apex starter. + * + * @param mainClassName the main class name + * @return the help string + */ + public String help(final String mainClassName) { + final HelpFormatter helpFormatter = new HelpFormatter(); + final StringWriter stringWriter = new StringWriter(); + final PrintWriter printWriter = new PrintWriter(stringWriter); + + helpFormatter.printHelp(printWriter, HELP_LINE_LENGTH, mainClassName + " [options...]", "options", options, 0, + 0, ""); + + return stringWriter.toString(); + } + + /** + * Gets the configuration file path. + * + * @return the configuration file path + */ + public String getConfigurationFilePath() { + return configurationFilePath; + } + + /** + * Gets the full expanded configuration file path. + * + * @return the configuration file path + */ + public String getFullConfigurationFilePath() { + return ResourceUtils.getFilePath4Resource(getConfigurationFilePath()); + } + + /** + * Sets the configuration file path. + * + * @param configurationFilePath the configuration file path + */ + public void setConfigurationFilePath(final String configurationFilePath) { + this.configurationFilePath = configurationFilePath; + + } + + /** + * Check set configuration file path. + * + * @return true, if check set configuration file path + */ + public boolean checkSetConfigurationFilePath() { + return configurationFilePath != null && configurationFilePath.length() > 0; + } + + /** + * Gets the property file path. + * + * @return the property file path + */ + public String getPropertyFilePath() { + return propertyFilePath; + } + + /** + * Gets the full expanded property file path. + * + * @return the property file path + */ + public String getFullPropertyFilePath() { + return ResourceUtils.getFilePath4Resource(getPropertyFilePath()); + } + + /** + * Sets the property file path. + * + * @param propertyFilePath the property file path + */ + public void setPropertyFilePath(final String propertyFilePath) { + this.propertyFilePath = propertyFilePath; + + } + + /** + * Check set property file path. + * + * @return true, if check set property file path + */ + public boolean checkSetPropertyFilePath() { + return propertyFilePath != null && propertyFilePath.length() > 0; + } + + /** + * Validate readable file. + * + * @param fileTag the file tag + * @param fileName the file name + * @throws ApexStarterException on the file name passed as a parameter + */ + private void validateReadableFile(final String fileTag, final String fileName) throws ApexStarterException { + if (fileName == null || fileName.length() == 0) { + throw new ApexStarterException(fileTag + " file was not specified as an argument"); + } + + // The file name refers to a resource on the local file system + final URL fileUrl = ResourceUtils.getUrl4Resource(fileName); + if (fileUrl == null) { + throw new ApexStarterException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist"); + } + + final File theFile = new File(fileUrl.getPath()); + if (!theFile.exists()) { + throw new ApexStarterException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist"); + } + if (!theFile.isFile()) { + throw new ApexStarterException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is not a normal file"); + } + if (!theFile.canRead()) { + throw new ApexStarterException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is ureadable"); + } + } + +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterMain.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterMain.java new file mode 100644 index 000000000..f576bdfd4 --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterMain.java @@ -0,0 +1,165 @@ +/*- + * ============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.starter; + +import java.io.FileInputStream; +import java.util.Arrays; +import java.util.Properties; + +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.apex.starter.parameters.ApexStarterParameterGroup; +import org.onap.policy.apex.starter.parameters.ApexStarterParameterHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class initiates Apex as a service based on instructions from PAP. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterMain { + + private static final Logger LOGGER = LoggerFactory.getLogger(ApexStarterMain.class); + + private ApexStarterActivator activator; + private ApexStarterParameterGroup parameterGroup; + + /** + * Instantiates the ApexStarter. + * + * @param args the command line arguments + */ + ApexStarterMain(final String[] args) { + LOGGER.info("In ApexStarter with parameters " + Arrays.toString(args)); + + // Check the arguments + final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments(); + try { + // The arguments return a string if there is a message to print and we should exit + final String argumentMessage = arguments.parse(args); + if (argumentMessage != null) { + LOGGER.info(argumentMessage); + return; + } + // Validate that the arguments are sane + arguments.validate(); + } catch (final ApexStarterException e) { + LOGGER.error("start of ApexStarter failed", e); + return; + } + + // Read the parameters + try { + parameterGroup = new ApexStarterParameterHandler().getParameters(arguments); + } catch (final Exception e) { + LOGGER.error("start of ApexStarter failed", e); + return; + } + + // Read the properties + final Properties topicProperties = new Properties(); + try { + final String propFile = arguments.getFullPropertyFilePath(); + try (FileInputStream stream = new FileInputStream(propFile)) { + topicProperties.load(stream); + } + } catch (final Exception e) { + LOGGER.error("start of ApexStarter failed", e); + return; + } + + // create the activator + activator = new ApexStarterActivator(parameterGroup, topicProperties); + + // Start the activator + try { + activator.initialize(); + } catch (final ApexStarterException e) { + LOGGER.error("start of ApexStarter failed, used parameters are {}", Arrays.toString(args), e); + return; + } + + // Add a shutdown hook to shut everything down in an orderly manner + Runtime.getRuntime().addShutdownHook(new ApexStarterShutdownHookClass()); + + LOGGER.info("Started ApexStarter service"); + } + + + /** + * Get the parameters specified in JSON. + * + * @return the parameters + */ + public ApexStarterParameterGroup getParameters() { + return parameterGroup; + } + + + /** + * Shut down Execution. + * + * @throws ApexStarterException on shutdown errors + */ + public void shutdown() throws ApexStarterException { + // clear the parameterGroup variable + parameterGroup = null; + + // clear the apex starter activator + if (activator != null && activator.isAlive()) { + activator.terminate(); + } + } + + /** + * The Class ApexStarterShutdownHookClass terminates the Apex starter for the Apex service when its run method is + * called. + */ + private class ApexStarterShutdownHookClass extends Thread { + /* + * (non-Javadoc) + * + * @see java.lang.Runnable#run() + */ + @Override + public void run() { + try { + // Shutdown the apex starter service and wait for everything to stop + if (activator != null && activator.isAlive()) { + activator.terminate(); + } + } catch (final ApexStarterException e) { + LOGGER.warn("error occured during shut down of the apex starter service", e); + } + } + } + + + /** + * The main method. + * + * @param args the arguments + * + */ + public static void main(final String[] args) { + new ApexStarterMain(args); + } +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterException.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterException.java new file mode 100644 index 000000000..7062e377b --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterException.java @@ -0,0 +1,59 @@ +/*- + * ============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.starter.exception; + +/** + * This exception will be called if an error occurs in apex starter. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterException extends Exception { + private static final long serialVersionUID = -510646141043975917L; + + /** + * Instantiates a new apex starter exception with a message. + * + * @param message the message + */ + public ApexStarterException(final String message) { + super(message); + } + + /** + * Instantiates a new apex starter exception caused by an exception. + * + * @param exception the exception that caused this exception to be thrown + */ + public ApexStarterException(final Exception exception) { + super(exception); + } + + /** + * Instantiates a new apex starter exception with a message and a caused by an exception. + * + * @param message the message + * @param exception the exception that caused this exception to be thrown + */ + public ApexStarterException(final String message, final Exception exception) { + super(message, exception); + } + +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterRunTimeException.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterRunTimeException.java new file mode 100644 index 000000000..f15b55d33 --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterRunTimeException.java @@ -0,0 +1,58 @@ +/*- + * ============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.starter.exception; + +/** + * This runtime exception will be called if a runtime error occurs when using apex starter. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterRunTimeException extends RuntimeException { + private static final long serialVersionUID = -6024353312002272098L; + + /** + * Instantiates a new apex starter runtime exception with a message. + * + * @param message the message + */ + public ApexStarterRunTimeException(final String message) { + super(message); + } + + /** + * Instantiates a new apex starter runtime exception caused by an exception. + * + * @param exception the exception that caused this exception to be thrown + */ + public ApexStarterRunTimeException(final Exception exception) { + super(exception); + } + + /** + * Instantiates a new apex starter runtime exception with a message and caused by an exception. + * + * @param message the message + * @param exception the exception that caused this exception to be thrown + */ + public ApexStarterRunTimeException(final String message, final Exception exception) { + super(message, exception); + } +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterGroup.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterGroup.java new file mode 100644 index 000000000..25001330c --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterGroup.java @@ -0,0 +1,50 @@ +/*- + * ============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.starter.parameters; + +import lombok.Getter; + +import org.onap.policy.common.parameters.ParameterGroupImpl; +import org.onap.policy.common.parameters.annotations.Min; +import org.onap.policy.common.parameters.annotations.NotBlank; +import org.onap.policy.common.parameters.annotations.NotNull; + +/** + * Class to hold all parameters needed for apex starter component. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +@NotNull +@NotBlank +@Getter +public class ApexStarterParameterGroup extends ParameterGroupImpl { + @Min(value = 1) + private int timeInterval; + + /** + * Create the apex starter parameter group. + * + * @param name the parameter group name + */ + public ApexStarterParameterGroup(final String name) { + super(name); + } +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterHandler.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterHandler.java new file mode 100644 index 000000000..dae4b8334 --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterHandler.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.starter.parameters; + +import java.io.File; + +import org.onap.policy.apex.starter.ApexStarterCommandLineArguments; +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.common.parameters.GroupValidationResult; +import org.onap.policy.common.utils.coder.Coder; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class handles reading, parsing and validating of apex starter parameters from JSON files. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterParameterHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(ApexStarterParameterHandler.class); + private static final Coder CODER = new StandardCoder(); + + /** + * Read the parameters from the parameter file. + * + * @param arguments the arguments passed to apex starter + * @return the parameters read from the configuration file + * @throws ApexStarterException on parameter exceptions + */ + public ApexStarterParameterGroup getParameters(final ApexStarterCommandLineArguments arguments) + throws ApexStarterException { + ApexStarterParameterGroup apexStarterParameterGroup = null; + + // Read the parameters + try { + // Read the parameters from JSON + final File file = new File(arguments.getFullConfigurationFilePath()); + apexStarterParameterGroup = CODER.decode(file, ApexStarterParameterGroup.class); + } catch (final CoderException e) { + final String errorMessage = "error reading parameters from \"" + arguments.getConfigurationFilePath() + + "\"\n" + "(" + e.getClass().getSimpleName() + "):" + e.getMessage(); + LOGGER.error(errorMessage, e); + throw new ApexStarterException(errorMessage, e); + } + + // The JSON processing returns null if there is an empty file + if (apexStarterParameterGroup == null) { + final String errorMessage = "no parameters found in \"" + arguments.getConfigurationFilePath() + "\""; + LOGGER.error(errorMessage); + throw new ApexStarterException(errorMessage); + } + + // validate the parameters + final GroupValidationResult validationResult = apexStarterParameterGroup.validate(); + if (!validationResult.isValid()) { + String returnMessage = + "validation error(s) on parameters from \"" + arguments.getConfigurationFilePath() + "\"\n"; + returnMessage += validationResult.getResult(); + + LOGGER.error(returnMessage); + throw new ApexStarterException(returnMessage); + } + + return apexStarterParameterGroup; + } + +} diff --git a/services/services-onappf/src/main/resources/version.txt b/services/services-onappf/src/main/resources/version.txt new file mode 100644 index 000000000..579f78fa3 --- /dev/null +++ b/services/services-onappf/src/main/resources/version.txt @@ -0,0 +1,4 @@ +ONAP Policy Framework Apex Starter Service +Version: ${project.version} +Built (UTC): ${maven.build.timestamp} +ONAP https://wiki.onap.org \ No newline at end of file diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterActivator.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterActivator.java new file mode 100644 index 000000000..3b7df8321 --- /dev/null +++ b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterActivator.java @@ -0,0 +1,114 @@ +/*- + * ============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.starter; + +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +import java.io.FileInputStream; +import java.util.Properties; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.apex.starter.parameters.ApexStarterParameterGroup; +import org.onap.policy.apex.starter.parameters.ApexStarterParameterHandler; +import org.onap.policy.apex.starter.parameters.CommonTestData; + + + +/** + * Class to perform unit test of {@link ApexStarterActivator}}. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class TestApexStarterActivator { + + private ApexStarterActivator activator; + + /** + * Initializes an activator. + * + * @throws Exception if an error occurs + */ + @Before + public void setUp() throws Exception { + final String[] apexStarterConfigParameters = { "-c", "src/test/resources/ApexStarterConfigParameters.json", + "-p", "src/test/resources/topic.properties" }; + final ApexStarterCommandLineArguments arguments = + new ApexStarterCommandLineArguments(apexStarterConfigParameters); + final ApexStarterParameterGroup parGroup = new ApexStarterParameterHandler().getParameters(arguments); + + final Properties props = new Properties(); + final String propFile = arguments.getFullPropertyFilePath(); + try (FileInputStream stream = new FileInputStream(propFile)) { + props.load(stream); + } + + activator = new ApexStarterActivator(parGroup, props); + } + + /** + * Method for cleanup after each test. + * + * @throws Exception if an error occurs + */ + @After + public void teardown() throws Exception { + if (activator != null && activator.isAlive()) { + activator.terminate(); + } + } + + @Test + public void testApexStarterActivator() throws ApexStarterException { + assertFalse(activator.isAlive()); + activator.initialize(); + assertTrue(activator.isAlive()); + assertTrue(activator.getParameterGroup().isValid()); + assertEquals(CommonTestData.APEX_STARTER_GROUP_NAME, activator.getParameterGroup().getName()); + + // repeat - should throw an exception + assertThatIllegalStateException().isThrownBy(() -> activator.initialize()); + assertTrue(activator.isAlive()); + assertTrue(activator.getParameterGroup().isValid()); + } + + @Test + public void testGetCurrent_testSetCurrent() { + assertSame(activator, ApexStarterActivator.getCurrent()); + } + + @Test + public void testTerminate() throws Exception { + activator.initialize(); + activator.terminate(); + assertFalse(activator.isAlive()); + + // repeat - should throw an exception + assertThatIllegalStateException().isThrownBy(() -> activator.terminate()); + assertFalse(activator.isAlive()); + } +} diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterMain.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterMain.java new file mode 100644 index 000000000..5d52d85c5 --- /dev/null +++ b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterMain.java @@ -0,0 +1,91 @@ +/*- + * ============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.starter; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.After; +import org.junit.Test; +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.apex.starter.parameters.CommonTestData; + +/** + * Class to perform unit test of {@link ApexStarterMain}}. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class TestApexStarterMain { + private ApexStarterMain apexStarter; + + /** + * Shuts "main" down. + * + * @throws Exception if an error occurs + */ + @After + public void tearDown() throws Exception { + // shut down activator + final ApexStarterActivator activator = ApexStarterActivator.getCurrent(); + if (activator != null && activator.isAlive()) { + activator.terminate(); + } + } + + @Test + public void testApexStarter() throws ApexStarterException { + final String[] apexStarterConfigParameters = { "-c", "src/test/resources/ApexStarterConfigParameters.json", + "-p", "src/test/resources/topic.properties" }; + apexStarter = new ApexStarterMain(apexStarterConfigParameters); + assertTrue(apexStarter.getParameters().isValid()); + assertEquals(CommonTestData.APEX_STARTER_GROUP_NAME, apexStarter.getParameters().getName()); + + apexStarter.shutdown(); + } + + @Test + public void testApexStarter_NoArguments() { + final String[] apexStarterConfigParameters = {}; + apexStarter = new ApexStarterMain(apexStarterConfigParameters); + assertTrue(apexStarter.getParameters() == null); + } + + @Test + public void testApexStarter_InvalidArguments() { + final String[] apexStarterConfigParameters = { "src/test/resources/ApexStarterConfigParameters.json" }; + apexStarter = new ApexStarterMain(apexStarterConfigParameters); + assertTrue(apexStarter.getParameters() == null); + } + + @Test + public void testApexStarter_Help() { + final String[] apexStarterConfigParameters = { "-h" }; + ApexStarterMain.main(apexStarterConfigParameters); + } + + @Test + public void testApexStarter_InvalidParameters() { + final String[] apexStarterConfigParameters = + { "-c", "src/test/resources/ApexStarterConfigParameters_InvalidName.json" }; + apexStarter = new ApexStarterMain(apexStarterConfigParameters); + assertTrue(apexStarter.getParameters() == null); + } +} diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/exception/TestExceptions.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/exception/TestExceptions.java new file mode 100644 index 000000000..63ebeb608 --- /dev/null +++ b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/exception/TestExceptions.java @@ -0,0 +1,38 @@ +/*- + * ============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.starter.exception; + +import org.junit.Test; +import org.onap.policy.common.utils.test.ExceptionsTester; + +/** + * Class to perform unit test of {@link ApexStarterException ApexStarterRunTimeException}}. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class TestExceptions { + + @Test + public void test() { + new ExceptionsTester().test(ApexStarterException.class); + new ExceptionsTester().test(ApexStarterRunTimeException.class); + } +} diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/CommonTestData.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/CommonTestData.java new file mode 100644 index 000000000..08a33b94c --- /dev/null +++ b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/CommonTestData.java @@ -0,0 +1,92 @@ +/*- + * ============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.starter.parameters; + +import java.util.Map; +import java.util.TreeMap; + +import org.onap.policy.common.parameters.ParameterGroup; +import org.onap.policy.common.utils.coder.Coder; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; + +/** + * Class to hold/create all parameters for test cases. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class CommonTestData { + + public static final String APEX_STARTER_GROUP_NAME = "ApexStarterParameterGroup"; + public static final int APEX_STARTER_TIME_INTERVAL = 5; + + private static final Coder coder = new StandardCoder(); + + /** + * Converts the contents of a map to a parameter class. + * + * @param source property map + * @param clazz class of object to be created from the map + * @return a new object represented by the map + */ + public T toObject(final Map source, final Class clazz) { + try { + return coder.decode(coder.encode(source), clazz); + + } catch (final CoderException e) { + throw new RuntimeException("cannot create " + clazz.getName() + " from map", e); + } + } + + /** + * Returns a property map for a ApexStarterParameterGroup map for test cases. + * + * @param name name of the parameters + * + * @return a property map suitable for constructing an object + */ + public Map getApexStarterParameterGroupMap(final String name) { + final Map map = new TreeMap<>(); + + map.put("name", name); + map.put("timeInterval", getTimeInterval(false)); + + return map; + } + + + + /** + * Determines whether to return null or a valid time interval + * + * @param isNullField flag to determine what to return + * @return time interval based on the flag + */ + public Object getTimeInterval(final boolean isNullField) { + if (isNullField) { + return null; + } else { + return APEX_STARTER_TIME_INTERVAL; + } + + } + +} diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterGroup.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterGroup.java new file mode 100644 index 000000000..d22455214 --- /dev/null +++ b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterGroup.java @@ -0,0 +1,104 @@ +/*- + * ============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.starter.parameters; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Map; + +import org.junit.Test; +import org.onap.policy.common.parameters.GroupValidationResult; + +/** + * Class to perform unit test of {@link ApexStarterParameterGroup}. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class TestApexStarterParameterGroup { + CommonTestData commonTestData = new CommonTestData(); + + @Test + public void testApexStarterParameterGroup_Named() { + final ApexStarterParameterGroup apexStarterParameters = new ApexStarterParameterGroup("my-name"); + assertEquals("my-name", apexStarterParameters.getName()); + } + + @Test + public void testApexStarterParameterGroup() { + final ApexStarterParameterGroup apexStarterParameters = commonTestData.toObject( + commonTestData.getApexStarterParameterGroupMap(CommonTestData.APEX_STARTER_GROUP_NAME), + ApexStarterParameterGroup.class); + final GroupValidationResult validationResult = apexStarterParameters.validate(); + assertTrue(validationResult.isValid()); + assertEquals(CommonTestData.APEX_STARTER_GROUP_NAME, apexStarterParameters.getName()); + assertEquals(CommonTestData.APEX_STARTER_TIME_INTERVAL, apexStarterParameters.getTimeInterval()); + } + + @Test + public void testApexStarterParameterGroup_NullName() { + final ApexStarterParameterGroup apexStarterParameters = commonTestData + .toObject(commonTestData.getApexStarterParameterGroupMap(null), ApexStarterParameterGroup.class); + final GroupValidationResult validationResult = apexStarterParameters.validate(); + assertFalse(validationResult.isValid()); + assertEquals(null, apexStarterParameters.getName()); + assertEquals(CommonTestData.APEX_STARTER_TIME_INTERVAL, apexStarterParameters.getTimeInterval()); + assertTrue(validationResult.getResult().contains("is null")); + } + + @Test + public void testApexStarterParameterGroup_EmptyName() { + final ApexStarterParameterGroup apexStarterParameters = commonTestData + .toObject(commonTestData.getApexStarterParameterGroupMap(""), ApexStarterParameterGroup.class); + final GroupValidationResult validationResult = apexStarterParameters.validate(); + assertFalse(validationResult.isValid()); + assertEquals("", apexStarterParameters.getName()); + assertEquals(CommonTestData.APEX_STARTER_TIME_INTERVAL, apexStarterParameters.getTimeInterval()); + assertTrue(validationResult.getResult().contains( + "field \"name\" type \"java.lang.String\" value \"\" INVALID, " + "must be a non-blank string")); + } + + @Test + public void testApexStarterParameterGroup_SetName() { + final ApexStarterParameterGroup apexStarterParameters = commonTestData.toObject( + commonTestData.getApexStarterParameterGroupMap(CommonTestData.APEX_STARTER_GROUP_NAME), + ApexStarterParameterGroup.class); + apexStarterParameters.setName("ApexStarterNewGroup"); + final GroupValidationResult validationResult = apexStarterParameters.validate(); + assertTrue(validationResult.isValid()); + assertEquals("ApexStarterNewGroup", apexStarterParameters.getName()); + } + + @Test + public void testApexStarterParameterGroup_EmptyTimeInterval() { + final Map map = + commonTestData.getApexStarterParameterGroupMap(CommonTestData.APEX_STARTER_GROUP_NAME); + map.put("timeInterval", commonTestData.getTimeInterval(true)); + final ApexStarterParameterGroup apexStarterParameters = + commonTestData.toObject(map, ApexStarterParameterGroup.class); + final GroupValidationResult validationResult = apexStarterParameters.validate(); + assertFalse(validationResult.isValid()); + assertTrue(validationResult.getResult() + .contains("field \"timeInterval\" type \"int\" value \"0\" INVALID, must be >= 1") + && validationResult.getResult().contains("parameter group has status INVALID")); + } +} diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterHandler.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterHandler.java new file mode 100644 index 000000000..3889b2aa5 --- /dev/null +++ b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterHandler.java @@ -0,0 +1,158 @@ +/*- + * ============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.starter.parameters; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.FileNotFoundException; + +import org.junit.Test; +import org.onap.policy.apex.starter.ApexStarterCommandLineArguments; +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.common.utils.coder.CoderException; + +/** + * Class to perform unit test of {@link ApexStarterParameterHandler}. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class TestApexStarterParameterHandler { + + @Test + public void testParameterHandlerNoParameterFile() throws ApexStarterException { + final String[] emptyArgumentString = { "-c", "src/test/resources/NoParametersFile.json" }; + + final ApexStarterCommandLineArguments emptyArguments = new ApexStarterCommandLineArguments(); + emptyArguments.parse(emptyArgumentString); + + try { + new ApexStarterParameterHandler().getParameters(emptyArguments); + fail("test should throw an exception here"); + } catch (final Exception e) { + assertTrue(e.getCause() instanceof CoderException); + assertTrue(e.getCause().getCause() instanceof FileNotFoundException); + } + } + + @Test + public void testParameterHandlerEmptyParameters() throws ApexStarterException { + final String[] noArgumentString = { "-c", "src/test/resources/NoParameters.json" }; + + final ApexStarterCommandLineArguments noArguments = new ApexStarterCommandLineArguments(); + noArguments.parse(noArgumentString); + + try { + new ApexStarterParameterHandler().getParameters(noArguments); + fail("test should throw an exception here"); + } catch (final Exception e) { + assertTrue(e.getMessage().contains("no parameters found")); + } + } + + @Test + public void testParameterHandlerInvalidParameters() throws ApexStarterException { + final String[] invalidArgumentString = { "-c", "src/test/resources/InvalidParameters.json" }; + + final ApexStarterCommandLineArguments invalidArguments = new ApexStarterCommandLineArguments(); + invalidArguments.parse(invalidArgumentString); + + try { + new ApexStarterParameterHandler().getParameters(invalidArguments); + fail("test should throw an exception here"); + } catch (final Exception e) { + assertTrue(e.getMessage().startsWith("error reading parameters from")); + assertTrue(e.getCause() instanceof CoderException); + } + } + + @Test + public void testParameterHandlerNoParameters() throws ApexStarterException { + final String[] noArgumentString = { "-c", "src/test/resources/EmptyConfigParameters.json" }; + + final ApexStarterCommandLineArguments noArguments = new ApexStarterCommandLineArguments(); + noArguments.parse(noArgumentString); + + try { + new ApexStarterParameterHandler().getParameters(noArguments); + } catch (final Exception e) { + assertTrue(e.getMessage().contains("is null")); + } + } + + @Test + public void testApexStarterParameterGroup() throws ApexStarterException { + final String[] apexStarterConfigParameters = { "-c", "src/test/resources/ApexStarterConfigParameters.json" }; + + final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments(); + arguments.parse(apexStarterConfigParameters); + + final ApexStarterParameterGroup parGroup = new ApexStarterParameterHandler().getParameters(arguments); + assertTrue(arguments.checkSetConfigurationFilePath()); + assertEquals(CommonTestData.APEX_STARTER_GROUP_NAME, parGroup.getName()); + assertEquals(CommonTestData.APEX_STARTER_TIME_INTERVAL, parGroup.getTimeInterval()); + } + + @Test + public void testApexStarterParameterGroup_InvalidName() throws ApexStarterException { + final String[] apexStarterConfigParameters = + { "-c", "src/test/resources/ApexStarterConfigParameters_InvalidName.json" }; + + final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments(); + arguments.parse(apexStarterConfigParameters); + + try { + new ApexStarterParameterHandler().getParameters(arguments); + fail("test should throw an exception here"); + } catch (final Exception e) { + assertTrue(e.getMessage().contains( + "field \"name\" type \"java.lang.String\" value \" \" INVALID, must be a non-blank string")); + } + } + + @Test + public void testApexStarterVersion() throws ApexStarterException { + final String[] apexStarterConfigParameters = { "-v" }; + final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments(); + final String version = arguments.parse(apexStarterConfigParameters); + assertTrue(version.startsWith("ONAP Policy Framework Apex Starter Service")); + } + + @Test + public void testApexStarterHelp() throws ApexStarterException { + final String[] apexStarterConfigParameters = { "-h" }; + final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments(); + final String help = arguments.parse(apexStarterConfigParameters); + assertTrue(help.startsWith("usage:")); + } + + @Test + public void testApexStarterInvalidOption() throws ApexStarterException { + final String[] apexStarterConfigParameters = { "-d" }; + final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments(); + try { + arguments.parse(apexStarterConfigParameters); + } catch (final Exception exp) { + assertTrue(exp.getMessage().startsWith("invalid command line arguments specified")); + } + } +} diff --git a/services/services-onappf/src/test/resources/ApexStarterConfigParameters.json b/services/services-onappf/src/test/resources/ApexStarterConfigParameters.json new file mode 100644 index 000000000..2720cdefd --- /dev/null +++ b/services/services-onappf/src/test/resources/ApexStarterConfigParameters.json @@ -0,0 +1,4 @@ +{ + "name":"ApexStarterParameterGroup", + "timeInterval": 5 +} diff --git a/services/services-onappf/src/test/resources/ApexStarterConfigParameters_InvalidName.json b/services/services-onappf/src/test/resources/ApexStarterConfigParameters_InvalidName.json new file mode 100644 index 000000000..a7273ae2b --- /dev/null +++ b/services/services-onappf/src/test/resources/ApexStarterConfigParameters_InvalidName.json @@ -0,0 +1,4 @@ +{ + "name":" ", + "timeInterval": 5 +} \ No newline at end of file diff --git a/services/services-onappf/src/test/resources/EmptyConfigParameters.json b/services/services-onappf/src/test/resources/EmptyConfigParameters.json new file mode 100644 index 000000000..7a73a41bf --- /dev/null +++ b/services/services-onappf/src/test/resources/EmptyConfigParameters.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/services/services-onappf/src/test/resources/InvalidParameters.json b/services/services-onappf/src/test/resources/InvalidParameters.json new file mode 100644 index 000000000..de2040cc8 --- /dev/null +++ b/services/services-onappf/src/test/resources/InvalidParameters.json @@ -0,0 +1,3 @@ +{ + "name" : [] +} \ No newline at end of file diff --git a/services/services-onappf/src/test/resources/NoParameters.json b/services/services-onappf/src/test/resources/NoParameters.json new file mode 100644 index 000000000..e69de29bb diff --git a/services/services-onappf/src/test/resources/topic.properties b/services/services-onappf/src/test/resources/topic.properties new file mode 100644 index 000000000..87c6ebd54 --- /dev/null +++ b/services/services-onappf/src/test/resources/topic.properties @@ -0,0 +1,4 @@ +noop.sink.topics=POLICY-PDP-PAP +noop.sink.topics.POLICY-PDP-PAP.servers=anyserver +noop.source.topics=POLICY-PDP-PAP +noop.source.topics.POLICY-PDP-PAP.servers=anyserver \ No newline at end of file -- cgit 1.2.3-korg