From 8244b53dd16c02703734ac89699b8bbf4e9fb074 Mon Sep 17 00:00:00 2001 From: Viktor Sidochenko Date: Thu, 2 Mar 2017 00:47:59 +0700 Subject: [PATCH 01/23] add initial draft for cucumber-jvm plugin base it on testng plugin --- .gitignore | 1 + allure-cucumber-jvm/build.gradle | 37 ++ .../allure/cucumberjvm/AllureCucumberJvm.java | 356 ++++++++++++++++++ .../src/main/resources/META-INF/aop-ajc.xml | 6 + .../testdata/AllureResultsWriterStub.java | 41 ++ .../images/totally-open-source-kitten.jpeg | Bin 0 -> 37130 bytes settings.gradle | 2 +- 7 files changed, 442 insertions(+), 1 deletion(-) create mode 100644 allure-cucumber-jvm/build.gradle create mode 100644 allure-cucumber-jvm/src/main/java/io/qameta/allure/cucumberjvm/AllureCucumberJvm.java create mode 100644 allure-cucumber-jvm/src/main/resources/META-INF/aop-ajc.xml create mode 100644 allure-cucumber-jvm/src/test/java/io/qameta/allure/cucumberjvm/testdata/AllureResultsWriterStub.java create mode 100644 allure-cucumber-jvm/src/test/resources/images/totally-open-source-kitten.jpeg diff --git a/.gitignore b/.gitignore index cc5f8f5d7..a18093f16 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ build #Mac OS stuff .DS_Store +/.nb-gradle/ \ No newline at end of file diff --git a/allure-cucumber-jvm/build.gradle b/allure-cucumber-jvm/build.gradle new file mode 100644 index 000000000..aa070a3f2 --- /dev/null +++ b/allure-cucumber-jvm/build.gradle @@ -0,0 +1,37 @@ +description = 'Allure CucumberJVM' + +configurations { + agent +} + +dependencies { + agent 'org.aspectj:aspectjweaver' + + compile project(':allure-java-commons') + compile 'info.cukes:gherkin:2.12.2' + compile 'info.cukes:cucumber-core:1.2.5' + compile 'info.cukes:cucumber-java:1.2.5' + + testCompile 'org.slf4j:slf4j-simple' + testCompile 'org.mockito:mockito-core' + testCompile 'org.assertj:assertj-core' + testCompile 'com.google.inject:guice' +} + +test.doFirst { + jvmArgs "-javaagent:${configurations.agent.singleFile}" +} + +test { + systemProperty 'allure.model.indentOutput', true + systemProperty 'allure.results.directory', 'build/allure-results' +} + +task spiOffJar(type: Jar, dependsOn: classes) { + classifier = 'spi-off' + from sourceSets.main.allJava +} + +artifacts { + archives spiOffJar +} diff --git a/allure-cucumber-jvm/src/main/java/io/qameta/allure/cucumberjvm/AllureCucumberJvm.java b/allure-cucumber-jvm/src/main/java/io/qameta/allure/cucumberjvm/AllureCucumberJvm.java new file mode 100644 index 000000000..8be502f12 --- /dev/null +++ b/allure-cucumber-jvm/src/main/java/io/qameta/allure/cucumberjvm/AllureCucumberJvm.java @@ -0,0 +1,356 @@ +package io.qameta.allure.cucumberjvm; + +import gherkin.formatter.Formatter; +import gherkin.formatter.Reporter; +import gherkin.formatter.model.Background; +import gherkin.formatter.model.Examples; +import gherkin.formatter.model.Feature; +import gherkin.formatter.model.Match; +import gherkin.formatter.model.Result; +import gherkin.formatter.model.Scenario; +import gherkin.formatter.model.ScenarioOutline; +import gherkin.formatter.model.Step; +import io.qameta.allure.AllureLifecycle; +import io.qameta.allure.Epic; +import io.qameta.allure.Flaky; +import io.qameta.allure.Muted; +import io.qameta.allure.ResultsUtils; +import static io.qameta.allure.ResultsUtils.firstNonEmpty; +import io.qameta.allure.Severity; +import io.qameta.allure.Story; +import io.qameta.allure.model.Label; +import io.qameta.allure.model.Link; +import io.qameta.allure.model.Parameter; +import io.qameta.allure.model.Status; +import io.qameta.allure.model.StatusDetails; +import io.qameta.allure.model.TestResult; +import java.lang.annotation.Annotation; +import java.math.BigInteger; +import static java.nio.charset.StandardCharsets.UTF_8; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.List; +import java.util.Map; +import static java.util.Map.Entry.comparingByValue; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AllureCucumberJvm implements Reporter, Formatter { + + private static final Logger LOGGER = LoggerFactory.getLogger(AllureCucumberJvm.class); + + private static final String ALLURE_UUID = "ALLURE_UUID"; + private static final String MD_5 = "md5"; + + /** + * Store current test result uuid to attach before/after methods into. + */ + private final ThreadLocal currentTestResult + = InheritableThreadLocal.withInitial(Current::new); + + /** + * Store current container uuid for fake containers around before/after + * methods. + */ + private final ThreadLocal currentTestContainer + = InheritableThreadLocal.withInitial(() -> UUID.randomUUID().toString()); + + /** + * Store uuid for current executable item to catch steps and attachments. + */ + private final ThreadLocal currentExecutable + = InheritableThreadLocal.withInitial(() -> UUID.randomUUID().toString()); + + private AllureLifecycle lifecycle; + + @Override + public void before(Match match, Result result) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void result(Result result) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void after(Match match, Result result) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void match(Match match) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void embedding(String string, byte[] bytes) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void write(String string) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void syntaxError(String string, String string1, List list, String string2, Integer intgr) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void uri(String string) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void feature(Feature ftr) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void scenarioOutline(ScenarioOutline so) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void examples(Examples exmpls) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void startOfScenarioLifeCycle(Scenario scnr) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void background(Background b) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void scenario(Scenario scnr) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void step(Step step) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void endOfScenarioLifeCycle(Scenario scnr) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void done() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void close() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void eof() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + private List