Changes related to multi policy handling improvement in APEX 51/117651/8
authora.sreekumar <ajith.sreekumar@bell.ca>
Tue, 9 Feb 2021 18:21:49 +0000 (18:21 +0000)
committerAjith Sreekumar <ajith.sreekumar@bell.ca>
Thu, 11 Feb 2021 10:01:27 +0000 (10:01 +0000)
This review fixes an issue identified during testing the changes done
for improving multiple policy handling in APEX.
Changes done to a few test files in the previous review are reverted as
well.

Change-Id: I98324da708239d314aadd4c45dc377137fd552ba
Issue-ID: POLICY-2883
Signed-off-by: a.sreekumar <ajith.sreekumar@bell.ca>
examples/examples-servlet/src/main/java/org/onap/policy/apex/examples/servlet/ApexServletListener.java
plugins/plugins-event/plugins-event-carrier/plugins-event-carrier-restrequestor/src/test/java/org/onap/policy/apex/plugins/event/carrier/restrequestor/RestRequestorTest.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java
services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java
services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/handler/ApexEngineHandler.java
testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/adapt/restclient/TestFile2Rest.java
testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/adapt/restclient/TestRest2File.java
testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/adapt/restserver/TestRestServer.java

index 3375ff8..80ef735 100644 (file)
@@ -1,7 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
- *  Modifications Copyright (C) 2021 Bell Canada. 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.
@@ -76,11 +75,7 @@ public class ApexServletListener implements ServletContextListener {
         }
 
         // Initialize apex
-        try {
-            apexMain = new ApexMain(argsList.toArray(new String[argsList.size()]));
-        } catch (ApexException e) {
-            LOGGER.error("Apex Engine initialization failed", e);
-        }
+        apexMain = new ApexMain(argsList.toArray(new String[argsList.size()]));
     }
 
 
index 0130464..40e9004 100644 (file)
 
 package org.onap.policy.apex.plugins.event.carrier.restrequestor;
 
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.awaitility.Awaitility.await;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 
 import com.google.gson.Gson;
 import java.io.ByteArrayOutputStream;
@@ -36,6 +35,7 @@ import java.util.concurrent.TimeUnit;
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.core.Response;
+import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -94,11 +94,22 @@ public class RestRequestorTest {
     }
 
     /**
-     * Reset counters.
+     * Before test.
      */
     @Before
-    public void resetCounters() {
+    public void beforeTest() {
         SupportRestRequestorEndpoint.resetCounters();
+        System.setOut(new PrintStream(outContent));
+        System.setErr(new PrintStream(errContent));
+    }
+
+    /**
+     * After test.
+     */
+    @After
+    public void afterTest() {
+        System.setOut(stdout);
+        System.setErr(stderr);
     }
 
     /**
@@ -269,14 +280,23 @@ public class RestRequestorTest {
 
     /**
      * Test REST requestor producer alone.
+     *
+     * @throws MessagingException the messaging exception
+     * @throws ApexException the apex exception
+     * @throws IOException Signals that an I/O exception has occurred.
      */
     @Test
-    public void testRestRequestorProducerAlone() {
+    public void testRestRequestorProducerAlone() throws MessagingException, ApexException, IOException {
+
         final String[] args = {"src/test/resources/prodcons/File2RESTRequest2FileGetProducerAlone.json"};
-        assertThatThrownBy(() -> new ApexMain(args))
-            .hasRootCauseMessage("REST Requestor producer (RestRequestorProducer) "
-                + "must run in peered requestor mode with a REST Requestor consumer");
 
+        ApexMain apexMain = new ApexMain(args);
+        apexMain.shutdown();
+
+        final String outString = outContent.toString();
+
+        assertThat(outString).contains("REST Requestor producer (RestRequestorProducer) "
+            + "must run in peered requestor mode with a REST Requestor consumer");
     }
 
     /**
@@ -288,21 +308,12 @@ public class RestRequestorTest {
      */
     @Test
     public void testRestRequestorConsumerAlone() throws MessagingException, ApexException, IOException {
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
-
         final String[] args = {"src/test/resources/prodcons/File2RESTRequest2FileGetConsumerAlone.json"};
-
         ApexMain apexMain = new ApexMain(args);
         apexMain.shutdown();
-
         final String outString = outContent.toString();
-
-        System.setOut(stdout);
-        System.setErr(stderr);
-
-        assertTrue(outString.contains("peer \"RestRequestorProducer for peered mode REQUESTOR "
-            + "does not exist or is not defined with the same peered mode"));
+        assertThat(outString).contains("peer \"RestRequestorProducer for peered mode REQUESTOR "
+            + "does not exist or is not defined with the same peered mode");
     }
 
     private double getStatsFromServer(final Client client, final String statToGet) {
index 65c2acf..3e9072d 100644 (file)
@@ -71,7 +71,7 @@ public class ApexMain {
      * @param args the command line arguments
      * @throws ApexException the apex exception.
      */
-    public ApexMain(final String[] args) throws ApexException {
+    public ApexMain(final String[] args) {
         LOGGER.entry("Starting Apex service with parameters " + Arrays.toString(args) + " . . .");
         try {
             apexParameters = populateApexParameters(args);
@@ -79,17 +79,18 @@ public class ApexMain {
             LOGGER.error(APEX_SERVICE_FAILED_MSG, e);
             return;
         }
-        aggregateParametersAndRegister();
+        try {
+            aggregateParametersAndRegister();
 
-        // Now, create the activator for the Apex service
-        activator = new ApexActivator(apexParameters);
+            // Now, create the activator for the Apex service
+            activator = new ApexActivator(apexParameters);
 
-        // Start the activator
-        try {
+            // Start the activator
             activator.initialize();
             setAlive(true);
-        } catch (final ApexActivatorException e) {
-            throw new ApexException("start of Apex service failed, used parameters are " + Arrays.toString(args), e);
+        } catch (final ApexException e) {
+            LOGGER.error("start of Apex service failed, used parameters are {}", Arrays.toString(args), e);
+            return;
         }
 
         // Add a shutdown hook to shut everything down in an orderly manner
@@ -246,7 +247,7 @@ public class ApexMain {
      * @param args the arguments
      * @throws ApexException the apex exception.
      */
-    public static void main(final String[] args) throws ApexException {
+    public static void main(final String[] args) {
         new ApexMain(args);
     }
 }
index 2cb12c3..5764a52 100644 (file)
@@ -23,7 +23,6 @@
 package org.onap.policy.apex.service.engine.main;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.awaitility.Awaitility.await;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -31,10 +30,10 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayOutputStream;
-import java.io.OutputStream;
 import java.io.PrintStream;
 import java.util.concurrent.TimeUnit;
 import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
 import org.onap.policy.apex.model.basicmodel.service.ModelService;
@@ -44,7 +43,20 @@ import org.onap.policy.common.parameters.ParameterService;
  * Test the ApexMain class.
  */
 public class ApexMainTest {
-    private PrintStream stdout = System.out;
+    private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+    private final PrintStream stdout = System.out;
+    private ApexMain apexMain1;
+    private ApexMain apexMain2;
+
+    /**
+     * Method for set up before each test.
+     *
+     * @throws Exception if an error occurs
+     */
+    @Before
+    public void setUp() throws Exception {
+        System.setOut(new PrintStream(outContent));
+    }
 
     /**
      * Method for cleanup after each test.
@@ -53,14 +65,17 @@ public class ApexMainTest {
      */
     @After
     public void teardown() throws Exception {
+        if (null != apexMain1) {
+            apexMain1.shutdown();
+        }
+        if (null != apexMain2) {
+            apexMain2.shutdown();
+        }
         System.setOut(stdout);
     }
 
     @Test
     public void testNullParameters() throws ApexException {
-        OutputStream outContent = new ByteArrayOutputStream();
-        System.setOut(new PrintStream(outContent));
-
         ApexMain.main(null);
         await().atMost(200, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
                 .contains("Tosca Policy file was not specified as an argument"));
@@ -70,95 +85,71 @@ public class ApexMainTest {
 
     @Test
     public void testBadArguments() throws ApexException {
-        OutputStream outContent = new ByteArrayOutputStream();
-        System.setOut(new PrintStream(outContent));
-
         String[] args = { "-whee" };
 
-        final ApexMain apexMain = new ApexMain(args);
+        apexMain1 = new ApexMain(args);
         await().atMost(200, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
                 .contains("invalid command line arguments specified : Unrecognized option: -whee"));
-        assertNotNull(apexMain);
-        apexMain.shutdown();
+        assertNotNull(apexMain1);
     }
 
     @Test
     public void testHelp() throws ApexException {
-        OutputStream outContent = new ByteArrayOutputStream();
-        System.setOut(new PrintStream(outContent));
-
         String[] args = { "-h" };
 
-        final ApexMain apexMain = new ApexMain(args);
+        apexMain1 = new ApexMain(args);
         await().atMost(200, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
                 .contains("usage: org.onap.policy.apex.service.engine.main.ApexMain [options...]"));
-        assertNotNull(apexMain);
-        apexMain.shutdown();
+        assertNotNull(apexMain1);
     }
 
     @Test
     public void testBadParameters() throws ApexException {
-        OutputStream outContent = new ByteArrayOutputStream();
-        System.setOut(new PrintStream(outContent));
-
         String[] args = { "-p", "src/test/resources/parameters/badParams.json" };
 
-        final ApexMain apexMain = new ApexMain(args);
+        apexMain1 = new ApexMain(args);
         await().atMost(200, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
                 .contains("parameter group has status INVALID"));
-        assertNotNull(apexMain);
-        apexMain.shutdown();
+        assertNotNull(apexMain1);
     }
 
     @Test
     public void testCorrectParameters() throws ApexException {
-        OutputStream outContent = new ByteArrayOutputStream();
-        System.setOut(new PrintStream(outContent));
-
         String[] args = {"-p", "src/test/resources/parameters/correctParams.json"};
 
-        final ApexMain apexMain = new ApexMain(args);
-        assertEquals("MyApexEngine", apexMain.getApexParameters().getEngineServiceParameters().getName());
+        apexMain1 = new ApexMain(args);
+        assertEquals("MyApexEngine", apexMain1.getApexParameters().getEngineServiceParameters().getName());
         await().atMost(200, TimeUnit.MILLISECONDS)
             .until(() -> outContent.toString().contains("Added the action listener to the engine"));
-        assertTrue(apexMain.isAlive());
-        apexMain.shutdown();
+        assertTrue(apexMain1.isAlive());
     }
 
     @Test
     public void testJavaProperties() throws ApexException {
-        OutputStream outContent = new ByteArrayOutputStream();
-        System.setOut(new PrintStream(outContent));
-
         String[] args = {"-p", "src/test/resources/parameters/correctParamsJavaProperties.json"};
 
-        final ApexMain apexMain = new ApexMain(args);
-        assertEquals("MyApexEngine", apexMain.getApexParameters().getEngineServiceParameters().getName());
+        apexMain1 = new ApexMain(args);
+        assertEquals("MyApexEngine", apexMain1.getApexParameters().getEngineServiceParameters().getName());
 
         assertEquals("trust-store-file", System.getProperty("javax.net.ssl.trustStore"));
         assertEquals("Pol1cy_0nap", System.getProperty("javax.net.ssl.trustStorePassword"));
         await().atMost(10000, TimeUnit.MILLISECONDS)
             .until(() -> outContent.toString().contains("Added the action listener to the engine"));
-        apexMain.shutdown();
     }
 
     @Test
     public void testCorrectParametersWithMultiplePolicies() throws ApexException {
-        OutputStream outContent = new ByteArrayOutputStream();
-        System.setOut(new PrintStream(outContent));
         String[] args1 = {"-p", "src/test/resources/parameters/correctParams.json"};
         String[] args2 = {"-p", "src/test/resources/parameters/correctParams2.json"};
-        final ApexMain apexMain1 = new ApexMain(args1);
-        final ApexMain apexMain2 = new ApexMain(args2);
+        apexMain1 = new ApexMain(args1);
+        apexMain2 = new ApexMain(args2);
         assertEquals("MyApexEngine", apexMain1.getApexParameters().getEngineServiceParameters().getName());
         assertEquals("MyApexEngine2", apexMain2.getApexParameters().getEngineServiceParameters().getName());
+        assertTrue(apexMain1.isAlive());
+        assertTrue(apexMain2.isAlive());
         final String outString = outContent.toString();
         assertThat(outString).contains("Added the action listener to the engine")
             .contains("Created apex engine MyApexEngine").contains("Created apex engine MyApexEngine2");
-        assertTrue(apexMain1.isAlive());
-        assertTrue(apexMain2.isAlive());
-        apexMain1.shutdown();
-        apexMain2.shutdown();
         ModelService.clear();
         ParameterService.clear();
     }
@@ -166,21 +157,21 @@ public class ApexMainTest {
     @Test
     public void testInCorrectParametersWithMultiplePolicies() throws ApexException {
         String[] args = {"-p", "src/test/resources/parameters/correctParams.json"};
-        final ApexMain apexMain1 = new ApexMain(args);
-        assertThatThrownBy(() -> new ApexMain(args)).hasMessage("start of Apex service failed because this"
+        apexMain1 = new ApexMain(args);
+        apexMain2 = new ApexMain(args);
+        assertTrue(apexMain1.isAlive());
+        assertFalse(apexMain2.isAlive());
+        final String outString = outContent.toString();
+        assertThat(outString).contains("start of Apex service failed because this"
             + " policy has the following duplicate I/O parameters: [TheFileConsumer1]/[FirstProducer]");
-        apexMain1.shutdown();
     }
 
     @Test
     public void testInvalidArgsWithMultiplePolicies() throws ApexException {
-        OutputStream outContent = new ByteArrayOutputStream();
-        System.setOut(new PrintStream(outContent));
         String[] args = {"-c", "file1", "-m", "file2"};
-        final ApexMain apexMain = new ApexMain(args);
+        apexMain1 = new ApexMain(args);
+        assertFalse(apexMain1.isAlive());
         final String outString = outContent.toString();
-        apexMain.shutdown();
         assertThat(outString).contains("Arguments validation failed", "start of Apex service failed");
-        assertFalse(apexMain.isAlive()); // No policy is running in the engine
     }
 }
index 03e9721..5a113a7 100644 (file)
@@ -72,7 +72,7 @@ public class ApexEngineHandler {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ApexEngineHandler.class);
 
-    private Map<ToscaConceptIdentifier, ApexMain> apexMainMap;
+    private Map<ToscaConceptIdentifier, ApexMain> apexMainMap = new LinkedHashMap<>();
 
     /**
      * Constructs the object. Extracts the config and model files from each policy and instantiates the apex engine.
@@ -82,12 +82,7 @@ public class ApexEngineHandler {
      */
     public ApexEngineHandler(List<ToscaPolicy> policies) throws ApexStarterException {
         LOGGER.debug("Starting apex engine.");
-        apexMainMap = initiateApexEngineForPolicies(policies);
-        if (apexMainMap.isEmpty()) {
-            ModelService.clear();
-            ParameterService.clear();
-            throw new ApexStarterException("Apex Engine failed to start.");
-        }
+        initiateApexEngineForPolicies(policies);
     }
 
     /**
@@ -118,11 +113,7 @@ public class ApexEngineHandler {
             updateModelAndParameterServices(undeployedPoliciesMainMap);
         }
         if (!policiesToDeploy.isEmpty()) {
-            Map<ToscaConceptIdentifier, ApexMain> mainMap = initiateApexEngineForPolicies(policiesToDeploy);
-            if (mainMap.isEmpty()) {
-                throw new ApexStarterException("Updating the APEX engine with new policies failed.");
-            }
-            apexMainMap.putAll(mainMap);
+            initiateApexEngineForPolicies(policiesToDeploy);
         }
         if (apexMainMap.isEmpty()) {
             ModelService.clear();
@@ -168,65 +159,80 @@ public class ApexEngineHandler {
             policyKeystoRetain.addAll(main.getActivator().getPolicyModel().getPolicies().getPolicyMap().keySet());
         });
         for (ApexMain main : undeployedPoliciesMainMap.values()) {
-            ApexParameters existingParameters = ParameterService.get(ApexParameterConstants.MAIN_GROUP_NAME);
-            List<String> eventInputParamKeysToRemove = main.getApexParameters().getEventInputParameters().keySet()
-                .stream().filter(key -> !inputParamKeysToRetain.contains(key)).collect(Collectors.toList());
-            List<String> eventOutputParamKeysToRemove = main.getApexParameters().getEventOutputParameters().keySet()
-                .stream().filter(key -> !outputParamKeysToRetain.contains(key)).collect(Collectors.toList());
-            eventInputParamKeysToRemove.forEach(existingParameters.getEventInputParameters()::remove);
-            eventOutputParamKeysToRemove.forEach(existingParameters.getEventOutputParameters()::remove);
-            EngineParameters engineParameters =
-                main.getApexParameters().getEngineServiceParameters().getEngineParameters();
-            final List<TaskParameters> taskParametersToRemove = engineParameters.getTaskParameters().stream()
-                .filter(taskParameter -> !taskParametersToRetain.contains(taskParameter)).collect(Collectors.toList());
-            final List<String> executorParamKeysToRemove = engineParameters.getExecutorParameterMap().keySet().stream()
-                .filter(key -> !executorParamKeysToRetain.contains(key)).collect(Collectors.toList());
-            final List<String> schemaParamKeysToRemove =
-                engineParameters.getContextParameters().getSchemaParameters().getSchemaHelperParameterMap().keySet()
-                    .stream().filter(key -> !schemaParamKeysToRetain.contains(key)).collect(Collectors.toList());
-            EngineParameters aggregatedEngineParameters =
-                existingParameters.getEngineServiceParameters().getEngineParameters();
-            aggregatedEngineParameters.getTaskParameters().removeAll(taskParametersToRemove);
-            executorParamKeysToRemove.forEach(aggregatedEngineParameters.getExecutorParameterMap()::remove);
-            schemaParamKeysToRemove.forEach(aggregatedEngineParameters.getContextParameters().getSchemaParameters()
-                .getSchemaHelperParameterMap()::remove);
+            handleParametersRemoval(inputParamKeysToRetain, outputParamKeysToRetain, taskParametersToRetain,
+                executorParamKeysToRetain, schemaParamKeysToRetain, main);
+
+            if (null != main.getActivator() && null != main.getActivator().getPolicyModel()) {
+                handleAxConceptsRemoval(keyInfoKeystoRetain, schemaKeystoRetain, eventKeystoRetain, albumKeystoRetain,
+                    taskKeystoRetain, policyKeystoRetain, main);
+            }
+        }
+    }
 
-            final AxPolicyModel policyModel = main.getActivator().getPolicyModel();
-            final List<AxArtifactKey> keyInfoKeystoRemove = policyModel.getKeyInformation().getKeyInfoMap().keySet()
-                .stream().filter(key -> !keyInfoKeystoRetain.contains(key)).collect(Collectors.toList());
-            final List<AxArtifactKey> schemaKeystoRemove = policyModel.getSchemas().getSchemasMap().keySet().stream()
-                .filter(key -> !schemaKeystoRetain.contains(key)).collect(Collectors.toList());
-            final List<AxArtifactKey> eventKeystoRemove = policyModel.getEvents().getEventMap().keySet().stream()
-                .filter(key -> !eventKeystoRetain.contains(key)).collect(Collectors.toList());
-            final List<AxArtifactKey> albumKeystoRemove = policyModel.getAlbums().getAlbumsMap().keySet().stream()
-                .filter(key -> !albumKeystoRetain.contains(key)).collect(Collectors.toList());
-            final List<AxArtifactKey> taskKeystoRemove = policyModel.getTasks().getTaskMap().keySet().stream()
-                .filter(key -> !taskKeystoRetain.contains(key)).collect(Collectors.toList());
-            final List<AxArtifactKey> policyKeystoRemove = policyModel.getPolicies().getPolicyMap().keySet().stream()
-                .filter(key -> !policyKeystoRetain.contains(key)).collect(Collectors.toList());
+    private void handleParametersRemoval(Set<String> inputParamKeysToRetain, Set<String> outputParamKeysToRetain,
+        List<TaskParameters> taskParametersToRetain, List<String> executorParamKeysToRetain,
+        List<String> schemaParamKeysToRetain, ApexMain main) {
+        ApexParameters existingParameters = ParameterService.get(ApexParameterConstants.MAIN_GROUP_NAME);
+        List<String> eventInputParamKeysToRemove = main.getApexParameters().getEventInputParameters().keySet().stream()
+            .filter(key -> !inputParamKeysToRetain.contains(key)).collect(Collectors.toList());
+        List<String> eventOutputParamKeysToRemove = main.getApexParameters().getEventOutputParameters().keySet()
+            .stream().filter(key -> !outputParamKeysToRetain.contains(key)).collect(Collectors.toList());
+        eventInputParamKeysToRemove.forEach(existingParameters.getEventInputParameters()::remove);
+        eventOutputParamKeysToRemove.forEach(existingParameters.getEventOutputParameters()::remove);
+        EngineParameters engineParameters = main.getApexParameters().getEngineServiceParameters().getEngineParameters();
+        final List<TaskParameters> taskParametersToRemove = engineParameters.getTaskParameters().stream()
+            .filter(taskParameter -> !taskParametersToRetain.contains(taskParameter)).collect(Collectors.toList());
+        final List<String> executorParamKeysToRemove = engineParameters.getExecutorParameterMap().keySet().stream()
+            .filter(key -> !executorParamKeysToRetain.contains(key)).collect(Collectors.toList());
+        final List<String> schemaParamKeysToRemove =
+            engineParameters.getContextParameters().getSchemaParameters().getSchemaHelperParameterMap().keySet()
+                .stream().filter(key -> !schemaParamKeysToRetain.contains(key)).collect(Collectors.toList());
+        EngineParameters aggregatedEngineParameters =
+            existingParameters.getEngineServiceParameters().getEngineParameters();
+        aggregatedEngineParameters.getTaskParameters().removeAll(taskParametersToRemove);
+        executorParamKeysToRemove.forEach(aggregatedEngineParameters.getExecutorParameterMap()::remove);
+        schemaParamKeysToRemove.forEach(aggregatedEngineParameters.getContextParameters().getSchemaParameters()
+            .getSchemaHelperParameterMap()::remove);
+    }
 
-            final Map<AxArtifactKey, AxKeyInfo> keyInfoMap =
-                ModelService.getModel(AxKeyInformation.class).getKeyInfoMap();
-            final Map<AxArtifactKey, AxContextSchema> schemasMap =
-                ModelService.getModel(AxContextSchemas.class).getSchemasMap();
-            final Map<AxArtifactKey, AxEvent> eventMap = ModelService.getModel(AxEvents.class).getEventMap();
-            final Map<AxArtifactKey, AxContextAlbum> albumsMap =
-                ModelService.getModel(AxContextAlbums.class).getAlbumsMap();
-            final Map<AxArtifactKey, AxTask> taskMap = ModelService.getModel(AxTasks.class).getTaskMap();
-            final Map<AxArtifactKey, AxPolicy> policyMap = ModelService.getModel(AxPolicies.class).getPolicyMap();
+    private void handleAxConceptsRemoval(List<AxArtifactKey> keyInfoKeystoRetain,
+        List<AxArtifactKey> schemaKeystoRetain, List<AxArtifactKey> eventKeystoRetain,
+        List<AxArtifactKey> albumKeystoRetain, List<AxArtifactKey> taskKeystoRetain,
+        List<AxArtifactKey> policyKeystoRetain, ApexMain main) {
+        final AxPolicyModel policyModel = main.getActivator().getPolicyModel();
+        final List<AxArtifactKey> keyInfoKeystoRemove = policyModel.getKeyInformation().getKeyInfoMap().keySet()
+            .stream().filter(key -> !keyInfoKeystoRetain.contains(key)).collect(Collectors.toList());
+        final List<AxArtifactKey> schemaKeystoRemove = policyModel.getSchemas().getSchemasMap().keySet().stream()
+            .filter(key -> !schemaKeystoRetain.contains(key)).collect(Collectors.toList());
+        final List<AxArtifactKey> eventKeystoRemove = policyModel.getEvents().getEventMap().keySet().stream()
+            .filter(key -> !eventKeystoRetain.contains(key)).collect(Collectors.toList());
+        final List<AxArtifactKey> albumKeystoRemove = policyModel.getAlbums().getAlbumsMap().keySet().stream()
+            .filter(key -> !albumKeystoRetain.contains(key)).collect(Collectors.toList());
+        final List<AxArtifactKey> taskKeystoRemove = policyModel.getTasks().getTaskMap().keySet().stream()
+            .filter(key -> !taskKeystoRetain.contains(key)).collect(Collectors.toList());
+        final List<AxArtifactKey> policyKeystoRemove = policyModel.getPolicies().getPolicyMap().keySet().stream()
+            .filter(key -> !policyKeystoRetain.contains(key)).collect(Collectors.toList());
 
-            keyInfoKeystoRemove.forEach(keyInfoMap::remove);
-            schemaKeystoRemove.forEach(schemasMap::remove);
-            eventKeystoRemove.forEach(eventMap::remove);
-            albumKeystoRemove.forEach(albumsMap::remove);
-            taskKeystoRemove.forEach(taskMap::remove);
-            policyKeystoRemove.forEach(policyMap::remove);
-        }
+        final Map<AxArtifactKey, AxKeyInfo> keyInfoMap = ModelService.getModel(AxKeyInformation.class).getKeyInfoMap();
+        final Map<AxArtifactKey, AxContextSchema> schemasMap =
+            ModelService.getModel(AxContextSchemas.class).getSchemasMap();
+        final Map<AxArtifactKey, AxEvent> eventMap = ModelService.getModel(AxEvents.class).getEventMap();
+        final Map<AxArtifactKey, AxContextAlbum> albumsMap =
+            ModelService.getModel(AxContextAlbums.class).getAlbumsMap();
+        final Map<AxArtifactKey, AxTask> taskMap = ModelService.getModel(AxTasks.class).getTaskMap();
+        final Map<AxArtifactKey, AxPolicy> policyMap = ModelService.getModel(AxPolicies.class).getPolicyMap();
+
+        keyInfoKeystoRemove.forEach(keyInfoMap::remove);
+        schemaKeystoRemove.forEach(schemasMap::remove);
+        eventKeystoRemove.forEach(eventMap::remove);
+        albumKeystoRemove.forEach(albumsMap::remove);
+        taskKeystoRemove.forEach(taskMap::remove);
+        policyKeystoRemove.forEach(policyMap::remove);
     }
 
-    private Map<ToscaConceptIdentifier, ApexMain> initiateApexEngineForPolicies(List<ToscaPolicy> policies)
+    private void initiateApexEngineForPolicies(List<ToscaPolicy> policies)
         throws ApexStarterException {
-        Map<ToscaConceptIdentifier, ApexMain> mainMap = new LinkedHashMap<>();
+        Map<ToscaConceptIdentifier, ApexMain> failedPoliciesMainMap = new LinkedHashMap<>();
         for (ToscaPolicy policy : policies) {
             String policyName = policy.getIdentifier().getName();
             final StandardCoder standardCoder = new StandardCoder();
@@ -243,14 +249,24 @@ public class ApexEngineHandler {
             }
             final String[] apexArgs = {"-p", file.getAbsolutePath()};
             LOGGER.info("Starting apex engine for policy {}", policy.getIdentifier());
-            try {
-                ApexMain apexMain = new ApexMain(apexArgs);
-                mainMap.put(policy.getIdentifier(), apexMain);
-            } catch (Exception e) {
-                LOGGER.error("Execution of policy {} failed", policy.getIdentifier(), e);
+            ApexMain apexMain = new ApexMain(apexArgs);
+            if (apexMain.isAlive()) {
+                apexMainMap.put(policy.getIdentifier(), apexMain);
+            } else {
+                failedPoliciesMainMap.put(policy.getIdentifier(), apexMain);
+                LOGGER.error("Execution of policy {} failed", policy.getIdentifier());
+            }
+        }
+        if (apexMainMap.isEmpty()) {
+            ModelService.clear();
+            ParameterService.clear();
+            throw new ApexStarterException("Apex Engine failed to start.");
+        } else if (failedPoliciesMainMap.size() > 0) {
+            updateModelAndParameterServices(failedPoliciesMainMap);
+            if (failedPoliciesMainMap.size() == policies.size()) {
+                throw new ApexStarterException("Updating the APEX engine with new policies failed.");
             }
         }
-        return mainMap;
     }
 
     /**
index 568e9f3..04a1e6f 100644 (file)
@@ -22,7 +22,8 @@
 
 package org.onap.policy.apex.testsuites.integration.uservice.adapt.restclient;
 
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Awaitility.await;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -31,9 +32,11 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.core.Response;
+import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -63,6 +66,7 @@ public class TestFile2Rest {
 
     private final PrintStream stdout = System.out;
     private final PrintStream stderr = System.err;
+    private ApexMain apexMain;
 
     /**
      * Sets the up.
@@ -97,11 +101,26 @@ public class TestFile2Rest {
     }
 
     /**
-     * Clear relative file root environment variable.
+     * Before test.
      */
     @Before
-    public void clearRelativeFileRoot() {
+    public void beforeTest() {
         System.clearProperty("APEX_RELATIVE_FILE_ROOT");
+        System.setOut(new PrintStream(outContent));
+        System.setErr(new PrintStream(errContent));
+    }
+
+    /**
+     * After test.
+     * @throws ApexException the exception.
+     */
+    @After
+    public void afterTest() throws ApexException {
+        if (null != apexMain) {
+            apexMain.shutdown();
+        }
+        System.setOut(stdout);
+        System.setErr(stderr);
     }
 
     /**
@@ -207,22 +226,12 @@ public class TestFile2Rest {
      */
     @Test
     public void testFileEventsNoUrl() throws MessagingException, ApexException, IOException {
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
 
         final String[] args = {"src/test/resources/prodcons/File2RESTJsonEventNoURL.json"};
-        final ApexMain apexMain = new ApexMain(args);
-
-        ThreadUtilities.sleep(200);
-        apexMain.shutdown();
-
+        apexMain = new ApexMain(args);
         final String outString = outContent.toString();
-
-        System.setOut(stdout);
-        System.setErr(stderr);
-
-        LOGGER.info("NoUrl-OUTSTRING=\n" + outString + "\nEnd-NoUrl");
-        assertTrue(outString.contains(" no URL has been set for event sending on RESTCLIENT"));
+        LOGGER.info("NoUrl-OUTSTRING=\n {} \nEnd-NoUrl", outString);
+        assertThat(outString).contains(" no URL has been set for event sending on RESTCLIENT");
     }
 
     /**
@@ -234,23 +243,15 @@ public class TestFile2Rest {
      */
     @Test
     public void testFileEventsBadUrl() throws MessagingException, ApexException, IOException {
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
 
         final String[] args = {"src/test/resources/prodcons/File2RESTJsonEventBadURL.json"};
-        final ApexMain apexMain = new ApexMain(args);
-
-        ThreadUtilities.sleep(2000);
-        apexMain.shutdown();
-
-        final String outString = outContent.toString();
-
-        System.setOut(stdout);
-        System.setErr(stderr);
-
-        LOGGER.info("BadUrl-OUTSTRING=\n" + outString + "\nEnd-BadUrl");
-        assertTrue(outString.contains(
-                "send of event to URL \"http://localhost:32801/TestFile2Rest/apex/event/Bad\" using HTTP \"POST\" failed with status code 404"));
+        apexMain = new ApexMain(args);
+        await().atMost(5, TimeUnit.SECONDS)
+            .until(() -> outContent.toString()
+                .contains("send of event to URL \"http://localhost:32801/TestFile2Rest/apex/event/Bad\" "
+                    + "using HTTP \"POST\" failed with status code 404"));
+        assertTrue(apexMain.isAlive());
+        LOGGER.info("BadUrl-OUTSTRING=\n {} \nEnd-BadUrl", outContent.toString());
     }
 
     /**
@@ -262,10 +263,14 @@ public class TestFile2Rest {
      */
     @Test
     public void testFileEventsBadHttpMethod() throws MessagingException, ApexException, IOException {
+
         final String[] args = {"src/test/resources/prodcons/File2RESTJsonEventBadHTTPMethod.json"};
-        assertThatThrownBy(() -> new ApexMain(args)).hasRootCauseMessage(
-            "specified HTTP method of \"DELETE\" is invalid, only HTTP methods \"POST\" and \"PUT\" "
-                + "are supported for event sending on REST client producer (FirstProducer)");
+        apexMain = new ApexMain(args);
+        final String outString = outContent.toString();
+        LOGGER.info("BadHttpMethod-OUTSTRING=\n {} \nEnd-BadHttpMethod", outString);
+        assertThat(outString)
+            .contains("specified HTTP method of \"DELETE\" is invalid, only HTTP methods \"POST\" and \"PUT\" "
+                + "are supported for event sending on REST client producer");
     }
 
     /**
@@ -277,23 +282,15 @@ public class TestFile2Rest {
      */
     @Test
     public void testFileEventsBadResponse() throws MessagingException, ApexException, IOException {
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
 
         final String[] args = {"src/test/resources/prodcons/File2RESTJsonEventPostBadResponse.json"};
-        final ApexMain apexMain = new ApexMain(args);
-
-        ThreadUtilities.sleep(2000);
-        apexMain.shutdown();
-
-        final String outString = outContent.toString();
-
-        System.setOut(stdout);
-        System.setErr(stderr);
+        apexMain = new ApexMain(args);
 
-        LOGGER.info("BadResponse-OUTSTRING=\n" + outString + "\nEnd-BadResponse");
-        assertTrue(outString.contains(
+        await().atMost(5, TimeUnit.SECONDS)
+            .until(() -> outContent.toString().contains(
                 "send of event to URL \"http://localhost:32801/TestFile2Rest/apex/event/PostEventBadResponse\""
-                        + " using HTTP \"POST\" failed with status code 400"));
+                    + " using HTTP \"POST\" failed with status code 400"));
+        assertTrue(apexMain.isAlive());
+        LOGGER.info("BadResponse-OUTSTRING=\n {} \nEnd-BadResponse", outContent.toString());
     }
 }
index 25ff122..0aeb196 100644 (file)
 
 package org.onap.policy.apex.testsuites.integration.uservice.adapt.restclient;
 
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.awaitility.Awaitility.await;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.concurrent.TimeUnit;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.apex.core.infrastructure.messaging.MessagingException;
-import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
 import org.onap.policy.apex.service.engine.main.ApexMain;
 import org.onap.policy.common.endpoints.http.server.HttpServletServer;
 import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance;
 import org.onap.policy.common.gson.GsonMessageBodyHandler;
 import org.onap.policy.common.utils.network.NetworkUtil;
-import org.onap.policy.common.utils.resources.TextFileUtils;
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 
@@ -57,13 +59,16 @@ public class TestRest2File {
 
     private final PrintStream stdout = System.out;
     private final PrintStream stderr = System.err;
+    private ApexMain apexMain;
 
     /**
-     * Clear relative file root environment variable.
+     * Before Test.
      */
     @Before
-    public void clearRelativeFileRoot() {
+    public void beforeTest() {
         System.clearProperty("APEX_RELATIVE_FILE_ROOT");
+        System.setOut(new PrintStream(outContent));
+        System.setErr(new PrintStream(errContent));
     }
 
     /**
@@ -93,9 +98,14 @@ public class TestRest2File {
      */
     @After
     public void tearDown() throws Exception {
+        if (null != apexMain) {
+            apexMain.shutdown();
+        }
         if (server != null) {
             server.stop();
         }
+        System.setOut(stdout);
+        System.setErr(stderr);
     }
 
     /**
@@ -109,16 +119,11 @@ public class TestRest2File {
     public void testRestEventsIn() throws MessagingException, ApexException, IOException {
         final String[] args = {"-rfr", "target", "-p", "target/examples/config/SampleDomain/REST2FileJsonEvent.json"};
 
-        final ApexMain apexMain = new ApexMain(args);
-
-        ThreadUtilities.sleep(5000);
-        apexMain.shutdown();
-
-        final String outputEventText =
-            TextFileUtils.getTextFileAsString("target/examples/events/SampleDomain/EventsOut.json");
-
-        checkRequiredString(outputEventText,
-            "04\",\n" + "  \"version\": \"0.0.1\",\n" + "  \"nameSpace\": \"org.onap.policy.apex.sample.events\"");
+        apexMain = new ApexMain(args);
+        await().atMost(5, TimeUnit.SECONDS).until(
+            () -> Files.readString(Path.of("target/examples/events/SampleDomain/EventsOut.json")).contains(
+                "04\",\n" + "  \"version\": \"0.0.1\",\n" + "  \"nameSpace\": \"org.onap.policy.apex.sample.events\""));
+        assertTrue(apexMain.isAlive());
     }
 
     /**
@@ -130,22 +135,12 @@ public class TestRest2File {
      */
     @Test
     public void testFileEmptyEvents() throws MessagingException, ApexException, IOException {
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
 
         final String[] args = {"src/test/resources/prodcons/REST2FileJsonEmptyEvents.json"};
-        final ApexMain apexMain = new ApexMain(args);
-
-        ThreadUtilities.sleep(5000);
-        apexMain.shutdown();
-
-        final String outString = outContent.toString();
-
-        System.setOut(stdout);
-        System.setErr(stderr);
-
-        checkRequiredString(outString,
-            "received an empty event from URL " + "\"http://localhost:32801/TestRest2File/apex/event/GetEmptyEvent\"");
+        apexMain = new ApexMain(args);
+        await().atMost(5, TimeUnit.SECONDS).until(() -> outContent.toString().contains(
+            "received an empty event from URL " + "\"http://localhost:32801/TestRest2File/apex/event/GetEmptyEvent\""));
+        assertTrue(apexMain.isAlive());
     }
 
     /**
@@ -157,20 +152,11 @@ public class TestRest2File {
      */
     @Test
     public void testFileEventsNoUrl() throws MessagingException, ApexException, IOException {
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
 
         final String[] args = {"src/test/resources/prodcons/REST2FileJsonEventNoURL.json"};
-        final ApexMain apexMain = new ApexMain(args);
-
-        ThreadUtilities.sleep(5000);
-        apexMain.shutdown();
-
+        apexMain = new ApexMain(args);
         final String outString = outContent.toString();
 
-        System.setOut(stdout);
-        System.setErr(stderr);
-
         checkRequiredString(outString, " no URL has been set for event sending on RESTCLIENT");
     }
 
@@ -183,34 +169,32 @@ public class TestRest2File {
      */
     @Test
     public void testFileEventsBadUrl() throws MessagingException, ApexException, IOException {
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
 
         final String[] args = {"src/test/resources/prodcons/REST2FileJsonEventBadURL.json"};
-        final ApexMain apexMain = new ApexMain(args);
-
-        ThreadUtilities.sleep(5000);
-        apexMain.shutdown();
-
-        final String outString = outContent.toString();
-
-        System.setOut(stdout);
-        System.setErr(stderr);
+        apexMain = new ApexMain(args);
 
-        checkRequiredString(outString, "reception of event from URL "
-            + "\"http://localhost:32801/TestRest2File/apex/event/Bad\" failed with status code 404");
+        await().atMost(5, TimeUnit.SECONDS).until(() -> outContent.toString().contains("reception of event from URL "
+            + "\"http://localhost:32801/TestRest2File/apex/event/Bad\" failed with status code 404"));
+        assertTrue(apexMain.isAlive());
     }
 
     /**
      * Test file events bad http method.
+     *
+     * @throws MessagingException the messaging exception
+     * @throws ApexException the apex exception
+     * @throws IOException Signals that an I/O exception has occurred.
      */
     @Test
-    public void testFileEventsBadHttpMethod() {
+    public void testFileEventsBadHttpMethod() throws MessagingException, ApexException, IOException {
+
         final String[] args = {"src/test/resources/prodcons/REST2FileJsonEventBadHTTPMethod.json"};
-        assertThatThrownBy(() -> new ApexMain(args))
-            .hasRootCauseMessage("specified HTTP method of \"POST\" is invalid, "
-                + "only HTTP method \"GET\" is supported for event reception on REST client consumer (FirstConsumer)");
+        apexMain = new ApexMain(args);
+
+        final String outString = outContent.toString();
 
+        checkRequiredString(outString, "specified HTTP method of \"POST\" is invalid, "
+            + "only HTTP method \"GET\" is supported for event reception on REST client consumer");
     }
 
     /**
@@ -222,23 +206,15 @@ public class TestRest2File {
      */
     @Test
     public void testFileEventsBadResponse() throws MessagingException, ApexException, IOException {
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
 
         final String[] args = {"src/test/resources/prodcons/REST2FileJsonEventBadResponse.json"};
-        final ApexMain apexMain = new ApexMain(args);
-
-        ThreadUtilities.sleep(5000);
-        apexMain.shutdown();
-
-        final String outString = outContent.toString();
-
-        System.setOut(stdout);
-        System.setErr(stderr);
-
-        checkRequiredString(outString,
-            "reception of event from URL " + "\"http://localhost:32801/TestRest2File/apex/event/GetEventBadResponse\" "
-                + "failed with status code 400 and message \"");
+        apexMain = new ApexMain(args);
+        await().atMost(5, TimeUnit.SECONDS)
+            .until(() -> outContent.toString()
+                .contains("reception of event from URL "
+                    + "\"http://localhost:32801/TestRest2File/apex/event/GetEventBadResponse\" "
+                    + "failed with status code 400 and message \""));
+        assertTrue(apexMain.isAlive());
     }
 
     /**
index 39173bc..0596a65 100644 (file)
@@ -22,7 +22,7 @@
 
 package org.onap.policy.apex.testsuites.integration.uservice.adapt.restserver;
 
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.awaitility.Awaitility.await;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -38,10 +38,10 @@ import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.core.Response;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.apex.core.infrastructure.messaging.MessagingException;
-import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
 import org.onap.policy.apex.service.engine.main.ApexMain;
 import org.onap.policy.common.utils.network.NetworkUtil;
@@ -63,11 +63,22 @@ public class TestRestServer {
     private static int eventsSent = 0;
 
     /**
-     * Clear relative file root environment variable.
+     * Before Test.
      */
     @Before
-    public void clearRelativeFileRoot() {
+    public void beforeTest() {
         System.clearProperty("APEX_RELATIVE_FILE_ROOT");
+        System.setOut(new PrintStream(outContent));
+        System.setErr(new PrintStream(errContent));
+    }
+
+    /**
+     * After test.
+     */
+    @After
+    public void afterTest() {
+        System.setOut(stdout);
+        System.setErr(stderr);
     }
 
     /**
@@ -286,14 +297,28 @@ public class TestRestServer {
 
     /**
      * Test rest server producer standalone.
+     *
+     * @throws MessagingException the messaging exception
+     * @throws ApexException the apex exception
+     * @throws IOException Signals that an I/O exception has occurred.
+     * @throws InterruptedException interrupted exception
      */
     @Test
-    public void testRestServerProducerStandalone() {
+    public void testRestServerProducerStandalone()
+        throws MessagingException, ApexException, IOException, InterruptedException {
         LOGGER.debug("testRestServerProducerStandalone start");
         final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventProducerStandalone.json"};
-        assertThatThrownBy(() -> new ApexMain(args))
-            .hasRootCauseMessage("the parameters \"host\", \"port\", and \"standalone\" are illegal"
-                + " on REST Server producer (FirstProducer)");
+
+        final ApexMain apexMain = new ApexMain(args);
+        apexMain.shutdown();
+
+        await().atMost(10L, TimeUnit.SECONDS).until(() -> !apexMain.isAlive());
+
+        final String outString = outContent.toString();
+
+        assertThat(outString)
+            .contains("the parameters \"host\", \"port\", and \"standalone\" are illegal on REST Server producer");
+        LOGGER.debug("testRestServerProducerStandalone end");
     }
 
     /**
@@ -308,23 +333,15 @@ public class TestRestServer {
     public void testRestServerProducerHost()
         throws MessagingException, ApexException, IOException, InterruptedException {
         LOGGER.debug("testRestServerProducerHost start");
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
-
         final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventProducerHost.json"};
 
         final ApexMain apexMain = new ApexMain(args);
-        ThreadUtilities.sleep(200);
         apexMain.shutdown();
 
         await().atMost(10L, TimeUnit.SECONDS).until(() -> !apexMain.isAlive());
 
         final String outString = outContent.toString();
-
-        System.setOut(stdout);
-        System.setErr(stderr);
-
-        assertTrue(outString.contains(" host is specified only in standalone mode"));
+        assertThat(outString).contains(" host is specified only in standalone mode");
         LOGGER.debug("testRestServerProducerHost end");
     }
 
@@ -340,61 +357,84 @@ public class TestRestServer {
     public void testRestServerProducerPort()
         throws MessagingException, ApexException, IOException, InterruptedException {
         LOGGER.debug("testRestServerProducerPort start");
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
-
         final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventProducerPort.json"};
 
         final ApexMain apexMain = new ApexMain(args);
-        ThreadUtilities.sleep(200);
         apexMain.shutdown();
 
         await().atMost(10L, TimeUnit.SECONDS).until(() -> !apexMain.isAlive());
 
         final String outString = outContent.toString();
-
-        System.setOut(stdout);
-        System.setErr(stderr);
-
-        assertTrue(outString.contains(" port is specified only in standalone mode"));
+        assertThat(outString).contains(" port is specified only in standalone mode");
         LOGGER.debug("testRestServerProducerPort end");
     }
 
     /**
      * Test rest server consumer standalone no host.
+     *
+     * @throws MessagingException the messaging exception
+     * @throws ApexException the apex exception
+     * @throws IOException Signals that an I/O exception has occurred.
      */
     @Test
-    public void testRestServerConsumerStandaloneNoHost() {
+    public void testRestServerConsumerStandaloneNoHost() throws MessagingException, ApexException, IOException {
         LOGGER.debug("testRestServerConsumerStandaloneNoHost start");
         final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventConsumerStandaloneNoHost.json"};
-        assertThatThrownBy(() -> new ApexMain(args))
-            .hasRootCauseMessage("the parameters \"host\" and \"port\" must be defined for REST Server consumer "
-                + "(FirstConsumer) in standalone mode");
 
+        final ApexMain apexMain = new ApexMain(args);
+        apexMain.shutdown();
+
+        await().atMost(10L, TimeUnit.SECONDS).until(() -> !apexMain.isAlive());
+
+        final String outString = outContent.toString();
+        assertThat(outString).contains("the parameters \"host\" and \"port\" must be defined for REST Server consumer "
+            + "(FirstConsumer) in standalone mode");
         LOGGER.debug("testRestServerConsumerStandaloneNoHost end");
     }
 
     /**
      * Test rest server consumer standalone no port.
+     *
+     * @throws MessagingException the messaging exception
+     * @throws ApexException the apex exception
+     * @throws IOException Signals that an I/O exception has occurred.
      */
     @Test
-    public void testRestServerConsumerStandaloneNoPort() {
+    public void testRestServerConsumerStandaloneNoPort() throws MessagingException, ApexException, IOException {
         LOGGER.debug("testRestServerConsumerStandaloneNoPort start");
         final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventConsumerStandaloneNoPort.json"};
-        assertThatThrownBy(() -> new ApexMain(args))
-            .hasRootCauseMessage("the parameters \"host\" and \"port\" must be defined for REST Server consumer "
-                + "(FirstConsumer) in standalone mode");
+
+        final ApexMain apexMain = new ApexMain(args);
+        apexMain.shutdown();
+
+        await().atMost(10L, TimeUnit.SECONDS).until(() -> !apexMain.isAlive());
+
+        final String outString = outContent.toString();
+        assertThat(outString).contains("the parameters \"host\" and \"port\" must be defined for REST Server consumer "
+            + "(FirstConsumer) in standalone mode");
         LOGGER.debug("testRestServerConsumerStandaloneNoPort end");
     }
 
     /**
      * Test rest server producer not sync.
+     *
+     * @throws MessagingException the messaging exception
+     * @throws ApexException the apex exception
+     * @throws IOException Signals that an I/O exception has occurred.
      */
     @Test
-    public void testRestServerProducerNotSync() {
+    public void testRestServerProducerNotSync() throws MessagingException, ApexException, IOException {
         LOGGER.debug("testRestServerProducerNotSync start");
         final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventProducerNotSync.json"};
-        assertThatThrownBy(() -> new ApexMain(args)).hasRootCauseMessage(
+
+        final ApexMain apexMain = new ApexMain(args);
+        apexMain.shutdown();
+
+        await().atMost(10L, TimeUnit.SECONDS).until(() -> !apexMain.isAlive());
+
+        final String outString = outContent.toString();
+
+        assertThat(outString).contains(
             "REST Server producer (FirstProducer) must run in synchronous mode " + "with a REST Server consumer");
         LOGGER.debug("testRestServerProducerNotSync end");
     }
@@ -409,25 +449,18 @@ public class TestRestServer {
     @Test
     public void testRestServerConsumerNotSync() throws MessagingException, ApexException, IOException {
         LOGGER.debug("testRestServerConsumerNotSync start");
-        System.setOut(new PrintStream(outContent));
-        System.setErr(new PrintStream(errContent));
-
         final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventConsumerNotSync.json"};
 
         final ApexMain apexMain = new ApexMain(args);
-        ThreadUtilities.sleep(200);
         apexMain.shutdown();
 
         await().atMost(10L, TimeUnit.SECONDS).until(() -> !apexMain.isAlive());
 
         final String outString = outContent.toString();
 
-        System.setOut(stdout);
-        System.setErr(stderr);
-
-        assertTrue(
-            outString.contains("peer \"FirstConsumer for peered mode SYNCHRONOUS does not exist or is not defined "
-                + "with the same peered mode"));
+        assertThat(outString)
+            .contains("peer \"FirstConsumer for peered mode SYNCHRONOUS does not exist or is not defined "
+                + "with the same peered mode");
         LOGGER.debug("testRestServerConsumerNotSync end");
     }