diff options
author | waqas.ikram <waqas.ikram@ericsson.com> | 2018-06-27 16:16:42 +0100 |
---|---|---|
committer | waqas.ikram <waqas.ikram@ericsson.com> | 2018-06-28 15:47:46 +0100 |
commit | 2816ea6b7672a5519628a5134a5ef719166b27f7 (patch) | |
tree | 94ee625fd5e84113f86a38b62124f7945241c302 /testsuites/integration/integration-uservice-test/src/test/java | |
parent | 7c2b947460d0795b29c9c23f1d7373a27ae7bc9e (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')
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 + } + } +} |