From 6f95d4832755a49ead5c0e1d04ec91fce444bd01 Mon Sep 17 00:00:00 2001 From: o_balcilar Date: Thu, 17 Feb 2022 14:22:29 +0300 Subject: [PATCH 1/3] update RPProjectRunListener for log4j2 compatibility. --- soapui/build.gradle | 6 +- .../listeners/RPProjectRunListener.java | 124 +++++++++--------- 2 files changed, 67 insertions(+), 63 deletions(-) diff --git a/soapui/build.gradle b/soapui/build.gradle index 913f495..e27554f 100644 --- a/soapui/build.gradle +++ b/soapui/build.gradle @@ -2,18 +2,18 @@ dependencies { if (releaseMode) { compile 'com.epam.reportportal:client-java:5.0.1' compile 'com.epam.reportportal:commons-model:5.0.0' - compile('com.epam.reportportal:logger-java-log4j:5.0.1') { + compile('com.epam.reportportal:logger-java-log4j:5.1.4') { exclude module: 'client-java' } } else { compile 'com.epam.reportportal:client-java:5.0.1' compile 'com.epam.reportportal:commons-model:5.0.0' - compile('com.epam.reportportal:logger-java-log4j:5.0.1') { + compile('com.epam.reportportal:logger-java-log4j:5.1.4') { exclude module: 'client-java' } } - compileOnly 'log4j:log4j:1.2.17' + compileOnly 'org.apache.logging.log4j:log4j-core:2.17.1' compile 'com.smartbear.soapui:soapui:5.5.0' testImplementation 'org.junit.platform:junit-platform-launcher:1.6.2' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2' diff --git a/soapui/src/main/java/com/epam/reportportal/soapui/listeners/RPProjectRunListener.java b/soapui/src/main/java/com/epam/reportportal/soapui/listeners/RPProjectRunListener.java index b8001d1..814d68e 100644 --- a/soapui/src/main/java/com/epam/reportportal/soapui/listeners/RPProjectRunListener.java +++ b/soapui/src/main/java/com/epam/reportportal/soapui/listeners/RPProjectRunListener.java @@ -16,12 +16,15 @@ package com.epam.reportportal.soapui.listeners; import com.epam.reportportal.soapui.service.SoapUIService; -import com.epam.ta.reportportal.log4j.appender.ReportPortalAppender; +import com.epam.ta.reportportal.log4j.appender.ReportPortalLog4j2Appender; import com.eviware.soapui.SoapUI; import com.eviware.soapui.model.testsuite.*; -import org.apache.log4j.SimpleLayout; +import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.layout.PatternLayout; -import java.util.Enumeration; +import java.util.Iterator; /** * Report portal related implementation of {@link ProjectRunListener}. This @@ -32,70 +35,71 @@ */ public class RPProjectRunListener implements ProjectRunListener { - public static final String APPENDER_NAME = "ReportPortalAppender"; - public static final String BASE_APPENDER_NAME = "REPORTPORTAL"; - public static final String RP_SERVICE = "rp_service"; + public static final String APPENDER_NAME = "ReportPortalAppender"; + public static final String BASE_APPENDER_NAME = "REPORTPORTAL"; + public static final String RP_SERVICE = "rp_service"; - private SoapUIService service; + private SoapUIService service; - @Override - public void beforeRun(ProjectRunner runner, ProjectRunContext context) { - try { - service = RpServiceBuilder.build(context.getProject()); - defineLogger(); - } catch (Throwable t) { - SoapUI.log("ReportPortal plugin cannot be initialized. " + t.getMessage()); - service = SoapUIService.NOP_SERVICE; - } - service.startLaunch(); - context.setProperty(RP_SERVICE, service); - } + @Override + public void beforeRun(ProjectRunner runner, ProjectRunContext context) { + try { + service = RpServiceBuilder.build(context.getProject()); + defineLogger(); + } catch (Throwable t) { + SoapUI.log("ReportPortal plugin cannot be initialized. " + t.getMessage()); + service = SoapUIService.NOP_SERVICE; + } + service.startLaunch(); + context.setProperty(RP_SERVICE, service); + } - @Override - public void afterRun(ProjectRunner paramProjectRunner, ProjectRunContext paramProjectRunContext) { - service.finishLaunch(); - } + @Override + public void afterRun(ProjectRunner paramProjectRunner, ProjectRunContext paramProjectRunContext) { + service.finishLaunch(); + } - @Override - public void beforeTestSuite(ProjectRunner paramProjectRunner, ProjectRunContext paramProjectRunContext, TestSuite paramTestSuite) { - service.startTestSuite(paramTestSuite); - } + @Override + public void beforeTestSuite(ProjectRunner paramProjectRunner, ProjectRunContext paramProjectRunContext, TestSuite paramTestSuite) { + service.startTestSuite(paramTestSuite); + } - @Override - public void afterTestSuite(ProjectRunner paramProjectRunner, ProjectRunContext paramProjectRunContext, - TestSuiteRunner paramTestSuiteRunner) { - service.finishTestSuite(paramTestSuiteRunner); - } + @Override + public void afterTestSuite(ProjectRunner paramProjectRunner, ProjectRunContext paramProjectRunContext, + TestSuiteRunner paramTestSuiteRunner) { + service.finishTestSuite(paramTestSuiteRunner); + } - /** - * Instantiate, initialize report portal log4j appender and add it to all - * groovy.log logger. - */ - private void defineLogger() { - @SuppressWarnings("rawtypes") + /** + * Instantiate, initialize report portal log4j appender and add it to all + * groovy.log logger. + */ + private void defineLogger() { + @SuppressWarnings("rawtypes") - ReportPortalAppender soapUIAppender = new ReportPortalAppender(); - soapUIAppender.setName(APPENDER_NAME); - soapUIAppender.setLayout(new SimpleLayout()); - Enumeration loggers = org.apache.log4j.Logger.getRootLogger().getLoggerRepository().getCurrentLoggers(); + ReportPortalLog4j2Appender reportPortalLog4j2Appender = ReportPortalLog4j2Appender.createAppender(APPENDER_NAME, null, + PatternLayout.createDefaultLayout()); - while (loggers.hasMoreElements()) { - org.apache.log4j.Logger logger = (org.apache.log4j.Logger) loggers.nextElement(); - if (logger.getAppender(BASE_APPENDER_NAME) != null) { - /* - * Report portal soapui log4j appender compatible only with - * groovy.log appender because this logger used for logging user - * logs from groovy scripts. Using soapui log4j appender with - * other appender unsafe because they may be not synchronized - * with listener(logs can be logged to report portal only if - * appender started test step) - */ - logger.removeAppender(BASE_APPENDER_NAME); + Iterator loggers = LoggerContext.getContext().getLoggers().iterator(); - if (logger.getName().equals("groovy.log")) { - logger.addAppender(soapUIAppender); - } - } - } - } + while (loggers.hasNext()) { + Logger logger = loggers.next(); + Appender appender = logger.getAppenders().get(BASE_APPENDER_NAME); + if (appender != null) { + /* + * Report portal soapui log4j appender compatible only with + * groovy.log appender because this logger used for logging user + * logs from groovy scripts. Using soapui log4j appender with + * other appender unsafe because they may be not synchronized + * with listener(logs can be logged to report portal only if + * appender started test step) + */ + logger.removeAppender(appender); + + if (logger.getName().equals("groovy.log")) { + logger.addAppender(reportPortalLog4j2Appender); + } + } + } + } } \ No newline at end of file From 9f12fd2297f8559f1545bf962ddb9ed2e0699ec4 Mon Sep 17 00:00:00 2001 From: o_balcilar Date: Wed, 2 Nov 2022 11:23:21 +0300 Subject: [PATCH 2/3] add Soapui parallel test case execution support for TEST_BASED reporter type. --- .../soapui/service/CustomLoggerService.java | 15 ++++++----- .../service/TestBasedSoapUIServiceImpl.java | 27 ++++++++----------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/soapui/src/main/java/com/epam/reportportal/soapui/service/CustomLoggerService.java b/soapui/src/main/java/com/epam/reportportal/soapui/service/CustomLoggerService.java index 29d2ec9..12a5e1f 100644 --- a/soapui/src/main/java/com/epam/reportportal/soapui/service/CustomLoggerService.java +++ b/soapui/src/main/java/com/epam/reportportal/soapui/service/CustomLoggerService.java @@ -17,6 +17,7 @@ import com.epam.reportportal.service.LoggingContext; import com.epam.ta.reportportal.ws.model.log.SaveLogRQ; +import com.eviware.soapui.model.testsuite.TestCase; import java.io.File; import java.io.IOException; @@ -32,21 +33,21 @@ public class CustomLoggerService { - public static void log(String message, String level) { - if (TEST_CASE_ID != null) { - LoggingContext loggingContext = CONTEXT_MAP.get(TEST_CASE_ID); - loggingContext.emit(asFunction(message, level, Calendar.getInstance().getTime())); + public static void log(TestCase testCase, String message, String level) { + if (testCase != null) { + LoggingContext loggingContext = CONTEXT_MAP.get(testCase.getId()); + loggingContext.emit(asFunction(message, level, Calendar.getInstance().getTime())); } } - public static void logFile(String message, File file, String level) throws IOException { - if (TEST_CASE_ID != null) { + public static void logFile(TestCase testCase, String message, File file, String level) throws IOException { + if (testCase != null) { byte[] fileContent = Files.readAllBytes(file.toPath()); SaveLogRQ.File rqFile = new SaveLogRQ.File(); rqFile.setContent(fileContent); rqFile.setContentType(Files.probeContentType(file.toPath())); rqFile.setName(UUID.randomUUID().toString()); - LoggingContext loggingContext = CONTEXT_MAP.get(TEST_CASE_ID); + LoggingContext loggingContext = CONTEXT_MAP.get(testCase.getId()); loggingContext.emit(asFunctionFile(message, rqFile, level, Calendar.getInstance().getTime())); } } diff --git a/soapui/src/main/java/com/epam/reportportal/soapui/service/TestBasedSoapUIServiceImpl.java b/soapui/src/main/java/com/epam/reportportal/soapui/service/TestBasedSoapUIServiceImpl.java index 77bb4fc..8d31236 100644 --- a/soapui/src/main/java/com/epam/reportportal/soapui/service/TestBasedSoapUIServiceImpl.java +++ b/soapui/src/main/java/com/epam/reportportal/soapui/service/TestBasedSoapUIServiceImpl.java @@ -46,7 +46,6 @@ public class TestBasedSoapUIServiceImpl extends StepBasedSoapUIServiceImpl imple public static final Map CONTEXT_MAP = new ConcurrentHashMap(); private static final String LEVEL_INFO = "INFO"; - public static String TEST_CASE_ID; public TestBasedSoapUIServiceImpl(ListenerParameters parameters, List> resultLoggers) { super(parameters, resultLoggers); @@ -57,25 +56,21 @@ public void startTestCase(TestCase testCase, PropertyExpansionContext propertyCo Maybe id = startItem(testCase, TestItemType.TEST_STEP, fromStringId(testCase.getTestSuite().getPropertyValue(ID))); testCase.setPropertyValue(ID, toStringId(id)); - LoggingContext loggingContext = LoggingContext.init(launchId, - id, - reportPortal.getClient(), - Schedulers.from(executor) - ); - CONTEXT_MAP.put(TEST_CASE_ID = testCase.getId(), loggingContext); + LoggingContext loggingContext = LoggingContext.init(launchId, id, reportPortal.getClient(), Schedulers.from(executor)); + CONTEXT_MAP.put(testCase.getId(), loggingContext); } public void startTestStep(TestStep testStep, TestCaseRunContext context) { if (!RpServiceBuilder.REPORTER_DISABLE) { String log = asMarkdown(String.format("# ===========STEP '%s' STARTED===========", testStep.getName())); - LoggingContext loggingContext = CONTEXT_MAP.get(TEST_CASE_ID); + LoggingContext loggingContext = CONTEXT_MAP.get(getTestCaseId(context.getTestCase())); loggingContext.emit(asFunction(log, LEVEL_INFO, Calendar.getInstance().getTime())); } } public void finishTestStep(TestStepResult testStepContext, TestCaseRunContext paramTestCaseRunContext) { - LoggingContext loggingContext = CONTEXT_MAP.get(TEST_CASE_ID); + LoggingContext loggingContext = CONTEXT_MAP.get(getTestCaseId(paramTestCaseRunContext.getTestCase())); if (!RpServiceBuilder.REPORTER_DISABLE) { String logStepData = getLogStepData(testStepContext); @@ -99,17 +94,14 @@ public void finishTestStep(TestStepResult testStepContext, TestCaseRunContext pa } if (!RpServiceBuilder.REPORTER_DISABLE) { - String log = asMarkdown(String.format("# ===========STEP '%s' %s===========", - testStepContext.getTestStep().getName(), - TestStatus.fromSoapUIStep(testStepContext.getStatus()) - )); + String log = asMarkdown(String.format("# ===========STEP '%s' %s===========", testStepContext.getTestStep().getName(), TestStatus.fromSoapUIStep(testStepContext.getStatus()))); loggingContext.emit(asFunction(log, LEVEL_INFO, Calendar.getInstance().getTime())); } } @Override public void finishTestCase(TestCaseRunner testCaseContext, PropertyExpansionContext propertyContext) { - CONTEXT_MAP.get(TEST_CASE_ID).completed().blockingAwait(); + CONTEXT_MAP.get(getTestCaseId(testCaseContext.getTestCase())).completed().blockingAwait(); super.finishTestCase(testCaseContext, propertyContext); } @@ -126,8 +118,7 @@ public static Function asFunction(final String message, final }; } - public static Function asFunctionFile(final String message, final SaveLogRQ.File file, final String level, - final Date time) { + public static Function asFunctionFile(final String message, final SaveLogRQ.File file, final String level, final Date time) { return id -> { SaveLogRQ rq = new SaveLogRQ(); rq.setLevel(level); @@ -139,4 +130,8 @@ public static Function asFunctionFile(final String message, f return rq; }; } + + private String getTestCaseId(TestCase testCase) { + return testCase.getId(); + } } \ No newline at end of file From e92218461e972e8dc7c009768870119970c7a0fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Or=C3=A7un=20Balc=C4=B1lar?= Date: Sat, 3 Feb 2024 10:32:19 +0300 Subject: [PATCH 3/3] escape step log, request, response to fix broken XML log view in ReportPortal UI --- .../soapui/results/HttpMessageExchangeLogger.java | 6 +++--- .../soapui/service/StepBasedSoapUIServiceImpl.java | 3 ++- .../soapui/service/TestBasedSoapUIServiceImpl.java | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/soapui/src/main/java/com/epam/reportportal/soapui/results/HttpMessageExchangeLogger.java b/soapui/src/main/java/com/epam/reportportal/soapui/results/HttpMessageExchangeLogger.java index 27c262d..5df5d36 100644 --- a/soapui/src/main/java/com/epam/reportportal/soapui/results/HttpMessageExchangeLogger.java +++ b/soapui/src/main/java/com/epam/reportportal/soapui/results/HttpMessageExchangeLogger.java @@ -18,7 +18,7 @@ import com.epam.ta.reportportal.ws.model.log.SaveLogRQ; import com.eviware.soapui.impl.wsdl.submit.HttpMessageExchange; import com.eviware.soapui.impl.wsdl.submit.transports.http.HttpResponse; -import rp.com.google.common.base.Strings; +import org.apache.commons.lang.StringEscapeUtils; import java.util.Arrays; import java.util.List; @@ -38,8 +38,8 @@ public HttpMessageExchangeLogger() { protected List prepareLogs(HttpMessageExchange result) { final HttpResponse testRS = (HttpResponse) result.getResponse(); return Arrays.asList( - prepareEntity( "REQUEST", testRS.getRequestHeaders().toString(), testRS.getRequestContent()), - prepareEntity("RESPONSE", testRS.getResponseHeaders().toString(), testRS.getContentAsString())); + prepareEntity("REQUEST", testRS.getRequestHeaders().toString(), StringEscapeUtils.escapeHtml(testRS.getRequestContent())), + prepareEntity("RESPONSE", testRS.getResponseHeaders().toString(), StringEscapeUtils.escapeHtml(testRS.getContentAsString()))); } private SaveLogRQ prepareEntity(String prefix, String headers, String body) { diff --git a/soapui/src/main/java/com/epam/reportportal/soapui/service/StepBasedSoapUIServiceImpl.java b/soapui/src/main/java/com/epam/reportportal/soapui/service/StepBasedSoapUIServiceImpl.java index 07a8f10..2a0d69a 100644 --- a/soapui/src/main/java/com/epam/reportportal/soapui/service/StepBasedSoapUIServiceImpl.java +++ b/soapui/src/main/java/com/epam/reportportal/soapui/service/StepBasedSoapUIServiceImpl.java @@ -35,6 +35,7 @@ import com.eviware.soapui.model.testsuite.TestRunner.Status; import com.eviware.soapui.model.testsuite.TestStepResult.TestStepStatus; import io.reactivex.Maybe; +import org.apache.commons.lang.StringEscapeUtils; import rp.com.google.common.base.StandardSystemProperty; import rp.com.google.common.base.Strings; @@ -244,7 +245,7 @@ public void finishTestStep(TestStepResult testStepContext, TestCaseRunContext pa String logStepData = getLogStepData(testStepContext); if (!Strings.isNullOrEmpty(logStepData)) { - ReportPortal.emitLog(logStepData, "INFO", Calendar.getInstance().getTime()); + ReportPortal.emitLog(StringEscapeUtils.escapeHtml(logStepData), "INFO", Calendar.getInstance().getTime()); } for (final SaveLogRQ rq : getStepLogReport(testStepContext)) { ReportPortal.emitLog((Function) id -> { diff --git a/soapui/src/main/java/com/epam/reportportal/soapui/service/TestBasedSoapUIServiceImpl.java b/soapui/src/main/java/com/epam/reportportal/soapui/service/TestBasedSoapUIServiceImpl.java index 8d31236..01751b3 100644 --- a/soapui/src/main/java/com/epam/reportportal/soapui/service/TestBasedSoapUIServiceImpl.java +++ b/soapui/src/main/java/com/epam/reportportal/soapui/service/TestBasedSoapUIServiceImpl.java @@ -26,6 +26,7 @@ import com.eviware.soapui.model.testsuite.*; import io.reactivex.Maybe; import io.reactivex.schedulers.Schedulers; +import org.apache.commons.lang.StringEscapeUtils; import rp.com.google.common.base.Strings; import java.util.Calendar; @@ -75,7 +76,7 @@ public void finishTestStep(TestStepResult testStepContext, TestCaseRunContext pa if (!RpServiceBuilder.REPORTER_DISABLE) { String logStepData = getLogStepData(testStepContext); if (!Strings.isNullOrEmpty(logStepData)) { - loggingContext.emit(asFunction(logStepData, LEVEL_INFO, Calendar.getInstance().getTime())); + loggingContext.emit(asFunction(StringEscapeUtils.escapeHtml(logStepData), LEVEL_INFO, Calendar.getInstance().getTime())); } for (final SaveLogRQ rq : getStepLogReport(testStepContext)) { loggingContext.emit((Function) id -> {