From 313ae294db717564e534626ce79721d800be3ece Mon Sep 17 00:00:00 2001 From: jusski <8794405+jusski@users.noreply.github.com> Date: Mon, 28 Mar 2022 07:22:45 +0300 Subject: [PATCH 01/11] Update ReportPortalLog4j2Appender.java Fixed bug with wrong object casting --- .../reportportal/log4j/appender/ReportPortalLog4j2Appender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2Appender.java b/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2Appender.java index 53ff877..3b0ce39 100644 --- a/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2Appender.java +++ b/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2Appender.java @@ -99,7 +99,7 @@ public void append(final LogEvent logEvent) { byteSource = rpMessage.getData(); message = rpMessage.getMessage(); } else if (objectMessage instanceof File) { - final File file = (File) event.getMessage(); + final File file = (File) objectMessage; byteSource = new TypeAwareByteSource(asByteSource(file), detect(file)); message = "File reported"; From 7d658c0ece420e0309232ccadce9f593b7c701a8 Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Thu, 7 Apr 2022 19:47:20 +0300 Subject: [PATCH 02/11] Client version update --- CHANGELOG.md | 2 ++ build.gradle | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a444229..4ad2e3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Changelog ## [Unreleased] +### Changed +- Client version updated on [5.1.7](https://github.com/reportportal/client-java/releases/tag/5.1.7) ## [5.1.4] ### Changed diff --git a/build.gradle b/build.gradle index 0ec51f4..c80dab7 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ repositories { dependencies { implementation 'org.apache.logging.log4j:log4j-core:2.17.1' implementation 'log4j:log4j:1.2.17' - implementation 'com.epam.reportportal:client-java:5.1.4' + implementation 'com.epam.reportportal:client-java:5.1.7' implementation 'com.epam.reportportal:commons-model:5.0.0' } From 14a537f4b423fc182c72da77f9c1f548c49de708 Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Mon, 25 Apr 2022 14:18:13 +0300 Subject: [PATCH 03/11] Client version update --- CHANGELOG.md | 3 +++ build.gradle | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ad2e3f..639ff6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ # Changelog +### Changed +- Client version updated on [5.1.10](https://github.com/reportportal/client-java/releases/tag/5.1.10) +- Log4j version updated on 2.17.2 ## [Unreleased] ### Changed diff --git a/build.gradle b/build.gradle index c80dab7..3abcfa4 100644 --- a/build.gradle +++ b/build.gradle @@ -25,9 +25,9 @@ repositories { } dependencies { - implementation 'org.apache.logging.log4j:log4j-core:2.17.1' + implementation 'org.apache.logging.log4j:log4j-core:2.17.2' implementation 'log4j:log4j:1.2.17' - implementation 'com.epam.reportportal:client-java:5.1.7' + implementation 'com.epam.reportportal:client-java:5.1.10' implementation 'com.epam.reportportal:commons-model:5.0.0' } From b26417cd83335a77baf2b13be5b235574d472c01 Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Thu, 19 May 2022 17:04:41 +0300 Subject: [PATCH 04/11] Issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 28 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..5037c5c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,28 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**Steps to Reproduce** +Steps to reproduce the behavior: +1. ... +2. ... + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Actual behavior** +What actually happened. + +**Dependency versions** +Include version info of the following libraries: client-java, logger-java-log4j + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..d217f3c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the issue is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 06f20371d036a7dcad7a62145877f0d5530dba46 Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Thu, 30 Jun 2022 11:55:05 +0300 Subject: [PATCH 05/11] Client version update --- CHANGELOG.md | 6 ++---- build.gradle | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 639ff6f..0518c42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,9 @@ # Changelog -### Changed -- Client version updated on [5.1.10](https://github.com/reportportal/client-java/releases/tag/5.1.10) -- Log4j version updated on 2.17.2 ## [Unreleased] ### Changed -- Client version updated on [5.1.7](https://github.com/reportportal/client-java/releases/tag/5.1.7) +- Client version updated on [5.1.11](https://github.com/reportportal/client-java/releases/tag/5.1.11) +- Log4j version updated on 2.17.2 ## [5.1.4] ### Changed diff --git a/build.gradle b/build.gradle index 3abcfa4..ef51528 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ repositories { dependencies { implementation 'org.apache.logging.log4j:log4j-core:2.17.2' implementation 'log4j:log4j:1.2.17' - implementation 'com.epam.reportportal:client-java:5.1.10' + implementation 'com.epam.reportportal:client-java:5.1.11' implementation 'com.epam.reportportal:commons-model:5.0.0' } From 792dd2f54e2b1c3af9e54fcfda7faa0d5ac4d22f Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Mon, 4 Jul 2022 14:08:18 +0300 Subject: [PATCH 06/11] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 94c3dbc..70b8b99 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![Maven Central](https://img.shields.io/maven-central/v/com.epam.reportportal/logger-java-log4j.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22com.epam.reportportal%22%20AND%20a:%22logger-java-log4j%22) [![Join Slack chat!](https://reportportal-slack-auto.herokuapp.com/badge.svg)](https://reportportal-slack-auto.herokuapp.com) [![stackoverflow](https://img.shields.io/badge/reportportal-stackoverflow-orange.svg?style=flat)](http://stackoverflow.com/questions/tagged/reportportal) -[![UserVoice](https://img.shields.io/badge/uservoice-vote%20ideas-orange.svg?style=flat)](https://rpp.uservoice.com/forums/247117-report-portal) [![Build with Love](https://img.shields.io/badge/build%20with-❤%EF%B8%8F%E2%80%8D-lightgrey.svg)](http://reportportal.io?style=flat) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) From fd89f95d621a921d03ebbe871a0b5999f1e7af0c Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Tue, 5 Jul 2022 11:06:19 +0300 Subject: [PATCH 07/11] Logging issues skip --- .github/workflows/ci.yml | 3 + CHANGELOG.md | 6 +- build.gradle | 37 +++++ gradle.properties | 4 + .../log4j/appender/ReportPortalAppender.java | 5 + .../appender/ReportPortalLog4j2Appender.java | 9 +- .../ta/reportportal/log4j/appender/Util.java | 19 ++- .../appender/ReportPortalAppenderTest.java | 118 ++++++++++++++++ .../ReportPortalLog4j2AppenderTest.java | 133 ++++++++++++++++++ .../org.junit.jupiter.api.extension.Extension | 1 + src/test/resources/junit-platform.properties | 1 + src/test/resources/pug/unlucky.jpg | Bin 0 -> 90404 bytes 12 files changed, 331 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalAppenderTest.java create mode 100644 src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2AppenderTest.java create mode 100644 src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension create mode 100644 src/test/resources/junit-platform.properties create mode 100644 src/test/resources/pug/unlucky.jpg diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 037727a..3b2f077 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,3 +47,6 @@ jobs: - name: Build with Gradle run: ./gradlew build + + - name: Codecov upload + run: bash <(curl -s https://codecov.io/bash) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0518c42..e195a7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,11 @@ # Changelog ## [Unreleased] +### Added +- Logging issues skip, by @HardNorth ### Changed -- Client version updated on [5.1.11](https://github.com/reportportal/client-java/releases/tag/5.1.11) -- Log4j version updated on 2.17.2 +- Client version updated on [5.1.11](https://github.com/reportportal/client-java/releases/tag/5.1.11), by @HardNorth +- Log4j version updated on 2.17.2, by @HardNorth ## [5.1.4] ### Changed diff --git a/build.gradle b/build.gradle index ef51528..0abcbcb 100644 --- a/build.gradle +++ b/build.gradle @@ -19,9 +19,20 @@ apply plugin: 'java-library' apply from: "${project.scripts_url}/${project.scripts_branch}/build-quality.gradle" apply from: "${project.scripts_url}/${project.scripts_branch}/release-commons.gradle" apply from: "${project.scripts_url}/${project.scripts_branch}/signing.gradle" +apply from: "${project.scripts_url}/${project.scripts_branch}/jacoco.gradle" + +project.ext.limits = [ + 'instruction': 60, + 'branch' : 53, + 'line' : 65, + 'complexity' : 60, + 'method' : 49, + 'class' : 90 +] repositories { mavenCentral() + maven { url "https://jitpack.io" } } dependencies { @@ -29,8 +40,34 @@ dependencies { implementation 'log4j:log4j:1.2.17' implementation 'com.epam.reportportal:client-java:5.1.11' implementation 'com.epam.reportportal:commons-model:5.0.0' + + testImplementation 'com.github.reportportal:agent-java-test-utils:236a68c' + testImplementation('org.awaitility:awaitility:4.0.2') { + exclude group: 'org.hamcrest' + } + testImplementation ("org.junit.platform:junit-platform-runner:${junit_runner_version}") { + exclude module: 'junit' + } + testImplementation "org.junit.jupiter:junit-jupiter-engine:${junit_version}" + testImplementation "org.junit.jupiter:junit-jupiter-params:${junit_version}" + testImplementation 'org.hamcrest:hamcrest-core:2.2' + testImplementation "org.mockito:mockito-core:${project.mockito_version}" + testImplementation "org.mockito:mockito-junit-jupiter:${project.mockito_version}" + testImplementation 'org.apache.commons:commons-io:1.3.2' +} + +test { + useJUnitPlatform() + systemProperty("file.encoding", "utf-8") + outputs.upToDateWhen { false } + testLogging { + events "failed" + exceptionFormat "full" + } } wrapper { gradleVersion = '5.4.1' } + +build.dependsOn jacocoTestReport diff --git a/gradle.properties b/gradle.properties index fe1b04c..206a3c7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,3 +2,7 @@ version=5.1.5-SNAPSHOT description=EPAM Report portal. Log4j Intergration scripts_url=https://raw.githubusercontent.com/reportportal/gradle-scripts scripts_branch=develop +junit_version=5.6.3 +junit_runner_version=1.6.3 +mockito_version=3.3.3 +excludeTests= diff --git a/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalAppender.java b/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalAppender.java index 8b0c20d..fec8c32 100644 --- a/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalAppender.java +++ b/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalAppender.java @@ -44,6 +44,11 @@ protected void append(final LoggingEvent event) { return; } + //make sure we are not logging themselves + if (Util.isInternal(event.getLoggerName())) { + return; + } + emitLog(itemUuid -> { SaveLogRQ request = new SaveLogRQ(); request.setLevel(event.getLevel().toString()); diff --git a/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2Appender.java b/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2Appender.java index 3b0ce39..969a2c7 100644 --- a/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2Appender.java +++ b/src/main/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2Appender.java @@ -55,8 +55,8 @@ protected ReportPortalLog4j2Appender(String name, Filter filter, Layout layout) { + public static ReportPortalLog4j2Appender createAppender(@PluginAttribute("name") String name, + @PluginElement("filter") Filter filter, @PluginElement("layout") Layout layout) { if (name == null) { LOGGER.error("No name provided for ReportPortalLog4j2Appender"); @@ -78,6 +78,11 @@ public void append(final LogEvent logEvent) { return; } + //make sure we are not logging themselves + if (Util.isInternal(event.getLoggerName())) { + return; + } + emitLog(itemUuid -> { SaveLogRQ request = new SaveLogRQ(); request.setItemUuid(itemUuid); diff --git a/src/main/java/com/epam/ta/reportportal/log4j/appender/Util.java b/src/main/java/com/epam/ta/reportportal/log4j/appender/Util.java index ed02d8f..16b9102 100644 --- a/src/main/java/com/epam/ta/reportportal/log4j/appender/Util.java +++ b/src/main/java/com/epam/ta/reportportal/log4j/appender/Util.java @@ -18,14 +18,31 @@ import com.epam.reportportal.message.HashMarkSeparatedMessageParser; import com.epam.reportportal.message.MessageParser; +import java.util.Collections; +import java.util.List; + /** * @author Andrei Varabyeu */ final class Util { - static final MessageParser MESSAGE_PARSER = new HashMarkSeparatedMessageParser(); + private static final List LOGGING_ISSUE = Collections.singletonList( + "com.epam.reportportal.service.logs.LoggingSubscriber"); private Util() { //statics only } + + static boolean isInternal(String loggerName) { + if (null == loggerName) { + return false; + } + + for (String packagePrefix : LOGGING_ISSUE) { + if (loggerName.startsWith(packagePrefix)) { + return true; + } + } + return false; + } } diff --git a/src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalAppenderTest.java b/src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalAppenderTest.java new file mode 100644 index 0000000..729e4f1 --- /dev/null +++ b/src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalAppenderTest.java @@ -0,0 +1,118 @@ +package com.epam.ta.reportportal.log4j.appender; + +import com.epam.reportportal.service.Launch; +import com.epam.reportportal.service.LoggingContext; +import com.epam.reportportal.service.ReportPortalClient; +import com.epam.reportportal.service.logs.LoggingSubscriber; +import com.epam.reportportal.util.test.CommonUtils; +import com.epam.ta.reportportal.ws.model.BatchSaveOperatingRS; +import io.reactivex.Maybe; +import io.reactivex.Scheduler; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import org.apache.commons.io.IOUtils; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.PatternLayout; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.concurrent.ExecutorService; + +import static java.util.Optional.ofNullable; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +public class ReportPortalAppenderTest { + @Mock + private ReportPortalClient client; + + private final ExecutorService executor = CommonUtils.testExecutor(); + private final Scheduler scheduler = Schedulers.from(executor); + + private static Logger createLoggerFor(Class clazz) { + PatternLayout py = new PatternLayout("%date %level [%thread] %logger{10} [%file:%line] %msg%n"); + ReportPortalAppender appender = new ReportPortalAppender(); + appender.setLayout(py); + + Logger logger = Logger.getLogger(clazz); + logger.addAppender(appender); + logger.setLevel(Level.DEBUG); + return logger; + } + + @SuppressWarnings("unchecked") + private static void mockBatchLogging(ReportPortalClient client) { + when(client.log(any(List.class))).thenReturn(Maybe.just(new BatchSaveOperatingRS())); + } + + @AfterEach + public void tearDown() { + CommonUtils.shutdownExecutorService(executor); + } + + @Test + @SuppressWarnings({ "unchecked", "ReactiveStreamsUnusedPublisher" }) + public void test_logger_append() { + mockBatchLogging(client); + LoggingContext.init(Maybe.just("launch_uuid"), Maybe.just("item_uuid"), client, scheduler); + Logger logger = createLoggerFor(Launch.class); + logger.info("test message"); + LoggingContext.complete(); + verify(client).log(any(List.class)); + } + + @Test + @SuppressWarnings({ "unchecked", "ReactiveStreamsUnusedPublisher" }) + public void test_logger_skip() { + LoggingContext.init(Maybe.just("launch_uuid"), Maybe.just("item_uuid"), client, scheduler); + Logger logger = createLoggerFor(LoggingSubscriber.class); + logger.info("test message"); + LoggingContext.complete(); + verify(client, timeout(100).times(0)).log(any(List.class)); + } + + @Test + @SuppressWarnings({ "unchecked", "ReactiveStreamsUnusedPublisher" }) + public void test_binary_file_message_encoding() throws IOException { + mockBatchLogging(client); + LoggingContext.init(Maybe.just("launch_uuid"), Maybe.just("item_uuid"), client, scheduler); + String message = "test message"; + Logger logger = createLoggerFor(this.getClass()); + byte[] content; + try (InputStream is = ofNullable(Thread.currentThread() + .getContextClassLoader() + .getResourceAsStream("pug/unlucky.jpg")).orElseThrow(() -> new IllegalStateException( + "Unable to find test image file"))) { + content = IOUtils.toByteArray(is); + } + logger.info(String.format("RP_MESSAGE#FILE#%s#%s", "src/test/resources/pug/unlucky.jpg", message)); + LoggingContext.complete(); + ArgumentCaptor> captor = ArgumentCaptor.forClass(List.class); + verify(client).log(captor.capture()); + + List request = captor.getValue(); + assertThat(request, hasSize(2)); + + RequestBody jsonPart = request.get(0).body(); + MediaType jsonPartType = jsonPart.contentType(); + assertThat(jsonPartType, notNullValue()); + assertThat(jsonPartType.toString(), Matchers.startsWith("application/json")); + + RequestBody binaryPart = request.get(1).body(); + MediaType binaryPartType = binaryPart.contentType(); + assertThat(binaryPartType, notNullValue()); + assertThat(binaryPartType.toString(), equalTo("image/jpeg")); + assertThat(binaryPart.contentLength(), equalTo((long) content.length)); + } +} diff --git a/src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2AppenderTest.java b/src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2AppenderTest.java new file mode 100644 index 0000000..0e349b2 --- /dev/null +++ b/src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2AppenderTest.java @@ -0,0 +1,133 @@ +package com.epam.ta.reportportal.log4j.appender; + +import com.epam.reportportal.service.Launch; +import com.epam.reportportal.service.LoggingContext; +import com.epam.reportportal.service.ReportPortalClient; +import com.epam.reportportal.service.logs.LoggingSubscriber; +import com.epam.reportportal.util.test.CommonUtils; +import com.epam.ta.reportportal.ws.model.BatchSaveOperatingRS; +import io.reactivex.Maybe; +import io.reactivex.Scheduler; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import org.apache.commons.io.IOUtils; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configurator; +import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder; +import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder; +import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory; +import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.concurrent.ExecutorService; + +import static java.util.Optional.ofNullable; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +public class ReportPortalLog4j2AppenderTest { + @Mock + private ReportPortalClient client; + + private final ExecutorService executor = CommonUtils.testExecutor(); + private final Scheduler scheduler = Schedulers.from(executor); + + @SuppressWarnings("resource") + private static Logger createLoggerFor(Class clazz) { + ConfigurationBuilder builder = ConfigurationBuilderFactory.newConfigurationBuilder(); + builder.setPackages("com.epam.ta.reportportal.log4j.appender"); + builder.setStatusLevel(Level.DEBUG); + builder.setConfigurationName("BuilderTest"); + AppenderComponentBuilder appenderBuilder = builder.newAppender( + "ReportPortalAppender", + "ReportPortalLog4j2Appender" + ); + appenderBuilder.add(builder.newLayout("PatternLayout") + .addAttribute("pattern", "%date %level [%thread] %logger{10} [%file:%line] %msg%n")); + appenderBuilder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL) + .addAttribute("level", Level.DEBUG)); + builder.add(appenderBuilder); + builder.add(builder.newRootLogger(Level.DEBUG).add(builder.newAppenderRef("ReportPortalAppender"))); + LoggerContext ctx = Configurator.initialize(builder.build()); + return ctx.getLogger(clazz); + } + + @SuppressWarnings("unchecked") + private static void mockBatchLogging(ReportPortalClient client) { + when(client.log(any(List.class))).thenReturn(Maybe.just(new BatchSaveOperatingRS())); + } + + @AfterEach + public void tearDown() { + CommonUtils.shutdownExecutorService(executor); + } + + @Test + @SuppressWarnings({ "unchecked", "ReactiveStreamsUnusedPublisher" }) + public void test_logger_append() { + mockBatchLogging(client); + LoggingContext.init(Maybe.just("launch_uuid"), Maybe.just("item_uuid"), client, scheduler); + Logger logger = createLoggerFor(Launch.class); + logger.info("test message"); + LoggingContext.complete(); + verify(client).log(any(List.class)); + } + + @Test + @SuppressWarnings({ "unchecked", "ReactiveStreamsUnusedPublisher" }) + public void test_logger_skip() { + LoggingContext.init(Maybe.just("launch_uuid"), Maybe.just("item_uuid"), client, scheduler); + Logger logger = createLoggerFor(LoggingSubscriber.class); + logger.info("test message"); + LoggingContext.complete(); + verify(client, timeout(100).times(0)).log(any(List.class)); + } + + @Test + @SuppressWarnings({ "unchecked", "ReactiveStreamsUnusedPublisher" }) + public void test_binary_file_message_encoding() throws IOException { + mockBatchLogging(client); + LoggingContext.init(Maybe.just("launch_uuid"), Maybe.just("item_uuid"), client, scheduler); + String message = "test message"; + Logger logger = createLoggerFor(this.getClass()); + byte[] content; + try (InputStream is = ofNullable(Thread.currentThread() + .getContextClassLoader() + .getResourceAsStream("pug/unlucky.jpg")).orElseThrow(() -> new IllegalStateException( + "Unable to find test image file"))) { + content = IOUtils.toByteArray(is); + } + logger.info(String.format("RP_MESSAGE#FILE#%s#%s", "src/test/resources/pug/unlucky.jpg", message)); + LoggingContext.complete(); + ArgumentCaptor> captor = ArgumentCaptor.forClass(List.class); + verify(client).log(captor.capture()); + + List request = captor.getValue(); + assertThat(request, hasSize(2)); + + RequestBody jsonPart = request.get(0).body(); + MediaType jsonPartType = jsonPart.contentType(); + assertThat(jsonPartType, notNullValue()); + assertThat(jsonPartType.toString(), Matchers.startsWith("application/json")); + + RequestBody binaryPart = request.get(1).body(); + MediaType binaryPartType = binaryPart.contentType(); + assertThat(binaryPartType, notNullValue()); + assertThat(binaryPartType.toString(), equalTo("image/jpeg")); + assertThat(binaryPart.contentLength(), equalTo((long) content.length)); + } +} diff --git a/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension new file mode 100644 index 0000000..02593ef --- /dev/null +++ b/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension @@ -0,0 +1 @@ +org.mockito.junit.jupiter.MockitoExtension diff --git a/src/test/resources/junit-platform.properties b/src/test/resources/junit-platform.properties new file mode 100644 index 0000000..6efc0d5 --- /dev/null +++ b/src/test/resources/junit-platform.properties @@ -0,0 +1 @@ +junit.jupiter.extensions.autodetection.enabled=true diff --git a/src/test/resources/pug/unlucky.jpg b/src/test/resources/pug/unlucky.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91e8af05fff849c12718414497f23a975ce71662 GIT binary patch literal 90404 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 Date: Tue, 5 Jul 2022 11:08:38 +0300 Subject: [PATCH 08/11] Lower complexity coverage requirement --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0abcbcb..c3bf0fe 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ project.ext.limits = [ 'instruction': 60, 'branch' : 53, 'line' : 65, - 'complexity' : 60, + 'complexity' : 45, 'method' : 49, 'class' : 90 ] From 171a0894bf51bac8709fb6462a84baca0ba218b5 Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Tue, 5 Jul 2022 11:12:16 +0300 Subject: [PATCH 09/11] Status badges --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 70b8b99..ddf127d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # log4j-integration [![Maven Central](https://img.shields.io/maven-central/v/com.epam.reportportal/logger-java-log4j.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22com.epam.reportportal%22%20AND%20a:%22logger-java-log4j%22) +[![CI Build](https://github.com/reportportal/logger-java-log4j/actions/workflows/ci.yml/badge.svg)](https://github.com/reportportal/logger-java-log4j/actions/workflows/ci.yml) +[![codecov](https://codecov.io/gh/reportportal/logger-java-log4j/branch/develop/graph/badge.svg?token=iEy7fURz1P)](https://codecov.io/gh/reportportal/logger-java-log4j) [![Join Slack chat!](https://reportportal-slack-auto.herokuapp.com/badge.svg)](https://reportportal-slack-auto.herokuapp.com) [![stackoverflow](https://img.shields.io/badge/reportportal-stackoverflow-orange.svg?style=flat)](http://stackoverflow.com/questions/tagged/reportportal) [![Build with Love](https://img.shields.io/badge/build%20with-❤%EF%B8%8F%E2%80%8D-lightgrey.svg)](http://reportportal.io?style=flat) From be205b57a24126ac50b627de239e040f32f80d2d Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Tue, 5 Jul 2022 11:26:37 +0300 Subject: [PATCH 10/11] More tests --- .../ReportPortalLog4j2AppenderTest.java | 73 ++++++++++++++----- 1 file changed, 56 insertions(+), 17 deletions(-) diff --git a/src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2AppenderTest.java b/src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2AppenderTest.java index 0e349b2..b188f85 100644 --- a/src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2AppenderTest.java +++ b/src/test/java/com/epam/ta/reportportal/log4j/appender/ReportPortalLog4j2AppenderTest.java @@ -1,11 +1,13 @@ package com.epam.ta.reportportal.log4j.appender; +import com.epam.reportportal.message.ReportPortalMessage; import com.epam.reportportal.service.Launch; import com.epam.reportportal.service.LoggingContext; import com.epam.reportportal.service.ReportPortalClient; import com.epam.reportportal.service.logs.LoggingSubscriber; import com.epam.reportportal.util.test.CommonUtils; import com.epam.ta.reportportal.ws.model.BatchSaveOperatingRS; +import com.google.common.io.ByteSource; import io.reactivex.Maybe; import io.reactivex.Scheduler; import io.reactivex.schedulers.Schedulers; @@ -22,12 +24,14 @@ import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder; import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory; import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration; +import org.apache.logging.log4j.message.ObjectMessage; import org.hamcrest.Matchers; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.List; @@ -52,8 +56,7 @@ private static Logger createLoggerFor(Class clazz) { builder.setPackages("com.epam.ta.reportportal.log4j.appender"); builder.setStatusLevel(Level.DEBUG); builder.setConfigurationName("BuilderTest"); - AppenderComponentBuilder appenderBuilder = builder.newAppender( - "ReportPortalAppender", + AppenderComponentBuilder appenderBuilder = builder.newAppender("ReportPortalAppender", "ReportPortalLog4j2Appender" ); appenderBuilder.add(builder.newLayout("PatternLayout") @@ -97,8 +100,28 @@ public void test_logger_skip() { verify(client, timeout(100).times(0)).log(any(List.class)); } + @SuppressWarnings({ "unchecked" }) + private void verify_binary_logging(long contentLength) throws IOException { + ArgumentCaptor> captor = ArgumentCaptor.forClass(List.class); + verify(client).log(captor.capture()); + + List request = captor.getValue(); + assertThat(request, hasSize(2)); + + RequestBody jsonPart = request.get(0).body(); + MediaType jsonPartType = jsonPart.contentType(); + assertThat(jsonPartType, notNullValue()); + assertThat(jsonPartType.toString(), Matchers.startsWith("application/json")); + + RequestBody binaryPart = request.get(1).body(); + MediaType binaryPartType = binaryPart.contentType(); + assertThat(binaryPartType, notNullValue()); + assertThat(binaryPartType.toString(), equalTo("image/jpeg")); + assertThat(binaryPart.contentLength(), equalTo(contentLength)); + } + @Test - @SuppressWarnings({ "unchecked", "ReactiveStreamsUnusedPublisher" }) + @SuppressWarnings({ "ReactiveStreamsUnusedPublisher" }) public void test_binary_file_message_encoding() throws IOException { mockBatchLogging(client); LoggingContext.init(Maybe.just("launch_uuid"), Maybe.just("item_uuid"), client, scheduler); @@ -113,21 +136,37 @@ public void test_binary_file_message_encoding() throws IOException { } logger.info(String.format("RP_MESSAGE#FILE#%s#%s", "src/test/resources/pug/unlucky.jpg", message)); LoggingContext.complete(); - ArgumentCaptor> captor = ArgumentCaptor.forClass(List.class); - verify(client).log(captor.capture()); - - List request = captor.getValue(); - assertThat(request, hasSize(2)); + verify_binary_logging(content.length); + } - RequestBody jsonPart = request.get(0).body(); - MediaType jsonPartType = jsonPart.contentType(); - assertThat(jsonPartType, notNullValue()); - assertThat(jsonPartType.toString(), Matchers.startsWith("application/json")); + @Test + @SuppressWarnings({ "ReactiveStreamsUnusedPublisher" }) + public void test_reportportal_message_logging() throws IOException { + mockBatchLogging(client); + LoggingContext.init(Maybe.just("launch_uuid"), Maybe.just("item_uuid"), client, scheduler); + String messageText = "test message"; + Logger logger = createLoggerFor(this.getClass()); + byte[] content; + try (InputStream is = ofNullable(Thread.currentThread() + .getContextClassLoader() + .getResourceAsStream("pug/unlucky.jpg")).orElseThrow(() -> new IllegalStateException( + "Unable to find test image file"))) { + content = IOUtils.toByteArray(is); + } + ReportPortalMessage message = new ReportPortalMessage(ByteSource.wrap(content), "image/jpeg", messageText); + logger.info(new ObjectMessage(message)); + LoggingContext.complete(); + verify_binary_logging(content.length); + } - RequestBody binaryPart = request.get(1).body(); - MediaType binaryPartType = binaryPart.contentType(); - assertThat(binaryPartType, notNullValue()); - assertThat(binaryPartType.toString(), equalTo("image/jpeg")); - assertThat(binaryPart.contentLength(), equalTo((long) content.length)); + @Test + @SuppressWarnings({ "ReactiveStreamsUnusedPublisher" }) + public void test_file_logging() throws IOException { + mockBatchLogging(client); + LoggingContext.init(Maybe.just("launch_uuid"), Maybe.just("item_uuid"), client, scheduler); + Logger logger = createLoggerFor(this.getClass()); + logger.info(new ObjectMessage(new File("src/test/resources/pug/unlucky.jpg"))); + LoggingContext.complete(); + verify_binary_logging(90404L); } } From 8b93c2019331a6c3ca8e5600f2b99edb98b7b82d Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Tue, 5 Jul 2022 11:30:23 +0300 Subject: [PATCH 11/11] CHANGELOG.md update --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e195a7d..5226995 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ ### Changed - Client version updated on [5.1.11](https://github.com/reportportal/client-java/releases/tag/5.1.11), by @HardNorth - Log4j version updated on 2.17.2, by @HardNorth +### Fixed +- A bug with wrong object casting, by @jusski ## [5.1.4] ### Changed