Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update RPProjectRunListener for log4j2 compatibility. #22

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions soapui/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<Logger> 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);
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -38,8 +38,8 @@ public HttpMessageExchangeLogger() {
protected List<SaveLogRQ> 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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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()));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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<String, SaveLogRQ>) id -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -46,7 +47,6 @@ public class TestBasedSoapUIServiceImpl extends StepBasedSoapUIServiceImpl imple

public static final Map<String, LoggingContext> CONTEXT_MAP = new ConcurrentHashMap<String, LoggingContext>();
private static final String LEVEL_INFO = "INFO";
public static String TEST_CASE_ID;

public TestBasedSoapUIServiceImpl(ListenerParameters parameters, List<ResultLogger<?>> resultLoggers) {
super(parameters, resultLoggers);
Expand All @@ -57,30 +57,26 @@ public void startTestCase(TestCase testCase, PropertyExpansionContext propertyCo
Maybe<String> 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);
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<String, SaveLogRQ>) id -> {
Expand All @@ -99,17 +95,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);
}
Expand All @@ -126,8 +119,7 @@ public static Function<String, SaveLogRQ> asFunction(final String message, final
};
}

public static Function<String, SaveLogRQ> asFunctionFile(final String message, final SaveLogRQ.File file, final String level,
final Date time) {
public static Function<String, SaveLogRQ> asFunctionFile(final String message, final SaveLogRQ.File file, final String level, final Date time) {
return id -> {
SaveLogRQ rq = new SaveLogRQ();
rq.setLevel(level);
Expand All @@ -139,4 +131,8 @@ public static Function<String, SaveLogRQ> asFunctionFile(final String message, f
return rq;
};
}

private String getTestCaseId(TestCase testCase) {
return testCase.getId();
}
}