Skip to content

Commit ade0442

Browse files
committed
v3 part 2
1 parent 5858b25 commit ade0442

64 files changed

Lines changed: 4509 additions & 2328 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.idea/vcs.xml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

AGENTS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ Never create pull requests or push git branches without explicit confirmation fr
44

55
## Test Work
66

7-
Use [Allure Test Agent](docs/allure-test-agent.md) for test-related work in this repository.
7+
Use [Allure Agent Mode](docs/allure-agent-mode.md) for test-related work in this repository.
88

9-
- Read `docs/allure-test-agent.md` before designing, writing, reviewing, validating, debugging, or enriching tests.
10-
- Use the `$allure-test-agent` skill as the durable behavior guide when it is installed; this project file contains local commands and conventions.
9+
- Read `docs/allure-agent-mode.md` before designing, writing, reviewing, validating, debugging, or enriching tests.
10+
- Use the `$allure-agent-mode` skill as the durable behavior guide when it is installed; this project file contains local commands and conventions.
1111
- If a command executes tests and its result will be used for smoke checking, reasoning, review, coverage analysis, debugging, or a user-facing conclusion, run it through `allure agent`.
1212
- Use agent-mode execution for smoke checks too, even when the change is small or mechanical.
1313
- If agent output is missing or incomplete, debug that first and treat console-only conclusions as provisional.

allure-assertj/src/main/java/io/qameta/allure/assertj/AssertJChain.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
*/
1616
package io.qameta.allure.assertj;
1717

18+
import io.qameta.allure.AllureExternalKey;
1819
import io.qameta.allure.model.Stage;
1920
import io.qameta.allure.model.Status;
2021
import io.qameta.allure.model.StatusDetails;
2122
import io.qameta.allure.model.StepResult;
2223
import org.assertj.core.api.AbstractAssert;
2324

2425
import java.util.Optional;
25-
import java.util.UUID;
2626

2727
/**
2828
* Parent Allure step for one AssertJ assertion chain.
@@ -69,14 +69,14 @@ final class AssertJChain {
6969

7070
private static final String ASSERTJ_STEP_PREFIX = "assert ";
7171

72-
private final String uuid;
72+
private final AllureExternalKey key;
7373

7474
private final AbstractAssert<?, ?> assertion;
7575

7676
private final StepResult step;
7777

7878
AssertJChain(final AbstractAssert<?, ?> assertion, final String subject) {
79-
this.uuid = UUID.randomUUID().toString();
79+
this.key = AllureExternalKey.random(AllureAspectJ.class);
8080
this.assertion = assertion;
8181
this.step = new StepResult()
8282
.setName(chainName(subject))
@@ -86,8 +86,8 @@ final class AssertJChain {
8686
.setStop(System.currentTimeMillis());
8787
}
8888

89-
String getUuid() {
90-
return uuid;
89+
AllureExternalKey getKey() {
90+
return key;
9191
}
9292

9393
AbstractAssert<?, ?> getAssertion() {

allure-assertj/src/main/java/io/qameta/allure/assertj/AssertJRecorder.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,10 @@ private void attachChain(final AllureLifecycle lifecycle,
187187
final AssertJChain chain,
188188
final AssertJOperation parentOperation) {
189189
if (parentOperation == null) {
190-
lifecycle.startStep(chain.getUuid(), chain.getStep());
191-
lifecycle.stopStep(chain.getUuid());
190+
lifecycle.getCurrentExecutableKey().ifPresent(parent -> {
191+
lifecycle.startStep(parent, chain.getKey(), chain.getStep());
192+
lifecycle.stopStep(chain.getKey());
193+
});
192194
return;
193195
}
194196

allure-awaitility/src/main/java/io/qameta/allure/awaitility/AllureAwaitilityListener.java

Lines changed: 76 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
package io.qameta.allure.awaitility;
1717

1818
import io.qameta.allure.Allure;
19+
import io.qameta.allure.AllureExternalKey;
1920
import io.qameta.allure.AllureLifecycle;
21+
import io.qameta.allure.AttachmentOptions;
2022
import io.qameta.allure.model.Status;
2123
import io.qameta.allure.model.StepResult;
2224
import org.awaitility.Awaitility;
@@ -27,10 +29,10 @@
2729
import org.awaitility.core.StartEvaluationEvent;
2830
import org.awaitility.core.TimeoutEvent;
2931

32+
import java.io.ByteArrayInputStream;
3033
import java.io.PrintWriter;
3134
import java.io.StringWriter;
3235
import java.nio.charset.StandardCharsets;
33-
import java.util.UUID;
3436
import java.util.concurrent.TimeUnit;
3537

3638
import static java.util.concurrent.TimeUnit.MILLISECONDS;
@@ -74,7 +76,7 @@ public class AllureAwaitilityListener implements ConditionEvaluationListener<Obj
7476
private final String onTimeoutStepTextPattern;
7577
private final String onExceptionStepTextPattern;
7678

77-
private String currentConditionStepUUID;
79+
private AllureExternalKey currentConditionStepKey;
7880

7981
private static final InheritableThreadLocal<AllureLifecycle> LIFECYCLE = new InheritableThreadLocal<AllureLifecycle>() {
8082
@Override
@@ -134,17 +136,22 @@ public AllureAwaitilityListener setLogIgnoredExceptions(final boolean logging) {
134136
*/
135137
@Override
136138
public void beforeEvaluation(final StartEvaluationEvent<Object> startEvaluationEvent) {
137-
currentConditionStepUUID = UUID.randomUUID().toString();
138-
final String nameWoAlias = String.format(onStartStepTextPattern, startEvaluationEvent.getDescription());
139-
final String nameWithAlias = String.format(onStartStepTextPattern, startEvaluationEvent.getAlias());
140-
final String stepName = startEvaluationEvent.getAlias() != null ? nameWithAlias : nameWoAlias;
141-
getLifecycle().startStep(
142-
currentConditionStepUUID,
143-
new StepResult()
144-
.setName(stepName)
145-
.setDescription("Awaitility condition started")
146-
.setStatus(Status.FAILED)
147-
);
139+
currentConditionStepKey = null;
140+
getLifecycle().getCurrentExecutableKey().ifPresent(parent -> {
141+
final String nameWoAlias = String.format(onStartStepTextPattern, startEvaluationEvent.getDescription());
142+
final String nameWithAlias = String.format(onStartStepTextPattern, startEvaluationEvent.getAlias());
143+
final String stepName = startEvaluationEvent.getAlias() != null ? nameWithAlias : nameWoAlias;
144+
final AllureExternalKey conditionStepKey = AllureExternalKey.random(AllureAwaitilityListener.class);
145+
currentConditionStepKey = conditionStepKey;
146+
getLifecycle().startStep(
147+
parent,
148+
conditionStepKey,
149+
new StepResult()
150+
.setName(stepName)
151+
.setDescription("Awaitility condition started")
152+
.setStatus(Status.FAILED)
153+
);
154+
});
148155
}
149156

150157
/**
@@ -154,19 +161,20 @@ public void beforeEvaluation(final StartEvaluationEvent<Object> startEvaluationE
154161
*/
155162
@Override
156163
public void onTimeout(final TimeoutEvent timeoutEvent) {
157-
getLifecycle().updateStep(awaitilityCondition -> {
158-
final String currentTimeoutStepUUID = UUID.randomUUID().toString();
159-
getLifecycle().startStep(
160-
currentConditionStepUUID,
161-
currentTimeoutStepUUID,
162-
new StepResult()
163-
.setName(String.format(onTimeoutStepTextPattern, timeoutEvent.getDescription()))
164-
.setDescription("Awaitility condition timeout")
165-
.setStatus(Status.BROKEN)
166-
);
167-
getLifecycle().stopStep(currentTimeoutStepUUID);
168-
});
169-
getLifecycle().stopStep(currentConditionStepUUID);
164+
if (currentConditionStepKey == null) {
165+
return;
166+
}
167+
final AllureExternalKey timeoutStepKey = AllureExternalKey.random(AllureAwaitilityListener.class);
168+
getLifecycle().startStep(
169+
currentConditionStepKey,
170+
timeoutStepKey,
171+
new StepResult()
172+
.setName(String.format(onTimeoutStepTextPattern, timeoutEvent.getDescription()))
173+
.setDescription("Awaitility condition timeout")
174+
.setStatus(Status.BROKEN)
175+
);
176+
getLifecycle().stopStep(timeoutStepKey);
177+
getLifecycle().stopStep(currentConditionStepKey);
170178
}
171179

172180
/**
@@ -191,22 +199,25 @@ public void conditionEvaluated(final EvaluatedCondition<Object> condition) {
191199
new TemporalDuration(condition.getPollInterval())
192200
);
193201

194-
getLifecycle().updateStep(awaitilityCondition -> {
195-
final String lastAwaitStepUUID = UUID.randomUUID().toString();
196-
getLifecycle().startStep(
197-
currentConditionStepUUID,
198-
lastAwaitStepUUID,
199-
new StepResult()
200-
.setName(message)
201-
.setDescription("Awaitility condition satisfied or not, but awaiting still in progress")
202-
.setStatus(Status.PASSED)
202+
if (currentConditionStepKey == null) {
203+
return;
204+
}
205+
final AllureExternalKey lastAwaitStepKey = AllureExternalKey.random(AllureAwaitilityListener.class);
206+
getLifecycle().startStep(
207+
currentConditionStepKey,
208+
lastAwaitStepKey,
209+
new StepResult()
210+
.setName(message)
211+
.setDescription("Awaitility condition satisfied or not, but awaiting still in progress")
212+
.setStatus(Status.PASSED)
213+
);
214+
getLifecycle().stopStep(lastAwaitStepKey);
215+
if (condition.isSatisfied()) {
216+
getLifecycle().updateStep(
217+
currentConditionStepKey, awaitilityCondition -> awaitilityCondition.setStatus(Status.PASSED)
203218
);
204-
getLifecycle().stopStep(lastAwaitStepUUID);
205-
if (condition.isSatisfied()) {
206-
awaitilityCondition.setStatus(Status.PASSED);
207-
getLifecycle().stopStep(currentConditionStepUUID);
208-
}
209-
});
219+
getLifecycle().stopStep(currentConditionStepKey);
220+
}
210221
}
211222

212223
/**
@@ -224,29 +235,30 @@ public void conditionEvaluated(final EvaluatedCondition<Object> condition) {
224235
*/
225236
@Override
226237
public void exceptionIgnored(final IgnoredException ignoredException) {
227-
if (logIgnoredExceptions) {
228-
getLifecycle().updateStep(awaitilityCondition -> {
229-
final String currentExceptionIgnoredStepUUID = UUID.randomUUID().toString();
230-
final String message = String.format(
231-
onExceptionStepTextPattern, ignoredException.getThrowable().getMessage()
232-
);
233-
final StringWriter stringWriter = new StringWriter();
234-
ignoredException.getThrowable().printStackTrace(new PrintWriter(stringWriter));
235-
final String stackTrace = stringWriter.toString();
236-
getLifecycle().startStep(
237-
currentConditionStepUUID,
238-
currentExceptionIgnoredStepUUID,
239-
new StepResult()
240-
.setName(message)
241-
.setDescription("Exception occurred and ignored, but awaiting still in progress")
242-
.setStatus(Status.SKIPPED)
243-
);
244-
getLifecycle().addAttachment(
245-
ignoredException.getThrowable().getMessage(), "text/plain", ".txt",
246-
stackTrace.getBytes(StandardCharsets.UTF_8)
247-
);
248-
getLifecycle().stopStep(currentExceptionIgnoredStepUUID);
249-
});
238+
if (logIgnoredExceptions && currentConditionStepKey != null) {
239+
final AllureExternalKey exceptionIgnoredStepKey = AllureExternalKey.random(AllureAwaitilityListener.class);
240+
final String message = String.format(
241+
onExceptionStepTextPattern, ignoredException.getThrowable().getMessage()
242+
);
243+
final StringWriter stringWriter = new StringWriter();
244+
ignoredException.getThrowable().printStackTrace(new PrintWriter(stringWriter));
245+
final String stackTrace = stringWriter.toString();
246+
getLifecycle().startStep(
247+
currentConditionStepKey,
248+
exceptionIgnoredStepKey,
249+
new StepResult()
250+
.setName(message)
251+
.setDescription("Exception occurred and ignored, but awaiting still in progress")
252+
.setStatus(Status.SKIPPED)
253+
);
254+
getLifecycle().addAttachment(
255+
exceptionIgnoredStepKey,
256+
ignoredException.getThrowable().getMessage(),
257+
"text/plain",
258+
new ByteArrayInputStream(stackTrace.getBytes(StandardCharsets.UTF_8)),
259+
AttachmentOptions.empty()
260+
);
261+
getLifecycle().stopStep(exceptionIgnoredStepKey);
250262
}
251263
}
252264

0 commit comments

Comments
 (0)