From 979fdbce6612a60caca1b7dcd0542a7c51695f4e Mon Sep 17 00:00:00 2001 From: Bartek Florczak Date: Wed, 24 Jun 2020 16:41:51 +0200 Subject: [PATCH 001/486] fix npe in http client integration (via #454) --- .../httpclient/AllureHttpClientRequest.java | 18 +++++----- .../httpclient/AllureHttpClientTest.java | 33 +++++++++++++++++++ 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/allure-httpclient/src/main/java/io/qameta/allure/httpclient/AllureHttpClientRequest.java b/allure-httpclient/src/main/java/io/qameta/allure/httpclient/AllureHttpClientRequest.java index 51b7be410..ea4be2ee6 100644 --- a/allure-httpclient/src/main/java/io/qameta/allure/httpclient/AllureHttpClientRequest.java +++ b/allure-httpclient/src/main/java/io/qameta/allure/httpclient/AllureHttpClientRequest.java @@ -23,7 +23,6 @@ import io.qameta.allure.attachment.http.HttpRequestAttachment; import org.apache.http.HttpEntity; import org.apache.http.HttpEntityEnclosingRequest; -import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; import org.apache.http.protocol.HttpContext; @@ -45,7 +44,7 @@ public class AllureHttpClientRequest implements HttpRequestInterceptor { public AllureHttpClientRequest() { this(new FreemarkerAttachmentRenderer("http-request.ftl"), - new DefaultAttachmentProcessor() + new DefaultAttachmentProcessor() ); } @@ -57,23 +56,24 @@ public AllureHttpClientRequest(final AttachmentRenderer renderer @Override public void process(final HttpRequest request, - final HttpContext context) throws HttpException, IOException { + final HttpContext context) throws IOException { final HttpRequestAttachment.Builder builder = create("Request", request.getRequestLine().getUri()) .setMethod(request.getRequestLine().getMethod()); Stream.of(request.getAllHeaders()) - .forEach(header -> builder.setHeader(header.getName(), header.getValue())); + .forEach(header -> builder.setHeader(header.getName(), header.getValue())); if (request instanceof HttpEntityEnclosingRequest) { final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); - final ByteArrayOutputStream os = new ByteArrayOutputStream(); - entity.writeTo(os); + if (entity != null) { + final ByteArrayOutputStream os = new ByteArrayOutputStream(); + entity.writeTo(os); - final String body = new String(os.toByteArray(), StandardCharsets.UTF_8); - builder.setBody(body); + final String body = new String(os.toByteArray(), StandardCharsets.UTF_8); + builder.setBody(body); + } } - final HttpRequestAttachment requestAttachment = builder.build(); processor.addAttachment(requestAttachment, renderer); } diff --git a/allure-httpclient/src/test/java/io/qameta/allure/httpclient/AllureHttpClientTest.java b/allure-httpclient/src/test/java/io/qameta/allure/httpclient/AllureHttpClientTest.java index fbbf67ba8..c974fbc7d 100644 --- a/allure-httpclient/src/test/java/io/qameta/allure/httpclient/AllureHttpClientTest.java +++ b/allure-httpclient/src/test/java/io/qameta/allure/httpclient/AllureHttpClientTest.java @@ -20,6 +20,7 @@ import io.qameta.allure.attachment.AttachmentProcessor; import io.qameta.allure.attachment.AttachmentRenderer; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; @@ -33,7 +34,9 @@ import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.delete; import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.noContent; import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; @@ -65,6 +68,9 @@ void setUp() { stubFor(get(urlEqualTo("/empty")) .willReturn(aResponse() .withStatus(304))); + + stubFor(delete(urlEqualTo("/hello")) + .willReturn(noContent())); } @AfterEach @@ -155,4 +161,31 @@ void shouldCreateResponseAttachmentWithEmptyBody() throws Exception { .extracting("body") .containsExactly("No body present"); } + + @SuppressWarnings("unchecked") + @Test + void shouldCreateRequestAttachmentWithEmptyBodyWhenNoContentIsReturned() throws Exception { + final AttachmentRenderer renderer = mock(AttachmentRenderer.class); + final AttachmentProcessor processor = mock(AttachmentProcessor.class); + + final HttpClientBuilder builder = HttpClientBuilder.create() + .addInterceptorLast(new AllureHttpClientRequest(renderer, processor)); + + try (CloseableHttpClient httpClient = builder.build()) { + final HttpDelete httpDelete = new HttpDelete(String.format("http://localhost:%d/hello", server.port())); + try (CloseableHttpResponse response = httpClient.execute(httpDelete)) { + assertThat(response.getEntity()) + .isEqualTo(null); + } + } + + final ArgumentCaptor captor = ArgumentCaptor.forClass(AttachmentData.class); + verify(processor, times(1)) + .addAttachment(captor.capture(), eq(renderer)); + + assertThat(captor.getAllValues()) + .hasSize(1) + .extracting("body") + .containsNull(); + } } From e24a40c2ec01be9050541d61fc6ac2be0f79013c Mon Sep 17 00:00:00 2001 From: Bartek Florczak Date: Wed, 24 Jun 2020 19:18:08 +0200 Subject: [PATCH 002/486] add method name and request url to the attachment name for http client integration (via #455) --- .../allure/httpclient/AllureHttpClientRequest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/allure-httpclient/src/main/java/io/qameta/allure/httpclient/AllureHttpClientRequest.java b/allure-httpclient/src/main/java/io/qameta/allure/httpclient/AllureHttpClientRequest.java index ea4be2ee6..5dc0fdd9e 100644 --- a/allure-httpclient/src/main/java/io/qameta/allure/httpclient/AllureHttpClientRequest.java +++ b/allure-httpclient/src/main/java/io/qameta/allure/httpclient/AllureHttpClientRequest.java @@ -54,10 +54,17 @@ public AllureHttpClientRequest(final AttachmentRenderer renderer this.processor = processor; } + private static String getAttachmentName(final HttpRequest request) { + return String.format("Request_%s_%s", request.getRequestLine().getMethod(), + request.getRequestLine().getUri()); + } + @Override public void process(final HttpRequest request, final HttpContext context) throws IOException { - final HttpRequestAttachment.Builder builder = create("Request", request.getRequestLine().getUri()) + + final HttpRequestAttachment.Builder builder = create(getAttachmentName(request), + request.getRequestLine().getUri()) .setMethod(request.getRequestLine().getMethod()); Stream.of(request.getAllHeaders()) From b7e516a0a1a9a178de97e8f943c50b26fa38bbfa Mon Sep 17 00:00:00 2001 From: 10koteyka01 Date: Tue, 30 Jun 2020 16:25:24 +0700 Subject: [PATCH 003/486] bump selenide version (via #451) --- allure-selenide/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allure-selenide/build.gradle.kts b/allure-selenide/build.gradle.kts index 6473dcf2d..1cbf9732f 100644 --- a/allure-selenide/build.gradle.kts +++ b/allure-selenide/build.gradle.kts @@ -2,7 +2,7 @@ description = "Allure Selenide Integration" val agent: Configuration by configurations.creating -val selenideVersion = "5.11.0" +val selenideVersion = "5.12.2" dependencies { agent("org.aspectj:aspectjweaver") From 1b1f8e1b19034f0dfbde19d40eb0d0a067639475 Mon Sep 17 00:00:00 2001 From: QametaCI Date: Tue, 7 Jul 2020 10:36:17 +0000 Subject: [PATCH 004/486] [Gradle Release Plugin] - pre tag commit: '2.13.5'. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index fe032911a..802ad6a3b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ -version=2.13.4-SNAPSHOT +version=2.13.5 org.gradle.daemon=true org.gradle.parallel=true \ No newline at end of file From b600f7b1d9fbbf81a8efa1f072d0af218530eb46 Mon Sep 17 00:00:00 2001 From: QametaCI Date: Tue, 7 Jul 2020 10:36:26 +0000 Subject: [PATCH 005/486] [Gradle Release Plugin] - new version commit: '2.14-SNAPSHOT'. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 802ad6a3b..1491bba12 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ -version=2.13.5 +version=2.14-SNAPSHOT org.gradle.daemon=true org.gradle.parallel=true \ No newline at end of file From 39b8ca078bfc1f52dac8786d6c2111ab4887887b Mon Sep 17 00:00:00 2001 From: Andrey K Date: Tue, 18 Aug 2020 16:15:22 +0200 Subject: [PATCH 006/486] add readme for junit5 assert module (via #459) --- allure-junit5-assert/README.MD | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 allure-junit5-assert/README.MD diff --git a/allure-junit5-assert/README.MD b/allure-junit5-assert/README.MD new file mode 100644 index 000000000..5124d63c9 --- /dev/null +++ b/allure-junit5-assert/README.MD @@ -0,0 +1,21 @@ +Adding JUnit5-assert may lead to java.lang.OutOfMemoryError: Java heap space + +Having a huge class path may lead to OOM, because AspectJ processes all the classes. [Link to documentation](https://www.eclipse.org/aspectj/doc/released/devguide/ltw.html) + +You can configure AspectJ to only process required classes +* a) package io.qameta.allure -> to process Allure classes +* b) package org.junit -> to process JUnit classes +* c) package com.company -> to process your test classes + +Link to documentation https://www.eclipse.org/aspectj/doc/released/devguide/ltw-configuration.html#configuring-load-time-weaving-with-aopxml-files + +In order to avoid this issue add aop.xml into `resources/META-INF/` folder. + +``` + + + + + + +``` From ea4ab0fc711bf010df440f128c0b81234b850334 Mon Sep 17 00:00:00 2001 From: Dmitry Baev Date: Mon, 14 Sep 2020 18:42:55 +0300 Subject: [PATCH 007/486] bump deps (via #471) --- .../allure/assertj/AllureAspectJTest.java | 2 +- .../src/main/resources/META-INF/aop-ajc.xml | 3 +- .../src/main/resources/META-INF/aop-ajc.xml | 3 +- .../src/main/resources/META-INF/aop-ajc.xml | 3 +- .../cucumber5jvm/AllureCucumber5Jvm.java | 52 ++++++-- .../testsourcemodel/TestSourcesModel.java | 15 +++ .../TestSourcesModelProxy.java | 1 - .../httpclient/AllureHttpClientTest.java | 1 - allure-java-commons-test/build.gradle.kts | 2 + .../java/io/qameta/allure/test/TestData.java | 41 +++++++ .../test/ThreadLocalEnhancedRandom.java | 37 ++++++ allure-java-commons/build.gradle.kts | 1 + .../io/qameta/allure/AllureLifecycleTest.java | 66 ++++++----- .../java/io/qameta/allure/AllureTest.java | 25 ++-- .../allure/FileSystemResultsWriterTest.java | 6 +- .../src/test/resources/META-INF/aop-ajc.xml | 3 +- .../src/main/resources/META-INF/aop-ajc.xml | 2 +- allure-junit-platform/build.gradle.kts | 1 + .../src/main/resources/META-INF/aop-ajc.xml | 3 +- .../AllureJunitPlatformTest.java | 8 +- .../src/main/resources/META-INF/aop.xml | 1 + .../src/main/resources/META-INF/aop-ajc.xml | 1 + .../junit5assert/AllureJunit5AssertTest.java | 1 - .../io/qameta/allure/junit5/AllureJunit5.java | 15 +++ .../allure/junit5/AllureJunit5Test.java | 17 ++- .../AfterEachFixtureFailureSupport.java | 15 +++ .../junit5/features/AllFixtureSupport.java | 15 +++ .../BeforeEachFixtureFailureSupport.java | 16 ++- .../junit5/features/EachFixtureSupport.java | 15 +++ .../src/main/resources/META-INF/aop-ajc.xml | 3 +- .../src/main/resources/META-INF/aop-ajc.xml | 1 + allure-testng/build.gradle.kts | 1 + .../src/main/resources/META-INF/aop-ajc.xml | 3 +- .../allure/testng/AllureTestNgTest.java | 9 +- .../test/resources/suites/all-features.xml | 2 +- .../src/test/resources/suites/attachments.xml | 2 +- .../test/resources/suites/bdd-annotations.xml | 2 +- .../src/test/resources/suites/broken.xml | 2 +- .../resources/suites/brokenWithoutMessage.xml | 2 +- .../suites/descriptions-test-two-classes.xml | 2 +- .../resources/suites/descriptions-test.xml | 2 +- .../suites/failed-after-method-fixture.xml | 2 +- .../suites/failed-after-suite-fixture.xml | 2 +- .../suites/failed-after-test-fixture.xml | 2 +- .../suites/failed-before-method-fixture.xml | 2 +- .../suites/failed-before-suite-fixture.xml | 2 +- .../suites/failed-before-test-fixture.xml | 2 +- .../suites/failed-test-passed-fixture.xml | 2 +- .../resources/suites/failing-by-assertion.xml | 2 +- .../src/test/resources/suites/flaky.xml | 2 +- .../src/test/resources/suites/gh-101.xml | 2 +- .../src/test/resources/suites/gh-102.xml | 2 +- .../src/test/resources/suites/gh-106.xml | 2 +- .../src/test/resources/suites/gh-128.xml | 2 +- .../src/test/resources/suites/gh-129.xml | 2 +- .../src/test/resources/suites/gh-135.xml | 2 +- .../src/test/resources/suites/gh-141.xml | 2 +- .../src/test/resources/suites/gh-219.xml | 2 +- .../src/test/resources/suites/gh-304.xml | 2 +- .../src/test/resources/suites/gh-42.xml | 2 +- .../src/test/resources/suites/gh-49.xml | 2 +- .../src/test/resources/suites/gh-97.xml | 2 +- .../src/test/resources/suites/gh-99.xml | 2 +- .../suites/history-id-parameters.xml | 2 +- .../resources/suites/history-id-the-same.xml | 2 +- .../src/test/resources/suites/links.xml | 2 +- .../src/test/resources/suites/muted.xml | 2 +- .../test/resources/suites/nested-steps.xml | 2 +- .../src/test/resources/suites/owner.xml | 2 +- .../suites/parallel-data-provider.xml | 2 +- .../resources/suites/parallel-methods.xml | 2 +- .../resources/suites/parameterized-suite1.xml | 2 +- .../resources/suites/parameterized-suite2.xml | 2 +- .../resources/suites/parameterized-test.xml | 2 +- .../suites/per-class-fixtures-combination.xml | 2 +- .../per-method-fixtures-combination.xml | 2 +- .../suites/per-suite-fixtures-combination.xml | 2 +- .../per-test-tag-fixtures-combination.xml | 2 +- .../src/test/resources/suites/retry.xml | 2 +- .../src/test/resources/suites/severity.xml | 2 +- .../src/test/resources/suites/single-test.xml | 2 +- .../test/resources/suites/skipped-suite.xml | 2 +- .../resources/suites/tests-with-timeout.xml | 2 +- allure-testng/src/test/resources/testng.xml | 2 +- build.gradle.kts | 112 +++++++++--------- gradle.properties | 6 +- .../quality-configs/checkstyle/checkstyle.xml | 7 +- gradle/quality-configs/pmd/pmd.xml | 4 +- gradle/wrapper/gradle-wrapper.jar | Bin 55616 -> 58694 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 51 ++++---- gradlew.bat | 21 +++- 92 files changed, 481 insertions(+), 210 deletions(-) create mode 100644 allure-java-commons-test/src/main/java/io/qameta/allure/test/TestData.java create mode 100644 allure-java-commons-test/src/main/java/io/qameta/allure/test/ThreadLocalEnhancedRandom.java diff --git a/allure-assertj/src/test/java/io/qameta/allure/assertj/AllureAspectJTest.java b/allure-assertj/src/test/java/io/qameta/allure/assertj/AllureAspectJTest.java index 7a48210c8..a4c311e29 100644 --- a/allure-assertj/src/test/java/io/qameta/allure/assertj/AllureAspectJTest.java +++ b/allure-assertj/src/test/java/io/qameta/allure/assertj/AllureAspectJTest.java @@ -82,7 +82,7 @@ void shouldHandleByteArrayObject() { .extracting(StepResult::getName) .containsExactly( "assertThat ''", - "as 'Byte array object []'", + "describedAs 'Byte array object'", "isEqualTo ''" ); } diff --git a/allure-cucumber-jvm/src/main/resources/META-INF/aop-ajc.xml b/allure-cucumber-jvm/src/main/resources/META-INF/aop-ajc.xml index a980b7a2d..09e38300c 100644 --- a/allure-cucumber-jvm/src/main/resources/META-INF/aop-ajc.xml +++ b/allure-cucumber-jvm/src/main/resources/META-INF/aop-ajc.xml @@ -1,6 +1,7 @@ + - \ No newline at end of file + diff --git a/allure-cucumber2-jvm/src/main/resources/META-INF/aop-ajc.xml b/allure-cucumber2-jvm/src/main/resources/META-INF/aop-ajc.xml index a980b7a2d..09e38300c 100644 --- a/allure-cucumber2-jvm/src/main/resources/META-INF/aop-ajc.xml +++ b/allure-cucumber2-jvm/src/main/resources/META-INF/aop-ajc.xml @@ -1,6 +1,7 @@ + - \ No newline at end of file + diff --git a/allure-cucumber3-jvm/src/main/resources/META-INF/aop-ajc.xml b/allure-cucumber3-jvm/src/main/resources/META-INF/aop-ajc.xml index a980b7a2d..09e38300c 100644 --- a/allure-cucumber3-jvm/src/main/resources/META-INF/aop-ajc.xml +++ b/allure-cucumber3-jvm/src/main/resources/META-INF/aop-ajc.xml @@ -1,6 +1,7 @@ + - \ No newline at end of file + diff --git a/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/AllureCucumber5Jvm.java b/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/AllureCucumber5Jvm.java index 932e0df7a..724e058db 100644 --- a/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/AllureCucumber5Jvm.java +++ b/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/AllureCucumber5Jvm.java @@ -15,33 +15,67 @@ */ package io.qameta.allure.cucumber5jvm; - -import gherkin.ast.*; -import io.qameta.allure.cucumber5jvm.testsourcemodel.TestSourcesModelProxy; +import gherkin.ast.Examples; +import gherkin.ast.Feature; +import gherkin.ast.ScenarioDefinition; +import gherkin.ast.ScenarioOutline; +import gherkin.ast.TableRow; import io.cucumber.plugin.ConcurrentEventListener; -import io.cucumber.plugin.event.*; +import io.cucumber.plugin.event.DataTableArgument; +import io.cucumber.plugin.event.EmbedEvent; +import io.cucumber.plugin.event.EventHandler; +import io.cucumber.plugin.event.EventPublisher; +import io.cucumber.plugin.event.HookTestStep; +import io.cucumber.plugin.event.HookType; +import io.cucumber.plugin.event.PickleStepTestStep; +import io.cucumber.plugin.event.Result; +import io.cucumber.plugin.event.StepArgument; +import io.cucumber.plugin.event.TestCase; +import io.cucumber.plugin.event.TestCaseFinished; +import io.cucumber.plugin.event.TestCaseStarted; +import io.cucumber.plugin.event.TestSourceRead; +import io.cucumber.plugin.event.TestStepFinished; +import io.cucumber.plugin.event.TestStepStarted; +import io.cucumber.plugin.event.WriteEvent; import io.qameta.allure.Allure; import io.qameta.allure.AllureLifecycle; -import io.qameta.allure.model.*; +import io.qameta.allure.cucumber5jvm.testsourcemodel.TestSourcesModelProxy; +import io.qameta.allure.model.FixtureResult; +import io.qameta.allure.model.Parameter; import io.qameta.allure.model.Status; +import io.qameta.allure.model.StatusDetails; +import io.qameta.allure.model.StepResult; +import io.qameta.allure.model.TestResult; +import io.qameta.allure.model.TestResultContainer; import java.io.ByteArrayInputStream; import java.net.URI; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.Collections; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; -import static io.qameta.allure.util.ResultsUtils.*; +import static io.qameta.allure.util.ResultsUtils.createParameter; +import static io.qameta.allure.util.ResultsUtils.getStatus; +import static io.qameta.allure.util.ResultsUtils.getStatusDetails; +import static io.qameta.allure.util.ResultsUtils.md5; /** * Allure plugin for Cucumber JVM 5.0. */ @SuppressWarnings({ + "ClassDataAbstractionCoupling", + "ClassFanOutComplexity", "PMD.ExcessiveImports", - "ClassFanOutComplexity", "ClassDataAbstractionCoupling" + "PMD.GodClass", }) public class AllureCucumber5Jvm implements ConcurrentEventListener { @@ -291,7 +325,7 @@ private List getExamplesAsParameters( private void createDataTableAttachment(final DataTableArgument dataTableArgument) { final List> rowsInTable = dataTableArgument.cells(); final StringBuilder dataTableCsv = new StringBuilder(); - for (List columns:rowsInTable) { + for (List columns : rowsInTable) { if (!columns.isEmpty()) { for (int i = 0; i < columns.size(); i++) { if (i == columns.size() - 1) { diff --git a/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/testsourcemodel/TestSourcesModel.java b/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/testsourcemodel/TestSourcesModel.java index 94057e3a6..6ffda30d3 100644 --- a/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/testsourcemodel/TestSourcesModel.java +++ b/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/testsourcemodel/TestSourcesModel.java @@ -1,3 +1,18 @@ +/* + * Copyright 2020 Qameta Software OÜ + * + * 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. + */ package io.qameta.allure.cucumber5jvm.testsourcemodel; import gherkin.AstBuilder; diff --git a/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/testsourcemodel/TestSourcesModelProxy.java b/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/testsourcemodel/TestSourcesModelProxy.java index 084b7bd4b..46937911c 100644 --- a/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/testsourcemodel/TestSourcesModelProxy.java +++ b/allure-cucumber5-jvm/src/main/java/io/qameta/allure/cucumber5jvm/testsourcemodel/TestSourcesModelProxy.java @@ -25,7 +25,6 @@ import java.util.HashMap; import java.util.Map; - public class TestSourcesModelProxy { private final Map pathToReadEventMap = new HashMap<>(); diff --git a/allure-httpclient/src/test/java/io/qameta/allure/httpclient/AllureHttpClientTest.java b/allure-httpclient/src/test/java/io/qameta/allure/httpclient/AllureHttpClientTest.java index c974fbc7d..366458e4a 100644 --- a/allure-httpclient/src/test/java/io/qameta/allure/httpclient/AllureHttpClientTest.java +++ b/allure-httpclient/src/test/java/io/qameta/allure/httpclient/AllureHttpClientTest.java @@ -162,7 +162,6 @@ void shouldCreateResponseAttachmentWithEmptyBody() throws Exception { .containsExactly("No body present"); } - @SuppressWarnings("unchecked") @Test void shouldCreateRequestAttachmentWithEmptyBodyWhenNoContentIsReturned() throws Exception { final AttachmentRenderer renderer = mock(AttachmentRenderer.class); diff --git a/allure-java-commons-test/build.gradle.kts b/allure-java-commons-test/build.gradle.kts index 3141a7a13..ea06623dc 100644 --- a/allure-java-commons-test/build.gradle.kts +++ b/allure-java-commons-test/build.gradle.kts @@ -2,6 +2,8 @@ description = "Allure Java Commons Test Utils" dependencies { api("commons-io:commons-io") + api("io.github.benas:random-beans") + api("org.apache.commons:commons-lang3") api(project(":allure-java-commons")) } diff --git a/allure-java-commons-test/src/main/java/io/qameta/allure/test/TestData.java b/allure-java-commons-test/src/main/java/io/qameta/allure/test/TestData.java new file mode 100644 index 000000000..3748458f8 --- /dev/null +++ b/allure-java-commons-test/src/main/java/io/qameta/allure/test/TestData.java @@ -0,0 +1,41 @@ +/* + * Copyright 2020 Qameta Software OÜ + * + * 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. + */ +package io.qameta.allure.test; + +import org.apache.commons.lang3.RandomStringUtils; + +/** + * @author charlie (Dmitry Baev). + */ +public final class TestData { + + private TestData() { + throw new IllegalStateException("do not instance"); + } + + public static String randomName() { + return RandomStringUtils.randomAlphabetic(10); + } + + public static String randomId() { + return randomString(10); + } + + public static String randomString(final int count) { + return RandomStringUtils.randomAlphanumeric(count); + } + +} diff --git a/allure-java-commons-test/src/main/java/io/qameta/allure/test/ThreadLocalEnhancedRandom.java b/allure-java-commons-test/src/main/java/io/qameta/allure/test/ThreadLocalEnhancedRandom.java new file mode 100644 index 000000000..d0be47326 --- /dev/null +++ b/allure-java-commons-test/src/main/java/io/qameta/allure/test/ThreadLocalEnhancedRandom.java @@ -0,0 +1,37 @@ +/* + * Copyright 2020 Qameta Software OÜ + * + * 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. + */ +package io.qameta.allure.test; + +import io.github.benas.randombeans.EnhancedRandomBuilder; +import io.github.benas.randombeans.api.EnhancedRandom; + +/** + * @author charlie (Dmitry Baev). + */ +public final class ThreadLocalEnhancedRandom { + + private static final ThreadLocal INSTANCE = ThreadLocal + .withInitial(EnhancedRandomBuilder::aNewEnhancedRandom); + + private ThreadLocalEnhancedRandom() { + throw new IllegalStateException("do not instance"); + } + + public static EnhancedRandom current() { + return INSTANCE.get(); + } + +} diff --git a/allure-java-commons/build.gradle.kts b/allure-java-commons/build.gradle.kts index 6886a31f5..3d2000b20 100644 --- a/allure-java-commons/build.gradle.kts +++ b/allure-java-commons/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { implementation("org.jooq:joor-java-8") testImplementation("io.github.benas:random-beans") testImplementation("io.github.glytching:junit-extensions") + testImplementation("org.apache.commons:commons-lang3") testImplementation("org.assertj:assertj-core") testImplementation("org.junit.jupiter:junit-jupiter-api") testImplementation("org.junit.jupiter:junit-jupiter-params") diff --git a/allure-java-commons/src/test/java/io/qameta/allure/AllureLifecycleTest.java b/allure-java-commons/src/test/java/io/qameta/allure/AllureLifecycleTest.java index 4d86ddc06..35ea19d86 100644 --- a/allure-java-commons/src/test/java/io/qameta/allure/AllureLifecycleTest.java +++ b/allure-java-commons/src/test/java/io/qameta/allure/AllureLifecycleTest.java @@ -45,9 +45,11 @@ import java.util.function.Supplier; import java.util.stream.Collectors; -import static io.github.benas.randombeans.api.EnhancedRandom.random; import static io.qameta.allure.Allure.addStreamAttachmentAsync; import static io.qameta.allure.Allure.setLifecycle; +import static io.qameta.allure.test.TestData.randomId; +import static io.qameta.allure.test.TestData.randomName; +import static io.qameta.allure.test.TestData.randomString; import static java.util.concurrent.CompletableFuture.allOf; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; @@ -71,8 +73,8 @@ public void setUp() { @Test void shouldCreateTest() { - final String uuid = random(String.class); - final String name = random(String.class); + final String uuid = randomId(); + final String name = randomName(); final TestResult result = new TestResult().setUuid(uuid).setName(name); lifecycle.scheduleTestCase(result); lifecycle.startTestCase(uuid); @@ -90,8 +92,8 @@ void shouldCreateTest() { @Test void shouldCreateTestContainer() { - final String uuid = random(String.class); - final String name = random(String.class); + final String uuid = randomId(); + final String name = randomName(); final TestResultContainer container = new TestResultContainer() .setUuid(uuid) .setName(name); @@ -111,15 +113,15 @@ void shouldCreateTestContainer() { @Test void shouldCreateChildTestContainer() { - final String parentUuid = random(String.class); - final String parentName = random(String.class); + final String parentUuid = randomId(); + final String parentName = randomName(); final TestResultContainer parent = new TestResultContainer() .setUuid(parentUuid) .setName(parentName); lifecycle.startTestContainer(parent); - final String childUuid = random(String.class); - final String childName = random(String.class); + final String childUuid = randomId(); + final String childName = randomName(); final TestResultContainer container = new TestResultContainer() .setUuid(childUuid) .setName(childName); @@ -155,8 +157,8 @@ void shouldCreateChildTestContainer() { @Test void shouldAddStepsToTests() { - final String uuid = random(String.class); - final String name = random(String.class); + final String uuid = randomId(); + final String name = randomName(); final TestResult result = new TestResult().setUuid(uuid).setName(name); lifecycle.scheduleTestCase(result); lifecycle.startTestCase(uuid); @@ -183,21 +185,21 @@ void shouldAddStepsToTests() { @Test void shouldUpdateTest() { - final String uuid = random(String.class); - final String name = random(String.class); + final String uuid = randomId(); + final String name = randomName(); final TestResult result = new TestResult().setUuid(uuid).setName(name); lifecycle.scheduleTestCase(result); lifecycle.startTestCase(uuid); - final String stepUuid = random(String.class); - final String stepName = random(String.class); + final String stepUuid = randomId(); + final String stepName = randomName(); final StepResult step = new StepResult().setName(stepName); lifecycle.startStep(uuid, stepUuid, step); - final String description = random(String.class); - final String fullName = random(String.class); + final String description = randomName(); + final String fullName = randomName(); lifecycle.updateTestCase(uuid, testResult -> testResult.setDescription(description)); lifecycle.updateTestCase(testResult -> testResult.setFullName(fullName)); @@ -225,9 +227,9 @@ void shouldUpdateTest() { @Test void shouldUpdateContainer() { - final String uuid = random(String.class); - final String name = random(String.class); - final String newName = random(String.class); + final String uuid = randomId(); + final String name = randomName(); + final String newName = randomName(); final TestResultContainer container = new TestResultContainer() .setUuid(uuid) @@ -249,16 +251,16 @@ void shouldUpdateContainer() { @Test void shouldCreateTestFixture() { - final String uuid = random(String.class); - final String name = random(String.class); + final String uuid = randomId(); + final String name = randomName(); TestResultContainer container = new TestResultContainer() .setUuid(uuid) .setName(name); lifecycle.startTestContainer(container); - final String firstUuid = random(String.class); - final String firstName = random(String.class); + final String firstUuid = randomId(); + final String firstName = randomName(); final FixtureResult first = new FixtureResult().setName(firstName); lifecycle.startPrepareFixture(uuid, firstUuid, first); @@ -309,11 +311,11 @@ void shouldAttachAsync() { lifecycle.scheduleTestCase(result); lifecycle.startTestCase(uuid); - final String attachment1Content = random(String.class); - final String attachment2Content = random(String.class); + final String attachment1Content = randomString(100); + final String attachment2Content = randomString(100); - final String attachment1Name = random(String.class); - final String attachment2Name = random(String.class); + final String attachment1Name = randomName(); + final String attachment2Name = randomName(); features.add(addStreamAttachmentAsync( attachment1Name, "video/mp4", getStreamWithTimeout(2, attachment1Content))); @@ -381,8 +383,8 @@ private Supplier getStreamWithTimeout(final long delay, final Strin @Test void supportForConcurrentUseOfChildThreads() throws Exception { - final String uuid = random(String.class); - final String name = random(String.class); + final String uuid = randomId(); + final String name = randomName(); final int threads = 20; final int stepsCount = 1000; @@ -446,8 +448,8 @@ void supportForConcurrentUseOfChildThreads() throws Exception { } private String randomStep(String parentUuid) { - final String uuid = random(String.class); - final String name = random(String.class); + final String uuid = randomId(); + final String name = randomName(); final StepResult step = new StepResult().setName(name); lifecycle.startStep(parentUuid, uuid, step); lifecycle.stopStep(uuid); diff --git a/allure-java-commons/src/test/java/io/qameta/allure/AllureTest.java b/allure-java-commons/src/test/java/io/qameta/allure/AllureTest.java index 53c2f81bd..ac7dbccc9 100644 --- a/allure-java-commons/src/test/java/io/qameta/allure/AllureTest.java +++ b/allure-java-commons/src/test/java/io/qameta/allure/AllureTest.java @@ -29,7 +29,6 @@ import java.util.Collections; import java.util.List; -import static io.github.benas.randombeans.api.EnhancedRandom.random; import static io.qameta.allure.Allure.attachment; import static io.qameta.allure.Allure.description; import static io.qameta.allure.Allure.descriptionHtml; @@ -43,6 +42,8 @@ import static io.qameta.allure.Allure.step; import static io.qameta.allure.Allure.tms; import static io.qameta.allure.test.RunUtils.runWithinTestContext; +import static io.qameta.allure.test.TestData.randomName; +import static io.qameta.allure.test.ThreadLocalEnhancedRandom.current; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -140,9 +141,9 @@ void shouldHideCheckedExceptions() { @Test void shouldAddLabels() { - final Label first = random(Label.class); - final Label second = random(Label.class); - final Label third = random(Label.class); + final Label first = current().nextObject(Label.class); + final Label second = current().nextObject(Label.class); + final Label third = current().nextObject(Label.class); final AllureResults results = runWithinTestContext( () -> getLifecycle().updateTestCase(testResult -> testResult.getLabels().addAll(asList(first, second, third))), @@ -156,9 +157,9 @@ void shouldAddLabels() { @Test void shouldAddParameter() { - final Parameter first = random(Parameter.class); - final Parameter second = random(Parameter.class); - final Parameter third = random(Parameter.class); + final Parameter first = current().nextObject(Parameter.class); + final Parameter second = current().nextObject(Parameter.class); + final Parameter third = current().nextObject(Parameter.class); final AllureResults results = runWithinTestContext( () -> { @@ -181,9 +182,9 @@ void shouldAddParameter() { @Test void shouldAddLinks() { - final io.qameta.allure.model.Link first = random(Link.class); - final io.qameta.allure.model.Link second = random(Link.class); - final io.qameta.allure.model.Link third = random(Link.class); + final io.qameta.allure.model.Link first = current().nextObject(Link.class); + final io.qameta.allure.model.Link second = current().nextObject(Link.class); + final io.qameta.allure.model.Link third = current().nextObject(Link.class); final AllureResults results = runWithinTestContext( () -> { @@ -206,7 +207,7 @@ void shouldAddLinks() { @Test void shouldAddDescription() { - final String description = random(String.class); + final String description = randomName(); final AllureResults results = runWithinTestContext( () -> description(description), @@ -220,7 +221,7 @@ void shouldAddDescription() { @Test void shouldAddDescriptionHtml() { - final String descriptionHtml = random(String.class); + final String descriptionHtml = randomName(); final AllureResults results = runWithinTestContext( () -> descriptionHtml(descriptionHtml), diff --git a/allure-java-commons/src/test/java/io/qameta/allure/FileSystemResultsWriterTest.java b/allure-java-commons/src/test/java/io/qameta/allure/FileSystemResultsWriterTest.java index 667f17285..9c0b103c6 100644 --- a/allure-java-commons/src/test/java/io/qameta/allure/FileSystemResultsWriterTest.java +++ b/allure-java-commons/src/test/java/io/qameta/allure/FileSystemResultsWriterTest.java @@ -22,8 +22,8 @@ import java.nio.file.Path; import java.util.UUID; -import static io.github.benas.randombeans.api.EnhancedRandom.random; import static io.qameta.allure.FileSystemResultsWriter.generateTestResultName; +import static io.qameta.allure.test.ThreadLocalEnhancedRandom.current; import static org.assertj.core.api.Assertions.assertThat; /** @@ -35,7 +35,7 @@ public class FileSystemResultsWriterTest { void shouldNotFailIfNoResultsDirectory(@TempDir final Path folder) { Path resolve = folder.resolve("some-directory"); FileSystemResultsWriter writer = new FileSystemResultsWriter(resolve); - final TestResult testResult = random(TestResult.class, "steps"); + final TestResult testResult = current().nextObject(TestResult.class, "steps"); writer.write(testResult); } @@ -43,7 +43,7 @@ void shouldNotFailIfNoResultsDirectory(@TempDir final Path folder) { void shouldWriteTestResult(@TempDir final Path folder) { FileSystemResultsWriter writer = new FileSystemResultsWriter(folder); final String uuid = UUID.randomUUID().toString(); - final TestResult testResult = random(TestResult.class, "steps").setUuid(uuid); + final TestResult testResult = current().nextObject(TestResult.class, "steps").setUuid(uuid); writer.write(testResult); final String fileName = generateTestResultName(uuid); diff --git a/allure-java-commons/src/test/resources/META-INF/aop-ajc.xml b/allure-java-commons/src/test/resources/META-INF/aop-ajc.xml index a980b7a2d..09e38300c 100644 --- a/allure-java-commons/src/test/resources/META-INF/aop-ajc.xml +++ b/allure-java-commons/src/test/resources/META-INF/aop-ajc.xml @@ -1,6 +1,7 @@ + - \ No newline at end of file + diff --git a/allure-java-migration/src/main/resources/META-INF/aop-ajc.xml b/allure-java-migration/src/main/resources/META-INF/aop-ajc.xml index 6c013660f..cd3df04f5 100644 --- a/allure-java-migration/src/main/resources/META-INF/aop-ajc.xml +++ b/allure-java-migration/src/main/resources/META-INF/aop-ajc.xml @@ -1,9 +1,9 @@ + - diff --git a/allure-junit-platform/build.gradle.kts b/allure-junit-platform/build.gradle.kts index 2cf696e6f..82528cfc2 100644 --- a/allure-junit-platform/build.gradle.kts +++ b/allure-junit-platform/build.gradle.kts @@ -7,6 +7,7 @@ dependencies { api(project(":allure-java-commons")) implementation("org.junit.jupiter:junit-jupiter-api") implementation("org.junit.platform:junit-platform-launcher") + testAnnotationProcessor("org.slf4j:slf4j-simple") testAnnotationProcessor(project(":allure-descriptions-javadoc")) testImplementation("io.github.glytching:junit-extensions") testImplementation("org.assertj:assertj-core") diff --git a/allure-junit-platform/src/main/resources/META-INF/aop-ajc.xml b/allure-junit-platform/src/main/resources/META-INF/aop-ajc.xml index a980b7a2d..09e38300c 100644 --- a/allure-junit-platform/src/main/resources/META-INF/aop-ajc.xml +++ b/allure-junit-platform/src/main/resources/META-INF/aop-ajc.xml @@ -1,6 +1,7 @@ + - \ No newline at end of file + diff --git a/allure-junit-platform/src/test/java/io/qameta/allure/junitplatform/AllureJunitPlatformTest.java b/allure-junit-platform/src/test/java/io/qameta/allure/junitplatform/AllureJunitPlatformTest.java index f81c299e0..e9f010f9a 100644 --- a/allure-junit-platform/src/test/java/io/qameta/allure/junitplatform/AllureJunitPlatformTest.java +++ b/allure-junit-platform/src/test/java/io/qameta/allure/junitplatform/AllureJunitPlatformTest.java @@ -220,9 +220,9 @@ void shouldProcessBrokenInAfterAllTests() { tr -> Optional.of(tr).map(TestResult::getStatusDetails).map(StatusDetails::getMessage).orElse(null)) .containsExactlyInAnyOrder( tuple("BrokenInAfterAllTests", Status.BROKEN, "Exception in @AfterAll"), - tuple("[1] a", Status.PASSED, null), - tuple("[2] b", Status.PASSED, null), - tuple("[3] c", Status.PASSED, null), + tuple("[1] value=a", Status.PASSED, null), + tuple("[2] value=b", Status.PASSED, null), + tuple("[3] value=c", Status.PASSED, null), tuple("test1()", Status.PASSED, null), tuple("test2()", Status.PASSED, null) ); @@ -334,7 +334,7 @@ void shouldProcessParametrisedTests() { .hasSize(2) .filteredOn(hasStatus(Status.PASSED)) .flatExtracting(TestResult::getName) - .containsExactlyInAnyOrder("[1] Hello", "[2] World"); + .containsExactlyInAnyOrder("[1] argument=Hello", "[2] argument=World"); } @Test diff --git a/allure-junit4-aspect/src/main/resources/META-INF/aop.xml b/allure-junit4-aspect/src/main/resources/META-INF/aop.xml index fa1632bca..95f3e6a10 100644 --- a/allure-junit4-aspect/src/main/resources/META-INF/aop.xml +++ b/allure-junit4-aspect/src/main/resources/META-INF/aop.xml @@ -1,4 +1,5 @@ + diff --git a/allure-junit4/src/main/resources/META-INF/aop-ajc.xml b/allure-junit4/src/main/resources/META-INF/aop-ajc.xml index 1f439cb73..09e38300c 100644 --- a/allure-junit4/src/main/resources/META-INF/aop-ajc.xml +++ b/allure-junit4/src/main/resources/META-INF/aop-ajc.xml @@ -1,4 +1,5 @@ + diff --git a/allure-junit5-assert/src/test/java/io/qameta/allure/junit5assert/AllureJunit5AssertTest.java b/allure-junit5-assert/src/test/java/io/qameta/allure/junit5assert/AllureJunit5AssertTest.java index 63d88429e..44d187e5e 100644 --- a/allure-junit5-assert/src/test/java/io/qameta/allure/junit5assert/AllureJunit5AssertTest.java +++ b/allure-junit5-assert/src/test/java/io/qameta/allure/junit5assert/AllureJunit5AssertTest.java @@ -233,4 +233,3 @@ void setLastName(String lastName) { } } } - diff --git a/allure-junit5/src/main/java/io/qameta/allure/junit5/AllureJunit5.java b/allure-junit5/src/main/java/io/qameta/allure/junit5/AllureJunit5.java index 501558459..9f2e2b04f 100644 --- a/allure-junit5/src/main/java/io/qameta/allure/junit5/AllureJunit5.java +++ b/allure-junit5/src/main/java/io/qameta/allure/junit5/AllureJunit5.java @@ -1,3 +1,18 @@ +/* + * Copyright 2020 Qameta Software OÜ + * + * 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. + */ package io.qameta.allure.junit5; import io.qameta.allure.model.Status; diff --git a/allure-junit5/src/test/java/io/qameta/allure/junit5/AllureJunit5Test.java b/allure-junit5/src/test/java/io/qameta/allure/junit5/AllureJunit5Test.java index 3a2a488eb..db61285fe 100644 --- a/allure-junit5/src/test/java/io/qameta/allure/junit5/AllureJunit5Test.java +++ b/allure-junit5/src/test/java/io/qameta/allure/junit5/AllureJunit5Test.java @@ -1,3 +1,18 @@ +/* + * Copyright 2020 Qameta Software OÜ + * + * 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. + */ package io.qameta.allure.junit5; import io.qameta.allure.Allure; @@ -277,4 +292,4 @@ private AllureResults runClasses(final Class... classes) { AttachmentsAspects.setLifecycle(defaultLifecycle); } } -} \ No newline at end of file +} diff --git a/allure-junit5/src/test/java/io/qameta/allure/junit5/features/AfterEachFixtureFailureSupport.java b/allure-junit5/src/test/java/io/qameta/allure/junit5/features/AfterEachFixtureFailureSupport.java index d5fd76364..b70b1f919 100644 --- a/allure-junit5/src/test/java/io/qameta/allure/junit5/features/AfterEachFixtureFailureSupport.java +++ b/allure-junit5/src/test/java/io/qameta/allure/junit5/features/AfterEachFixtureFailureSupport.java @@ -1,3 +1,18 @@ +/* + * Copyright 2020 Qameta Software OÜ + * + * 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. + */ package io.qameta.allure.junit5.features; import io.qameta.allure.Allure; diff --git a/allure-junit5/src/test/java/io/qameta/allure/junit5/features/AllFixtureSupport.java b/allure-junit5/src/test/java/io/qameta/allure/junit5/features/AllFixtureSupport.java index f19bc65e6..2ef2e0550 100644 --- a/allure-junit5/src/test/java/io/qameta/allure/junit5/features/AllFixtureSupport.java +++ b/allure-junit5/src/test/java/io/qameta/allure/junit5/features/AllFixtureSupport.java @@ -1,3 +1,18 @@ +/* + * Copyright 2020 Qameta Software OÜ + * + * 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. + */ package io.qameta.allure.junit5.features; import io.qameta.allure.Allure; diff --git a/allure-junit5/src/test/java/io/qameta/allure/junit5/features/BeforeEachFixtureFailureSupport.java b/allure-junit5/src/test/java/io/qameta/allure/junit5/features/BeforeEachFixtureFailureSupport.java index f2f77d695..6d7e960cb 100644 --- a/allure-junit5/src/test/java/io/qameta/allure/junit5/features/BeforeEachFixtureFailureSupport.java +++ b/allure-junit5/src/test/java/io/qameta/allure/junit5/features/BeforeEachFixtureFailureSupport.java @@ -1,7 +1,21 @@ +/* + * Copyright 2020 Qameta Software OÜ + * + * 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. + */ package io.qameta.allure.junit5.features; import io.qameta.allure.Allure; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/allure-junit5/src/test/java/io/qameta/allure/junit5/features/EachFixtureSupport.java b/allure-junit5/src/test/java/io/qameta/allure/junit5/features/EachFixtureSupport.java index 5e723f39b..ac6005395 100644 --- a/allure-junit5/src/test/java/io/qameta/allure/junit5/features/EachFixtureSupport.java +++ b/allure-junit5/src/test/java/io/qameta/allure/junit5/features/EachFixtureSupport.java @@ -1,3 +1,18 @@ +/* + * Copyright 2020 Qameta Software OÜ + * + * 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. + */ package io.qameta.allure.junit5.features; import io.qameta.allure.Allure; diff --git a/allure-scalatest/src/main/resources/META-INF/aop-ajc.xml b/allure-scalatest/src/main/resources/META-INF/aop-ajc.xml index a980b7a2d..09e38300c 100644 --- a/allure-scalatest/src/main/resources/META-INF/aop-ajc.xml +++ b/allure-scalatest/src/main/resources/META-INF/aop-ajc.xml @@ -1,6 +1,7 @@ + - \ No newline at end of file + diff --git a/allure-spock/src/main/resources/META-INF/aop-ajc.xml b/allure-spock/src/main/resources/META-INF/aop-ajc.xml index 1f439cb73..09e38300c 100644 --- a/allure-spock/src/main/resources/META-INF/aop-ajc.xml +++ b/allure-spock/src/main/resources/META-INF/aop-ajc.xml @@ -1,4 +1,5 @@ + diff --git a/allure-testng/build.gradle.kts b/allure-testng/build.gradle.kts index dd43d7ecf..36565c519 100644 --- a/allure-testng/build.gradle.kts +++ b/allure-testng/build.gradle.kts @@ -8,6 +8,7 @@ dependencies { agent("org.aspectj:aspectjweaver") api(project(":allure-java-commons")) implementation("org.testng:testng:$testNgVersion") + testAnnotationProcessor("org.slf4j:slf4j-simple") testAnnotationProcessor(project(":allure-descriptions-javadoc")) testImplementation("com.google.inject:guice") testImplementation("org.assertj:assertj-core") diff --git a/allure-testng/src/main/resources/META-INF/aop-ajc.xml b/allure-testng/src/main/resources/META-INF/aop-ajc.xml index a980b7a2d..09e38300c 100644 --- a/allure-testng/src/main/resources/META-INF/aop-ajc.xml +++ b/allure-testng/src/main/resources/META-INF/aop-ajc.xml @@ -1,6 +1,7 @@ + - \ No newline at end of file + diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java index c8ff94225..564a6a35f 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java @@ -22,7 +22,6 @@ import io.qameta.allure.aspects.AttachmentsAspects; import io.qameta.allure.aspects.StepsAspects; import io.qameta.allure.model.Attachment; -import io.qameta.allure.model.ExecutableItem; import io.qameta.allure.model.FixtureResult; import io.qameta.allure.model.Label; import io.qameta.allure.model.Link; @@ -33,6 +32,7 @@ import io.qameta.allure.model.StepResult; import io.qameta.allure.model.TestResult; import io.qameta.allure.model.TestResultContainer; +import io.qameta.allure.model.WithSteps; import io.qameta.allure.test.AllureFeatures; import io.qameta.allure.test.AllureResults; import io.qameta.allure.test.AllureResultsWriterStub; @@ -66,11 +66,11 @@ @SuppressWarnings("deprecation") public class AllureTestNgTest { - private static final Condition> ALL_FINISHED = new Condition<>(items -> + private static final Condition> ALL_FINISHED = new Condition<>(items -> items.stream().allMatch(item -> item.getStage() == Stage.FINISHED), "All items should have be in a finished stage"); - private static final Condition> WITH_STEPS = new Condition<>(items -> + private static final Condition> WITH_STEPS = new Condition<>(items -> items.stream().allMatch(item -> item.getSteps().size() == 1), "All items should have a step attached"); @@ -199,7 +199,6 @@ public void descriptionsTest() { .contains(testDescription); } - @SuppressWarnings("unchecked") @AllureFeatures.Descriptions @Test(description = "Javadoc description of befores", dataProvider = "parallelConfiguration") public void descriptionsBefores(final XmlSuite.ParallelMode mode, final int threadCount) { @@ -990,7 +989,7 @@ public void shouldProcessConfigurationFailure() { assertThat(results.getTestResults()) .filteredOn("name", "failed configuration") - .extracting(ExecutableItem::getStatusDetails) + .extracting(TestResult::getStatusDetails) .extracting(StatusDetails::getMessage) .containsExactly("fail"); } diff --git a/allure-testng/src/test/resources/suites/all-features.xml b/allure-testng/src/test/resources/suites/all-features.xml index ae78bc46a..5a2654f96 100644 --- a/allure-testng/src/test/resources/suites/all-features.xml +++ b/allure-testng/src/test/resources/suites/all-features.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/attachments.xml b/allure-testng/src/test/resources/suites/attachments.xml index 42e80252a..2de7fd740 100644 --- a/allure-testng/src/test/resources/suites/attachments.xml +++ b/allure-testng/src/test/resources/suites/attachments.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/bdd-annotations.xml b/allure-testng/src/test/resources/suites/bdd-annotations.xml index 263f50759..35bc9b57e 100644 --- a/allure-testng/src/test/resources/suites/bdd-annotations.xml +++ b/allure-testng/src/test/resources/suites/bdd-annotations.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/broken.xml b/allure-testng/src/test/resources/suites/broken.xml index 2c06be806..8c5280f29 100644 --- a/allure-testng/src/test/resources/suites/broken.xml +++ b/allure-testng/src/test/resources/suites/broken.xml @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/brokenWithoutMessage.xml b/allure-testng/src/test/resources/suites/brokenWithoutMessage.xml index e6b58bc2b..cdf35c371 100644 --- a/allure-testng/src/test/resources/suites/brokenWithoutMessage.xml +++ b/allure-testng/src/test/resources/suites/brokenWithoutMessage.xml @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/descriptions-test-two-classes.xml b/allure-testng/src/test/resources/suites/descriptions-test-two-classes.xml index a4ff104f6..08aa85e7f 100644 --- a/allure-testng/src/test/resources/suites/descriptions-test-two-classes.xml +++ b/allure-testng/src/test/resources/suites/descriptions-test-two-classes.xml @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/descriptions-test.xml b/allure-testng/src/test/resources/suites/descriptions-test.xml index d146cbd7d..7bc8ce60e 100644 --- a/allure-testng/src/test/resources/suites/descriptions-test.xml +++ b/allure-testng/src/test/resources/suites/descriptions-test.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/failed-after-method-fixture.xml b/allure-testng/src/test/resources/suites/failed-after-method-fixture.xml index 7999d78e6..766cb4b6c 100644 --- a/allure-testng/src/test/resources/suites/failed-after-method-fixture.xml +++ b/allure-testng/src/test/resources/suites/failed-after-method-fixture.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/failed-after-suite-fixture.xml b/allure-testng/src/test/resources/suites/failed-after-suite-fixture.xml index c78c1e25d..729a64f21 100644 --- a/allure-testng/src/test/resources/suites/failed-after-suite-fixture.xml +++ b/allure-testng/src/test/resources/suites/failed-after-suite-fixture.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/failed-after-test-fixture.xml b/allure-testng/src/test/resources/suites/failed-after-test-fixture.xml index 1ddf24d0c..794f22806 100644 --- a/allure-testng/src/test/resources/suites/failed-after-test-fixture.xml +++ b/allure-testng/src/test/resources/suites/failed-after-test-fixture.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/failed-before-method-fixture.xml b/allure-testng/src/test/resources/suites/failed-before-method-fixture.xml index 0249fd3b8..8536b19c5 100644 --- a/allure-testng/src/test/resources/suites/failed-before-method-fixture.xml +++ b/allure-testng/src/test/resources/suites/failed-before-method-fixture.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/failed-before-suite-fixture.xml b/allure-testng/src/test/resources/suites/failed-before-suite-fixture.xml index 8049565e7..8cf017945 100644 --- a/allure-testng/src/test/resources/suites/failed-before-suite-fixture.xml +++ b/allure-testng/src/test/resources/suites/failed-before-suite-fixture.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/failed-before-test-fixture.xml b/allure-testng/src/test/resources/suites/failed-before-test-fixture.xml index 12bb60761..7fa23084c 100644 --- a/allure-testng/src/test/resources/suites/failed-before-test-fixture.xml +++ b/allure-testng/src/test/resources/suites/failed-before-test-fixture.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/failed-test-passed-fixture.xml b/allure-testng/src/test/resources/suites/failed-test-passed-fixture.xml index 076988b92..944827b31 100644 --- a/allure-testng/src/test/resources/suites/failed-test-passed-fixture.xml +++ b/allure-testng/src/test/resources/suites/failed-test-passed-fixture.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/failing-by-assertion.xml b/allure-testng/src/test/resources/suites/failing-by-assertion.xml index ae8503fc7..fa1f373b6 100644 --- a/allure-testng/src/test/resources/suites/failing-by-assertion.xml +++ b/allure-testng/src/test/resources/suites/failing-by-assertion.xml @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/flaky.xml b/allure-testng/src/test/resources/suites/flaky.xml index 456e30cff..97bbc749c 100644 --- a/allure-testng/src/test/resources/suites/flaky.xml +++ b/allure-testng/src/test/resources/suites/flaky.xml @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-101.xml b/allure-testng/src/test/resources/suites/gh-101.xml index 1457eb828..5afef5fc9 100644 --- a/allure-testng/src/test/resources/suites/gh-101.xml +++ b/allure-testng/src/test/resources/suites/gh-101.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-102.xml b/allure-testng/src/test/resources/suites/gh-102.xml index be31b547b..bdac2559f 100644 --- a/allure-testng/src/test/resources/suites/gh-102.xml +++ b/allure-testng/src/test/resources/suites/gh-102.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-106.xml b/allure-testng/src/test/resources/suites/gh-106.xml index 04deb1902..4dec26138 100644 --- a/allure-testng/src/test/resources/suites/gh-106.xml +++ b/allure-testng/src/test/resources/suites/gh-106.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-128.xml b/allure-testng/src/test/resources/suites/gh-128.xml index a55b8b93b..cf29f3df1 100644 --- a/allure-testng/src/test/resources/suites/gh-128.xml +++ b/allure-testng/src/test/resources/suites/gh-128.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-129.xml b/allure-testng/src/test/resources/suites/gh-129.xml index 587d8c661..955ecc9f6 100644 --- a/allure-testng/src/test/resources/suites/gh-129.xml +++ b/allure-testng/src/test/resources/suites/gh-129.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-135.xml b/allure-testng/src/test/resources/suites/gh-135.xml index ec5c902b0..012b1299d 100644 --- a/allure-testng/src/test/resources/suites/gh-135.xml +++ b/allure-testng/src/test/resources/suites/gh-135.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-141.xml b/allure-testng/src/test/resources/suites/gh-141.xml index 3ba451d89..ba38d9d17 100644 --- a/allure-testng/src/test/resources/suites/gh-141.xml +++ b/allure-testng/src/test/resources/suites/gh-141.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-219.xml b/allure-testng/src/test/resources/suites/gh-219.xml index bceadc7a0..ce8355492 100644 --- a/allure-testng/src/test/resources/suites/gh-219.xml +++ b/allure-testng/src/test/resources/suites/gh-219.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-304.xml b/allure-testng/src/test/resources/suites/gh-304.xml index 7c2c9c6ab..303a2eb1a 100644 --- a/allure-testng/src/test/resources/suites/gh-304.xml +++ b/allure-testng/src/test/resources/suites/gh-304.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-42.xml b/allure-testng/src/test/resources/suites/gh-42.xml index ab6ce4368..450439705 100644 --- a/allure-testng/src/test/resources/suites/gh-42.xml +++ b/allure-testng/src/test/resources/suites/gh-42.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-49.xml b/allure-testng/src/test/resources/suites/gh-49.xml index c70fb6ebc..8c18dc46d 100644 --- a/allure-testng/src/test/resources/suites/gh-49.xml +++ b/allure-testng/src/test/resources/suites/gh-49.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-97.xml b/allure-testng/src/test/resources/suites/gh-97.xml index 3b2865ac8..2799b57e1 100644 --- a/allure-testng/src/test/resources/suites/gh-97.xml +++ b/allure-testng/src/test/resources/suites/gh-97.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/gh-99.xml b/allure-testng/src/test/resources/suites/gh-99.xml index 0a38a78ac..dd18d31ec 100644 --- a/allure-testng/src/test/resources/suites/gh-99.xml +++ b/allure-testng/src/test/resources/suites/gh-99.xml @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/history-id-parameters.xml b/allure-testng/src/test/resources/suites/history-id-parameters.xml index f77fbef2c..206161756 100644 --- a/allure-testng/src/test/resources/suites/history-id-parameters.xml +++ b/allure-testng/src/test/resources/suites/history-id-parameters.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/history-id-the-same.xml b/allure-testng/src/test/resources/suites/history-id-the-same.xml index 08fd9379d..21d93de9e 100644 --- a/allure-testng/src/test/resources/suites/history-id-the-same.xml +++ b/allure-testng/src/test/resources/suites/history-id-the-same.xml @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/links.xml b/allure-testng/src/test/resources/suites/links.xml index 415a5fe1c..3a4070084 100644 --- a/allure-testng/src/test/resources/suites/links.xml +++ b/allure-testng/src/test/resources/suites/links.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/muted.xml b/allure-testng/src/test/resources/suites/muted.xml index 13da15e76..4ded62ae1 100644 --- a/allure-testng/src/test/resources/suites/muted.xml +++ b/allure-testng/src/test/resources/suites/muted.xml @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/nested-steps.xml b/allure-testng/src/test/resources/suites/nested-steps.xml index be9f3652b..56c2368ae 100644 --- a/allure-testng/src/test/resources/suites/nested-steps.xml +++ b/allure-testng/src/test/resources/suites/nested-steps.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/owner.xml b/allure-testng/src/test/resources/suites/owner.xml index d4f54561a..831ab32f9 100644 --- a/allure-testng/src/test/resources/suites/owner.xml +++ b/allure-testng/src/test/resources/suites/owner.xml @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/parallel-data-provider.xml b/allure-testng/src/test/resources/suites/parallel-data-provider.xml index 41e1b831f..b9f37a2ab 100644 --- a/allure-testng/src/test/resources/suites/parallel-data-provider.xml +++ b/allure-testng/src/test/resources/suites/parallel-data-provider.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/parallel-methods.xml b/allure-testng/src/test/resources/suites/parallel-methods.xml index 71fce6997..80d3089e7 100644 --- a/allure-testng/src/test/resources/suites/parallel-methods.xml +++ b/allure-testng/src/test/resources/suites/parallel-methods.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/parameterized-suite1.xml b/allure-testng/src/test/resources/suites/parameterized-suite1.xml index 3e78702e4..1867af366 100644 --- a/allure-testng/src/test/resources/suites/parameterized-suite1.xml +++ b/allure-testng/src/test/resources/suites/parameterized-suite1.xml @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/parameterized-suite2.xml b/allure-testng/src/test/resources/suites/parameterized-suite2.xml index 279cc294d..2faa5f97a 100644 --- a/allure-testng/src/test/resources/suites/parameterized-suite2.xml +++ b/allure-testng/src/test/resources/suites/parameterized-suite2.xml @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/parameterized-test.xml b/allure-testng/src/test/resources/suites/parameterized-test.xml index f8f5340b4..6911eb613 100644 --- a/allure-testng/src/test/resources/suites/parameterized-test.xml +++ b/allure-testng/src/test/resources/suites/parameterized-test.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/per-class-fixtures-combination.xml b/allure-testng/src/test/resources/suites/per-class-fixtures-combination.xml index 467ad6a3c..a54c2e2f4 100644 --- a/allure-testng/src/test/resources/suites/per-class-fixtures-combination.xml +++ b/allure-testng/src/test/resources/suites/per-class-fixtures-combination.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/per-method-fixtures-combination.xml b/allure-testng/src/test/resources/suites/per-method-fixtures-combination.xml index c7e2bf9d8..d5834447c 100644 --- a/allure-testng/src/test/resources/suites/per-method-fixtures-combination.xml +++ b/allure-testng/src/test/resources/suites/per-method-fixtures-combination.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/per-suite-fixtures-combination.xml b/allure-testng/src/test/resources/suites/per-suite-fixtures-combination.xml index 1cfc65c42..5b569b57d 100644 --- a/allure-testng/src/test/resources/suites/per-suite-fixtures-combination.xml +++ b/allure-testng/src/test/resources/suites/per-suite-fixtures-combination.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/per-test-tag-fixtures-combination.xml b/allure-testng/src/test/resources/suites/per-test-tag-fixtures-combination.xml index c625fc43f..390cd0f66 100644 --- a/allure-testng/src/test/resources/suites/per-test-tag-fixtures-combination.xml +++ b/allure-testng/src/test/resources/suites/per-test-tag-fixtures-combination.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/retry.xml b/allure-testng/src/test/resources/suites/retry.xml index a1447f43b..f19500052 100644 --- a/allure-testng/src/test/resources/suites/retry.xml +++ b/allure-testng/src/test/resources/suites/retry.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/severity.xml b/allure-testng/src/test/resources/suites/severity.xml index 05f724124..7b53dbc71 100644 --- a/allure-testng/src/test/resources/suites/severity.xml +++ b/allure-testng/src/test/resources/suites/severity.xml @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/single-test.xml b/allure-testng/src/test/resources/suites/single-test.xml index efaa27d3d..36c3a07ee 100644 --- a/allure-testng/src/test/resources/suites/single-test.xml +++ b/allure-testng/src/test/resources/suites/single-test.xml @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/skipped-suite.xml b/allure-testng/src/test/resources/suites/skipped-suite.xml index 24941b5d5..a77424175 100644 --- a/allure-testng/src/test/resources/suites/skipped-suite.xml +++ b/allure-testng/src/test/resources/suites/skipped-suite.xml @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/suites/tests-with-timeout.xml b/allure-testng/src/test/resources/suites/tests-with-timeout.xml index 2d8cac5a0..a2eb9f525 100644 --- a/allure-testng/src/test/resources/suites/tests-with-timeout.xml +++ b/allure-testng/src/test/resources/suites/tests-with-timeout.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/allure-testng/src/test/resources/testng.xml b/allure-testng/src/test/resources/testng.xml index aa0e45d43..ae0d72d39 100644 --- a/allure-testng/src/test/resources/testng.xml +++ b/allure-testng/src/test/resources/testng.xml @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/build.gradle.kts b/build.gradle.kts index 62cf4780c..9fa48023c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,10 +13,10 @@ buildscript { } dependencies { - classpath("com.diffplug.spotless:spotless-plugin-gradle:3.27.0") - classpath("com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4") - classpath("io.spring.gradle:dependency-management-plugin:1.0.6.RELEASE") - classpath("ru.vyarus:gradle-quality-plugin:4.0.0") + classpath("com.diffplug.spotless:spotless-plugin-gradle:5.5.1") + classpath("com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.5") + classpath("io.spring.gradle:dependency-management-plugin:1.0.10.RELEASE") + classpath("ru.vyarus:gradle-quality-plugin:4.3.0") } } @@ -31,14 +31,14 @@ val qualityConfigsDir by extra("$gradleScriptDir/quality-configs") val spotlessDtr by extra("$qualityConfigsDir/spotless") tasks.withType(Wrapper::class) { - gradleVersion = "6.3" + gradleVersion = "6.6.1" } plugins { java `java-library` - id("net.researchgate.release") version "2.7.0" - id("io.qameta.allure") version "2.7.0" + id("net.researchgate.release") version "2.8.1" + id("io.qameta.allure") version "2.8.1" } java { @@ -71,36 +71,36 @@ configure(subprojects) { apply(plugin = "maven") apply(plugin = "io.spring.dependency-management") apply(plugin = "ru.vyarus.quality") - apply(plugin = "com.diffplug.gradle.spotless") + apply(plugin = "com.diffplug.spotless") apply(plugin = "io.qameta.allure") apply(from = "$gradleScriptDir/bintray.gradle") apply(from = "$gradleScriptDir/maven-publish.gradle") configure { imports { - mavenBom("com.fasterxml.jackson:jackson-bom:2.9.8") - mavenBom("org.junit:junit-bom:5.5.2") + mavenBom("com.fasterxml.jackson:jackson-bom:2.11.2") + mavenBom("org.junit:junit-bom:5.7.0") } dependencies { - dependency("com.github.tomakehurst:wiremock:2.21.0") - dependency("com.google.inject:guice:4.2.2") - dependency("com.google.testing.compile:compile-testing:0.15") - dependency("com.squareup.retrofit2:retrofit:2.5.0") - dependency("commons-io:commons-io:2.6") - dependency("io.github.benas:random-beans:3.8.0") - dependency("io.github.glytching:junit-extensions:2.3.0") - dependency("org.apache.commons:commons-lang3:3.8.1") - dependency("org.apache.httpcomponents:httpclient:4.5.7") - dependency("org.apache.tika:tika-core:1.20") - dependency("org.aspectj:aspectjrt:1.9.4") - dependency("org.aspectj:aspectjweaver:1.9.4") - dependency("org.assertj:assertj-core:3.11.1") - dependency("org.codehaus.groovy:groovy-all:2.5.6") - dependency("org.freemarker:freemarker:2.3.28") - dependency("org.jboss.resteasy:resteasy-client:3.6.2.Final") - dependency("org.jooq:joor-java-8:0.9.10") - dependency("org.mock-server:mockserver-netty:5.5.1") - dependency("org.mockito:mockito-core:2.24.0") + dependency("com.github.tomakehurst:wiremock:2.27.2") + dependency("com.google.inject:guice:4.2.3") + dependency("com.google.testing.compile:compile-testing:0.18") + dependency("com.squareup.retrofit2:retrofit:2.9.0") + dependency("commons-io:commons-io:2.8.0") + dependency("io.github.benas:random-beans:3.9.0") + dependency("io.github.glytching:junit-extensions:2.4.0") + dependency("org.apache.commons:commons-lang3:3.11") + dependency("org.apache.httpcomponents:httpclient:4.5.12") + dependency("org.apache.tika:tika-core:1.24.1") + dependency("org.aspectj:aspectjrt:1.9.6") + dependency("org.aspectj:aspectjweaver:1.9.6") + dependency("org.assertj:assertj-core:3.17.2") + dependency("org.codehaus.groovy:groovy-all:2.5.13") + dependency("org.freemarker:freemarker:2.3.30") + dependency("org.jboss.resteasy:resteasy-client:4.5.6.Final") + dependency("org.jooq:joor-java-8:0.9.13") + dependency("org.mock-server:mockserver-netty:5.11.1") + dependency("org.mockito:mockito-core:3.5.10") dependencySet("org.slf4j:1.7.30") { entry("slf4j-api") entry("slf4j-nop") @@ -130,9 +130,13 @@ configure(subprojects) { tasks.test { systemProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug") systemProperty("allure.model.indentOutput", "true") + systemProperty("junit.jupiter.execution.parallel.enabled", true) + systemProperty("junit.jupiter.execution.parallel.mode.default", true) testLogging { - events("passed", "skipped", "failed") + listOf(org.gradle.api.tasks.testing.logging.TestLogEvent.FAILED) } + maxHeapSize = project.property("test.maxHeapSize").toString() + maxParallelForks = Integer.parseInt(project.property("test.maxParallelForks") as String) } tasks.processTestResources { @@ -145,19 +149,25 @@ configure(subprojects) { configure { configDir = qualityConfigsDir - checkstyleVersion = "8.22" - pmdVersion = "6.17.0" - spotbugsVersion = "3.1.12" - codenarcVersion = "1.4" + checkstyleVersion = "8.36.1" + pmdVersion = "6.27.0" + spotbugsVersion = "4.1.2" + codenarcVersion = "1.6" enabled = !project.hasProperty("disableQuality") + afterEvaluate { + val spotbugs = configurations.findByName("spotbugs") + if (spotbugs != null) { + dependencies { + spotbugs("org.slf4j:slf4j-simple") + spotbugs("com.github.spotbugs:spotbugs:3.1.12") + } + } + } } configure { java { - target(fileTree(rootDir) { - include("src/**/*.java") - exclude("**/generated-sources/**/*.*") - }) + target("src/**/*.java") removeUnusedImports() @Suppress("INACCESSIBLE_TYPE") licenseHeaderFile("$spotlessDtr/header.java", "(package|import|open|module|//startfile)") @@ -166,9 +176,7 @@ configure(subprojects) { replaceRegex("one blank line after import lists", "(import .+;\n\n)\n+", "$1") } scala { - target(fileTree(rootDir) { - include("**/src/**/*.scala") - }) + target("src/**/*.scala") @Suppress("INACCESSIBLE_TYPE") licenseHeaderFile("$spotlessDtr/header.java", "(package|//startfile)") endWithNewline() @@ -176,9 +184,7 @@ configure(subprojects) { replaceRegex("one blank line after import lists", "(import .+;\n\n)\n+", "$1") } groovy { - target(fileTree(rootDir) { - include("**/src/**/*.groovy") - }) + target("src/**/*.groovy") @Suppress("INACCESSIBLE_TYPE") licenseHeaderFile("$spotlessDtr/header.java", "(package|//startfile) ") endWithNewline() @@ -186,14 +192,14 @@ configure(subprojects) { replaceRegex("one blank line after import lists", "(import .+;\n\n)\n+", "$1") } format("misc") { - target(fileTree(rootDir) { - include("**/*.gradle", - "**/*.gitignore", - "README.md", - "CONTRIBUTING.md", - "config/**/*.xml", - "src/**/*.xml") - }) + target( + "*.gradle", + "*.gitignore", + "README.md", + "CONTRIBUTING.md", + "config/**/*.xml", + "src/**/*.xml" + ) trimTrailingWhitespace() endWithNewline() } @@ -234,7 +240,7 @@ configure(subprojects) { } allure { - version = "2.9.0" + version = "2.13.5" autoconfigure = false aspectjweaver = false } diff --git a/gradle.properties b/gradle.properties index 1491bba12..1022fe6b1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,7 @@ version=2.14-SNAPSHOT + org.gradle.daemon=true -org.gradle.parallel=true \ No newline at end of file +org.gradle.parallel=true + +test.maxHeapSize=512m +test.maxParallelForks=4 diff --git a/gradle/quality-configs/checkstyle/checkstyle.xml b/gradle/quality-configs/checkstyle/checkstyle.xml index 507c4e845..ade530b5b 100644 --- a/gradle/quality-configs/checkstyle/checkstyle.xml +++ b/gradle/quality-configs/checkstyle/checkstyle.xml @@ -20,6 +20,10 @@ + + + + @@ -208,9 +212,6 @@ - - - diff --git a/gradle/quality-configs/pmd/pmd.xml b/gradle/quality-configs/pmd/pmd.xml index c29cb9780..181a946aa 100644 --- a/gradle/quality-configs/pmd/pmd.xml +++ b/gradle/quality-configs/pmd/pmd.xml @@ -30,6 +30,7 @@ + @@ -115,7 +116,6 @@ - @@ -150,4 +150,4 @@ - \ No newline at end of file + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..490fda8577df6c95960ba7077c43220e5bb2c0d9 100644 GIT binary patch delta 22806 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 Z!$zsDgoO%|(a?lZ=Qe6kxv{^r{{!uYR<-~D delta 19980 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 Z5H)%VJiSWIAOn$sbP+#;Q{V4m{s)AkOUM8K diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4b442974..12d38de6a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index af6708ff2..2fe81a7d9 100755 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m"' +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -109,8 +125,8 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` @@ -138,19 +154,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -159,14 +175,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 6d57edc70..62bd9b9cc 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,8 +29,11 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome From d2e7f6fe1b2299e2a34d02dece93fdd39da000ea Mon Sep 17 00:00:00 2001 From: Dmitry Baev Date: Mon, 14 Sep 2020 18:51:47 +0300 Subject: [PATCH 008/486] deny wildcard imports (via #472) --- .../src/main/java/io/qameta/allure/junit4/Tags.java | 6 +++++- .../io/qameta/allure/junit5assert/AllureJunit5Assert.java | 6 +++++- gradle/quality-configs/checkstyle/checkstyle.xml | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/allure-junit4/src/main/java/io/qameta/allure/junit4/Tags.java b/allure-junit4/src/main/java/io/qameta/allure/junit4/Tags.java index a3646d454..49bacad4b 100644 --- a/allure-junit4/src/main/java/io/qameta/allure/junit4/Tags.java +++ b/allure-junit4/src/main/java/io/qameta/allure/junit4/Tags.java @@ -15,7 +15,11 @@ */ package io.qameta.allure.junit4; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * @author jkttt on 05.07.17. diff --git a/allure-junit5-assert/src/main/java/io/qameta/allure/junit5assert/AllureJunit5Assert.java b/allure-junit5-assert/src/main/java/io/qameta/allure/junit5assert/AllureJunit5Assert.java index 669e59799..375a3d19e 100644 --- a/allure-junit5-assert/src/main/java/io/qameta/allure/junit5assert/AllureJunit5Assert.java +++ b/allure-junit5-assert/src/main/java/io/qameta/allure/junit5assert/AllureJunit5Assert.java @@ -21,7 +21,11 @@ import io.qameta.allure.model.StepResult; import io.qameta.allure.util.ObjectUtils; import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.*; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/gradle/quality-configs/checkstyle/checkstyle.xml b/gradle/quality-configs/checkstyle/checkstyle.xml index ade530b5b..b4ab1aa17 100644 --- a/gradle/quality-configs/checkstyle/checkstyle.xml +++ b/gradle/quality-configs/checkstyle/checkstyle.xml @@ -125,7 +125,7 @@ - + From eecb1b56e14905951af8a3285e5e0218478b7675 Mon Sep 17 00:00:00 2001 From: Artem Eroshenko Date: Tue, 29 Sep 2020 16:31:18 +0300 Subject: [PATCH 009/486] first draft of cucumber 6 support (via #475) --- allure-cucumber6-jvm/build.gradle.kts | 39 + .../cucumber6jvm/AllureCucumber6Jvm.java | 424 ++++++++++ .../allure/cucumber6jvm/LabelBuilder.java | 191 +++++ .../qameta/allure/cucumber6jvm/TagParser.java | 71 ++ .../testsourcemodel/TestSourcesModel.java | 159 ++++ .../TestSourcesModelProxy.java | 75 ++ .../cucumber6jvm/AllureCucumber6JvmTest.java | 747 ++++++++++++++++++ .../cucumber6jvm/samples/AmbigiousSteps.java | 40 + .../cucumber6jvm/samples/AttachmentSteps.java | 39 + .../samples/BackgroundFeatureSteps.java | 43 + .../samples/BrokenFeatureSteps.java | 30 + .../samples/DatatableFeatureSteps.java | 31 + .../cucumber6jvm/samples/HookSteps.java | 64 ++ .../cucumber6jvm/samples/PendingSteps.java | 32 + .../samples/SimpleFeatureSteps.java | 52 ++ .../src/test/resources/allure.properties | 3 + .../test/resources/features/ambigious.feature | 5 + .../resources/features/attachments.feature | 8 + .../resources/features/background.feature | 9 + .../test/resources/features/broken.feature | 4 + .../test/resources/features/datatable.feature | 8 + .../resources/features/description.feature | 17 + .../test/resources/features/examples.feature | 11 + .../test/resources/features/failed.feature | 7 + .../src/test/resources/features/hooks.feature | 98 +++ .../resources/features/multi-examples.feature | 17 + .../test/resources/features/parallel.feature | 17 + .../test/resources/features/pending.feature | 6 + .../features/scenario_description.feature | 19 + .../test/resources/features/simple.feature | 7 + .../src/test/resources/features/tags.feature | 13 + .../test/resources/features/undefined.feature | 6 + settings.gradle.kts | 1 + 33 files changed, 2293 insertions(+) create mode 100644 allure-cucumber6-jvm/build.gradle.kts create mode 100644 allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/AllureCucumber6Jvm.java create mode 100644 allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/LabelBuilder.java create mode 100644 allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/TagParser.java create mode 100644 allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/testsourcemodel/TestSourcesModel.java create mode 100644 allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/testsourcemodel/TestSourcesModelProxy.java create mode 100644 allure-cucumber6-jvm/src/test/java/io/qameta/allure/cucumber6jvm/AllureCucumber6JvmTest.java create mode 100644 allure-cucumber6-jvm/src/test/java/io/qameta/allure/cucumber6jvm/samples/AmbigiousSteps.java create mode 100644 allure-cucumber6-jvm/src/test/java/io/qameta/allure/cucumber6jvm/samples/AttachmentSteps.java create mode 100644 allure-cucumber6-jvm/src/test/java/io/qameta/allure/cucumber6jvm/samples/BackgroundFeatureSteps.java create mode 100644 allure-cucumber6-jvm/src/test/java/io/qameta/allure/cucumber6jvm/samples/BrokenFeatureSteps.java create mode 100644 allure-cucumber6-jvm/src/test/java/io/qameta/allure/cucumber6jvm/samples/DatatableFeatureSteps.java create mode 100644 allure-cucumber6-jvm/src/test/java/io/qameta/allure/cucumber6jvm/samples/HookSteps.java create mode 100644 allure-cucumber6-jvm/src/test/java/io/qameta/allure/cucumber6jvm/samples/PendingSteps.java create mode 100644 allure-cucumber6-jvm/src/test/java/io/qameta/allure/cucumber6jvm/samples/SimpleFeatureSteps.java create mode 100644 allure-cucumber6-jvm/src/test/resources/allure.properties create mode 100644 allure-cucumber6-jvm/src/test/resources/features/ambigious.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/attachments.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/background.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/broken.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/datatable.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/description.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/examples.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/failed.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/hooks.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/multi-examples.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/parallel.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/pending.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/scenario_description.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/simple.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/tags.feature create mode 100644 allure-cucumber6-jvm/src/test/resources/features/undefined.feature diff --git a/allure-cucumber6-jvm/build.gradle.kts b/allure-cucumber6-jvm/build.gradle.kts new file mode 100644 index 000000000..5bb9fb09f --- /dev/null +++ b/allure-cucumber6-jvm/build.gradle.kts @@ -0,0 +1,39 @@ +description = "Allure CucumberJVM 6.0" + +val agent: Configuration by configurations.creating + +val cucumberVersion = "6.1.1" +val cucumberGherkinVersion = "5.1.0" + +dependencies { + agent("org.aspectj:aspectjweaver") + api(project(":allure-java-commons")) + compileOnly("io.cucumber:cucumber-plugin:$cucumberVersion") + implementation("io.cucumber:gherkin:$cucumberGherkinVersion") + testImplementation("io.cucumber:gherkin:$cucumberGherkinVersion") + testImplementation("io.cucumber:cucumber-core:$cucumberVersion") + testImplementation("io.cucumber:cucumber-java:$cucumberVersion") + testImplementation("io.cucumber:cucumber-testng:$cucumberVersion") + testImplementation("commons-io:commons-io") + testImplementation("io.github.glytching:junit-extensions") + testImplementation("org.assertj:assertj-core") + testImplementation("org.junit.jupiter:junit-jupiter-api") + testImplementation("org.slf4j:slf4j-simple") + testImplementation(project(":allure-java-commons-test")) + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") +} + +tasks.jar { + manifest { + attributes(mapOf( + "Automatic-Module-Name" to "io.qameta.allure.cucumber5jvm" + )) + } +} + +tasks.test { + useJUnitPlatform() + doFirst { + jvmArgs("-javaagent:${agent.singleFile}") + } +} diff --git a/allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/AllureCucumber6Jvm.java b/allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/AllureCucumber6Jvm.java new file mode 100644 index 000000000..e57514bea --- /dev/null +++ b/allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/AllureCucumber6Jvm.java @@ -0,0 +1,424 @@ +/* + * Copyright 2019 Qameta Software OÜ + * + * 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. + */ +package io.qameta.allure.cucumber6jvm; + +import gherkin.ast.Examples; +import gherkin.ast.Feature; +import gherkin.ast.ScenarioDefinition; +import gherkin.ast.ScenarioOutline; +import gherkin.ast.TableRow; +import io.cucumber.plugin.ConcurrentEventListener; +import io.cucumber.plugin.event.DataTableArgument; +import io.cucumber.plugin.event.EmbedEvent; +import io.cucumber.plugin.event.EventHandler; +import io.cucumber.plugin.event.EventPublisher; +import io.cucumber.plugin.event.HookTestStep; +import io.cucumber.plugin.event.HookType; +import io.cucumber.plugin.event.PickleStepTestStep; +import io.cucumber.plugin.event.Result; +import io.cucumber.plugin.event.StepArgument; +import io.cucumber.plugin.event.TestCase; +import io.cucumber.plugin.event.TestCaseFinished; +import io.cucumber.plugin.event.TestCaseStarted; +import io.cucumber.plugin.event.TestSourceRead; +import io.cucumber.plugin.event.TestStepFinished; +import io.cucumber.plugin.event.TestStepStarted; +import io.cucumber.plugin.event.WriteEvent; +import io.qameta.allure.Allure; +import io.qameta.allure.AllureLifecycle; +import io.qameta.allure.cucumber6jvm.testsourcemodel.TestSourcesModelProxy; +import io.qameta.allure.model.FixtureResult; +import io.qameta.allure.model.Parameter; +import io.qameta.allure.model.Status; +import io.qameta.allure.model.StatusDetails; +import io.qameta.allure.model.StepResult; +import io.qameta.allure.model.TestResult; +import io.qameta.allure.model.TestResultContainer; + +import java.io.ByteArrayInputStream; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static io.qameta.allure.util.ResultsUtils.createParameter; +import static io.qameta.allure.util.ResultsUtils.getStatus; +import static io.qameta.allure.util.ResultsUtils.getStatusDetails; +import static io.qameta.allure.util.ResultsUtils.md5; + +/** + * Allure plugin for Cucumber JVM 5.0. + */ +@SuppressWarnings({ + "ClassDataAbstractionCoupling", + "ClassFanOutComplexity", + "PMD.ExcessiveImports", + "PMD.GodClass", +}) +public class AllureCucumber6Jvm implements ConcurrentEventListener { + + private final AllureLifecycle lifecycle; + + private final ConcurrentHashMap scenarioUuids = new ConcurrentHashMap<>(); + private final TestSourcesModelProxy testSources = new TestSourcesModelProxy(); + + private final ThreadLocal currentFeature = new InheritableThreadLocal<>(); + private final ThreadLocal currentFeatureFile = new InheritableThreadLocal<>(); + private final ThreadLocal currentTestCase = new InheritableThreadLocal<>(); + private final ThreadLocal currentContainer = new InheritableThreadLocal<>(); + private final ThreadLocal forbidTestCaseStatusChange = new InheritableThreadLocal<>(); + + private final EventHandler featureStartedHandler = this::handleFeatureStartedHandler; + private final EventHandler caseStartedHandler = this::handleTestCaseStarted; + private final EventHandler caseFinishedHandler = this::handleTestCaseFinished; + private final EventHandler stepStartedHandler = this::handleTestStepStarted; + private final EventHandler stepFinishedHandler = this::handleTestStepFinished; + private final EventHandler writeEventHandler = this::handleWriteEvent; + private final EventHandler embedEventHandler = this::handleEmbedEvent; + + private static final String TXT_EXTENSION = ".txt"; + private static final String TEXT_PLAIN = "text/plain"; + + @SuppressWarnings("unused") + public AllureCucumber6Jvm() { + this(Allure.getLifecycle()); + } + + public AllureCucumber6Jvm(final AllureLifecycle lifecycle) { + this.lifecycle = lifecycle; + } + + /* + Event Handlers + */ + @Override + public void setEventPublisher(final EventPublisher publisher) { + publisher.registerHandlerFor(TestSourceRead.class, featureStartedHandler); + + publisher.registerHandlerFor(TestCaseStarted.class, caseStartedHandler); + publisher.registerHandlerFor(TestCaseFinished.class, caseFinishedHandler); + + publisher.registerHandlerFor(TestStepStarted.class, stepStartedHandler); + publisher.registerHandlerFor(TestStepFinished.class, stepFinishedHandler); + + publisher.registerHandlerFor(WriteEvent.class, writeEventHandler); + publisher.registerHandlerFor(EmbedEvent.class, embedEventHandler); + } + + private void handleFeatureStartedHandler(final TestSourceRead event) { + testSources.addTestSourceReadEvent(event.getUri(), event); + } + + private void handleTestCaseStarted(final TestCaseStarted event) { + currentFeatureFile.set(event.getTestCase().getUri()); + currentFeature.set(testSources.getFeature(currentFeatureFile.get())); + currentTestCase.set(event.getTestCase()); + currentContainer.set(UUID.randomUUID().toString()); + forbidTestCaseStatusChange.set(false); + + final Deque tags = new LinkedList<>(currentTestCase.get().getTags()); + + final Feature feature = currentFeature.get(); + final LabelBuilder labelBuilder = new LabelBuilder(feature, currentTestCase.get(), tags); + + final String name = currentTestCase.get().getName(); + final String featureName = feature.getName(); + + final TestResult result = new TestResult() + .setUuid(getTestCaseUuid(currentTestCase.get())) + .setHistoryId(getHistoryId(currentTestCase.get())) + .setFullName(featureName + ": " + name) + .setName(name) + .setLabels(labelBuilder.getScenarioLabels()) + .setLinks(labelBuilder.getScenarioLinks()); + + final ScenarioDefinition scenarioDefinition = + testSources.getScenarioDefinition(currentFeatureFile.get(), currentTestCase.get().getLine()); + if (scenarioDefinition instanceof ScenarioOutline) { + result.setParameters( + getExamplesAsParameters((ScenarioOutline) scenarioDefinition, currentTestCase.get()) + ); + } + + final String description = Stream.of(feature.getDescription(), scenarioDefinition.getDescription()) + .filter(Objects::nonNull) + .filter(s -> !s.isEmpty()) + .collect(Collectors.joining("\n")); + + if (!description.isEmpty()) { + result.setDescription(description); + } + + final TestResultContainer resultContainer = new TestResultContainer() + .setName(String.format("%s: %s", scenarioDefinition.getKeyword(), scenarioDefinition.getName())) + .setUuid(getTestContainerUuid()) + .setChildren(Collections.singletonList(getTestCaseUuid(currentTestCase.get()))); + + lifecycle.scheduleTestCase(result); + lifecycle.startTestContainer(getTestContainerUuid(), resultContainer); + lifecycle.startTestCase(getTestCaseUuid(currentTestCase.get())); + } + + private void handleTestCaseFinished(final TestCaseFinished event) { + + final String uuid = getTestCaseUuid(event.getTestCase()); + final Optional details = getStatusDetails(event.getResult().getError()); + details.ifPresent(statusDetails -> lifecycle.updateTestCase( + uuid, + testResult -> testResult.setStatusDetails(statusDetails) + )); + lifecycle.stopTestCase(uuid); + lifecycle.stopTestContainer(getTestContainerUuid()); + lifecycle.writeTestCase(uuid); + lifecycle.writeTestContainer(getTestContainerUuid()); + } + + private void handleTestStepStarted(final TestStepStarted event) { + if (event.getTestStep() instanceof PickleStepTestStep) { + final PickleStepTestStep pickleStep = (PickleStepTestStep) event.getTestStep(); + final String stepKeyword = Optional.ofNullable( + testSources.getKeywordFromSource(currentFeatureFile.get(), pickleStep.getStep().getLine()) + ).orElse("UNDEFINED"); + + final StepResult stepResult = new StepResult() + .setName(String.format("%s %s", stepKeyword, pickleStep.getStep().getText())) + .setStart(System.currentTimeMillis()); + + lifecycle.startStep(getTestCaseUuid(currentTestCase.get()), getStepUuid(pickleStep), stepResult); + + final StepArgument stepArgument = pickleStep.getStep().getArgument(); + if (stepArgument instanceof DataTableArgument) { + final DataTableArgument dataTableArgument = (DataTableArgument) stepArgument; + createDataTableAttachment(dataTableArgument); + } + } else if (event.getTestStep() instanceof HookTestStep) { + initHook((HookTestStep) event.getTestStep()); + } + } + + private void initHook(final HookTestStep hook) { + + final FixtureResult hookResult = new FixtureResult() + .setName(hook.getCodeLocation()) + .setStart(System.currentTimeMillis()); + + if (hook.getHookType() == HookType.BEFORE) { + lifecycle.startPrepareFixture(getTestContainerUuid(), getHookStepUuid(hook), hookResult); + } else { + lifecycle.startTearDownFixture(getTestContainerUuid(), getHookStepUuid(hook), hookResult); + } + + } + + private void handleTestStepFinished(final TestStepFinished event) { + if (event.getTestStep() instanceof HookTestStep) { + handleHookStep(event); + } else { + handlePickleStep(event); + } + } + + private void handleWriteEvent(final WriteEvent event) { + lifecycle.addAttachment( + "Text output", + TEXT_PLAIN, + TXT_EXTENSION, + Objects.toString(event.getText()).getBytes(StandardCharsets.UTF_8) + ); + } + + private void handleEmbedEvent(final EmbedEvent event) { + lifecycle.addAttachment(event.name, event.getMediaType(), null, new ByteArrayInputStream(event.getData())); + } + + /* + Utility Methods + */ + + private String getTestContainerUuid() { + return currentContainer.get(); + } + + private String getTestCaseUuid(final TestCase testCase) { + return scenarioUuids.computeIfAbsent(getHistoryId(testCase), it -> UUID.randomUUID().toString()); + } + + private String getStepUuid(final PickleStepTestStep step) { + return currentFeature.get().getName() + getTestCaseUuid(currentTestCase.get()) + + step.getStep().getText() + step.getStep().getLine(); + } + + private String getHookStepUuid(final HookTestStep step) { + return currentFeature.get().getName() + getTestCaseUuid(currentTestCase.get()) + + step.getHookType().toString() + step.getCodeLocation(); + } + + private String getHistoryId(final TestCase testCase) { + final String testCaseLocation = testCase.getUri().toString() + .substring(testCase.getUri().toString().lastIndexOf('/') + 1) + + ":" + testCase.getLine(); + return md5(testCaseLocation); + } + + private Status translateTestCaseStatus(final Result testCaseResult) { + switch (testCaseResult.getStatus()) { + case FAILED: + return getStatus(testCaseResult.getError()) + .orElse(Status.FAILED); + case PASSED: + return Status.PASSED; + case SKIPPED: + case PENDING: + return Status.SKIPPED; + case AMBIGUOUS: + case UNDEFINED: + default: + return null; + } + } + + private List getExamplesAsParameters( + final ScenarioOutline scenarioOutline, final TestCase localCurrentTestCase + ) { + final Optional examplesBlock = + scenarioOutline.getExamples().stream() + .filter(example -> example.getTableBody().stream() + .anyMatch(row -> row.getLocation().getLine() == localCurrentTestCase.getLine()) + ).findFirst(); + + if (examplesBlock.isPresent()) { + final TableRow row = examplesBlock.get().getTableBody().stream() + .filter(example -> example.getLocation().getLine() == localCurrentTestCase.getLine()) + .findFirst().get(); + return IntStream.range(0, examplesBlock.get().getTableHeader().getCells().size()).mapToObj(index -> { + final String name = examplesBlock.get().getTableHeader().getCells().get(index).getValue(); + final String value = row.getCells().get(index).getValue(); + return createParameter(name, value); + }).collect(Collectors.toList()); + } else { + return Collections.emptyList(); + } + } + + private void createDataTableAttachment(final DataTableArgument dataTableArgument) { + final List> rowsInTable = dataTableArgument.cells(); + final StringBuilder dataTableCsv = new StringBuilder(); + for (List columns : rowsInTable) { + if (!columns.isEmpty()) { + for (int i = 0; i < columns.size(); i++) { + if (i == columns.size() - 1) { + dataTableCsv.append(columns.get(i)); + } else { + dataTableCsv.append(columns.get(i)); + dataTableCsv.append('\t'); + } + } + dataTableCsv.append('\n'); + } + } + final String attachmentSource = lifecycle + .prepareAttachment("Data table", "text/tab-separated-values", "csv"); + lifecycle.writeAttachment(attachmentSource, + new ByteArrayInputStream(dataTableCsv.toString().getBytes(StandardCharsets.UTF_8))); + } + + private void handleHookStep(final TestStepFinished event) { + final HookTestStep hookStep = (HookTestStep) event.getTestStep(); + final String uuid = getHookStepUuid(hookStep); + final FixtureResult fixtureResult = new FixtureResult().setStatus(translateTestCaseStatus(event.getResult())); + + if (!Status.PASSED.equals(fixtureResult.getStatus())) { + final TestResult testResult = new TestResult().setStatus(translateTestCaseStatus(event.getResult())); + final StatusDetails statusDetails = getStatusDetails(event.getResult().getError()) + .orElseGet(StatusDetails::new); + + final String errorMessage = event.getResult().getError() == null ? hookStep.getHookType() + .name() + " is failed." : hookStep.getHookType() + .name() + " is failed: " + event.getResult().getError().getLocalizedMessage(); + statusDetails.setMessage(errorMessage); + + if (hookStep.getHookType() == HookType.BEFORE) { + final TagParser tagParser = new TagParser(currentFeature.get(), currentTestCase.get()); + statusDetails + .setFlaky(tagParser.isFlaky()) + .setMuted(tagParser.isMuted()) + .setKnown(tagParser.isKnown()); + testResult.setStatus(Status.SKIPPED); + updateTestCaseStatus(testResult.getStatus()); + forbidTestCaseStatusChange.set(true); + } else { + testResult.setStatus(Status.BROKEN); + updateTestCaseStatus(testResult.getStatus()); + } + fixtureResult.setStatusDetails(statusDetails); + } + + lifecycle.updateFixture(uuid, result -> result.setStatus(fixtureResult.getStatus()) + .setStatusDetails(fixtureResult.getStatusDetails())); + lifecycle.stopFixture(uuid); + } + + private void handlePickleStep(final TestStepFinished event) { + + final Status stepStatus = translateTestCaseStatus(event.getResult()); + final StatusDetails statusDetails; + if (event.getResult().getStatus() == io.cucumber.plugin.event.Status.UNDEFINED) { + updateTestCaseStatus(Status.PASSED); + + statusDetails = + getStatusDetails(new IllegalStateException("Undefined Step. Please add step definition")) + .orElse(new StatusDetails()); + lifecycle.updateTestCase(getTestCaseUuid(currentTestCase.get()), scenarioResult -> + scenarioResult + .setStatusDetails(statusDetails)); + } else { + statusDetails = + getStatusDetails(event.getResult().getError()) + .orElse(new StatusDetails()); + updateTestCaseStatus(stepStatus); + } + + if (!Status.PASSED.equals(stepStatus) && stepStatus != null) { + forbidTestCaseStatusChange.set(true); + } + + final TagParser tagParser = new TagParser(currentFeature.get(), currentTestCase.get()); + statusDetails + .setFlaky(tagParser.isFlaky()) + .setMuted(tagParser.isMuted()) + .setKnown(tagParser.isKnown()); + + lifecycle.updateStep(getStepUuid((PickleStepTestStep) event.getTestStep()), + stepResult -> stepResult.setStatus(stepStatus).setStatusDetails(statusDetails)); + lifecycle.stopStep(getStepUuid((PickleStepTestStep) event.getTestStep())); + } + + private void updateTestCaseStatus(final Status status) { + if (!forbidTestCaseStatusChange.get()) { + lifecycle.updateTestCase(getTestCaseUuid(currentTestCase.get()), + result -> result.setStatus(status)); + } + } +} diff --git a/allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/LabelBuilder.java b/allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/LabelBuilder.java new file mode 100644 index 000000000..5ad4a04e5 --- /dev/null +++ b/allure-cucumber6-jvm/src/main/java/io/qameta/allure/cucumber6jvm/LabelBuilder.java @@ -0,0 +1,191 @@ +/* + * Copyright 2019 Qameta Software OÜ + * + * 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. + */ +package io.qameta.allure.cucumber6jvm; + +import io.cucumber.plugin.event.TestCase; +import gherkin.ast.Feature; +import io.qameta.allure.model.Label; +import io.qameta.allure.model.Link; +import io.qameta.allure.util.ResultsUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Deque; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static io.qameta.allure.util.ResultsUtils.createFeatureLabel; +import static io.qameta.allure.util.ResultsUtils.createFrameworkLabel; +import static io.qameta.allure.util.ResultsUtils.createHostLabel; +import static io.qameta.allure.util.ResultsUtils.createLabel; +import static io.qameta.allure.util.ResultsUtils.createLanguageLabel; +import static io.qameta.allure.util.ResultsUtils.createStoryLabel; +import static io.qameta.allure.util.ResultsUtils.createSuiteLabel; +import static io.qameta.allure.util.ResultsUtils.createTestClassLabel; +import static io.qameta.allure.util.ResultsUtils.createThreadLabel; + +/** + * Scenario labels and links builder. + */ +@SuppressWarnings({"CyclomaticComplexity", "PMD.CyclomaticComplexity", "PMD.NcssCount", "MultipleStringLiterals"}) +class LabelBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(LabelBuilder.class); + private static final String COMPOSITE_TAG_DELIMITER = "="; + + private static final String SEVERITY = "@SEVERITY"; + private static final String ISSUE_LINK = "@ISSUE"; + private static final String TMS_LINK = "@TMSLINK"; + private static final String PLAIN_LINK = "@LINK"; + + private final List