summaryrefslogtreecommitdiffstats
path: root/testsuites/integration/integration-uservice-test/src/test/java
diff options
context:
space:
mode:
authorwaqas.ikram <waqas.ikram@ericsson.com>2018-06-27 16:16:42 +0100
committerwaqas.ikram <waqas.ikram@ericsson.com>2018-06-28 15:47:46 +0100
commit2816ea6b7672a5519628a5134a5ef719166b27f7 (patch)
tree94ee625fd5e84113f86a38b62124f7945241c302 /testsuites/integration/integration-uservice-test/src/test/java
parent7c2b947460d0795b29c9c23f1d7373a27ae7bc9e (diff)
Adding integration test module
Change-Id: If94ff28724a31269cf20b32c43fa0790c3b2dac3 Issue-ID: POLICY-865 Signed-off-by: waqas.ikram <waqas.ikram@ericsson.com>
Diffstat (limited to 'testsuites/integration/integration-uservice-test/src/test/java')
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/events/EventGenerator.java501
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2File.java78
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2FileFiltered.java108
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2FileIgnore.java75
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/JMSEventProducer.java129
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/JMSEventSubscriber.java117
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestContext.java185
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestInitialContextFactory.java48
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestJMS2JMS.java150
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestPing.java97
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/KafkaEventProducer.java168
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/KafkaEventSubscriber.java111
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/TestKafka2Kafka.java141
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/TestKafkaXMLEventProducer.java63
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestFile2REST.java205
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestREST2File.java188
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestRESTClientEndpoint.java123
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restserver/TestRESTServer.java324
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restserver/TestRESTServerVPNContext.java136
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/sampletypes/Foo.java48
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/sampletypes/FooMap.java48
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/TestWs2WsClient.java71
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/TestWs2WsServer.java71
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventProducerClient.java146
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventProducerServer.java145
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventSubscriberClient.java80
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventSubscriberServer.java83
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/context/AvroEventAlbumContextTest.java95
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/context/JavaEventAlbumContextTest.java83
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/engdep/EngDepMessagingTest.java180
-rw-r--r--testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/engdep/EngineTestServer.java269
31 files changed, 4266 insertions, 0 deletions
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/events/EventGenerator.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/events/EventGenerator.java
new file mode 100644
index 000000000..4c2ed5c88
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/events/EventGenerator.java
@@ -0,0 +1,501 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.events;
+
+import java.util.Random;
+
+/**
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class EventGenerator {
+ private static int nextEventNo = 0;
+
+ public static String xmlEvents(final int eventCount) {
+ final StringBuilder builder = new StringBuilder();
+
+ for (int i = 0; i < eventCount; i++) {
+ if (i > 0) {
+ builder.append("\n");
+ }
+ builder.append(xmlEvent());
+ }
+
+ return builder.toString();
+ }
+
+ public static String jsonEvents(final int eventCount) {
+ final StringBuilder builder = new StringBuilder();
+
+ for (int i = 0; i < eventCount; i++) {
+ if (i > 0) {
+ builder.append("\n");
+ }
+ builder.append(jsonEvent());
+ }
+
+ return builder.toString();
+ }
+
+ public static String xmlEvent() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n");
+ builder.append("<xmlApexEvent xmlns=\"http://www.onap.org/policy/apex-pdp/apexevent\">\n");
+
+ builder.append(" <name>" + eventName + "</name>\n");
+ builder.append(" <version>0.0.1</version>\n");
+ builder.append(" <nameSpace>org.onap.policy.apex.sample.events</nameSpace>\n");
+ builder.append(" <source>test</source>\n");
+ builder.append(" <target>apex</target>\n");
+ builder.append(" <data>\n");
+ builder.append(" <key>TestSlogan</key>\n");
+ builder.append(" <value>Test slogan for External Event" + (nextEventNo++) + "</value>\n");
+ builder.append(" </data>\n");
+ builder.append(" <data>\n");
+ builder.append(" <key>TestMatchCase</key>\n");
+ builder.append(" <value>" + nextMatchCase + "</value>\n");
+ builder.append(" </data>\n");
+ builder.append(" <data>\n");
+ builder.append(" <key>TestTimestamp</key>\n");
+ builder.append(" <value>" + System.currentTimeMillis() + "</value>\n");
+ builder.append(" </data>\n");
+ builder.append(" <data>\n");
+ builder.append(" <key>TestTemperature</key>\n");
+ builder.append(" <value>" + nextTestTemperature + "</value>\n");
+ builder.append(" </data>\n");
+ builder.append("</xmlApexEvent>");
+
+ return builder.toString();
+ }
+
+ public static String jsonEvent() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"" + eventName + "\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventNoName() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"namez\": \"" + eventName + "\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventBadName() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"%%%%\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventNoExName() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"I_DONT_EXIST\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventNoVersion() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"" + eventName + "\",\n");
+ builder.append(" \"versiion\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventBadVersion() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"" + eventName + "\",\n");
+ builder.append(" \"version\": \"#####\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventNoExVersion() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"Event0000\",\n");
+ builder.append(" \"version\": \"1.2.3\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventNoNamespace() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpacee\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"" + eventName + "\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventBadNamespace() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"hello.&&&&\",\n");
+ builder.append(" \"name\": \"" + eventName + "\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventNoExNamespace() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"pie.in.the.sky\",\n");
+ builder.append(" \"name\": \"Event0000\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventNoSource() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"" + eventName + "\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"sourcee\": \"test\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventBadSource() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"" + eventName + "\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"%!@**@!\",\n");
+ builder.append(" \"target\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventNoTarget() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"" + eventName + "\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"targett\": \"apex\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventBadTarget() {
+ final Random rand = new Random();
+
+ final StringBuilder builder = new StringBuilder();
+
+ int nextEventNo = rand.nextInt(2);
+ final String eventName = (nextEventNo == 0 ? "Event0000" : "Event0100");
+ final int nextMatchCase = rand.nextInt(4);
+ final float nextTestTemperature = rand.nextFloat() * 10000;
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"" + eventName + "\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"KNIO(*S)A(S)D\",\n");
+ builder.append(" \"TestSlogan\": \"Test slogan for External Event" + (nextEventNo++) + "\",\n");
+ builder.append(" \"TestMatchCase\": " + nextMatchCase + ",\n");
+ builder.append(" \"TestTimestamp\": " + System.currentTimeMillis() + ",\n");
+ builder.append(" \"TestTemperature\": " + nextTestTemperature + "\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventMissingFields() {
+ final StringBuilder builder = new StringBuilder();
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"Event0000\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"apex\"\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static String jsonEventNullFields() {
+ final StringBuilder builder = new StringBuilder();
+
+ builder.append("{\n");
+ builder.append(" \"nameSpace\": \"org.onap.policy.apex.sample.events\",\n");
+ builder.append(" \"name\": \"Event0000\",\n");
+ builder.append(" \"version\": \"0.0.1\",\n");
+ builder.append(" \"source\": \"test\",\n");
+ builder.append(" \"target\": \"Apex\",\n");
+ builder.append(" \"TestSlogan\": null,\n");
+ builder.append(" \"TestMatchCase\": -1,\n");
+ builder.append(" \"TestTimestamp\": -1,\n");
+ builder.append(" \"TestTemperature\": -1.0\n");
+ builder.append("}");
+
+ return builder.toString();
+ }
+
+ public static void main(final String[] args) {
+ if (args.length != 2) {
+ System.err.println("usage EventGenerator #events XML|JSON");
+ return;
+ }
+
+ int eventCount = 0;
+ try {
+ eventCount = Integer.parseInt(args[0]);
+ } catch (final Exception e) {
+ System.err.println("usage EventGenerator #events XML|JSON");
+ e.printStackTrace();
+ return;
+ }
+
+ if (args[1].equalsIgnoreCase("XML")) {
+ System.out.println(xmlEvents(eventCount));
+ } else if (args[1].equalsIgnoreCase("JSON")) {
+ System.out.println(jsonEvents(eventCount));
+ } else {
+ System.err.println("usage EventGenerator #events XML|JSON");
+ return;
+ }
+ }
+
+ public static int getNextEventNo() {
+ return nextEventNo;
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2File.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2File.java
new file mode 100644
index 000000000..347cce80e
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2File.java
@@ -0,0 +1,78 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.file;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+
+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.model.utilities.TextFileUtils;
+import org.onap.policy.apex.service.engine.main.ApexMain;
+
+public class TestFile2File {
+
+ @Test
+ public void testJsonFileEvents() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/File2FileJsonEvent.json"};
+
+ testFileEvents(args, "src/test/resources/events/EventsOut.json", 48956);
+ }
+
+ @Test
+ public void testXMLFileEvents() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/File2FileXmlEvent.json"};
+
+ testFileEvents(args, "src/test/resources/events/EventsOut.xmlfile", 106739);
+ }
+
+ private void testFileEvents(final String[] args, final String outFilePath, final long expectedFileSize)
+ throws MessagingException, ApexException, IOException {
+ final ApexMain apexMain = new ApexMain(args);
+
+ final File outFile = new File(outFilePath);
+
+ while (!outFile.exists()) {
+ ThreadUtilities.sleep(500);
+ }
+
+ // Wait for the file to be filled
+ long outFileSize = 0;
+ while (true) {
+ final String fileString = TextFileUtils.getTextFileAsString(outFilePath).replaceAll("\\s+", "");
+ outFileSize = fileString.length();
+ if (outFileSize > 0 && outFileSize >= expectedFileSize) {
+ break;
+ }
+ ThreadUtilities.sleep(500);
+ }
+
+ apexMain.shutdown();
+ outFile.delete();
+ assertEquals(outFileSize, expectedFileSize);
+ }
+}
+
+
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2FileFiltered.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2FileFiltered.java
new file mode 100644
index 000000000..c2b097273
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2FileFiltered.java
@@ -0,0 +1,108 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.file;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+
+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.model.utilities.TextFileUtils;
+import org.onap.policy.apex.service.engine.main.ApexMain;
+
+public class TestFile2FileFiltered {
+
+ @Test
+ public void testJsonFilteredFileInOutEvents() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/File2FileFilteredInOutJsonEvent.json"};
+
+ final String[] outFilePaths =
+ {"src/test/resources/events/Events0004Out.json", "src/test/resources/events/Events0104Out.json"};
+
+ final long[] expectedFileSizes = {25949, 23007};
+
+ testFilteredFileEvents(args, outFilePaths, expectedFileSizes);
+ }
+
+ @Test
+ public void testJsonFilteredFileOutEvents() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/File2FileFilteredOutJsonEvent.json"};
+
+ final String[] outFilePaths =
+ {"src/test/resources/events/Events0004Out.json", "src/test/resources/events/Events0104Out.json"};
+
+ final long[] expectedFileSizes = {25949, 23007};
+
+ testFilteredFileEvents(args, outFilePaths, expectedFileSizes);
+ }
+
+ @Test
+ public void testJsonFilteredFileInEvents() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/File2FileFilteredInJsonEvent.json"};
+
+ final String[] outFilePaths = {"src/test/resources/events/Events0004Out.json"};
+
+ final long[] expectedFileSizes = {25949};
+
+ testFilteredFileEvents(args, outFilePaths, expectedFileSizes);
+ }
+
+ private void testFilteredFileEvents(final String[] args, final String[] outFilePaths,
+ final long[] expectedFileSizes) throws MessagingException, ApexException, IOException {
+ final ApexMain apexMain = new ApexMain(args);
+
+ final File outFile0 = new File(outFilePaths[0]);
+
+ while (!outFile0.exists()) {
+ ThreadUtilities.sleep(500);
+ }
+
+ // Wait for the file to be filled
+ long outFile0Size = 0;
+ for (int i = 0; i < 4; i++) {
+ final String fileString = TextFileUtils.getTextFileAsString(outFilePaths[0]).replaceAll("\\s+", "");
+ outFile0Size = fileString.length();
+ if (outFile0Size > 0 && outFile0Size >= expectedFileSizes[0]) {
+ break;
+ }
+ ThreadUtilities.sleep(500);
+ }
+
+ ThreadUtilities.sleep(500);
+ apexMain.shutdown();
+
+ final long[] actualFileSizes = new long[expectedFileSizes.length];
+
+ for (int i = 0; i < outFilePaths.length; i++) {
+ final String fileString = TextFileUtils.getTextFileAsString(outFilePaths[i]).replaceAll("\\s+", "");
+ actualFileSizes[i] = fileString.length();
+ new File(outFilePaths[i]).delete();
+ }
+
+ for (int i = 0; i < actualFileSizes.length; i++) {
+ assertEquals(actualFileSizes[i], expectedFileSizes[i]);
+ }
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2FileIgnore.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2FileIgnore.java
new file mode 100644
index 000000000..c952d73b5
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/file/TestFile2FileIgnore.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.file;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+
+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.model.utilities.TextFileUtils;
+import org.onap.policy.apex.service.engine.main.ApexMain;
+
+public class TestFile2FileIgnore {
+
+ // This test is used just to bring up an instance of Apex for manual testing and demonstrations
+ // It should always be ignored in automated testing because it holds Apex up for a very long
+ // time
+ public static void main(final String[] args) throws MessagingException, ApexException, IOException {
+ final String[] apexArgs = {"src/test/resources/prodcons/File2FileJsonEvent.json"};
+
+ testFileEvents(apexArgs, "src/test/resources/events/EventsOut.json", 48656);
+ }
+
+ private static void testFileEvents(final String[] args, final String outFilePath, final long expectedFileSize)
+ throws MessagingException, ApexException, IOException {
+ final ApexMain apexMain = new ApexMain(args);
+
+ final File outFile = new File(outFilePath);
+
+ while (!outFile.exists()) {
+ ThreadUtilities.sleep(500);
+ }
+
+ // Wait for the file to be filled
+ long outFileSize = 0;
+ while (true) {
+ final String fileString = TextFileUtils.getTextFileAsString(outFilePath).replaceAll("\\s+", "");
+ outFileSize = fileString.length();
+ if (outFileSize > 0 && outFileSize >= expectedFileSize) {
+ break;
+ }
+ ThreadUtilities.sleep(500);
+ }
+
+ // Here's the long time I was talking about above!
+ ThreadUtilities.sleep(100000000);
+
+ apexMain.shutdown();
+ outFile.delete();
+ assertEquals(outFileSize, expectedFileSize);
+ }
+}
+
+
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/JMSEventProducer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/JMSEventProducer.java
new file mode 100644
index 000000000..e5ddbfee5
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/JMSEventProducer.java
@@ -0,0 +1,129 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.jms;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.Topic;
+
+import org.apache.activemq.command.ActiveMQTopic;
+import org.onap.policy.apex.apps.uservice.test.adapt.events.EventGenerator;
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+import org.onap.policy.apex.service.engine.event.ApexEventRuntimeException;
+
+/**
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class JMSEventProducer implements Runnable {
+ private final String topic;
+ private final int eventCount;
+ private final boolean sendObjects;
+ private final long eventInterval;
+ private long eventsSentCount = 0;
+
+ private final Thread producerThread;
+ private boolean sendEventsFlag = false;
+ private boolean stopFlag = false;
+ private final Connection connection;
+
+ public JMSEventProducer(String topic, ConnectionFactory connectionFactory, String username, String password,
+ final int eventCount, final boolean sendObjects, final long eventInterval) throws JMSException {
+ this.topic = topic;
+ this.eventCount = eventCount;
+ this.sendObjects = sendObjects;
+ this.eventInterval = eventInterval;
+ connection = connectionFactory.createConnection(username, password);
+ connection.start();
+
+ producerThread = new Thread(this);
+ producerThread.start();
+ }
+
+ @Override
+ public void run() {
+ try {
+ final Topic jmsTopic = new ActiveMQTopic(topic);
+ final Session jmsSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ final MessageProducer jmsProducer = jmsSession.createProducer(jmsTopic);
+
+ while (producerThread.isAlive() && !stopFlag) {
+ ThreadUtilities.sleep(50);
+
+ if (sendEventsFlag) {
+ sendEventsToTopic(jmsSession, jmsProducer);
+ sendEventsFlag = false;
+ }
+ }
+
+ jmsProducer.close();
+ jmsSession.close();
+ } catch (final Exception e) {
+ throw new ApexEventRuntimeException("JMS event consumption failed", e);
+ }
+ }
+
+ public void sendEvents() {
+ sendEventsFlag = true;
+ }
+
+ private void sendEventsToTopic(final Session jmsSession, final MessageProducer jmsProducer) throws JMSException {
+ System.out.println(JMSEventProducer.class.getCanonicalName() + ": sending events to JMS server, event count "
+ + eventCount);
+
+ for (int i = 0; i < eventCount; i++) {
+ System.out.println(JMSEventProducer.class.getCanonicalName() + ": waiting " + eventInterval
+ + " milliseconds before sending next event");
+ ThreadUtilities.sleep(eventInterval);
+
+ Message jmsMessage = null;
+ if (sendObjects) {
+ jmsMessage = jmsSession.createObjectMessage(new TestPing());
+ } else {
+ jmsMessage = jmsSession.createTextMessage(EventGenerator.jsonEvent());
+ }
+ jmsProducer.send(jmsMessage);
+ eventsSentCount++;
+ System.out.println(JMSEventProducer.class.getCanonicalName() + ": sent event " + jmsMessage.toString());
+ }
+ System.out.println(JMSEventProducer.class.getCanonicalName() + ": completed");
+ }
+
+ public long getEventsSentCount() {
+ return eventsSentCount;
+ }
+
+ public void shutdown() {
+ System.out.println(JMSEventProducer.class.getCanonicalName() + ": stopping");
+
+ stopFlag = true;
+
+ while (producerThread.isAlive()) {
+ ThreadUtilities.sleep(10);
+ }
+
+ System.out.println(JMSEventProducer.class.getCanonicalName() + ": stopped");
+ }
+
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/JMSEventSubscriber.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/JMSEventSubscriber.java
new file mode 100644
index 000000000..46455f5df
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/JMSEventSubscriber.java
@@ -0,0 +1,117 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.jms;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.ObjectMessage;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+
+import org.apache.activemq.command.ActiveMQTopic;
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+import org.onap.policy.apex.service.engine.event.ApexEventException;
+import org.onap.policy.apex.service.engine.event.ApexEventRuntimeException;
+
+/**
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class JMSEventSubscriber implements Runnable {
+ private final String topic;
+ private long eventsReceivedCount = 0;
+
+ private final Thread subscriberThread;
+ private final Connection connection;
+
+
+ public JMSEventSubscriber(final String topic, final ConnectionFactory connectionFactory, final String username,
+ final String password) throws JMSException {
+ this.topic = topic;
+ connection = connectionFactory.createConnection(username, password);
+ connection.start();
+
+ subscriberThread = new Thread(this);
+ subscriberThread.start();
+ }
+
+ @Override
+ public void run() {
+ try {
+ final Topic jmsTopic = new ActiveMQTopic(topic);
+ final Session jmsSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ final MessageConsumer jmsConsumer = jmsSession.createConsumer(jmsTopic);
+
+ System.out.println(JMSEventSubscriber.class.getCanonicalName()
+ + ": receiving events from Kafka server on topic " + topic);
+
+ while (subscriberThread.isAlive() && !subscriberThread.isInterrupted()) {
+ try {
+ final Message message = jmsConsumer.receive(100);
+ if (message == null) {
+ continue;
+ }
+
+ if (message instanceof ObjectMessage) {
+ final TestPing testPing = (TestPing) ((ObjectMessage) message).getObject();
+ System.out.println("Received message: " + testPing.toString());
+ testPing.verify();
+ } else if (message instanceof TextMessage) {
+ final String textMessage = ((TextMessage) message).getText();
+ System.out.println("Received message: " + textMessage);
+ } else {
+ throw new ApexEventException("unknowm message \"" + message + "\" of type \""
+ + message.getClass().getCanonicalName() + "\" received");
+ }
+ eventsReceivedCount++;
+ } catch (final Exception e) {
+ break;
+ }
+ }
+
+ jmsConsumer.close();
+ jmsSession.close();
+ } catch (final Exception e) {
+ throw new ApexEventRuntimeException("JMS event consumption failed", e);
+ }
+
+ System.out.println(JMSEventSubscriber.class.getCanonicalName() + ": event reception completed");
+ }
+
+ public long getEventsReceivedCount() {
+ return eventsReceivedCount;
+ }
+
+ public void shutdown() throws JMSException {
+ subscriberThread.interrupt();
+
+ while (subscriberThread.isAlive()) {
+ ThreadUtilities.sleep(10);
+ }
+
+ connection.close();
+ System.out.println(JMSEventSubscriber.class.getCanonicalName() + ": stopped");
+ }
+
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestContext.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestContext.java
new file mode 100644
index 000000000..36d689bda
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestContext.java
@@ -0,0 +1,185 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.jms;
+
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.naming.Binding;
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.NameClassPair;
+import javax.naming.NameParser;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+
+import org.apache.activemq.command.ActiveMQTopic;
+import org.onap.policy.apex.model.basicmodel.concepts.ApexRuntimeException;
+
+/**
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class TestContext implements Context {
+
+ private Properties testProperties;
+
+ public TestContext() {
+ try {
+ testProperties = new Properties();
+
+ final Map<String, Object> params = new HashMap<String, Object>();
+ params.put("host", "localhost");
+ params.put("port", "5445");
+ testProperties.put("ConnectionFactory", TestJMS2JMS.connectionFactory);
+ testProperties.put("jms/topic/apexIn", new ActiveMQTopic("jms/topic/apexIn"));
+ testProperties.put("jms/topic/apexOut", new ActiveMQTopic("jms/topic/apexOut"));
+ } catch (final Exception e) {
+ e.printStackTrace();
+ throw new ApexRuntimeException("Context initiation failed", e);
+ }
+ }
+
+ @Override
+ public Object lookup(final Name name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public Object lookup(final String name) throws NamingException {
+ return testProperties.get(name);
+ }
+
+ @Override
+ public void bind(final Name name, final Object obj) throws NamingException {}
+
+ @Override
+ public void bind(final String name, final Object obj) throws NamingException {}
+
+ @Override
+ public void rebind(final Name name, final Object obj) throws NamingException {}
+
+ @Override
+ public void rebind(final String name, final Object obj) throws NamingException {}
+
+ @Override
+ public void unbind(final Name name) throws NamingException {}
+
+ @Override
+ public void unbind(final String name) throws NamingException {}
+
+ @Override
+ public void rename(final Name oldName, final Name newName) throws NamingException {}
+
+ @Override
+ public void rename(final String oldName, final String newName) throws NamingException {}
+
+ @Override
+ public NamingEnumeration<NameClassPair> list(final Name name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public NamingEnumeration<NameClassPair> list(final String name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public NamingEnumeration<Binding> listBindings(final Name name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public NamingEnumeration<Binding> listBindings(final String name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public void destroySubcontext(final Name name) throws NamingException {}
+
+ @Override
+ public void destroySubcontext(final String name) throws NamingException {}
+
+ @Override
+ public Context createSubcontext(final Name name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public Context createSubcontext(final String name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public Object lookupLink(final Name name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public Object lookupLink(final String name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public NameParser getNameParser(final Name name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public NameParser getNameParser(final String name) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public Name composeName(final Name name, final Name prefix) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public String composeName(final String name, final String prefix) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public Object addToEnvironment(final String propName, final Object propVal) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public Object removeFromEnvironment(final String propName) throws NamingException {
+ return null;
+ }
+
+ @Override
+ public Hashtable<?, ?> getEnvironment() throws NamingException {
+ return null;
+ }
+
+ @Override
+ public void close() throws NamingException {}
+
+ @Override
+ public String getNameInNamespace() throws NamingException {
+ return null;
+ }
+
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestInitialContextFactory.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestInitialContextFactory.java
new file mode 100644
index 000000000..6cb874671
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestInitialContextFactory.java
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.jms;
+
+import java.util.Hashtable;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactory;
+
+/**
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class TestInitialContextFactory implements InitialContextFactory {
+
+ private final Context context = new TestContext();
+
+ public TestInitialContextFactory() throws NamingException {}
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.naming.spi.InitialContextFactory#getInitialContext(java.util.Hashtable)
+ */
+ @Override
+ public Context getInitialContext(final Hashtable<?, ?> environment) throws NamingException {
+ return context;
+ }
+
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestJMS2JMS.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestJMS2JMS.java
new file mode 100644
index 000000000..ca23292a9
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestJMS2JMS.java
@@ -0,0 +1,150 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.jms;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.jms.JMSException;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.broker.BrokerPlugin;
+import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.security.AuthenticationUser;
+import org.apache.activemq.security.SimpleAuthenticationPlugin;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+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.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+public class TestJMS2JMS {
+ private static final String GROUP_ROLE = "guests";
+ private static final String PACKAGE_NAME = "org.onap.policy.apex.apps.uservice.test.adapt.jms";
+ private static final String USERNAME = "guest";
+ private static final String PASSWORD = "IAmAGuest";
+ private static final String JMS_TOPIC_APEX_IN = "jms/topic/apexIn";
+ private static final String JMS_TOPIC_APEX_OUT = "jms/topic/apexOut";
+ private static final String URL = "tcp://localhost:5445";
+
+ private static final String DATA_PARENT_DIR = Paths.get("target", "activemq-data").toString();
+
+ private static final XLogger LOGGER = XLoggerFactory.getXLogger(TestJMS2JMS.class);
+
+ private static final long MAX_TEST_LENGTH = 10000;
+ private static final int EVENT_COUNT = 100;
+ private static final int EVENT_INTERVAL = 20;
+
+ private static BrokerService broker;
+
+ public static ActiveMQConnectionFactory connectionFactory;
+
+
+ @BeforeClass
+ public static void setupEmbeddedJMSServer() throws Exception {
+ final ArrayList<BrokerPlugin> plugins = new ArrayList<BrokerPlugin>();
+ final BrokerPlugin authenticationPlugin = getAuthenticationBrokerPlugin();
+ if (authenticationPlugin != null) {
+ plugins.add(authenticationPlugin);
+ }
+
+ broker = new BrokerService();
+ broker.setUseJmx(false);
+ broker.setPersistent(false);
+ broker.addConnector(URL);
+ broker.setDeleteAllMessagesOnStartup(true);
+ broker.setPlugins(plugins.toArray(new BrokerPlugin[0]));
+ broker.setDataDirectory(DATA_PARENT_DIR);
+ broker.start();
+ broker.waitUntilStarted();
+ connectionFactory = new ActiveMQConnectionFactory(URL);
+ connectionFactory.setTrustedPackages(Arrays.asList(PACKAGE_NAME));
+ }
+
+ private static BrokerPlugin getAuthenticationBrokerPlugin() {
+ final List<AuthenticationUser> users = new ArrayList<AuthenticationUser>();
+ users.add(new AuthenticationUser(USERNAME, PASSWORD, GROUP_ROLE));
+ final SimpleAuthenticationPlugin authenticationPlugin = new SimpleAuthenticationPlugin(users);
+ return authenticationPlugin;
+ }
+
+ @AfterClass
+ public static void shutdownEmbeddedJMSServer() throws IOException {
+ try {
+ if (broker != null) {
+ broker.stop();
+ }
+ } catch (final Exception e) {
+ LOGGER.warn("Failed to stop JMS server", e);
+ }
+
+ }
+
+ @Test
+ public void testJMSObjectEvents() throws ApexException, JMSException {
+ final String[] args = {"src/test/resources/prodcons/JMS2JMSObjectEvent.json"};
+ testJMSEvents(args, true);
+ }
+
+ @Test
+ public void testJMSJsonEvents() throws ApexException, JMSException {
+ final String[] args = {"src/test/resources/prodcons/JMS2JMSJsonEvent.json"};
+ testJMSEvents(args, false);
+ }
+
+ private void testJMSEvents(final String[] args, final Boolean sendObjects) throws ApexException, JMSException {
+ final JMSEventSubscriber subscriber =
+ new JMSEventSubscriber(JMS_TOPIC_APEX_OUT, connectionFactory, USERNAME, PASSWORD);
+ final JMSEventProducer producer = new JMSEventProducer(JMS_TOPIC_APEX_IN, connectionFactory, USERNAME, PASSWORD,
+ EVENT_COUNT, sendObjects, EVENT_INTERVAL);
+
+ final ApexMain apexMain = new ApexMain(args);
+ ThreadUtilities.sleep(3000);
+
+ producer.sendEvents();
+
+ final long testStartTime = System.currentTimeMillis();
+
+ while (System.currentTimeMillis() < testStartTime + MAX_TEST_LENGTH
+ && subscriber.getEventsReceivedCount() < EVENT_COUNT) {
+ ThreadUtilities.sleep(EVENT_INTERVAL);
+ }
+
+ ThreadUtilities.sleep(1000);
+
+ System.out.println("sent event count: " + producer.getEventsSentCount());
+ System.out.println("received event count: " + subscriber.getEventsReceivedCount());
+ assertTrue(subscriber.getEventsReceivedCount() == producer.getEventsSentCount());
+
+ apexMain.shutdown();
+ subscriber.shutdown();
+ producer.shutdown();
+ ThreadUtilities.sleep(1000);
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestPing.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestPing.java
new file mode 100644
index 000000000..caf6e2ffd
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/jms/TestPing.java
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.jms;
+
+import java.io.Serializable;
+
+import org.onap.policy.apex.service.engine.event.ApexEventException;
+
+/**
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class TestPing implements Serializable {
+ private static final long serialVersionUID = -3400711508992955886L;
+
+ private String name = "Rose";
+ private String description = "A rose by any other name would smell as sweet";
+ private long pingTime = System.currentTimeMillis();
+ private long pongTime = -1;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(final String description) {
+ this.description = description;
+ }
+
+ public long getPingTime() {
+ return pingTime;
+ }
+
+ public void setPingTime(final long pingTime) {
+ this.pingTime = pingTime;
+ }
+
+ public long getPongTime() {
+ return pongTime;
+ }
+
+ public void setPongTime(final long pongTime) {
+ this.pongTime = pongTime;
+ }
+
+ @Override
+ public String toString() {
+ return "TestPing [name=" + name + ", description=" + description + ", pingTime=" + pingTime + ", pongTime="
+ + pongTime + "]";
+ }
+
+ public void verify() throws ApexEventException {
+ if (!name.startsWith("Rose")) {
+ throw new ApexEventException("TestPing is not valid");
+ }
+
+ if (name.length() <= 4) {
+ throw new ApexEventException("TestPing is not valid");
+ }
+
+ if (!description.startsWith("A rose by any other name would smell as sweet")) {
+ throw new ApexEventException("TestPing is not valid");
+ }
+
+ if (description.length() <= 44) {
+ throw new ApexEventException("TestPing is not valid");
+ }
+
+ if (pongTime <= pingTime) {
+ throw new ApexEventException("TestPing is not valid");
+ }
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/KafkaEventProducer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/KafkaEventProducer.java
new file mode 100644
index 000000000..639b450df
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/KafkaEventProducer.java
@@ -0,0 +1,168 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.kafka;
+
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.Producer;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.onap.policy.apex.apps.uservice.test.adapt.events.EventGenerator;
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+
+/**
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class KafkaEventProducer implements Runnable {
+ private final String topic;
+ private final String kafkaServerAddress;
+ private final int eventCount;
+ private final boolean xmlEvents;
+ private final long eventInterval;
+ private long eventsSentCount = 0;
+
+ private Producer<String, String> producer;
+
+ private final Thread producerThread;
+ private boolean sendEventsFlag = false;
+ private boolean stopFlag = false;
+
+ public KafkaEventProducer(final String topic, final String kafkaServerAddress, final int eventCount,
+ final boolean xmlEvents, final long eventInterval) {
+ this.topic = topic;
+ this.kafkaServerAddress = kafkaServerAddress;
+ this.eventCount = eventCount;
+ this.xmlEvents = xmlEvents;
+ this.eventInterval = eventInterval;
+
+ producerThread = new Thread(this);
+ producerThread.start();
+ }
+
+ @Override
+ public void run() {
+ final Properties kafkaProducerProperties = new Properties();
+ kafkaProducerProperties.put("bootstrap.servers", kafkaServerAddress);
+ kafkaProducerProperties.put("acks", "all");
+ kafkaProducerProperties.put("retries", 0);
+ kafkaProducerProperties.put("batch.size", 16384);
+ kafkaProducerProperties.put("linger.ms", 1);
+ kafkaProducerProperties.put("buffer.memory", 33554432);
+ kafkaProducerProperties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
+ kafkaProducerProperties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
+
+ producer = new KafkaProducer<String, String>(kafkaProducerProperties);
+
+ while (producerThread.isAlive() && !stopFlag) {
+ ThreadUtilities.sleep(50);
+
+ if (sendEventsFlag) {
+ sendEventsToTopic();
+ sendEventsFlag = false;
+ }
+ }
+
+ producer.close(1000, TimeUnit.MILLISECONDS);
+ }
+
+ public void sendEvents() {
+ sendEventsFlag = true;
+ }
+
+ private void sendEventsToTopic() {
+ System.out.println(KafkaEventProducer.class.getCanonicalName() + ": sending events to Kafka server at "
+ + kafkaServerAddress + ", event count " + eventCount + ", xmlEvents " + xmlEvents);
+
+ for (int i = 0; i < eventCount; i++) {
+ System.out.println(KafkaEventProducer.class.getCanonicalName() + ": waiting " + eventInterval
+ + " milliseconds before sending next event");
+ ThreadUtilities.sleep(eventInterval);
+
+ String eventString = null;
+ if (xmlEvents) {
+ eventString = EventGenerator.xmlEvent();
+ } else {
+ eventString = EventGenerator.jsonEvent();
+ }
+ producer.send(new ProducerRecord<String, String>(topic, "Event" + i + "Of" + eventCount, eventString));
+ producer.flush();
+ eventsSentCount++;
+ System.out.println(KafkaEventProducer.class.getCanonicalName() + ": sent event " + eventString);
+ }
+ System.out.println(KafkaEventProducer.class.getCanonicalName() + ": completed");
+ }
+
+ public long getEventsSentCount() {
+ return eventsSentCount;
+ }
+
+ public void shutdown() {
+ System.out.println(KafkaEventProducer.class.getCanonicalName() + ": stopping");
+
+ stopFlag = true;
+
+ while (producerThread.isAlive()) {
+ ThreadUtilities.sleep(10);
+ }
+
+ System.out.println(KafkaEventProducer.class.getCanonicalName() + ": stopped");
+ }
+
+ public static void main(final String[] args) {
+ if (args.length != 5) {
+ System.err.println("usage KafkaEventProducer topic kafkaServerAddress #events XML|JSON eventInterval");
+ return;
+ }
+
+ int eventCount = 0;
+ try {
+ eventCount = Integer.parseInt(args[2]);
+ } catch (final Exception e) {
+ System.err.println("usage KafkaEventProducer topic kafkaServerAddress #events XML|JSON eventInterval");
+ e.printStackTrace();
+ return;
+ }
+
+ long eventInterval = 0;
+ try {
+ eventInterval = Long.parseLong(args[4]);
+ } catch (final Exception e) {
+ System.err.println("usage KafkaEventProducer topic kafkaServerAddress #events XML|JSON eventInterval");
+ e.printStackTrace();
+ return;
+ }
+
+ boolean xmlEvents = false;
+ if (args[3].equalsIgnoreCase("XML")) {
+ xmlEvents = true;
+ } else if (!args[3].equalsIgnoreCase("JSON")) {
+ System.err.println("usage KafkaEventProducer topic kafkaServerAddress #events XML|JSON eventInterval");
+ return;
+ }
+
+ final KafkaEventProducer producer =
+ new KafkaEventProducer(args[0], args[1], eventCount, xmlEvents, eventInterval);
+
+ producer.sendEvents();
+ producer.shutdown();
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/KafkaEventSubscriber.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/KafkaEventSubscriber.java
new file mode 100644
index 000000000..8bdc56dda
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/KafkaEventSubscriber.java
@@ -0,0 +1,111 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.kafka;
+
+import java.util.Arrays;
+import java.util.Properties;
+
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.apache.kafka.clients.consumer.ConsumerRecords;
+import org.apache.kafka.clients.consumer.KafkaConsumer;
+import org.onap.policy.apex.core.infrastructure.messaging.MessagingException;
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+
+/**
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class KafkaEventSubscriber implements Runnable {
+ private final String topic;
+ private final String kafkaServerAddress;
+ private long eventsReceivedCount = 0;
+
+ KafkaConsumer<String, String> consumer;
+
+ Thread subscriberThread;
+
+ public KafkaEventSubscriber(final String topic, final String kafkaServerAddress) throws MessagingException {
+ this.topic = topic;
+ this.kafkaServerAddress = kafkaServerAddress;
+
+ final Properties props = new Properties();
+ props.put("bootstrap.servers", kafkaServerAddress);
+ props.put("group.id", "test");
+ props.put("enable.auto.commit", "true");
+ props.put("auto.commit.interval.ms", "1000");
+ props.put("session.timeout.ms", "30000");
+ props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
+ props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
+
+ consumer = new KafkaConsumer<String, String>(props);
+ consumer.subscribe(Arrays.asList(topic));
+
+ subscriberThread = new Thread(this);
+ subscriberThread.start();
+ }
+
+ @Override
+ public void run() {
+ System.out.println(KafkaEventSubscriber.class.getCanonicalName() + ": receiving events from Kafka server at "
+ + kafkaServerAddress + " on topic " + topic);
+
+ while (subscriberThread.isAlive() && !subscriberThread.isInterrupted()) {
+ try {
+ final ConsumerRecords<String, String> records = consumer.poll(100);
+ for (final ConsumerRecord<String, String> record : records) {
+ System.out.println("******");
+ System.out.println("offset=" + record.offset());
+ System.out.println("key=" + record.key());
+ System.out.println("name=" + record.value());
+ eventsReceivedCount++;
+ }
+ } catch (final Exception e) {
+ // Thread interrupted
+ break;
+ }
+ }
+
+ System.out.println(KafkaEventSubscriber.class.getCanonicalName() + ": event reception completed");
+ }
+
+ public long getEventsReceivedCount() {
+ return eventsReceivedCount;
+ }
+
+ public void shutdown() {
+ subscriberThread.interrupt();
+
+ while (subscriberThread.isAlive()) {
+ ThreadUtilities.sleep(10);
+ }
+
+ consumer.close();
+ System.out.println(KafkaEventSubscriber.class.getCanonicalName() + ": stopped");
+ }
+
+
+ public static void main(final String[] args) throws MessagingException {
+ if (args.length != 2) {
+ System.err.println("usage KafkaEventSubscriber topic kafkaServerAddress");
+ return;
+ }
+ new KafkaEventSubscriber(args[0], args[1]);
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/TestKafka2Kafka.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/TestKafka2Kafka.java
new file mode 100644
index 000000000..0874d9827
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/TestKafka2Kafka.java
@@ -0,0 +1,141 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.kafka;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Properties;
+
+import org.I0Itec.zkclient.ZkClient;
+import org.apache.kafka.common.utils.MockTime;
+import org.apache.kafka.common.utils.Time;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+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 kafka.admin.AdminUtils;
+import kafka.admin.RackAwareMode;
+import kafka.server.KafkaConfig;
+import kafka.server.KafkaServer;
+import kafka.utils.TestUtils;
+import kafka.utils.ZKStringSerializer$;
+import kafka.utils.ZkUtils;
+import kafka.zk.EmbeddedZookeeper;
+
+
+public class TestKafka2Kafka {
+ // The method of starting an embedded Kafka server used in this example is based on the method
+ // on slashdot at
+ // https://github.com/asmaier/mini-kafka
+
+ private static final long MAX_TEST_LENGTH = 10000;
+
+ private static final int EVENT_COUNT = 100;
+ private static final int EVENT_INTERVAL = 20;
+
+ private static final String ZKHOST = "127.0.0.1";
+ private static final String BROKERHOST = "127.0.0.1";
+ private static final String BROKERPORT = "39902";
+
+ private static EmbeddedZookeeper zkServer;
+ private static ZkClient zkClient;
+ private static KafkaServer kafkaServer;
+
+ @BeforeClass
+ public static void setupDummyKafkaServer() throws IOException {
+ // setup Zookeeper
+ zkServer = new EmbeddedZookeeper();
+ final String zkConnect = ZKHOST + ":" + zkServer.port();
+ zkClient = new ZkClient(zkConnect, 30000, 30000, ZKStringSerializer$.MODULE$);
+ final ZkUtils zkUtils = ZkUtils.apply(zkClient, false);
+
+ // setup Broker
+ final Properties brokerProps = new Properties();
+ brokerProps.setProperty("zookeeper.connect", zkConnect);
+ brokerProps.setProperty("broker.id", "0");
+ brokerProps.setProperty("log.dirs", Files.createTempDirectory("kafka-").toAbsolutePath().toString());
+ brokerProps.setProperty("listeners", "PLAINTEXT://" + BROKERHOST + ":" + BROKERPORT);
+ final KafkaConfig config = new KafkaConfig(brokerProps);
+ final Time mock = new MockTime();
+ kafkaServer = TestUtils.createServer(config, mock);
+
+ // create topics
+ AdminUtils.createTopic(zkUtils, "apex-in-0", 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$);
+ AdminUtils.createTopic(zkUtils, "apex-in-1", 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$);
+ AdminUtils.createTopic(zkUtils, "apex-out", 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$);
+ }
+
+ @AfterClass
+ public static void shutdownDummyKafkaServer() throws IOException {
+ kafkaServer.shutdown();
+ zkClient.close();
+ zkServer.shutdown();
+ }
+
+ @Test
+ public void testJsonKafkaEvents() throws MessagingException, ApexException {
+ final String[] args = {"src/test/resources/prodcons/Kafka2KafkaJsonEvent.json"};
+ testKafkaEvents(args, false, "json");
+ }
+
+ @Test
+ public void testXMLKafkaEvents() throws MessagingException, ApexException {
+ final String[] args = {"src/test/resources/prodcons/Kafka2KafkaXmlEvent.json"};
+ testKafkaEvents(args, true, "xml");
+ }
+
+ private void testKafkaEvents(final String[] args, final Boolean xmlEvents, final String topicSuffix)
+ throws MessagingException, ApexException {
+ final KafkaEventSubscriber subscriber =
+ new KafkaEventSubscriber("apex-out-" + topicSuffix, "localhost:" + BROKERPORT);
+ final KafkaEventProducer producer = new KafkaEventProducer("apex-in-" + topicSuffix, "localhost:" + BROKERPORT,
+ EVENT_COUNT, xmlEvents, EVENT_INTERVAL);
+
+ final ApexMain apexMain = new ApexMain(args);
+ ThreadUtilities.sleep(3000);
+
+ producer.sendEvents();
+
+ final long testStartTime = System.currentTimeMillis();
+
+ while (System.currentTimeMillis() < testStartTime + MAX_TEST_LENGTH
+ && subscriber.getEventsReceivedCount() < EVENT_COUNT) {
+ ThreadUtilities.sleep(EVENT_INTERVAL);
+ }
+
+ ThreadUtilities.sleep(1000);
+
+ System.out.println("sent event count: " + producer.getEventsSentCount());
+ System.out.println("received event count: " + subscriber.getEventsReceivedCount());
+ assertTrue(subscriber.getEventsReceivedCount() == producer.getEventsSentCount());
+
+ apexMain.shutdown();
+ subscriber.shutdown();
+ producer.shutdown();
+ ThreadUtilities.sleep(1000);
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/TestKafkaXMLEventProducer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/TestKafkaXMLEventProducer.java
new file mode 100644
index 000000000..80b4aef55
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/kafka/TestKafkaXMLEventProducer.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.kafka;
+
+import java.util.Properties;
+
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.Producer;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.onap.policy.apex.plugins.event.protocol.xml.jaxb.XMLApexEvent;
+import org.onap.policy.apex.plugins.event.protocol.xml.jaxb.XMLApexEventData;
+
+/**
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class TestKafkaXMLEventProducer {
+
+ public static void main(final String[] args) {
+ final Properties props = new Properties();
+ props.put("bootstrap.servers", "localhost:49092");
+ props.put("acks", "all");
+ props.put("retries", 0);
+ props.put("batch.size", 16384);
+ props.put("linger.ms", 1);
+ props.put("buffer.memory", 33554432);
+ props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
+ props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
+
+ final XMLApexEvent xmlEvent = new XMLApexEvent();
+ xmlEvent.setName("XMLEvent-1");
+ xmlEvent.setVersion("0.0.1");
+ xmlEvent.getData().add(new XMLApexEventData("Data-1", "Data Value -1"));
+
+ final Producer<String, String> producer = new KafkaProducer<String, String>(props);
+ for (int i = 0; i < 100; i++) {
+ xmlEvent.setName("XMLEvent" + Integer.toString(i));
+ xmlEvent.setVersion("0.0.1");
+ xmlEvent.getData()
+ .add(new XMLApexEventData("Data" + Integer.toString(i), "Data Value " + Integer.toString(i)));
+
+ producer.send(new ProducerRecord<String, String>("apex-in-0", xmlEvent.getName(), xmlEvent.toString()));
+ }
+ producer.close();
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestFile2REST.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestFile2REST.java
new file mode 100644
index 000000000..d304eb9d0
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestFile2REST.java
@@ -0,0 +1,205 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.restclient;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.net.URI;
+import java.util.Map;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.core.Response;
+
+import org.glassfish.grizzly.http.server.HttpServer;
+import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+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 com.google.gson.Gson;
+
+
+public class TestFile2REST {
+ private static final String BASE_URI = "http://localhost:32801/TestFile2Rest";
+ private static HttpServer server;
+
+ private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+ private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
+
+ private final PrintStream stdout = System.out;
+ private final PrintStream stderr = System.err;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ final ResourceConfig rc = new ResourceConfig(TestRESTClientEndpoint.class);
+ server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
+
+ while (!server.isStarted()) {
+ ThreadUtilities.sleep(50);
+ }
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ server.shutdown();
+ }
+
+ @Test
+ public void testFileEventsPost() throws MessagingException, ApexException, IOException {
+ final Client client = ClientBuilder.newClient();
+
+ final String[] args = {"src/test/resources/prodcons/File2RESTJsonEventPost.json"};
+ final ApexMain apexMain = new ApexMain(args);
+
+ // Wait for the required amount of events to be received or for 10 seconds
+ for (int i = 0; i < 100; i++) {
+ ThreadUtilities.sleep(100);
+ final Response response = client.target("http://localhost:32801/TestFile2Rest/apex/event/Stats")
+ .request("application/json").get();
+
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+ final String responseString = response.readEntity(String.class);
+
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> jsonMap = new Gson().fromJson(responseString, Map.class);
+ if ((double) jsonMap.get("POST") == 100) {
+ break;
+ }
+ }
+
+ apexMain.shutdown();
+ }
+
+ @Test
+ public void testFileEventsPut() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/File2RESTJsonEventPut.json"};
+ final ApexMain apexMain = new ApexMain(args);
+
+ final Client client = ClientBuilder.newClient();
+
+ // Wait for the required amount of events to be received or for 10 seconds
+ for (int i = 0; i < 100; i++) {
+ ThreadUtilities.sleep(100);
+ final Response response = client.target("http://localhost:32801/TestFile2Rest/apex/event/Stats")
+ .request("application/json").get();
+
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+ final String responseString = response.readEntity(String.class);
+
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> jsonMap = new Gson().fromJson(responseString, Map.class);
+ if ((double) jsonMap.get("PUT") == 100) {
+ break;
+ }
+ }
+
+ apexMain.shutdown();
+ }
+
+ @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();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(" no URL has been set for event sending on REST client"));
+ }
+
+ @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(200);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "send of event to URL \"http://localhost:32801/TestFile2Rest/apex/event/Bad\" using HTTP \"POST\" failed with status code 404"));
+ }
+
+ @Test
+ public void testFileEventsBadHTTPMethod() throws MessagingException, ApexException, IOException {
+ System.setOut(new PrintStream(outContent));
+ System.setErr(new PrintStream(errContent));
+
+ final String[] args = {"src/test/resources/prodcons/File2RESTJsonEventBadHTTPMethod.json"};
+ final ApexMain apexMain = new ApexMain(args);
+
+ ThreadUtilities.sleep(200);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "specified HTTP method of \"DELETE\" is invalid, only HTTP methods \"POST\" and \"PUT\" are supproted for event sending on REST client producer"));
+ }
+
+ @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(500);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "send of event to URL \"http://localhost:32801/TestFile2Rest/apex/event/PostEventBadResponse\" using HTTP \"POST\" failed with status code 400"));
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestREST2File.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestREST2File.java
new file mode 100644
index 000000000..f8898a7c5
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestREST2File.java
@@ -0,0 +1,188 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.restclient;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.net.URI;
+
+import org.glassfish.grizzly.http.server.HttpServer;
+import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.junit.After;
+import org.junit.AfterClass;
+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.model.utilities.TextFileUtils;
+import org.onap.policy.apex.service.engine.main.ApexMain;
+
+
+public class TestREST2File {
+
+ private static final String BASE_URI = "http://localhost:32801/TestRest2File";
+ private HttpServer server;
+
+ private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+ private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
+
+ private final PrintStream stdout = System.out;
+ private final PrintStream stderr = System.err;
+
+ @Before
+ public void setUp() throws Exception {
+ final ResourceConfig rc = new ResourceConfig(TestRESTClientEndpoint.class);
+ server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
+
+ while (!server.isStarted()) {
+ ThreadUtilities.sleep(50);
+ }
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ server.shutdown();
+ }
+
+ @AfterClass
+ public static void deleteTempFiles() {
+ new File("src/test/resources/events/EventsOut.json").delete();
+ }
+
+ @Test
+ public void testRESTEventsIn() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/REST2FileJsonEvent.json"};
+
+ final ApexMain apexMain = new ApexMain(args);
+
+ ThreadUtilities.sleep(1000);
+ apexMain.shutdown();
+
+ final String outputEventText = TextFileUtils.getTextFileAsString("src/test/resources/events/EventsOut.json");
+ assertTrue(outputEventText.contains(
+ "04\",\n" + " \"version\": \"0.0.1\",\n" + " \"nameSpace\": \"org.onap.policy.apex.sample.events\""));
+ }
+
+ @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(1000);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "received an empty event from URL \"http://localhost:32801/TestRest2File/apex/event/GetEmptyEvent\""));
+ }
+
+ @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(1000);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(" no URL has been set for event sending on REST client"));
+ }
+
+ @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(1000);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "reception of event from URL \"http://localhost:32801/TestRest2File/apex/event/Bad\" failed with status code 404"));
+ }
+
+ @Test
+ public void testFileEventsBadHTTPMethod() throws MessagingException, ApexException, IOException {
+ System.setOut(new PrintStream(outContent));
+ System.setErr(new PrintStream(errContent));
+
+ final String[] args = {"src/test/resources/prodcons/REST2FileJsonEventBadHTTPMethod.json"};
+ final ApexMain apexMain = new ApexMain(args);
+
+ ThreadUtilities.sleep(1000);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "specified HTTP method of \"POST\" is invalid, only HTTP method \"GET\" is supported for event reception on REST client consumer"));
+ }
+
+ @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(1000);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "reception of event from URL \"http://localhost:32801/TestRest2File/apex/event/GetEventBadResponse\" failed with status code 400 and message \"\""));
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestRESTClientEndpoint.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestRESTClientEndpoint.java
new file mode 100644
index 000000000..79634ebcb
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restclient/TestRESTClientEndpoint.java
@@ -0,0 +1,123 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.restclient;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Map;
+import java.util.Random;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Response;
+
+import com.google.gson.Gson;
+
+
+@Path("/apex")
+public class TestRESTClientEndpoint {
+
+ private static int postMessagesReceived = 0;
+ private static int putMessagesReceived = 0;
+ private static int statMessagesReceived = 0;
+ private static int getMessagesReceived = 0;
+
+ @Path("/event/Stats")
+ @GET
+ public Response serviceGetStats() {
+ statMessagesReceived++;
+ return Response.status(200).entity("{\"GET\": " + getMessagesReceived + ",\"STAT\": " + statMessagesReceived
+ + ",\"POST\": " + postMessagesReceived + ",\"PUT\": " + putMessagesReceived + "}").build();
+ }
+
+ @Path("/event/GetEvent")
+ @GET
+ public Response serviceGetEvent() {
+ final Random rand = new Random();
+ final int nextMatchCase = rand.nextInt(4);
+ final String nextEventName = "Event0" + rand.nextInt(2) + "00";
+
+ final String eventString = "{\n" + "\"nameSpace\": \"org.onap.policy.apex.sample.events\",\n" + "\"name\": \""
+ + nextEventName + "\",\n" + "\"version\": \"0.0.1\",\n" + "\"source\": \"REST_" + getMessagesReceived
+ + "\",\n" + "\"target\": \"apex\",\n" + "\"TestSlogan\": \"Test slogan for External Event0\",\n"
+ + "\"TestMatchCase\": " + nextMatchCase + ",\n" + "\"TestTimestamp\": " + System.currentTimeMillis()
+ + ",\n" + "\"TestTemperature\": 9080.866\n" + "}";
+
+ getMessagesReceived++;
+
+ return Response.status(200).entity(eventString).build();
+ }
+
+ @Path("/event/GetEmptyEvent")
+ @GET
+ public Response serviceGetEmptyEvent() {
+ return Response.status(200).build();
+ }
+
+ @Path("/event/GetEventBadResponse")
+ @GET
+ public Response serviceGetEventBadResponse() {
+ return Response.status(400).build();
+ }
+
+ @Path("/event/PostEvent")
+ @POST
+ public Response servicePostRequest(final String jsonString) {
+ postMessagesReceived++;
+
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> jsonMap = new Gson().fromJson(jsonString, Map.class);
+ assertTrue(jsonMap.containsKey("name"));
+ assertEquals("0.0.1", jsonMap.get("version"));
+ assertEquals("org.onap.policy.apex.sample.events", jsonMap.get("nameSpace"));
+ assertEquals("Act", jsonMap.get("source"));
+ assertEquals("Outside", jsonMap.get("target"));
+
+ return Response.status(200).entity("{\"GET\": , " + getMessagesReceived + ",\"STAT\": " + statMessagesReceived
+ + ",\"POST\": , " + postMessagesReceived + ",\"PUT\": " + putMessagesReceived + "}").build();
+ }
+
+ @Path("/event/PostEventBadResponse")
+ @POST
+ public Response servicePostRequestBadResponse(final String jsonString) {
+ return Response.status(400).build();
+ }
+
+ @Path("/event/PutEvent")
+ @PUT
+ public Response servicePutRequest(final String jsonString) {
+ putMessagesReceived++;
+
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> jsonMap = new Gson().fromJson(jsonString, Map.class);
+ assertTrue(jsonMap.containsKey("name"));
+ assertEquals("0.0.1", jsonMap.get("version"));
+ assertEquals("org.onap.policy.apex.sample.events", jsonMap.get("nameSpace"));
+ assertEquals("Act", jsonMap.get("source"));
+ assertEquals("Outside", jsonMap.get("target"));
+
+ return Response.status(200).entity("{\"GET\": , " + getMessagesReceived + ",\"STAT\": " + statMessagesReceived
+ + ",\"POST\": , " + postMessagesReceived + ",\"PUT\": " + putMessagesReceived + "}").build();
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restserver/TestRESTServer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restserver/TestRESTServer.java
new file mode 100644
index 000000000..5ac714673
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restserver/TestRESTServer.java
@@ -0,0 +1,324 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.restserver;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.Map;
+import java.util.Random;
+
+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.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 com.google.gson.Gson;
+
+
+public class TestRESTServer {
+ private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+ private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
+
+ private final PrintStream stdout = System.out;
+ private final PrintStream stderr = System.err;
+
+ private static int eventsSent = 0;
+
+ @Test
+ public void testRESTServerPut() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/RESTServerJsonEvent.json"};
+ final ApexMain apexMain = new ApexMain(args);
+
+ final Client client = ClientBuilder.newClient();
+
+ // Wait for the required amount of events to be received or for 10 seconds
+ for (int i = 0; i < 20; i++) {
+ ThreadUtilities.sleep(100);
+
+ final Response response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn")
+ .request("application/json").put(Entity.json(getEvent()));
+
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+ final String responseString = response.readEntity(String.class);
+
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> jsonMap = new Gson().fromJson(responseString, Map.class);
+ assertEquals("org.onap.policy.apex.sample.events", jsonMap.get("nameSpace"));
+ assertEquals("Test slogan for External Event0", jsonMap.get("TestSlogan"));
+ }
+
+ apexMain.shutdown();
+ }
+
+ @Test
+ public void testRESTServerPost() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/RESTServerJsonEvent.json"};
+ final ApexMain apexMain = new ApexMain(args);
+
+ final Client client = ClientBuilder.newClient();
+
+ // Wait for the required amount of events to be received or for 10 seconds
+ for (int i = 0; i < 20; i++) {
+ ThreadUtilities.sleep(100);
+
+ final Response response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn")
+ .request("application/json").post(Entity.json(getEvent()));
+
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+ final String responseString = response.readEntity(String.class);
+
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> jsonMap = new Gson().fromJson(responseString, Map.class);
+ assertEquals("org.onap.policy.apex.sample.events", jsonMap.get("nameSpace"));
+ assertEquals("Test slogan for External Event0", jsonMap.get("TestSlogan"));
+ }
+
+ apexMain.shutdown();
+ }
+
+ @Test
+ public void testRESTServerMultiInputs() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventMultiIn.json"};
+ final ApexMain apexMain = new ApexMain(args);
+
+ final Client client = ClientBuilder.newClient();
+
+ // Wait for the required amount of events to be received or for 10 seconds
+ for (int i = 0; i < 20; i++) {
+ ThreadUtilities.sleep(100);
+
+ final Response firstResponse = client.target("http://localhost:23324/apex/FirstConsumer/EventIn")
+ .request("application/json").post(Entity.json(getEvent()));
+
+ assertEquals(Response.Status.OK.getStatusCode(), firstResponse.getStatus());
+ final String firstResponseString = firstResponse.readEntity(String.class);
+
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> firstJsonMap = new Gson().fromJson(firstResponseString, Map.class);
+ assertEquals("org.onap.policy.apex.sample.events", firstJsonMap.get("nameSpace"));
+ assertEquals("Test slogan for External Event0", firstJsonMap.get("TestSlogan"));
+
+ final Response secondResponse = client.target("http://localhost:23324/apex/SecondConsumer/EventIn")
+ .request("application/json").post(Entity.json(getEvent()));
+
+ assertEquals(Response.Status.OK.getStatusCode(), secondResponse.getStatus());
+ final String secondResponseString = secondResponse.readEntity(String.class);
+
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> secondJsonMap = new Gson().fromJson(secondResponseString, Map.class);
+ assertEquals("org.onap.policy.apex.sample.events", secondJsonMap.get("nameSpace"));
+ assertEquals("Test slogan for External Event0", secondJsonMap.get("TestSlogan"));
+ }
+
+ apexMain.shutdown();
+ }
+
+ @Test
+ public void testRESTServerProducerStandalone() throws MessagingException, ApexException, IOException {
+ System.setOut(new PrintStream(outContent));
+ System.setErr(new PrintStream(errContent));
+
+ final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventProducerStandalone.json"};
+
+ final ApexMain apexMain = new ApexMain(args);
+ ThreadUtilities.sleep(200);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString
+ .contains("the parameters \"host\", \"port\", and \"standalone\" are illegal on REST Server producer"));
+ }
+
+ @Test
+ public void testRESTServerProducerHost() throws MessagingException, ApexException, IOException {
+ 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();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(" host and port are specified only in standalone mode"));
+ }
+
+ @Test
+ public void testRESTServerProducerPort() throws MessagingException, ApexException, IOException {
+ 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();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(" host and port are specified only in standalone mode"));
+ }
+
+ @Test
+ public void testRESTServerConsumerStandaloneNoHost() throws MessagingException, ApexException, IOException {
+ System.setOut(new PrintStream(outContent));
+ System.setErr(new PrintStream(errContent));
+
+ final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventConsumerStandaloneNoHost.json"};
+
+ final ApexMain apexMain = new ApexMain(args);
+ ThreadUtilities.sleep(200);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "the parameters \"host\" and \"port\" must be defined for REST Server consumer (FirstConsumer) in standalone mode"));
+ }
+
+ @Test
+ public void testRESTServerConsumerStandaloneNoPort() throws MessagingException, ApexException, IOException {
+ System.setOut(new PrintStream(outContent));
+ System.setErr(new PrintStream(errContent));
+
+ final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventConsumerStandaloneNoPort.json"};
+
+ final ApexMain apexMain = new ApexMain(args);
+ ThreadUtilities.sleep(200);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "the parameters \"host\" and \"port\" must be defined for REST Server consumer (FirstConsumer) in standalone mode"));
+ }
+
+ @Test
+ public void testRESTServerProducerNotSync() throws MessagingException, ApexException, IOException {
+ System.setOut(new PrintStream(outContent));
+ System.setErr(new PrintStream(errContent));
+
+ final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventProducerNotSync.json"};
+
+ final ApexMain apexMain = new ApexMain(args);
+ ThreadUtilities.sleep(200);
+ apexMain.shutdown();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "REST Server producer (FirstProducer) must run in synchronous mode with a REST Server consumer"));
+ }
+
+ @Test
+ public void testRESTServerConsumerNotSync() throws MessagingException, ApexException, IOException {
+ 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();
+
+ final String outString = outContent.toString();
+
+ System.setOut(stdout);
+ System.setErr(stderr);
+
+ assertTrue(outString.contains(
+ "event output for peered mode \"SYNCHRONOUS\": peer \"FirstConsumer\" for event handler \"FirstProducer\" does not exist or is not defined as being synchronous"));
+ }
+
+ @Test
+ public void testRESTServerDivideByZero() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventDivideByZero.json"};
+ final ApexMain apexMain = new ApexMain(args);
+
+ final Client client = ClientBuilder.newClient();
+
+ // Wait for the required amount of events to be received or for 10 seconds
+ for (int i = 0; i < 20; i++) {
+ ThreadUtilities.sleep(100);
+
+ final Response response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn")
+ .request("application/json").put(Entity.json(getEvent()));
+
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+ final String responseString = response.readEntity(String.class);
+
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> jsonMap = new Gson().fromJson(responseString, Map.class);
+ assertEquals("org.onap.policy.apex.sample.events", jsonMap.get("nameSpace"));
+ assertEquals("Test slogan for External Event0", jsonMap.get("TestSlogan"));
+ assertTrue(((String) jsonMap.get("exceptionMessage")).contains("caused by: / by zero"));
+
+ }
+
+
+ apexMain.shutdown();
+ }
+
+ private String getEvent() {
+ final Random rand = new Random();
+ final int nextMatchCase = rand.nextInt(4);
+ final String nextEventName = "Event0" + rand.nextInt(2) + "00";
+
+ final String eventString = "{\n" + "\"nameSpace\": \"org.onap.policy.apex.sample.events\",\n" + "\"name\": \""
+ + nextEventName + "\",\n" + "\"version\": \"0.0.1\",\n" + "\"source\": \"REST_" + eventsSent++ + "\",\n"
+ + "\"target\": \"apex\",\n" + "\"TestSlogan\": \"Test slogan for External Event0\",\n"
+ + "\"TestMatchCase\": " + nextMatchCase + ",\n" + "\"TestTimestamp\": " + System.currentTimeMillis()
+ + ",\n" + "\"TestTemperature\": 9080.866\n" + "}";
+
+ return eventString;
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restserver/TestRESTServerVPNContext.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restserver/TestRESTServerVPNContext.java
new file mode 100644
index 000000000..cb52dd50b
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/restserver/TestRESTServerVPNContext.java
@@ -0,0 +1,136 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.restserver;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+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.Ignore;
+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;
+
+
+public class TestRESTServerVPNContext {
+ private static int eventsSent = 0;
+
+ @Ignore
+ @Test
+ public void testRESTServerPut() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventContextJava.json"};
+ final ApexMain apexMain = new ApexMain(args);
+
+ final Client client = ClientBuilder.newClient();
+
+ Response response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn")
+ .request("application/json").put(Entity.json(setupLinkContext("L09", true)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn").request("application/json")
+ .put(Entity.json(setupLinkContext("L10", true)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn").request("application/json")
+ .put(Entity.json(setupCustomerContext("A", "L09 L10", 300, 50)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn").request("application/json")
+ .put(Entity.json(setupCustomerContext("B", "L09 L10", 300, 299)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn").request("application/json")
+ .put(Entity.json(setupCustomerContext("C", "L09 L10", 300, 300)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn").request("application/json")
+ .put(Entity.json(setupCustomerContext("D", "L09 L10", 300, 400)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ ThreadUtilities.sleep(100000);
+
+ apexMain.shutdown();
+ }
+
+ @Ignore
+ @Test
+ public void testRESTServerPutAvro() throws MessagingException, ApexException, IOException {
+ final String[] args = {"src/test/resources/prodcons/RESTServerJsonEventContextAvro.json"};
+ final ApexMain apexMain = new ApexMain(args);
+
+ final Client client = ClientBuilder.newClient();
+
+ Response response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn")
+ .request("application/json").put(Entity.json(setupLinkContext("L09", true)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn").request("application/json")
+ .put(Entity.json(setupLinkContext("L10", true)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn").request("application/json")
+ .put(Entity.json(setupCustomerContext("A", "L09 L10", 300, 50)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn").request("application/json")
+ .put(Entity.json(setupCustomerContext("B", "L09 L10", 300, 299)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn").request("application/json")
+ .put(Entity.json(setupCustomerContext("C", "L09 L10", 300, 300)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ response = client.target("http://localhost:23324/apex/FirstConsumer/EventIn").request("application/json")
+ .put(Entity.json(setupCustomerContext("D", "L09 L10", 300, 400)));
+ assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+ ThreadUtilities.sleep(100000);
+
+ apexMain.shutdown();
+ }
+
+ private String setupLinkContext(final String link, final Boolean isUp) {
+ final String eventString = "{\n" + "\"nameSpace\": \"org.onap.policy.apex.domains.vpn.events\",\n"
+ + "\"name\": \"VPNLinkCtxtTriggerEvent\",\n" + "\"version\": \"0.0.1\",\n" + "\"source\": \"REST_"
+ + eventsSent++ + "\",\n" + "\"target\": \"apex\",\n" + "\"Link\": \"" + link + "\",\n" + "\"LinkUp\": "
+ + isUp + "\n" + "}";
+
+ return eventString;
+ }
+
+ private String setupCustomerContext(final String customerName, final String linkList, final int slaDT,
+ final int ytdDT) {
+ final String eventString = "{\n" + "\"nameSpace\": \"org.onap.policy.apex.domains.vpn.events\",\n"
+ + "\"name\": \"VPNCustomerCtxtTriggerEvent\",\n" + "\"version\": \"0.0.1\",\n" + "\"source\": \"REST_"
+ + eventsSent++ + "\",\n" + "\"target\": \"apex\",\n" + "\"CustomerName\": \"" + customerName + "\",\n"
+ + "\"LinkList\": \"" + linkList + "\",\n" + "\"SlaDT\": \"" + slaDT + "\",\n" + "\"YtdDT\": " + ytdDT
+ + "\n" + "}";
+
+ return eventString;
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/sampletypes/Foo.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/sampletypes/Foo.java
new file mode 100644
index 000000000..da075b6a2
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/sampletypes/Foo.java
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.sampletypes;
+
+public class Foo {
+ private String bar;
+
+ public String getBar() {
+ return bar;
+ }
+
+ public void setBar(final String bar) {
+ this.bar = bar;
+ }
+
+ public Foo(final String bar) {
+ this();
+ this.bar = bar;
+ }
+
+ public Foo() {
+ super();
+ }
+
+ @Override
+ public String toString() {
+ return "Foo [bar=(String)\"" + bar + "\"]";
+ }
+
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/sampletypes/FooMap.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/sampletypes/FooMap.java
new file mode 100644
index 000000000..9adaf6dae
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/sampletypes/FooMap.java
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.sampletypes;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class FooMap extends LinkedHashMap<String, String> {
+ private static final long serialVersionUID = -7125986379378753022L;
+
+ public FooMap() {
+ super();
+ }
+
+ public FooMap(final int initialCapacity, final float loadFactor, final boolean accessOrder) {
+ super(initialCapacity, loadFactor, accessOrder);
+ }
+
+ public FooMap(final int initialCapacity, final float loadFactor) {
+ super(initialCapacity, loadFactor);
+ }
+
+ public FooMap(final int initialCapacity) {
+ super(initialCapacity);
+ }
+
+ public FooMap(final Map<? extends String, ? extends String> m) {
+ super(m);
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/TestWs2WsClient.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/TestWs2WsClient.java
new file mode 100644
index 000000000..52e896438
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/TestWs2WsClient.java
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.websocket;
+
+import static org.junit.Assert.assertEquals;
+
+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;
+
+public class TestWs2WsClient {
+ private static final long MAX_TEST_LENGTH = 10000;
+
+ private static final int EVENT_COUNT = 100;
+ private static final int EVENT_INTERVAL = 20;
+
+ @Test
+ public void testJsonWSEvents() throws MessagingException, ApexException {
+ final String[] args = {"src/test/resources/prodcons/Ws2WsClientJsonEvent.json"};
+ testWSEvents(args, false);
+ }
+
+ @Test
+ public void testXMLWSEvents() throws MessagingException, ApexException {
+ final String[] args = {"src/test/resources/prodcons/Ws2WsClientXMLEvent.json"};
+ testWSEvents(args, true);
+ }
+
+ private void testWSEvents(final String[] args, final Boolean xmlEvents) throws MessagingException, ApexException {
+ final WebSocketEventSubscriberServer subServer = new WebSocketEventSubscriberServer(42453);
+ final WebSocketEventProducerServer prodServer =
+ new WebSocketEventProducerServer(42451, EVENT_COUNT, xmlEvents, EVENT_INTERVAL);
+
+ final ApexMain apexMain = new ApexMain(args);
+
+ prodServer.sendEvents();
+
+ final long testStartTime = System.currentTimeMillis();
+
+ while (System.currentTimeMillis() < testStartTime + MAX_TEST_LENGTH
+ && subServer.getEventsReceivedCount() < EVENT_COUNT) {
+ ThreadUtilities.sleep(EVENT_INTERVAL);
+ }
+
+ assertEquals(prodServer.getEventsSentCount(), subServer.getEventsReceivedCount());
+
+ apexMain.shutdown();
+ prodServer.shutdown();
+ subServer.shutdown();
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/TestWs2WsServer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/TestWs2WsServer.java
new file mode 100644
index 000000000..86f6ee123
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/TestWs2WsServer.java
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.websocket;
+
+import static org.junit.Assert.assertEquals;
+
+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;
+
+public class TestWs2WsServer {
+ private static final long MAX_TEST_LENGTH = 10000;
+
+ private static final int EVENT_COUNT = 100;
+ private static final int EVENT_INTERVAL = 20;
+
+ @Test
+ public void testJsonWSEvents() throws MessagingException, ApexException {
+ final String[] args = {"src/test/resources/prodcons/Ws2WsServerJsonEvent.json"};
+ testWSEvents(args, false);
+ }
+
+ @Test
+ public void testXMLWSEvents() throws MessagingException, ApexException {
+ final String[] args = {"src/test/resources/prodcons/Ws2WsServerXMLEvent.json"};
+ testWSEvents(args, true);
+ }
+
+ public void testWSEvents(final String[] args, final boolean xmlEvents) throws MessagingException, ApexException {
+ final ApexMain apexMain = new ApexMain(args);
+
+ final WebSocketEventSubscriberClient subClient = new WebSocketEventSubscriberClient("localhost", 42452);
+ final WebSocketEventProducerClient prodClient =
+ new WebSocketEventProducerClient("localhost", 42450, EVENT_COUNT, xmlEvents, EVENT_INTERVAL);
+
+ prodClient.sendEvents();
+
+ final long testStartTime = System.currentTimeMillis();
+
+ while (System.currentTimeMillis() < testStartTime + MAX_TEST_LENGTH
+ && subClient.getEventsReceivedCount() < EVENT_COUNT) {
+ ThreadUtilities.sleep(EVENT_INTERVAL);
+ }
+
+ assertEquals(subClient.getEventsReceivedCount(), prodClient.getEventsSentCount());
+
+ prodClient.shutdown();
+ subClient.shutdown();
+ apexMain.shutdown();
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventProducerClient.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventProducerClient.java
new file mode 100644
index 000000000..dc186a1e8
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventProducerClient.java
@@ -0,0 +1,146 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.websocket;
+
+import org.onap.policy.apex.apps.uservice.test.adapt.events.EventGenerator;
+import org.onap.policy.apex.core.infrastructure.messaging.MessagingException;
+import org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageClient;
+import org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageListener;
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+
+public class WebSocketEventProducerClient implements WSStringMessageListener {
+ private final String host;
+ private final int port;
+ private final int eventCount;
+ private final boolean xmlEvents;
+ private final long eventInterval;
+ private long eventsSentCount = 0;
+
+ WSStringMessageClient client;
+
+ public WebSocketEventProducerClient(final String host, final int port, final int eventCount,
+ final boolean xmlEvents, final long eventInterval) throws MessagingException {
+ this.host = host;
+ this.port = port;
+ this.eventCount = eventCount;
+ this.xmlEvents = xmlEvents;
+ this.eventInterval = eventInterval;
+
+ client = new WSStringMessageClient(host, port);
+ client.start(this);
+
+ System.out.println(WebSocketEventProducerClient.class.getCanonicalName() + ": host " + host + ", port " + port
+ + ", event count " + eventCount + ", xmlEvents " + xmlEvents);
+ }
+
+ public void sendEvents() {
+ System.out.println(WebSocketEventProducerClient.class.getCanonicalName() + ": sending events on host " + host
+ + ", port " + port + ", event count " + eventCount + ", xmlEvents " + xmlEvents);
+
+ for (int i = 0; i < eventCount; i++) {
+ System.out.println(WebSocketEventProducerClient.class.getCanonicalName() + ": waiting " + eventInterval
+ + " milliseconds before sending next event");
+ ThreadUtilities.sleep(eventInterval);
+
+ String eventString = null;
+ if (xmlEvents) {
+ eventString = EventGenerator.xmlEvent();
+ } else {
+ eventString = EventGenerator.jsonEvent();
+ }
+ client.sendString(eventString);
+ eventsSentCount++;
+ System.out.println(WebSocketEventProducerClient.class.getCanonicalName() + ": host " + host + ", port "
+ + port + ", sent event " + eventString);
+ }
+ System.out.println(WebSocketEventProducerClient.class.getCanonicalName() + ": completed");
+ }
+
+ public long getEventsSentCount() {
+ return eventsSentCount;
+ }
+
+ public void shutdown() {
+ client.stop();
+ System.out.println(WebSocketEventProducerClient.class.getCanonicalName() + ": stopped");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageListener#
+ * receiveString(java.lang.String)
+ */
+ @Override
+ public void receiveString(final String eventString) {
+ System.out.println(WebSocketEventProducerServer.class.getCanonicalName() + ": host " + host + ", port " + port
+ + ", received event " + eventString);
+ }
+
+ public static void main(final String[] args) throws MessagingException {
+ if (args.length != 5) {
+ System.err.println("usage WebSocketEventProducerClient host port #events XML|JSON eventInterval");
+ return;
+ }
+
+ int port = 0;
+ try {
+ port = Integer.parseInt(args[1]);
+ } catch (final Exception e) {
+ System.err.println("usage WebSocketEventProducerClient host port #events XML|JSON eventInterval");
+ e.printStackTrace();
+ return;
+ }
+
+ int eventCount = 0;
+ try {
+ eventCount = Integer.parseInt(args[2]);
+ } catch (final Exception e) {
+ System.err.println("usage WebSocketEventProducerClient host port #events XML|JSON eventInterval");
+ e.printStackTrace();
+ return;
+ }
+
+ long eventInterval = 0;
+ try {
+ eventInterval = Long.parseLong(args[4]);
+ } catch (final Exception e) {
+ System.err.println("usage WebSocketEventProducerClient host port #events XML|JSON eventInterval");
+ e.printStackTrace();
+ return;
+ }
+
+ boolean xmlEvents = false;
+ if (args[3].equalsIgnoreCase("XML")) {
+ xmlEvents = true;
+ } else if (!args[3].equalsIgnoreCase("JSON")) {
+ System.err.println("usage WebSocketEventProducerClient host port #events XML|JSON eventInterval");
+ return;
+ }
+
+ final WebSocketEventProducerClient client =
+ new WebSocketEventProducerClient(args[0], port, eventCount, xmlEvents, eventInterval);
+
+ client.sendEvents();
+ client.shutdown();
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventProducerServer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventProducerServer.java
new file mode 100644
index 000000000..32b463d6f
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventProducerServer.java
@@ -0,0 +1,145 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.websocket;
+
+import org.onap.policy.apex.apps.uservice.test.adapt.events.EventGenerator;
+import org.onap.policy.apex.core.infrastructure.messaging.MessagingException;
+import org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageListener;
+import org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageServer;
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+
+public class WebSocketEventProducerServer implements WSStringMessageListener {
+ private final int port;
+ private final int eventCount;
+ private final boolean xmlEvents;
+ private final long eventInterval;
+ private long eventsSentCount = 0;
+
+ WSStringMessageServer server;
+
+ public WebSocketEventProducerServer(final int port, final int eventCount, final boolean xmlEvents,
+ final long eventInterval) throws MessagingException {
+ this.port = port;
+ this.eventCount = eventCount;
+ this.xmlEvents = xmlEvents;
+ this.eventInterval = eventInterval;
+
+ server = new WSStringMessageServer(port);
+ server.start(this);
+
+ System.out.println(WebSocketEventProducerServer.class.getCanonicalName() + ": port " + port + ", event count "
+ + eventCount + ", xmlEvents " + xmlEvents);
+ }
+
+ public void sendEvents() {
+ System.out.println(WebSocketEventProducerServer.class.getCanonicalName() + ": sending events on port " + port
+ + ", event count " + eventCount + ", xmlEvents " + xmlEvents);
+
+ for (int i = 0; i < eventCount; i++) {
+ System.out.println(WebSocketEventProducerServer.class.getCanonicalName() + ": waiting " + eventInterval
+ + " milliseconds before sending next event");
+ ThreadUtilities.sleep(eventInterval);
+
+ String eventString = null;
+ if (xmlEvents) {
+ eventString = EventGenerator.xmlEvent();
+ } else {
+ eventString = EventGenerator.jsonEvent();
+ }
+ server.sendString(eventString);
+ eventsSentCount++;
+ System.out.println(WebSocketEventProducerServer.class.getCanonicalName() + ": port " + port
+ + ", sent event " + eventString);
+ }
+
+ System.out.println(WebSocketEventProducerServer.class.getCanonicalName() + ": event sending completed");
+ }
+
+ public long getEventsSentCount() {
+ return eventsSentCount;
+ }
+
+ public void shutdown() {
+ server.stop();
+ System.out.println(WebSocketEventProducerServer.class.getCanonicalName() + ": stopped");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageListener#
+ * receiveString(java.lang.String)
+ */
+ @Override
+ public void receiveString(final String eventString) {
+ System.out.println(WebSocketEventProducerServer.class.getCanonicalName() + ": port " + port
+ + ", received event " + eventString);
+ }
+
+ public static void main(final String[] args) throws MessagingException {
+ if (args.length != 4) {
+ System.err.println("usage WebSocketEventProducerServer port #events XML|JSON eventInterval");
+ return;
+ }
+
+ int port = 0;
+ try {
+ port = Integer.parseInt(args[0]);
+ } catch (final Exception e) {
+ System.err.println("usage WebSocketEventProducerServer port #events XML|JSON eventInterval");
+ e.printStackTrace();
+ return;
+ }
+
+ int eventCount = 0;
+ try {
+ eventCount = Integer.parseInt(args[1]);
+ } catch (final Exception e) {
+ System.err.println("usage WebSocketEventProducerServer port #events XML|JSON eventInterval");
+ e.printStackTrace();
+ return;
+ }
+
+ long eventInterval = 0;
+ try {
+ eventInterval = Long.parseLong(args[3]);
+ } catch (final Exception e) {
+ System.err.println("usage WebSocketEventProducerServer port #events XML|JSON eventInterval");
+ e.printStackTrace();
+ return;
+ }
+
+ boolean xmlEvents = false;
+ if (args[2].equalsIgnoreCase("XML")) {
+ xmlEvents = true;
+ } else if (!args[2].equalsIgnoreCase("JSON")) {
+ System.err.println("usage WebSocketEventProducerServer port #events XML|JSON startDelay eventInterval");
+ return;
+ }
+
+ final WebSocketEventProducerServer server =
+ new WebSocketEventProducerServer(port, eventCount, xmlEvents, eventInterval);
+
+ server.sendEvents();
+ server.shutdown();
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventSubscriberClient.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventSubscriberClient.java
new file mode 100644
index 000000000..639d7ae77
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventSubscriberClient.java
@@ -0,0 +1,80 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.websocket;
+
+import org.onap.policy.apex.core.infrastructure.messaging.MessagingException;
+import org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageClient;
+import org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageListener;
+
+public class WebSocketEventSubscriberClient implements WSStringMessageListener {
+ private final int port;
+ private long eventsReceivedCount = 0;
+
+ private final WSStringMessageClient client;
+
+ public WebSocketEventSubscriberClient(final String host, final int port) throws MessagingException {
+ this.port = port;
+
+ client = new WSStringMessageClient(host, port);
+ client.start(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageListener#
+ * receiveString(java.lang.String)
+ */
+ @Override
+ public void receiveString(final String eventString) {
+ System.out.println(WebSocketEventSubscriberClient.class.getCanonicalName() + ": port " + port
+ + ", received event " + eventString);
+ eventsReceivedCount++;
+ }
+
+ public long getEventsReceivedCount() {
+ return eventsReceivedCount;
+ }
+
+ public void shutdown() {
+ client.stop();
+ System.out.println(WebSocketEventSubscriberServer.class.getCanonicalName() + ": stopped");
+ }
+
+ public static void main(final String[] args) throws MessagingException {
+ if (args.length != 2) {
+ System.err.println("usage WebSocketEventSubscriberClient host port");
+ return;
+ }
+
+ int port = 0;
+ try {
+ port = Integer.parseInt(args[0]);
+ } catch (final Exception e) {
+ System.err.println("usage WebSocketEventSubscriberClient port");
+ e.printStackTrace();
+ return;
+ }
+
+ new WebSocketEventSubscriberClient(args[0], port);
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventSubscriberServer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventSubscriberServer.java
new file mode 100644
index 000000000..bfa543774
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/adapt/websocket/WebSocketEventSubscriberServer.java
@@ -0,0 +1,83 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.adapt.websocket;
+
+import org.onap.policy.apex.core.infrastructure.messaging.MessagingException;
+import org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageListener;
+import org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageServer;
+
+public class WebSocketEventSubscriberServer implements WSStringMessageListener {
+ private final int port;
+ private long eventsReceivedCount = 0;
+
+ private final WSStringMessageServer server;
+
+ public WebSocketEventSubscriberServer(final int port) throws MessagingException {
+ this.port = port;
+
+ server = new WSStringMessageServer(port);
+ server.start(this);
+
+ System.out.println(
+ WebSocketEventSubscriberServer.class.getCanonicalName() + ": port " + port + ", waiting for events");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.onap.policy.apex.core.infrastructure.messaging.stringmessaging.WSStringMessageListener#
+ * receiveString(java.lang.String)
+ */
+ @Override
+ public void receiveString(final String eventString) {
+ System.out.println(WebSocketEventSubscriberServer.class.getCanonicalName() + ": port " + port
+ + ", received event " + eventString);
+ eventsReceivedCount++;
+ }
+
+ public long getEventsReceivedCount() {
+ return eventsReceivedCount;
+ }
+
+ public void shutdown() {
+ server.stop();
+ System.out.println(WebSocketEventSubscriberServer.class.getCanonicalName() + ": stopped");
+ }
+
+ public static void main(final String[] args) throws MessagingException {
+ if (args.length != 1) {
+ System.err.println("usage WebSocketEventSubscriberClient port");
+ return;
+ }
+
+ int port = 0;
+ try {
+ port = Integer.parseInt(args[0]);
+ } catch (final Exception e) {
+ System.err.println("usage WebSocketEventSubscriberClient port");
+ e.printStackTrace();
+ return;
+ }
+
+ new WebSocketEventSubscriberServer(port);
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/context/AvroEventAlbumContextTest.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/context/AvroEventAlbumContextTest.java
new file mode 100644
index 000000000..5360a2148
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/context/AvroEventAlbumContextTest.java
@@ -0,0 +1,95 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.context;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+import org.onap.policy.apex.auth.clieditor.ApexCLIEditorMain;
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
+import org.onap.policy.apex.model.basicmodel.service.ModelService;
+import org.onap.policy.apex.model.basicmodel.service.ParameterService;
+import org.onap.policy.apex.model.utilities.ResourceUtils;
+import org.onap.policy.apex.model.utilities.TextFileUtils;
+import org.onap.policy.apex.service.engine.main.ApexMain;
+
+/**
+ * The Class AvroEventAlbumContextTest.
+ */
+public class AvroEventAlbumContextTest {
+
+ /**
+ * Test avro event fields, by starting an engine, send event in, test event out.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws ApexException the apex exception
+ */
+ @Test
+ public void testAvroEventAlbumContextTest() throws IOException, ApexException {
+ final File tempCommandFile = File.createTempFile("TestPolicyAvroEventContext", ".apex");
+ final File tempLogFile = File.createTempFile("TestPolicyAvroEventContext", ".log");
+ final File tempModelFile = File.createTempFile("TestPolicyAvroEventContext", ".json");
+
+ final String javaEventContextString =
+ ResourceUtils.getResourceAsString("examples/scripts/TestPolicyAvroEventContext.apex");
+ TextFileUtils.putStringAsFile(javaEventContextString, tempCommandFile);
+
+ final String[] cliArgs = new String[] {"-c", tempCommandFile.getCanonicalPath(), "-l",
+ tempLogFile.getAbsolutePath(), "-o", tempModelFile.getAbsolutePath()};
+
+ ModelService.clear();
+
+ new ApexCLIEditorMain(cliArgs);
+
+ tempCommandFile.delete();
+ tempLogFile.delete();
+
+ ModelService.clear();
+
+ final String[] args = new String[] {"-m", tempModelFile.getAbsolutePath(), "-c",
+ "src/test/resources/prodcons/Context_AvroEventAlbum_file2file.json"};
+ final ApexMain apexMain = new ApexMain(args);
+ ThreadUtilities.sleep(1000);
+ apexMain.shutdown();
+
+ ParameterService.clear();
+ // The output event is in this file
+ final File outputEventFile = new File("src/test/resources/events/Context_AvroEventAlbum_EventOut.json");
+ final String outputEventString =
+ TextFileUtils.getTextFileAsString(outputEventFile.getCanonicalPath()).replaceAll("\\s+", "");
+
+ // We compare the output to what we expect to get
+ final String outputEventCompareString = TextFileUtils
+ .getTextFileAsString("src/test/resources/events/Context_AvroEventAlbum_EventOutCompare.json")
+ .replaceAll("\\s+", "");
+
+ // Check what we got is what we expected to get
+ assertEquals(outputEventCompareString, outputEventString);
+
+
+ tempModelFile.delete();
+ outputEventFile.delete();
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/context/JavaEventAlbumContextTest.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/context/JavaEventAlbumContextTest.java
new file mode 100644
index 000000000..242a9415c
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/context/JavaEventAlbumContextTest.java
@@ -0,0 +1,83 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.context;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+import org.onap.policy.apex.auth.clieditor.ApexCLIEditorMain;
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
+import org.onap.policy.apex.model.basicmodel.service.ModelService;
+import org.onap.policy.apex.model.basicmodel.service.ParameterService;
+import org.onap.policy.apex.model.utilities.ResourceUtils;
+import org.onap.policy.apex.model.utilities.TextFileUtils;
+import org.onap.policy.apex.service.engine.main.ApexMain;
+
+public class JavaEventAlbumContextTest {
+ @Test
+ public void testJavaEventAlbumContextTest() throws IOException, ApexException {
+ final File tempCommandFile = File.createTempFile("TestPolicyJavaEventContext", ".apex");
+ final File tempLogFile = File.createTempFile("TestPolicyJavaEventContext", ".log");
+ final File tempModelFile = File.createTempFile("TestPolicyJavaEventContext", ".json");
+
+ final String javaEventContextString =
+ ResourceUtils.getResourceAsString("examples/scripts/TestPolicyJavaEventContext.apex");
+ TextFileUtils.putStringAsFile(javaEventContextString, tempCommandFile);
+
+ final String[] cliArgs = new String[] {"-c", tempCommandFile.getCanonicalPath(), "-l",
+ tempLogFile.getAbsolutePath(), "-o", tempModelFile.getAbsolutePath()};
+
+ ModelService.clear();
+
+ new ApexCLIEditorMain(cliArgs);
+
+ tempCommandFile.delete();
+ tempLogFile.delete();
+
+ ModelService.clear();
+
+ final String[] args = new String[] {"-m", tempModelFile.getAbsolutePath(), "-c",
+ "src/test/resources/prodcons/Context_JavaEventAlbum_file2file.json"};
+ final ApexMain apexMain = new ApexMain(args);
+ ThreadUtilities.sleep(1000);
+ apexMain.shutdown();
+ ParameterService.clear();
+
+ // The output event is in this file
+ final File outputEventFile = new File("src/test/resources/events/Context_JavaEventAlbum_EventOut.json");
+ final String actualFileContent = TextFileUtils.getTextFileAsString(outputEventFile.getCanonicalPath());
+ final String outputEventString = actualFileContent.replaceAll("\\s+", "");
+
+ // We compare the output to what we expect to get
+ final String expectedFileContent = TextFileUtils
+ .getTextFileAsString("src/test/resources/events/Context_JavaEventAlbum_EventOutCompare.json");
+ final String outputEventCompareString = expectedFileContent.replaceAll("\\s+", "");
+
+ assertEquals(outputEventCompareString, outputEventString);
+
+ tempModelFile.delete();
+ outputEventFile.delete();
+ }
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/engdep/EngDepMessagingTest.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/engdep/EngDepMessagingTest.java
new file mode 100644
index 000000000..adc416dca
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/engdep/EngDepMessagingTest.java
@@ -0,0 +1,180 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.engdep;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.apex.core.deployment.BatchDeployer;
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
+import org.onap.policy.apex.model.basicmodel.service.ModelService;
+import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
+import org.onap.policy.apex.plugins.executor.mvel.MVELExecutorParameters;
+import org.onap.policy.apex.service.engine.event.ApexEvent;
+import org.onap.policy.apex.service.parameters.engineservice.EngineServiceParameters;
+import org.onap.policy.apex.test.common.model.SampleDomainModelFactory;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+// CHECKSTYLE:OFF: checkstyle:magicNumber
+
+/**
+ * The Class EngDepMessagingTest.
+ *
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class EngDepMessagingTest {
+ // Logger for this class
+ private static final XLogger LOGGER = XLoggerFactory.getXLogger(EngDepMessagingTest.class);
+
+ private static final long MAX_START_WAIT = 10000; // 10 sec
+
+ /**
+ * Sets the up.
+ *
+ * @throws Exception the exception
+ */
+ @Before
+ public void setUp() throws Exception {}
+
+ /**
+ * Test EngDep messaging.
+ *
+ * @throws URISyntaxException the URI syntax exception
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws ApexException the apex exception
+ */
+ @Test
+ public void testEngDepMessaging() throws URISyntaxException, IOException, ApexException {
+ LOGGER.debug("engine<-->deployment messaging test starting . . .");
+
+ ModelService.clear();
+
+ final EngineServiceParameters parameters = new EngineServiceParameters();
+ parameters.setName("EngDepMessagingTest");
+ parameters.setVersion("0.0.1");
+ parameters.setDeploymentPort(58820);
+ parameters.setInstanceCount(3);
+ parameters.setId(100);
+ parameters.getEngineParameters().getExecutorParameterMap().put("MVEL", new MVELExecutorParameters());
+
+ final EngineTestServer server = new EngineTestServer(parameters);
+ assertNotNull(server);
+
+ final Thread serverThread = new Thread(server);
+ serverThread.start();
+ final long starttime = System.currentTimeMillis();
+ while (server.isStarting() && System.currentTimeMillis() - starttime < MAX_START_WAIT) {
+ ThreadUtilities.sleep(100);
+ }
+ if (server.isStarting()) {
+ fail("Test server failed to start after " + MAX_START_WAIT + " ms");
+ }
+
+ final AxPolicyModel apexPolicyModel = new SampleDomainModelFactory().getSamplePolicyModel("MVEL");
+
+ final BatchDeployer deployer1 = new BatchDeployer("localhost", 58820);
+ assertNotNull(deployer1);
+
+ deployer1.init();
+ deployer1.deployModel(apexPolicyModel, false, false);
+ deployer1.stopEngines();
+ deployer1.startEngines();
+ deployer1.close();
+
+ // Send events
+ final Date testStartTime = new Date();
+ final Map<String, Object> eventDataMap = new HashMap<>();
+ eventDataMap.put("TestSlogan", "This is a test slogan");
+ eventDataMap.put("TestMatchCase", (byte) 123);
+ eventDataMap.put("TestTimestamp", testStartTime.getTime());
+ eventDataMap.put("TestTemperature", 34.5445667);
+
+ final ApexEvent event0 =
+ new ApexEvent("Event0000", "0.0.1", "org.onap.policy.apex.domains.sample.events", "apex", "test");
+ event0.putAll(eventDataMap);
+ server.sendEvent(event0);
+
+ final ApexEvent event1 =
+ new ApexEvent("Event0100", "0.0.1", "org.onap.policy.apex.domains.sample.events", "apex", "test");
+ event1.putAll(eventDataMap);
+ server.sendEvent(event1);
+
+ // Wait for results
+ while (server.getTotalActionEventsReceived() < 2) {
+ ThreadUtilities.sleep(100);
+ }
+ ThreadUtilities.sleep(500);
+
+ assertEquals(server.getTotalActionEventsReceived(), 2);
+
+ deployer1.init();
+ deployer1.stopEngines();
+ deployer1.close();
+
+ // Test re-initialization of model
+ final BatchDeployer deployer2 = new BatchDeployer("localhost", 58820);
+ assertNotNull(deployer2);
+
+ deployer2.init();
+ deployer2.deployModel(apexPolicyModel, true, true);
+ deployer2.stopEngines();
+ deployer2.startEngines();
+ deployer2.close();
+
+ server.sendEvent(event0);
+ server.sendEvent(event1);
+
+ // Wait for results
+ while (server.getTotalActionEventsReceived() < 4) {
+ ThreadUtilities.sleep(100);
+ }
+ ThreadUtilities.sleep(500);
+
+ assertEquals(server.getTotalActionEventsReceived(), 4);
+
+ deployer2.init();
+ deployer2.stopEngines();
+ deployer2.close();
+
+ server.stopServer();
+ LOGGER.debug("engine<-->deployment messaging test finished");
+ }
+
+ /**
+ * Tear down.
+ *
+ * @throws Exception the exception
+ */
+ @After
+ public void tearDown() throws Exception {}
+}
diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/engdep/EngineTestServer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/engdep/EngineTestServer.java
new file mode 100644
index 000000000..1a8b1d364
--- /dev/null
+++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/apps/uservice/test/engdep/EngineTestServer.java
@@ -0,0 +1,269 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.apps.uservice.test.engdep;
+
+import java.util.Date;
+
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+import org.onap.policy.apex.service.engine.engdep.EngDepMessagingService;
+import org.onap.policy.apex.service.engine.event.ApexEvent;
+import org.onap.policy.apex.service.engine.runtime.ApexEventListener;
+import org.onap.policy.apex.service.engine.runtime.EngineService;
+import org.onap.policy.apex.service.engine.runtime.EngineServiceEventInterface;
+import org.onap.policy.apex.service.engine.runtime.impl.EngineServiceImpl;
+import org.onap.policy.apex.service.parameters.engineservice.EngineServiceParameters;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+/**
+ * The Class EngineTestServer is a test Apex service used to test the performance of Apex engines.
+ *
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class EngineTestServer implements Runnable, EngineServiceEventInterface {
+ private static final XLogger LOGGER = XLoggerFactory.getXLogger(EngineTestServer.class);
+
+ private static final int TEST_SERVER_WAIT_TIME = 200;
+
+ // The engine service for sending events to the Apex engines and the EngDEp service for engine
+ // administration
+ private EngineService engineService = null;
+ private EngDepMessagingService messageService = null;
+
+ // The inner class used to receive and process events
+ private TestApexListener testApexListener = null;
+
+ // Status flags
+ private boolean starting = true;
+ private boolean interrupted = false;
+
+ // Parameters for the test
+ private final EngineServiceParameters parameters;
+
+ // Apex performance statistics
+ private Date statsStartDate = null;
+ private long actionEventsReceivedCount = 0;
+ private long accumulatedExecutionTime = 0;
+ private long totalActionEventsReceivedCount = 0;
+
+ private ApexEvent lastEventReceived = null;
+
+ /**
+ * Instantiates a new engine test server to test Apex performance.
+ *
+ * @param parameters the parameters
+ */
+ public EngineTestServer(final EngineServiceParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ LOGGER.debug("engine<-->deployment test server starting . . .");
+
+ // Set the name of the test server thread
+ Thread.currentThread().setName(EngineTestServer.class.getName());
+
+ try {
+ // Create the engine service and set the listener for events emitted by the Apex service
+ engineService = EngineServiceImpl.create(parameters);
+ testApexListener = new TestApexListener();
+ engineService.registerActionListener("testApexListener", testApexListener);
+
+ // Create the EngDep messaging service and start it
+ messageService = new EngDepMessagingService(engineService, parameters.getDeploymentPort());
+ messageService.start();
+
+ // Record the start date for statistics
+ statsStartDate = new Date();
+ } catch (final Exception e) {
+ LOGGER.error("engine<-->deployment test server exception", e);
+ e.printStackTrace();
+ return;
+ }
+ LOGGER.debug("engine<-->deployment test server started");
+
+ starting = false;
+
+ while (!interrupted) {
+ if (!ThreadUtilities.sleep(TEST_SERVER_WAIT_TIME)) {
+ interrupted = true;
+ }
+ }
+ }
+
+ /**
+ * Stop the test server.
+ */
+ public void stopServer() {
+ LOGGER.debug("engine<-->deployment test server stopping . . .");
+
+ interrupted = true;
+ messageService.stop();
+
+ LOGGER.debug("engine<-->deployment test server stopped");
+ }
+
+ /**
+ * Checks if the test server is interrupted.
+ *
+ * @return true, if is interrupted
+ */
+ public boolean isInterrupted() {
+ return interrupted;
+ }
+
+ /**
+ * Gets the total action events received.
+ *
+ * @return the total action events received
+ */
+ public long getTotalActionEventsReceived() {
+ return totalActionEventsReceivedCount;
+ }
+
+ /**
+ * Gets the last action events received.
+ *
+ * @return the last action event received
+ */
+ public ApexEvent getLastActionEvent() {
+ return lastEventReceived;
+ }
+
+ /**
+ * Gets the Apex statistics and resets them.
+ *
+ * @return the statistics
+ */
+ public long[] getAndResetStats() {
+ // Check if we have statistics
+ if (statsStartDate == null || actionEventsReceivedCount == 0) {
+ return null;
+ }
+
+ // Calculate, save, and reset the statistics
+ final long[] stats = new long[2];
+ synchronized (statsStartDate) {
+ final long averageExecutionTime = accumulatedExecutionTime / actionEventsReceivedCount;
+ final long measuringTime = new Date().getTime() - statsStartDate.getTime();
+ final long transactionsPerMillisecond = actionEventsReceivedCount / measuringTime;
+ stats[0] = averageExecutionTime;
+ stats[1] = transactionsPerMillisecond;
+ statsStartDate = new Date();
+
+ actionEventsReceivedCount = 0;
+ accumulatedExecutionTime = 0;
+ }
+
+ // Return the statistics
+ return stats;
+ }
+
+ /**
+ * Checks if the test server is starting.
+ *
+ * @return true, if the server is starting
+ */
+ public boolean isStarting() {
+ return starting;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.onap.policy.apex.service.engine.runtime.EngineServiceEventInterface#sendEvent(org.onap.
+ * policy.apex.service.engine.event.ApexEvent)
+ */
+ @Override
+ public void sendEvent(final ApexEvent event) {
+ // Send the event onto the service being tested
+ engineService.getEngineServiceEventInterface().sendEvent(event);
+ }
+
+ /**
+ * The listener interface for receiving testApex events. The class that is interested in
+ * processing a testApex event implements this interface, and the object created with that class
+ * is registered with a component using the component's {@code addTestApexListener} method. When
+ * the testApex event occurs, that object's appropriate method is invoked.
+ *
+ * This class listens for events from the Apex engine
+ *
+ * @see TestApexEvent
+ */
+ private final class TestApexListener implements ApexEventListener {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.onap.policy.apex.service.engine.runtime.ApexEventListener#onApexEvent(org.onap.policy
+ * .apex.service.engine.event.ApexEvent)
+ */
+ @Override
+ public synchronized void onApexEvent(final ApexEvent apexEvent) {
+ LOGGER.debug("result is:" + apexEvent);
+
+ // Check the result event is correct
+ checkResult(apexEvent);
+
+ // Calculate the performance of the Apex engine service on this policy execution run and
+ // accumulate the total statistics
+ final Date testStartTime = new Date((Long) apexEvent.get("TestTimestamp"));
+ final Date testEndTime = new Date();
+ final long testTime = testEndTime.getTime() - testStartTime.getTime();
+ LOGGER.debug("policy execution time: " + testTime + "ms");
+ synchronized (statsStartDate) {
+ actionEventsReceivedCount++;
+ totalActionEventsReceivedCount++;
+ accumulatedExecutionTime += testTime;
+ }
+ lastEventReceived = apexEvent;
+ }
+
+ /**
+ * Check that a reply event from the Apex engine is valid.
+ *
+ * @param result the result event from the Apex engine
+ */
+ private void checkResult(final ApexEvent result) {
+ assert result.getName().startsWith("Event0004") || result.getName().startsWith("Event0104");
+
+ // CHECKSTYLE:OFF: checkstyle:magicNumber
+ assert result.get("TestSlogan").equals("This is a test slogan");
+ assert result.get("TestMatchCase").equals(new Byte((byte) 123));
+ assert result.get("TestTemperature").equals(34.5445667);
+ assert ((byte) result.get("TestMatchCaseSelected") >= 0 && (byte) result.get("TestMatchCaseSelected") <= 3);
+ assert ((byte) result.get("TestEstablishCaseSelected") >= 0
+ && (byte) result.get("TestEstablishCaseSelected") <= 3);
+ assert ((byte) result.get("TestDecideCaseSelected") >= 0
+ && (byte) result.get("TestDecideCaseSelected") <= 3);
+ assert ((byte) result.get("TestActCaseSelected") >= 0 && (byte) result.get("TestActCaseSelected") <= 3);
+ // CHECKSTYLE:ON: checkstyle:magicNumber
+ }
+ }
+}