Skip to content

Commit 6d19316

Browse files
Artem Eroshenkobaev
authored andcommitted
first draft of migrations (via allure-framework#52)
1 parent 5cd8bd5 commit 6d19316

35 files changed

Lines changed: 1384 additions & 8 deletions

File tree

allure-cucumber-jvm/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ task spiOffJar(type: Jar, dependsOn: classes) {
3939

4040
artifacts {
4141
archives spiOffJar
42-
}
42+
}

allure-descriptions-javadoc/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,3 @@ dependencies {
1111
testCompile 'org.testng:testng'
1212
testCompile 'com.google.testing.compile:compile-testing:0.10'
1313
}
14-

allure-java-commons/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@ dependencies {
2727

2828
test.doFirst {
2929
jvmArgs "-javaagent:${configurations.agent.singleFile}"
30-
}
30+
}

allure-java-commons/src/main/java/io/qameta/allure/AllureLifecycle.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ public void stopFixture(final String uuid) {
132132
notifier.afterFixtureStop(fixture);
133133
}
134134

135+
public Optional<String> getCurrentTestCase() {
136+
return Optional.ofNullable(storage.getRootStep());
137+
}
138+
135139
public void scheduleTestCase(final String parentUuid, final TestResult result) {
136140
updateTestContainer(parentUuid, container -> container.getChildren().add(result.getUuid()));
137141
scheduleTestCase(result);

allure-java-commons/src/main/java/io/qameta/allure/internal/AllureStorage.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,12 @@ public String getCurrentStep() {
3131
: uids.getFirst();
3232
}
3333

34+
@SuppressWarnings("PMD.NullAssignment")
3435
public String getRootStep() {
35-
return currentStepContext.get().getLast();
36+
final LinkedList<String> uids = currentStepContext.get();
37+
return uids.isEmpty()
38+
? null
39+
: uids.getLast();
3640
}
3741

3842
public void startStep(final String uuid) {

allure-java-migration/build.gradle

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
description = 'Allure Java Migration'
2+
3+
apply from: "${gradleScriptDir}/maven-publish.gradle"
4+
apply from: "${gradleScriptDir}/bintray.gradle"
5+
apply plugin: 'maven'
6+
apply plugin: 'java'
7+
8+
configurations {
9+
agent
10+
}
11+
12+
dependencies {
13+
agent 'org.aspectj:aspectjweaver'
14+
15+
compile project(':allure-java-commons')
16+
17+
compile 'org.aspectj:aspectjrt'
18+
19+
compileOnly 'junit:junit'
20+
compileOnly 'org.testng:testng'
21+
22+
testCompile 'junit:junit'
23+
testCompile 'org.testng:testng'
24+
testCompile 'org.mockito:mockito-core'
25+
testCompile 'org.assertj:assertj-core'
26+
}
27+
28+
test.doFirst {
29+
jvmArgs "-javaagent:${configurations.agent.singleFile}"
30+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package io.qameta.allure.aspects;
2+
3+
import io.qameta.allure.model.Label;
4+
import io.qameta.allure.model.Parameter;
5+
import io.qameta.allure.model.TestResult;
6+
import org.apache.commons.lang3.reflect.FieldUtils;
7+
import org.aspectj.lang.reflect.MethodSignature;
8+
import ru.yandex.qatools.allure.annotations.Description;
9+
import ru.yandex.qatools.allure.annotations.Features;
10+
import ru.yandex.qatools.allure.annotations.Issue;
11+
import ru.yandex.qatools.allure.annotations.Issues;
12+
import ru.yandex.qatools.allure.annotations.Severity;
13+
import ru.yandex.qatools.allure.annotations.Stories;
14+
import ru.yandex.qatools.allure.annotations.TestCaseId;
15+
import ru.yandex.qatools.allure.annotations.Title;
16+
import ru.yandex.qatools.allure.model.DescriptionType;
17+
18+
import java.lang.reflect.Field;
19+
import java.lang.reflect.Method;
20+
import java.util.ArrayList;
21+
import java.util.Arrays;
22+
import java.util.HashMap;
23+
import java.util.List;
24+
import java.util.Map;
25+
import java.util.stream.Collectors;
26+
27+
/**
28+
* Allure labels utils.
29+
*/
30+
final class Allure1Annotations {
31+
32+
private static final String SUITE_LABEL = "suite";
33+
34+
private final MethodSignature signature;
35+
36+
private final Object target;
37+
38+
private final Object[] args;
39+
40+
41+
Allure1Annotations(final Object target, final MethodSignature signature, final Object... args) {
42+
this.args = Arrays.copyOf(args, args.length);
43+
this.signature = signature;
44+
this.target = target;
45+
}
46+
47+
public void updateTitle(final TestResult result) {
48+
final Method method = getMethod();
49+
if (method.isAnnotationPresent(Title.class)) {
50+
final Title title = method.getAnnotation(Title.class);
51+
result.setName(title.value());
52+
}
53+
final Class<?> type = getType();
54+
if (type.isAnnotationPresent(Title.class)) {
55+
final Title title = type.getAnnotation(Title.class);
56+
final List<Label> labels = result.getLabels().stream()
57+
.filter(label -> !label.getName().equals(SUITE_LABEL))
58+
.collect(Collectors.toList());
59+
labels.add(new Label().withName(SUITE_LABEL).withValue(title.value()));
60+
result.setLabels(labels);
61+
}
62+
}
63+
64+
public void updateDescription(final TestResult result) {
65+
final Method method = getMethod();
66+
if (method.isAnnotationPresent(Description.class)) {
67+
final Description description = method.getAnnotation(Description.class);
68+
if (description.type().equals(DescriptionType.HTML)) {
69+
result.setDescriptionHtml(description.value());
70+
} else {
71+
result.setDescription(description.value());
72+
}
73+
}
74+
}
75+
76+
public void updateLabels(final TestResult result) {
77+
result.getLabels().addAll(getLabels());
78+
}
79+
80+
public void updateParameters(final TestResult result) {
81+
final Map<String, String> parameters = getParameters();
82+
result.getParameters().stream()
83+
.map(Parameter::getName)
84+
.filter(parameters::containsKey)
85+
.forEach(parameters::remove);
86+
parameters.forEach((n, v) -> result.getParameters().add(new Parameter().withName(n).withValue(v)));
87+
}
88+
89+
private Map<String, String> getParameters() {
90+
final Map<String, String> parameters = new HashMap<>();
91+
parameters.putAll(getMethodParameters());
92+
parameters.putAll(getClassParameters());
93+
return parameters;
94+
}
95+
96+
private Map<String, String> getMethodParameters() {
97+
final Map<String, String> parameters = new HashMap<>();
98+
final String[] names = signature.getParameterNames();
99+
for (int i = 0; i < names.length; i++) {
100+
parameters.put(names[i], args[i].toString());
101+
}
102+
return parameters;
103+
}
104+
105+
private Map<String, String> getClassParameters() {
106+
final List<Field> fields = FieldUtils.getFieldsListWithAnnotation(getType(),
107+
ru.yandex.qatools.allure.annotations.Parameter.class);
108+
109+
return fields.stream().collect(
110+
Collectors.toMap(Allure1Utils::getParameterName, f -> Allure1Utils.getParameterValue(f, target))
111+
);
112+
}
113+
114+
private Class<?> getType() {
115+
return signature.getMethod().getDeclaringClass();
116+
}
117+
118+
private Method getMethod() {
119+
return signature.getMethod();
120+
}
121+
122+
private List<Label> getLabels() {
123+
final Method method = getMethod();
124+
final List<Label> labels = new ArrayList<>();
125+
labels.addAll(Allure1Utils.getLabels(method, Severity.class, Allure1Utils::createLabels));
126+
labels.addAll(Allure1Utils.getLabels(method, TestCaseId.class, Allure1Utils::createLabels));
127+
labels.addAll(Allure1Utils.getLabels(method, Issue.class, Allure1Utils::createLabels));
128+
labels.addAll(Allure1Utils.getLabels(method, Issues.class, Allure1Utils::createLabels));
129+
labels.addAll(Allure1Utils.getLabels(method, Stories.class, Allure1Utils::createLabels));
130+
labels.addAll(Allure1Utils.getLabels(method, Features.class, Allure1Utils::createLabels));
131+
return labels;
132+
}
133+
134+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package io.qameta.allure.aspects;
2+
3+
import io.qameta.allure.Allure;
4+
import io.qameta.allure.AllureLifecycle;
5+
import org.aspectj.lang.JoinPoint;
6+
import org.aspectj.lang.annotation.AfterReturning;
7+
import org.aspectj.lang.annotation.Aspect;
8+
import org.aspectj.lang.annotation.Pointcut;
9+
import org.aspectj.lang.reflect.MethodSignature;
10+
import ru.yandex.qatools.allure.annotations.Attachment;
11+
12+
import java.nio.charset.StandardCharsets;
13+
import java.util.Objects;
14+
15+
/**
16+
* Aspects (AspectJ) for handling {@link Attachment}.
17+
*/
18+
@Aspect
19+
public class Allure1AttachAspects {
20+
21+
private static AllureLifecycle lifecycle;
22+
23+
/**
24+
* Pointcut for things annotated with {@link ru.yandex.qatools.allure.annotations.Attachment}.
25+
*/
26+
@Pointcut("@annotation(ru.yandex.qatools.allure.annotations.Attachment)")
27+
public void withAttachmentAnnotation() {
28+
//pointcut body, should be empty
29+
}
30+
31+
/**
32+
* Pointcut for any methods.
33+
*/
34+
@Pointcut("execution(* *(..))")
35+
public void anyMethod() {
36+
//pointcut body, should be empty
37+
}
38+
39+
/**
40+
* Process data returned from method annotated with {@link ru.yandex.qatools.allure.annotations.Attachment}
41+
* If returned data is not a byte array, then use toString() method, and get bytes from it using.
42+
*/
43+
@AfterReturning(pointcut = "anyMethod() && withAttachmentAnnotation()", returning = "result")
44+
public void attachment(final JoinPoint joinPoint, final Object result) {
45+
final MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
46+
final Attachment attachment = methodSignature.getMethod().getAnnotation(Attachment.class);
47+
48+
final String title = Allure1Utils.getTitle(
49+
attachment.value(),
50+
methodSignature.getName(),
51+
joinPoint.getThis(),
52+
joinPoint.getArgs()
53+
);
54+
55+
final byte[] bytes = (result instanceof byte[])
56+
? (byte[]) result : result.toString().getBytes(StandardCharsets.UTF_8);
57+
getLifecycle().addAttachment(title, attachment.type(), "", bytes);
58+
}
59+
60+
/**
61+
* For tests only.
62+
*/
63+
public static void setLifecycle(final AllureLifecycle lifecycle) {
64+
Allure1AttachAspects.lifecycle = lifecycle;
65+
}
66+
67+
public static AllureLifecycle getLifecycle() {
68+
if (Objects.isNull(lifecycle)) {
69+
lifecycle = Allure.getLifecycle();
70+
}
71+
return lifecycle;
72+
}
73+
74+
75+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package io.qameta.allure.aspects;
2+
3+
import io.qameta.allure.Allure;
4+
import io.qameta.allure.AllureLifecycle;
5+
import io.qameta.allure.model.Parameter;
6+
import io.qameta.allure.model.Status;
7+
import io.qameta.allure.model.StepResult;
8+
import org.aspectj.lang.JoinPoint;
9+
import org.aspectj.lang.annotation.AfterReturning;
10+
import org.aspectj.lang.annotation.AfterThrowing;
11+
import org.aspectj.lang.annotation.Aspect;
12+
import org.aspectj.lang.annotation.Before;
13+
import org.aspectj.lang.annotation.Pointcut;
14+
import org.aspectj.lang.reflect.MethodSignature;
15+
import ru.yandex.qatools.allure.annotations.Step;
16+
17+
import java.util.Objects;
18+
import java.util.UUID;
19+
import java.util.stream.IntStream;
20+
21+
import static io.qameta.allure.aspects.Allure1Utils.getName;
22+
import static io.qameta.allure.aspects.Allure1Utils.getTitle;
23+
import static io.qameta.allure.util.ResultsUtils.getStatus;
24+
import static io.qameta.allure.util.ResultsUtils.getStatusDetails;
25+
26+
/**
27+
* Aspects (AspectJ) for handling {@link Step}.
28+
*/
29+
@Aspect
30+
@SuppressWarnings("unused")
31+
public class Allure1StepsAspects {
32+
33+
private static AllureLifecycle lifecycle;
34+
35+
@Pointcut("@annotation(ru.yandex.qatools.allure.annotations.Step)")
36+
public void withStepAnnotation() {
37+
//pointcut body, should be empty
38+
}
39+
40+
@Pointcut("execution(* *(..))")
41+
public void anyMethod() {
42+
//pointcut body, should be empty
43+
}
44+
45+
@Before("anyMethod() && withStepAnnotation()")
46+
public void stepStart(final JoinPoint joinPoint) {
47+
final MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
48+
final String uuid = UUID.randomUUID().toString();
49+
final StepResult result = new StepResult()
50+
.withName(createTitle(joinPoint))
51+
.withParameters(getParameters(methodSignature, joinPoint.getArgs()));
52+
53+
getLifecycle().startStep(uuid, result);
54+
}
55+
56+
@AfterThrowing(pointcut = "anyMethod() && withStepAnnotation()", throwing = "e")
57+
public void stepFailed(final JoinPoint joinPoint, final Throwable e) {
58+
getLifecycle().updateStep(result -> result
59+
.withStatus(getStatus(e).orElse(Status.BROKEN))
60+
.withStatusDetails(getStatusDetails(e).orElse(null)));
61+
getLifecycle().stopStep();
62+
}
63+
64+
@AfterReturning(pointcut = "anyMethod() && withStepAnnotation()", returning = "result")
65+
public void stepStop(final JoinPoint joinPoint, final Object result) {
66+
getLifecycle().updateStep(step -> step.withStatus(Status.PASSED));
67+
getLifecycle().stopStep();
68+
}
69+
70+
public String createTitle(final JoinPoint joinPoint) {
71+
final MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
72+
final Step step = methodSignature.getMethod().getAnnotation(Step.class);
73+
return step.value().isEmpty()
74+
? getName(methodSignature.getName(), joinPoint.getArgs())
75+
: getTitle(step.value(), methodSignature.getName(), joinPoint.getThis(), joinPoint.getArgs());
76+
}
77+
78+
private static Parameter[] getParameters(final MethodSignature signature, final Object... args) {
79+
return IntStream.range(0, args.length).mapToObj(index -> {
80+
final String name = signature.getParameterNames()[index];
81+
final String value = Objects.toString(args[index]);
82+
return new Parameter().withName(name).withValue(value);
83+
}).toArray(Parameter[]::new);
84+
}
85+
86+
87+
/**
88+
* For tests only.
89+
*/
90+
public static void setLifecycle(final AllureLifecycle allure) {
91+
lifecycle = allure;
92+
}
93+
94+
public static AllureLifecycle getLifecycle() {
95+
if (Objects.isNull(lifecycle)) {
96+
lifecycle = Allure.getLifecycle();
97+
}
98+
return lifecycle;
99+
}
100+
101+
}

0 commit comments

Comments
 (0)