@e2edev/e2e 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +104 -0
- package/dist/agent/act-validation.d.ts +27 -0
- package/dist/agent/act-validation.d.ts.map +1 -0
- package/dist/agent/act-validation.js +121 -0
- package/dist/agent/act-validation.js.map +1 -0
- package/dist/agent/act.d.ts +27 -0
- package/dist/agent/act.d.ts.map +1 -0
- package/dist/agent/act.js +775 -0
- package/dist/agent/act.js.map +1 -0
- package/dist/agent/actions.d.ts +66 -0
- package/dist/agent/actions.d.ts.map +1 -0
- package/dist/agent/actions.js +82 -0
- package/dist/agent/actions.js.map +1 -0
- package/dist/agent/ai-sdk.d.ts +16 -0
- package/dist/agent/ai-sdk.d.ts.map +1 -0
- package/dist/agent/ai-sdk.js +59 -0
- package/dist/agent/ai-sdk.js.map +1 -0
- package/dist/agent/call-options.d.ts +10 -0
- package/dist/agent/call-options.d.ts.map +1 -0
- package/dist/agent/call-options.js +28 -0
- package/dist/agent/call-options.js.map +1 -0
- package/dist/agent/default-agent.d.ts +22 -0
- package/dist/agent/default-agent.d.ts.map +1 -0
- package/dist/agent/default-agent.js +354 -0
- package/dist/agent/default-agent.js.map +1 -0
- package/dist/agent/error.d.ts +53 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +94 -0
- package/dist/agent/error.js.map +1 -0
- package/dist/agent/executor.d.ts +238 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +56 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/agent/index.d.ts +15 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +304 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/invocation.d.ts +194 -0
- package/dist/agent/invocation.d.ts.map +1 -0
- package/dist/agent/invocation.js +389 -0
- package/dist/agent/invocation.js.map +1 -0
- package/dist/agent/ledger.d.ts +24 -0
- package/dist/agent/ledger.d.ts.map +1 -0
- package/dist/agent/ledger.js +48 -0
- package/dist/agent/ledger.js.map +1 -0
- package/dist/agent/loop-guards.d.ts +35 -0
- package/dist/agent/loop-guards.d.ts.map +1 -0
- package/dist/agent/loop-guards.js +110 -0
- package/dist/agent/loop-guards.js.map +1 -0
- package/dist/agent/model/adapter.d.ts +97 -0
- package/dist/agent/model/adapter.d.ts.map +1 -0
- package/dist/agent/model/adapter.js +40 -0
- package/dist/agent/model/adapter.js.map +1 -0
- package/dist/agent/model/router.d.ts +36 -0
- package/dist/agent/model/router.d.ts.map +1 -0
- package/dist/agent/model/router.js +45 -0
- package/dist/agent/model/router.js.map +1 -0
- package/dist/agent/model/schema.d.ts +16 -0
- package/dist/agent/model/schema.d.ts.map +1 -0
- package/dist/agent/model/schema.js +37 -0
- package/dist/agent/model/schema.js.map +1 -0
- package/dist/agent/model/sdk.d.ts +28 -0
- package/dist/agent/model/sdk.d.ts.map +1 -0
- package/dist/agent/model/sdk.js +258 -0
- package/dist/agent/model/sdk.js.map +1 -0
- package/dist/agent/observation.d.ts +70 -0
- package/dist/agent/observation.d.ts.map +1 -0
- package/dist/agent/observation.js +174 -0
- package/dist/agent/observation.js.map +1 -0
- package/dist/agent/phases.d.ts +71 -0
- package/dist/agent/phases.d.ts.map +1 -0
- package/dist/agent/phases.js +124 -0
- package/dist/agent/phases.js.map +1 -0
- package/dist/agent/prompts.d.ts +40 -0
- package/dist/agent/prompts.d.ts.map +1 -0
- package/dist/agent/prompts.js +104 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/protocol.d.ts +31 -0
- package/dist/agent/protocol.d.ts.map +1 -0
- package/dist/agent/protocol.js +67 -0
- package/dist/agent/protocol.js.map +1 -0
- package/dist/agent/public.d.ts +12 -0
- package/dist/agent/public.d.ts.map +1 -0
- package/dist/agent/public.js +12 -0
- package/dist/agent/public.js.map +1 -0
- package/dist/agent/replay.d.ts +61 -0
- package/dist/agent/replay.d.ts.map +1 -0
- package/dist/agent/replay.js +185 -0
- package/dist/agent/replay.js.map +1 -0
- package/dist/agent/secrets.d.ts +22 -0
- package/dist/agent/secrets.d.ts.map +1 -0
- package/dist/agent/secrets.js +63 -0
- package/dist/agent/secrets.js.map +1 -0
- package/dist/agent/step-cache.d.ts +156 -0
- package/dist/agent/step-cache.d.ts.map +1 -0
- package/dist/agent/step-cache.js +301 -0
- package/dist/agent/step-cache.js.map +1 -0
- package/dist/agent/tool-loop.d.ts +51 -0
- package/dist/agent/tool-loop.d.ts.map +1 -0
- package/dist/agent/tool-loop.js +331 -0
- package/dist/agent/tool-loop.js.map +1 -0
- package/dist/agent/tool.d.ts +39 -0
- package/dist/agent/tool.d.ts.map +1 -0
- package/dist/agent/tool.js +52 -0
- package/dist/agent/tool.js.map +1 -0
- package/dist/backend/contract.d.ts +186 -0
- package/dist/backend/contract.d.ts.map +1 -0
- package/dist/backend/contract.js +65 -0
- package/dist/backend/contract.js.map +1 -0
- package/dist/backend/index.d.ts +316 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +219 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/session.d.ts +23 -0
- package/dist/backend/session.d.ts.map +1 -0
- package/dist/backend/session.js +213 -0
- package/dist/backend/session.js.map +1 -0
- package/dist/backend/surface.d.ts +83 -0
- package/dist/backend/surface.d.ts.map +1 -0
- package/dist/backend/surface.js +11 -0
- package/dist/backend/surface.js.map +1 -0
- package/dist/cache/anchors.d.ts +37 -0
- package/dist/cache/anchors.d.ts.map +1 -0
- package/dist/cache/anchors.js +89 -0
- package/dist/cache/anchors.js.map +1 -0
- package/dist/cache/context.d.ts +74 -0
- package/dist/cache/context.d.ts.map +1 -0
- package/dist/cache/context.js +82 -0
- package/dist/cache/context.js.map +1 -0
- package/dist/cache/decide.d.ts +42 -0
- package/dist/cache/decide.d.ts.map +1 -0
- package/dist/cache/decide.js +47 -0
- package/dist/cache/decide.js.map +1 -0
- package/dist/cache/identity.d.ts +113 -0
- package/dist/cache/identity.d.ts.map +1 -0
- package/dist/cache/identity.js +109 -0
- package/dist/cache/identity.js.map +1 -0
- package/dist/cache/recorder.d.ts +76 -0
- package/dist/cache/recorder.d.ts.map +1 -0
- package/dist/cache/recorder.js +143 -0
- package/dist/cache/recorder.js.map +1 -0
- package/dist/cache/relocate.d.ts +69 -0
- package/dist/cache/relocate.d.ts.map +1 -0
- package/dist/cache/relocate.js +125 -0
- package/dist/cache/relocate.js.map +1 -0
- package/dist/cache/store.d.ts +68 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +106 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/trace.d.ts +146 -0
- package/dist/cache/trace.d.ts.map +1 -0
- package/dist/cache/trace.js +249 -0
- package/dist/cache/trace.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +4 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +108 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +6 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +101 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/collect/collect.d.ts +44 -0
- package/dist/collect/collect.d.ts.map +1 -0
- package/dist/collect/collect.js +89 -0
- package/dist/collect/collect.js.map +1 -0
- package/dist/collect/registry.d.ts +47 -0
- package/dist/collect/registry.d.ts.map +1 -0
- package/dist/collect/registry.js +262 -0
- package/dist/collect/registry.js.map +1 -0
- package/dist/collect/select.d.ts +54 -0
- package/dist/collect/select.d.ts.map +1 -0
- package/dist/collect/select.js +230 -0
- package/dist/collect/select.js.map +1 -0
- package/dist/config/agent.d.ts +91 -0
- package/dist/config/agent.d.ts.map +1 -0
- package/dist/config/agent.js +232 -0
- package/dist/config/agent.js.map +1 -0
- package/dist/config/load.d.ts +23 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +75 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/resolve.d.ts +94 -0
- package/dist/config/resolve.d.ts.map +1 -0
- package/dist/config/resolve.js +500 -0
- package/dist/config/resolve.js.map +1 -0
- package/dist/config/validate.d.ts +6 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/validate.js +21 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/credentials.d.ts +7 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +42 -0
- package/dist/credentials.js.map +1 -0
- package/dist/expect/async.d.ts +5 -0
- package/dist/expect/async.d.ts.map +1 -0
- package/dist/expect/async.js +186 -0
- package/dist/expect/async.js.map +1 -0
- package/dist/expect/index.d.ts +7 -0
- package/dist/expect/index.d.ts.map +1 -0
- package/dist/expect/index.js +23 -0
- package/dist/expect/index.js.map +1 -0
- package/dist/expect/values.d.ts +4 -0
- package/dist/expect/values.d.ts.map +1 -0
- package/dist/expect/values.js +108 -0
- package/dist/expect/values.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/ai-trace.d.ts +151 -0
- package/dist/internal/ai-trace.d.ts.map +1 -0
- package/dist/internal/ai-trace.js +360 -0
- package/dist/internal/ai-trace.js.map +1 -0
- package/dist/internal/brands.d.ts +9 -0
- package/dist/internal/brands.d.ts.map +1 -0
- package/dist/internal/brands.js +9 -0
- package/dist/internal/brands.js.map +1 -0
- package/dist/internal/debug.d.ts +43 -0
- package/dist/internal/debug.d.ts.map +1 -0
- package/dist/internal/debug.js +102 -0
- package/dist/internal/debug.js.map +1 -0
- package/dist/internal/errors.d.ts +98 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +212 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/globs.d.ts +29 -0
- package/dist/internal/globs.d.ts.map +1 -0
- package/dist/internal/globs.js +126 -0
- package/dist/internal/globs.js.map +1 -0
- package/dist/internal/ids.d.ts +32 -0
- package/dist/internal/ids.d.ts.map +1 -0
- package/dist/internal/ids.js +124 -0
- package/dist/internal/ids.js.map +1 -0
- package/dist/internal/json-value.d.ts +15 -0
- package/dist/internal/json-value.d.ts.map +1 -0
- package/dist/internal/json-value.js +61 -0
- package/dist/internal/json-value.js.map +1 -0
- package/dist/internal/package-version.d.ts +6 -0
- package/dist/internal/package-version.d.ts.map +1 -0
- package/dist/internal/package-version.js +14 -0
- package/dist/internal/package-version.js.map +1 -0
- package/dist/internal/realm-slot.d.ts +13 -0
- package/dist/internal/realm-slot.d.ts.map +1 -0
- package/dist/internal/realm-slot.js +23 -0
- package/dist/internal/realm-slot.js.map +1 -0
- package/dist/internal/redact.d.ts +33 -0
- package/dist/internal/redact.d.ts.map +1 -0
- package/dist/internal/redact.js +56 -0
- package/dist/internal/redact.js.map +1 -0
- package/dist/internal/regexp.d.ts +10 -0
- package/dist/internal/regexp.d.ts.map +1 -0
- package/dist/internal/regexp.js +27 -0
- package/dist/internal/regexp.js.map +1 -0
- package/dist/internal/text.d.ts +39 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +66 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/time.d.ts +37 -0
- package/dist/internal/time.d.ts.map +1 -0
- package/dist/internal/time.js +91 -0
- package/dist/internal/time.js.map +1 -0
- package/dist/internal/trace.d.ts +18 -0
- package/dist/internal/trace.d.ts.map +1 -0
- package/dist/internal/trace.js +46 -0
- package/dist/internal/trace.js.map +1 -0
- package/dist/internal/urls.d.ts +31 -0
- package/dist/internal/urls.d.ts.map +1 -0
- package/dist/internal/urls.js +95 -0
- package/dist/internal/urls.js.map +1 -0
- package/dist/locator/engine.d.ts +65 -0
- package/dist/locator/engine.d.ts.map +1 -0
- package/dist/locator/engine.js +164 -0
- package/dist/locator/engine.js.map +1 -0
- package/dist/locator/expression.d.ts +19 -0
- package/dist/locator/expression.d.ts.map +1 -0
- package/dist/locator/expression.js +85 -0
- package/dist/locator/expression.js.map +1 -0
- package/dist/locator/screen.d.ts +36 -0
- package/dist/locator/screen.d.ts.map +1 -0
- package/dist/locator/screen.js +281 -0
- package/dist/locator/screen.js.map +1 -0
- package/dist/report/build.d.ts +214 -0
- package/dist/report/build.d.ts.map +1 -0
- package/dist/report/build.js +346 -0
- package/dist/report/build.js.map +1 -0
- package/dist/report/code-frame.d.ts +20 -0
- package/dist/report/code-frame.d.ts.map +1 -0
- package/dist/report/code-frame.js +73 -0
- package/dist/report/code-frame.js.map +1 -0
- package/dist/report/debug-steps.d.ts +14 -0
- package/dist/report/debug-steps.d.ts.map +1 -0
- package/dist/report/debug-steps.js +85 -0
- package/dist/report/debug-steps.js.map +1 -0
- package/dist/report/list.d.ts +80 -0
- package/dist/report/list.d.ts.map +1 -0
- package/dist/report/list.js +372 -0
- package/dist/report/list.js.map +1 -0
- package/dist/report/live-status.d.ts +51 -0
- package/dist/report/live-status.d.ts.map +1 -0
- package/dist/report/live-status.js +162 -0
- package/dist/report/live-status.js.map +1 -0
- package/dist/report/write.d.ts +4 -0
- package/dist/report/write.d.ts.map +1 -0
- package/dist/report/write.js +13 -0
- package/dist/report/write.js.map +1 -0
- package/dist/run/app-process.d.ts +18 -0
- package/dist/run/app-process.d.ts.map +1 -0
- package/dist/run/app-process.js +112 -0
- package/dist/run/app-process.js.map +1 -0
- package/dist/run/artifacts.d.ts +51 -0
- package/dist/run/artifacts.d.ts.map +1 -0
- package/dist/run/artifacts.js +114 -0
- package/dist/run/artifacts.js.map +1 -0
- package/dist/run/events.d.ts +100 -0
- package/dist/run/events.d.ts.map +1 -0
- package/dist/run/events.js +59 -0
- package/dist/run/events.js.map +1 -0
- package/dist/run/execute.d.ts +119 -0
- package/dist/run/execute.d.ts.map +1 -0
- package/dist/run/execute.js +555 -0
- package/dist/run/execute.js.map +1 -0
- package/dist/run/fixtures.d.ts +40 -0
- package/dist/run/fixtures.d.ts.map +1 -0
- package/dist/run/fixtures.js +408 -0
- package/dist/run/fixtures.js.map +1 -0
- package/dist/run/in-process.d.ts +24 -0
- package/dist/run/in-process.d.ts.map +1 -0
- package/dist/run/in-process.js +120 -0
- package/dist/run/in-process.js.map +1 -0
- package/dist/run/public.d.ts +19 -0
- package/dist/run/public.d.ts.map +1 -0
- package/dist/run/public.js +11 -0
- package/dist/run/public.js.map +1 -0
- package/dist/run/realm.d.ts +52 -0
- package/dist/run/realm.d.ts.map +1 -0
- package/dist/run/realm.js +101 -0
- package/dist/run/realm.js.map +1 -0
- package/dist/run/records.d.ts +87 -0
- package/dist/run/records.d.ts.map +1 -0
- package/dist/run/records.js +3 -0
- package/dist/run/records.js.map +1 -0
- package/dist/run/retry.d.ts +18 -0
- package/dist/run/retry.d.ts.map +1 -0
- package/dist/run/retry.js +33 -0
- package/dist/run/retry.js.map +1 -0
- package/dist/run/runner.d.ts +49 -0
- package/dist/run/runner.d.ts.map +1 -0
- package/dist/run/runner.js +375 -0
- package/dist/run/runner.js.map +1 -0
- package/dist/run/scheduler.d.ts +45 -0
- package/dist/run/scheduler.d.ts.map +1 -0
- package/dist/run/scheduler.js +512 -0
- package/dist/run/scheduler.js.map +1 -0
- package/dist/run/serial.d.ts +52 -0
- package/dist/run/serial.d.ts.map +1 -0
- package/dist/run/serial.js +247 -0
- package/dist/run/serial.js.map +1 -0
- package/dist/run/sessions.d.ts +54 -0
- package/dist/run/sessions.d.ts.map +1 -0
- package/dist/run/sessions.js +221 -0
- package/dist/run/sessions.js.map +1 -0
- package/dist/run/steps.d.ts +196 -0
- package/dist/run/steps.d.ts.map +1 -0
- package/dist/run/steps.js +151 -0
- package/dist/run/steps.js.map +1 -0
- package/dist/run/unit-runner.d.ts +30 -0
- package/dist/run/unit-runner.d.ts.map +1 -0
- package/dist/run/unit-runner.js +11 -0
- package/dist/run/unit-runner.js.map +1 -0
- package/dist/run/units.d.ts +50 -0
- package/dist/run/units.d.ts.map +1 -0
- package/dist/run/units.js +103 -0
- package/dist/run/units.js.map +1 -0
- package/dist/run/worker/entry.d.ts +8 -0
- package/dist/run/worker/entry.d.ts.map +1 -0
- package/dist/run/worker/entry.js +137 -0
- package/dist/run/worker/entry.js.map +1 -0
- package/dist/run/worker/handle.d.ts +10 -0
- package/dist/run/worker/handle.d.ts.map +1 -0
- package/dist/run/worker/handle.js +74 -0
- package/dist/run/worker/handle.js.map +1 -0
- package/dist/run/worker/protocol.d.ts +129 -0
- package/dist/run/worker/protocol.d.ts.map +1 -0
- package/dist/run/worker/protocol.js +18 -0
- package/dist/run/worker/protocol.js.map +1 -0
- package/dist/run/worker/session.d.ts +69 -0
- package/dist/run/worker/session.d.ts.map +1 -0
- package/dist/run/worker/session.js +123 -0
- package/dist/run/worker/session.js.map +1 -0
- package/dist/types.d.ts +630 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
/** Test-target execution engine (spec 11-lifecycle.md). */
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { classifyError, ConfigurationError, E2EError, InfrastructureError, serializeError, TestTimeoutError, translateBackendError, } from '../internal/errors.js';
|
|
4
|
+
import { withAiTraceScope } from '../internal/ai-trace.js';
|
|
5
|
+
import { DebugTrace } from '../internal/debug.js';
|
|
6
|
+
import { canonicalDigest, timestamp, uuidv7 } from '../internal/ids.js';
|
|
7
|
+
import { Deadline, withTimeout } from '../internal/time.js';
|
|
8
|
+
import { createAgentCacheContext, flushStagedTraces } from '../cache/context.js';
|
|
9
|
+
import { createAttemptArtifacts, sanitizePathSegment } from './artifacts.js';
|
|
10
|
+
import { BACKEND_SPI_VERSION } from '../backend/contract.js';
|
|
11
|
+
import { createBackendSession } from '../backend/session.js';
|
|
12
|
+
import { createFixtures } from './fixtures.js';
|
|
13
|
+
import { findRegistered, RealmManager } from './realm.js';
|
|
14
|
+
import { runWithRetries } from './retry.js';
|
|
15
|
+
import { runSerialUnit } from './serial.js';
|
|
16
|
+
import { INTERRUPTED_BEFORE_START, pairResult, unstartedResult } from './units.js';
|
|
17
|
+
import { SessionStaging, SessionStore } from './sessions.js';
|
|
18
|
+
import { StepRecorder } from './steps.js';
|
|
19
|
+
/** Signal for operations that only end when they finish, such as cleanup. */
|
|
20
|
+
const NEVER_ABORTS = new AbortController().signal;
|
|
21
|
+
/** Executes every selected pair for one target sequentially. */
|
|
22
|
+
export class TargetExecutor {
|
|
23
|
+
options;
|
|
24
|
+
target;
|
|
25
|
+
get runId() {
|
|
26
|
+
return this.options.runId;
|
|
27
|
+
}
|
|
28
|
+
get artifactStore() {
|
|
29
|
+
return this.config.artifactStore;
|
|
30
|
+
}
|
|
31
|
+
artifactsRoot;
|
|
32
|
+
interruptSignal;
|
|
33
|
+
realms;
|
|
34
|
+
debug;
|
|
35
|
+
runErrors = [];
|
|
36
|
+
sessionIdentity;
|
|
37
|
+
/** Resolves once the backend's init hook completed for this worker. */
|
|
38
|
+
backendReady;
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.options = options;
|
|
41
|
+
this.target = options.target;
|
|
42
|
+
this.artifactsRoot = options.artifactsRoot;
|
|
43
|
+
this.interruptSignal = options.interruptSignal;
|
|
44
|
+
this.debug = options.debug ?? new DebugTrace(false);
|
|
45
|
+
this.realms = new RealmManager({
|
|
46
|
+
targetName: options.target.name,
|
|
47
|
+
platform: options.target.platform,
|
|
48
|
+
timeout: options.config.timeout,
|
|
49
|
+
cleanupTimeout: options.config.cleanupTimeout,
|
|
50
|
+
runErrors: this.runErrors,
|
|
51
|
+
debug: this.debug,
|
|
52
|
+
});
|
|
53
|
+
this.sessionIdentity = {
|
|
54
|
+
targetId: options.target.name,
|
|
55
|
+
// Session and cache identity comes from the backend declaration, so a
|
|
56
|
+
// backend swap never restores another backend's state.
|
|
57
|
+
backendName: options.target.backend?.name ?? 'none',
|
|
58
|
+
backendVersion: options.target.backend?.version ?? 'unversioned',
|
|
59
|
+
spiVersion: options.target.backend?.spiVersion ?? BACKEND_SPI_VERSION,
|
|
60
|
+
platform: options.target.platform,
|
|
61
|
+
// An explicit `app.identity` replaces the origin, so an ephemeral
|
|
62
|
+
// per-deploy origin (a PR preview) shares cache and session identity
|
|
63
|
+
// with the app it is a deployment of. The environment always joins the
|
|
64
|
+
// digest: an identity must never bleed entries across environments.
|
|
65
|
+
appIdentity: canonicalDigest(options.config.app.identity === undefined
|
|
66
|
+
? {
|
|
67
|
+
origin: options.config.app.base.origin,
|
|
68
|
+
basePath: options.config.app.base.basePath,
|
|
69
|
+
environment: options.config.app.environment,
|
|
70
|
+
}
|
|
71
|
+
: {
|
|
72
|
+
identity: options.config.app.identity,
|
|
73
|
+
environment: options.config.app.environment,
|
|
74
|
+
}),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
get config() {
|
|
78
|
+
return this.options.config;
|
|
79
|
+
}
|
|
80
|
+
/** Emits one final result record (SerialHost). Records are not retained. */
|
|
81
|
+
emit(result) {
|
|
82
|
+
this.options.events?.onResult?.(result);
|
|
83
|
+
}
|
|
84
|
+
/** Builds one backend operation context. */
|
|
85
|
+
op(attemptId, timeoutMs, signal) {
|
|
86
|
+
return { signal, timeoutMs, runId: this.options.runId, attemptId };
|
|
87
|
+
}
|
|
88
|
+
/** Run-level errors recorded so far, in order. */
|
|
89
|
+
collectedRunErrors() {
|
|
90
|
+
return this.runErrors;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Runs the backend's init hook once per worker, before the first session.
|
|
94
|
+
* Boot work (simulators, device leases) is bounded by the launch timeout
|
|
95
|
+
* but never charged against a step budget.
|
|
96
|
+
*/
|
|
97
|
+
initBackendOnce() {
|
|
98
|
+
const backend = this.target.backend;
|
|
99
|
+
const init = backend?.init?.bind(backend);
|
|
100
|
+
if (init === undefined)
|
|
101
|
+
return Promise.resolve();
|
|
102
|
+
// Memoized for the worker's lifetime, failure included: a backend that
|
|
103
|
+
// could not boot fails every attempt on this worker with the same cause
|
|
104
|
+
// instead of re-running a broken boot per test. Init outlives any single
|
|
105
|
+
// attempt, so it aborts on worker interrupt, not on one test's deadline.
|
|
106
|
+
this.backendReady ??= this.debug.time('backend.init', () => this.lifecycle(`initializing backend ${backend?.name ?? 'none'}`, this.config.launchTimeout, 'LAUNCH_TIMEOUT', this.interruptSignal, (signal) => init({
|
|
107
|
+
runId: this.options.runId,
|
|
108
|
+
targetName: this.target.name,
|
|
109
|
+
app: {
|
|
110
|
+
...(this.config.app.configured ? { baseUrl: this.config.app.base.href } : {}),
|
|
111
|
+
allowedOrigins: this.config.app.allowedOrigins,
|
|
112
|
+
},
|
|
113
|
+
testIdAttribute: this.config.testIdAttribute,
|
|
114
|
+
headed: this.options.headed,
|
|
115
|
+
signal,
|
|
116
|
+
})));
|
|
117
|
+
return this.backendReady;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Runs one lifecycle call on the backend seam within the given budget. The
|
|
121
|
+
* signal handed to `run` follows `parent` and is aborted the moment the call
|
|
122
|
+
* fails, timeout included, so a hook that outlived its budget is told to
|
|
123
|
+
* stop instead of running on into the retry. Synchronous throws are caught,
|
|
124
|
+
* and every failure is translated onto the runner taxonomy: a backend
|
|
125
|
+
* failing outside its contract is infrastructure, never a test error.
|
|
126
|
+
*/
|
|
127
|
+
async lifecycle(label, timeoutMs, code, parent, run) {
|
|
128
|
+
const scope = new AbortController();
|
|
129
|
+
try {
|
|
130
|
+
return await withTimeout(Promise.resolve().then(() => run(AbortSignal.any([parent, scope.signal]))), timeoutMs, () => new InfrastructureError(code, `${label} timed out`));
|
|
131
|
+
}
|
|
132
|
+
catch (cause) {
|
|
133
|
+
scope.abort();
|
|
134
|
+
throw translateBackendError(cause, ` while ${label}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Disposes the backend at worker end of life, bounded by the cleanup budget.
|
|
139
|
+
* Runs whether or not `init` did: a backend may hold resources it acquired
|
|
140
|
+
* lazily, and the contract makes `dispose` safe to call on a cold backend.
|
|
141
|
+
*/
|
|
142
|
+
async dispose() {
|
|
143
|
+
const disposeBackend = this.target.backend?.dispose?.bind(this.target.backend);
|
|
144
|
+
if (disposeBackend === undefined)
|
|
145
|
+
return;
|
|
146
|
+
try {
|
|
147
|
+
await this.lifecycle('disposing the backend', this.config.cleanupTimeout, 'CLEANUP_TIMEOUT', NEVER_ABORTS, (signal) => disposeBackend({ signal, timeoutMs: this.config.cleanupTimeout }));
|
|
148
|
+
}
|
|
149
|
+
catch (cause) {
|
|
150
|
+
this.runErrors.push({ error: serializeError(classifyError(cause), { phase: 'cleanup' }) });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Runs one file-target unit: runnable pairs of a single file, in declaration
|
|
155
|
+
* order, sharing a realm between passing non-serial tests (spec
|
|
156
|
+
* 11-lifecycle.md). Dispatch-time gating (selection dispositions and
|
|
157
|
+
* setup-failure dependencies) belongs to the scheduler, so every pair
|
|
158
|
+
* reaching here is runnable.
|
|
159
|
+
*/
|
|
160
|
+
async runFileUnit(file, filePairs, freshRegistration) {
|
|
161
|
+
const executedSerialUnits = new Set();
|
|
162
|
+
const ordered = filePairs.toSorted((a, b) => a.test.declarationIndex - b.test.declarationIndex);
|
|
163
|
+
let realm = freshRegistration === undefined ? null : this.realms.adopt(freshRegistration);
|
|
164
|
+
for (const pair of ordered) {
|
|
165
|
+
if (this.interruptSignal.aborted) {
|
|
166
|
+
this.emit(unstartedResult(pair, INTERRUPTED_BEFORE_START));
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (pair.test.serialId !== undefined) {
|
|
170
|
+
if (!executedSerialUnits.has(pair.test.serialId)) {
|
|
171
|
+
executedSerialUnits.add(pair.test.serialId);
|
|
172
|
+
const members = ordered.filter((member) => member.test.serialId === pair.test.serialId);
|
|
173
|
+
this.options.events?.onPairStart?.(pair);
|
|
174
|
+
// A serial group owns its realm; whatever realm ordinary tests were
|
|
175
|
+
// sharing ends here, afterAll included.
|
|
176
|
+
if (realm !== null)
|
|
177
|
+
await this.realms.leave(realm);
|
|
178
|
+
realm = null;
|
|
179
|
+
const group = await runSerialUnit(this, members, file.absolutePath);
|
|
180
|
+
this.options.events?.onSerialGroup?.(group);
|
|
181
|
+
}
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
this.options.events?.onPairStart?.(pair);
|
|
185
|
+
realm = await this.runOrdinaryPair(pair, file, realm);
|
|
186
|
+
}
|
|
187
|
+
if (realm !== null)
|
|
188
|
+
await this.realms.leave(realm);
|
|
189
|
+
}
|
|
190
|
+
/** Records a deterministic-registration violation as a run-level error. */
|
|
191
|
+
recordDisappeared(message) {
|
|
192
|
+
this.runErrors.push({
|
|
193
|
+
error: serializeError(new ConfigurationError('COLLECTION_ERROR', message), {
|
|
194
|
+
phase: 'collection',
|
|
195
|
+
}),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
// --- ordinary tests ---
|
|
199
|
+
async runOrdinaryPair(pair, file, incomingRealm) {
|
|
200
|
+
const attempts = [];
|
|
201
|
+
let realm = incomingRealm;
|
|
202
|
+
let hookFailure;
|
|
203
|
+
const finalStatus = await runWithRetries(pair.options.retries + 1, this.interruptSignal, async (attemptIndex) => {
|
|
204
|
+
if (realm === null)
|
|
205
|
+
realm = await this.realms.create(file.absolutePath);
|
|
206
|
+
const registered = findRegistered(realm, pair.test);
|
|
207
|
+
if (registered === undefined) {
|
|
208
|
+
this.recordDisappeared(`test ${pair.test.id} disappeared on re-import; registration must be deterministic`);
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
hookFailure = await this.realms.enterScopes(realm, registered);
|
|
212
|
+
if (hookFailure !== undefined)
|
|
213
|
+
return undefined;
|
|
214
|
+
const attempt = await this.runAttempt(pair, registered, realm, attemptIndex, {
|
|
215
|
+
kind: 'ordinary',
|
|
216
|
+
});
|
|
217
|
+
attempts.push(attempt);
|
|
218
|
+
if (attempt.status !== 'passed') {
|
|
219
|
+
// Spec 11-lifecycle.md: a failed realm is never reused, but afterAll
|
|
220
|
+
// still runs for every scope whose beforeAll started in it.
|
|
221
|
+
await this.realms.leave(realm);
|
|
222
|
+
realm = null;
|
|
223
|
+
}
|
|
224
|
+
return attempt;
|
|
225
|
+
});
|
|
226
|
+
// A beforeAll failure before any attempt ran skips the test. On a retry
|
|
227
|
+
// the recorded attempts stand: the hook failure is already a run error,
|
|
228
|
+
// and a failing test must not be reported as skipped.
|
|
229
|
+
if (hookFailure !== undefined && attempts.length === 0) {
|
|
230
|
+
this.emit(pairResult(pair, {
|
|
231
|
+
status: 'skipped',
|
|
232
|
+
selected: true,
|
|
233
|
+
skip: { cause: 'hook-failed', reason: hookFailure.message },
|
|
234
|
+
attempts: [],
|
|
235
|
+
}));
|
|
236
|
+
return realm;
|
|
237
|
+
}
|
|
238
|
+
this.emit(pairResult(pair, { status: finalStatus, selected: true, attempts }));
|
|
239
|
+
return realm;
|
|
240
|
+
}
|
|
241
|
+
// --- setup tests ---
|
|
242
|
+
/** Runs one setup pair to completion, persisting staged sessions on success. */
|
|
243
|
+
async runSetupUnit(pair, freshRegistration) {
|
|
244
|
+
this.options.events?.onPairStart?.(pair);
|
|
245
|
+
const absolutePath = path.resolve(this.config.projectRoot, pair.test.file);
|
|
246
|
+
const attempts = [];
|
|
247
|
+
let hookFailure;
|
|
248
|
+
const finalStatus = await runWithRetries(pair.options.retries + 1, this.interruptSignal, async (attemptIndex) => {
|
|
249
|
+
const realm = attemptIndex === 0 && freshRegistration !== undefined
|
|
250
|
+
? this.realms.adopt(freshRegistration)
|
|
251
|
+
: await this.realms.create(absolutePath);
|
|
252
|
+
const registered = findRegistered(realm, pair.test);
|
|
253
|
+
if (registered === undefined) {
|
|
254
|
+
this.recordDisappeared(`setup ${pair.test.id} disappeared on re-import`);
|
|
255
|
+
return undefined;
|
|
256
|
+
}
|
|
257
|
+
hookFailure = await this.realms.enterScopes(realm, registered);
|
|
258
|
+
if (hookFailure !== undefined) {
|
|
259
|
+
await this.realms.leave(realm);
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
const staging = new SessionStaging(pair.test.sessions);
|
|
263
|
+
const attempt = await this.runAttempt(pair, registered, realm, attemptIndex, {
|
|
264
|
+
kind: 'setup',
|
|
265
|
+
staging,
|
|
266
|
+
});
|
|
267
|
+
attempts.push(attempt);
|
|
268
|
+
await this.realms.leave(realm);
|
|
269
|
+
if (attempt.status === 'passed') {
|
|
270
|
+
const missing = staging.missing();
|
|
271
|
+
if (missing.length > 0) {
|
|
272
|
+
attempt.status = 'failed';
|
|
273
|
+
attempt.error = serializeError(new E2EError('test', 'SESSION_CONTRACT', `setup must save each declared session exactly once; missing: [${missing.join(', ')}]`), { phase: 'body' });
|
|
274
|
+
return attempt;
|
|
275
|
+
}
|
|
276
|
+
for (const [name, state] of staging.entries()) {
|
|
277
|
+
await this.options.sessionStore.save(name, this.sessionIdentity, state);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return attempt;
|
|
281
|
+
});
|
|
282
|
+
if (hookFailure !== undefined && attempts.length === 0) {
|
|
283
|
+
this.emit(pairResult(pair, {
|
|
284
|
+
status: 'skipped',
|
|
285
|
+
selected: true,
|
|
286
|
+
skip: { cause: 'hook-failed', reason: hookFailure.message },
|
|
287
|
+
attempts: [],
|
|
288
|
+
}));
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
this.emit(pairResult(pair, { status: finalStatus, selected: true, attempts }));
|
|
292
|
+
}
|
|
293
|
+
// --- attempt core ---
|
|
294
|
+
/** Starts one attempt on the backend, restores a configured session, and starts tracing. */
|
|
295
|
+
async launchSession(pair, attemptId, artifactsDir, signal) {
|
|
296
|
+
// The backend booted in init() once per worker; the adapter is per-attempt
|
|
297
|
+
// so refs never cross attempts.
|
|
298
|
+
await this.initBackendOnce();
|
|
299
|
+
const backend = this.target.backend;
|
|
300
|
+
// Session restore rides the backend's neutral state capability. Checked
|
|
301
|
+
// before any per-attempt isolation opens, so a misconfigured session never
|
|
302
|
+
// orphans a started attempt.
|
|
303
|
+
if (pair.options.session !== undefined && backend?.state === undefined) {
|
|
304
|
+
throw new ConfigurationError('UNSUPPORTED_CAPABILITY', `target "${this.target.name}" has no backend state capability for session restore`);
|
|
305
|
+
}
|
|
306
|
+
const session = createBackendSession({ backend, targetName: this.target.name });
|
|
307
|
+
const launch = (label, run) => this.lifecycle(label, this.config.launchTimeout, 'LAUNCH_TIMEOUT', signal, run);
|
|
308
|
+
const launchOp = (launchSignal) => this.op(attemptId, this.config.launchTimeout, launchSignal);
|
|
309
|
+
try {
|
|
310
|
+
const startAttempt = backend?.startAttempt?.bind(backend);
|
|
311
|
+
if (startAttempt !== undefined) {
|
|
312
|
+
await this.debug.time('session.launch', () => launch(`starting an attempt on backend ${backend?.name ?? 'none'}`, (launchSignal) => startAttempt({ attemptId, artifactsDir, signal: launchSignal })));
|
|
313
|
+
}
|
|
314
|
+
if (pair.options.session !== undefined) {
|
|
315
|
+
const state = await this.options.sessionStore.load(pair.options.session, this.sessionIdentity);
|
|
316
|
+
await launch('restoring the session', (launchSignal) => session.restoreState(state, launchOp(launchSignal)));
|
|
317
|
+
}
|
|
318
|
+
if (this.config.artifacts.includes('trace') && session.artifacts.startTrace !== undefined) {
|
|
319
|
+
// An explicitly configured trace is a contract; the default set is best-effort.
|
|
320
|
+
const starting = launch('starting the trace', (launchSignal) => session.artifacts.startTrace(launchOp(launchSignal)));
|
|
321
|
+
if (this.config.artifactsExplicit)
|
|
322
|
+
await starting;
|
|
323
|
+
else
|
|
324
|
+
await starting.catch(() => undefined);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
catch (cause) {
|
|
328
|
+
// The attempt's isolation is open, or a timed-out startAttempt may still
|
|
329
|
+
// open it: end it within the cleanup budget, or the retry opens a second
|
|
330
|
+
// one. A backend without startAttempt makes this a no-op.
|
|
331
|
+
await this.endAttempt(session, attemptId).catch(() => undefined);
|
|
332
|
+
throw cause;
|
|
333
|
+
}
|
|
334
|
+
return session;
|
|
335
|
+
}
|
|
336
|
+
/** Ends one attempt's isolation within the cleanup budget. */
|
|
337
|
+
endAttempt(session, attemptId) {
|
|
338
|
+
return this.lifecycle('ending the attempt', this.config.cleanupTimeout, 'CLEANUP_TIMEOUT', NEVER_ABORTS, (signal) => session.close(this.op(attemptId, this.config.cleanupTimeout, signal)));
|
|
339
|
+
}
|
|
340
|
+
/** Finalizes trace and ends the attempt with a fresh cleanup budget. */
|
|
341
|
+
async closeSession(session, attemptId, record, artifactSink, secondaryErrors) {
|
|
342
|
+
if (this.config.artifacts.includes('trace') && session.artifacts.stopTrace !== undefined) {
|
|
343
|
+
try {
|
|
344
|
+
const tracePath = await this.lifecycle('stopping the trace', this.config.cleanupTimeout, 'CLEANUP_TIMEOUT', NEVER_ABORTS, (signal) => session.artifacts.stopTrace(this.op(attemptId, this.config.cleanupTimeout, signal)));
|
|
345
|
+
artifactSink.register('trace', tracePath);
|
|
346
|
+
}
|
|
347
|
+
catch (cause) {
|
|
348
|
+
// Best-effort for the default artifact set; a configured trace that
|
|
349
|
+
// cannot be finalized is a cleanup failure the report must show.
|
|
350
|
+
if (this.config.artifactsExplicit) {
|
|
351
|
+
record.cleanup = 'failed';
|
|
352
|
+
secondaryErrors.push(serializeError(classifyError(cause), { phase: 'cleanup' }));
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
try {
|
|
357
|
+
await this.debug.time('session.close', () => this.endAttempt(session, attemptId));
|
|
358
|
+
}
|
|
359
|
+
catch (cause) {
|
|
360
|
+
record.cleanup = 'failed';
|
|
361
|
+
secondaryErrors.push(serializeError(classifyError(cause), { phase: 'cleanup' }));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/** Runs one attempt to completion (SerialHost). */
|
|
365
|
+
/**
|
|
366
|
+
* Runs one attempt under its AI trace scope, so every model call the
|
|
367
|
+
* attempt makes is attributed to this test, target, and attempt.
|
|
368
|
+
*/
|
|
369
|
+
runAttempt(pair, registered, realm, attemptIndex, context) {
|
|
370
|
+
return withAiTraceScope({
|
|
371
|
+
test: pair.test.titlePath.join(' › '),
|
|
372
|
+
testId: pair.test.id,
|
|
373
|
+
target: this.target.name,
|
|
374
|
+
attempt: attemptIndex,
|
|
375
|
+
}, () => this.executeAttempt(pair, registered, realm, attemptIndex, context));
|
|
376
|
+
}
|
|
377
|
+
async executeAttempt(pair, registered, realm, attemptIndex, context) {
|
|
378
|
+
const attemptId = uuidv7();
|
|
379
|
+
const startedAt = timestamp();
|
|
380
|
+
const startedMs = Date.now();
|
|
381
|
+
// Serial members borrow the group's shared session, open state, artifact
|
|
382
|
+
// directory, and prior-step context; every other attempt owns its own.
|
|
383
|
+
const shared = context.kind === 'serial' ? context.shared : undefined;
|
|
384
|
+
const onProgress = this.options.events?.onProgress;
|
|
385
|
+
const steps = new StepRecorder(attemptId, {
|
|
386
|
+
maxEventsPerStep: this.config.limits.maxEventsPerStep,
|
|
387
|
+
...(onProgress === undefined
|
|
388
|
+
? {}
|
|
389
|
+
: { onProgress: (progress) => onProgress(pair.test.id, progress) }),
|
|
390
|
+
});
|
|
391
|
+
// Agent prompts quote completed steps as prior context. Serial-group
|
|
392
|
+
// members prepend the steps earlier members already contributed.
|
|
393
|
+
const priorSteps = shared === undefined
|
|
394
|
+
? () => steps.completed()
|
|
395
|
+
: () => [...shared.priorSteps, ...steps.completed()];
|
|
396
|
+
const secondaryErrors = [];
|
|
397
|
+
const attemptAbort = new AbortController();
|
|
398
|
+
const onInterrupt = () => attemptAbort.abort();
|
|
399
|
+
this.interruptSignal.addEventListener('abort', onInterrupt, { once: true });
|
|
400
|
+
const artifacts = createAttemptArtifacts({
|
|
401
|
+
artifactsRoot: this.artifactsRoot,
|
|
402
|
+
// Serial members share the group's session, and therefore its artifact
|
|
403
|
+
// directory; registering under their own would not resolve on disk.
|
|
404
|
+
segments: shared?.artifactSegments ??
|
|
405
|
+
[this.target.name, sanitizePathSegment(pair.test.id), `attempt-${attemptIndex}`],
|
|
406
|
+
attemptId,
|
|
407
|
+
currentStepId: () => steps.currentStepId,
|
|
408
|
+
...(this.config.artifactStore === undefined ? {} : { store: this.config.artifactStore }),
|
|
409
|
+
// A serial member's artifacts are filed under the group attempt in the
|
|
410
|
+
// report, so that is the attempt a store must see for them.
|
|
411
|
+
identity: { runId: this.options.runId, testId: pair.test.id, attemptId: shared?.attemptId ?? attemptId },
|
|
412
|
+
});
|
|
413
|
+
const record = {
|
|
414
|
+
id: attemptId,
|
|
415
|
+
index: attemptIndex,
|
|
416
|
+
status: 'passed',
|
|
417
|
+
startedAt,
|
|
418
|
+
durationMs: 0,
|
|
419
|
+
steps: [],
|
|
420
|
+
artifacts: artifacts.records,
|
|
421
|
+
secondaryErrors,
|
|
422
|
+
cleanup: 'complete',
|
|
423
|
+
};
|
|
424
|
+
let openSession = null;
|
|
425
|
+
let failure;
|
|
426
|
+
let failurePhase;
|
|
427
|
+
let phase = 'launch';
|
|
428
|
+
let timedOut = false;
|
|
429
|
+
// Captured the moment the primary failure lands: steps that pass later —
|
|
430
|
+
// afterEach cleanup, teardown — must not confirm traces the failure
|
|
431
|
+
// implicated (a cleanup assertion says nothing about the failed flow).
|
|
432
|
+
let lastVerifiedAtFailure = -1;
|
|
433
|
+
const recordFailure = (cause, atPhase) => {
|
|
434
|
+
if (failure === undefined)
|
|
435
|
+
lastVerifiedAtFailure = steps.lastVerifiedStepIndex;
|
|
436
|
+
failure = classifyError(cause);
|
|
437
|
+
failurePhase = atPhase;
|
|
438
|
+
};
|
|
439
|
+
const cache = createAgentCacheContext({
|
|
440
|
+
cache: this.config.cache,
|
|
441
|
+
projectId: this.config.projectId,
|
|
442
|
+
testId: pair.test.id,
|
|
443
|
+
target: this.sessionIdentity,
|
|
444
|
+
attemptIndex,
|
|
445
|
+
});
|
|
446
|
+
try {
|
|
447
|
+
const session = shared?.session ??
|
|
448
|
+
(await this.launchSession(pair, attemptId, artifacts.dir, attemptAbort.signal));
|
|
449
|
+
openSession = session;
|
|
450
|
+
const testDeadline = new Deadline(pair.options.timeout);
|
|
451
|
+
const saveSession = context.kind !== 'setup'
|
|
452
|
+
? undefined
|
|
453
|
+
: async (name) => {
|
|
454
|
+
if (session.captureState === undefined) {
|
|
455
|
+
throw new ConfigurationError('UNSUPPORTED_CAPABILITY', `target "${this.target.name}" has no backend state capability for session.save()`);
|
|
456
|
+
}
|
|
457
|
+
const state = await session.captureState(this.op(attemptId, this.config.actionTimeout, attemptAbort.signal));
|
|
458
|
+
context.staging.stage(name, state);
|
|
459
|
+
};
|
|
460
|
+
const fixtures = createFixtures({
|
|
461
|
+
config: this.config,
|
|
462
|
+
target: this.target,
|
|
463
|
+
session,
|
|
464
|
+
steps,
|
|
465
|
+
signal: attemptAbort.signal,
|
|
466
|
+
runId: this.options.runId,
|
|
467
|
+
attemptId,
|
|
468
|
+
testDeadline,
|
|
469
|
+
artifacts: artifacts.sink,
|
|
470
|
+
priorSteps,
|
|
471
|
+
agentContext: pair.options.agentContext,
|
|
472
|
+
saveSession,
|
|
473
|
+
...(cache === undefined ? {} : { cache }),
|
|
474
|
+
debug: this.debug,
|
|
475
|
+
});
|
|
476
|
+
const beforeEachHooks = this.realms.hooksFor(realm, registered, 'beforeEach');
|
|
477
|
+
const afterEachHooks = this.realms.hooksFor(realm, registered, 'afterEach').toReversed();
|
|
478
|
+
const mainWork = async () => {
|
|
479
|
+
phase = 'beforeEach';
|
|
480
|
+
for (const hook of beforeEachHooks) {
|
|
481
|
+
await hook.fn(fixtures);
|
|
482
|
+
}
|
|
483
|
+
phase = 'body';
|
|
484
|
+
await registered.fn(fixtures);
|
|
485
|
+
};
|
|
486
|
+
try {
|
|
487
|
+
await this.debug.time('test.body', () => withTimeout(mainWork(), Math.max(1, testDeadline.remaining()), () => {
|
|
488
|
+
timedOut = true;
|
|
489
|
+
attemptAbort.abort();
|
|
490
|
+
return new TestTimeoutError(`test timed out after ${pair.options.timeout} ms in phase ${phase}`);
|
|
491
|
+
}));
|
|
492
|
+
}
|
|
493
|
+
catch (cause) {
|
|
494
|
+
recordFailure(cause, phase);
|
|
495
|
+
}
|
|
496
|
+
phase = 'afterEach';
|
|
497
|
+
for (const hook of afterEachHooks) {
|
|
498
|
+
try {
|
|
499
|
+
await withTimeout(Promise.resolve(hook.fn(fixtures)), this.config.cleanupTimeout, () => new TestTimeoutError('afterEach hook timed out'));
|
|
500
|
+
}
|
|
501
|
+
catch (cause) {
|
|
502
|
+
if (failure === undefined) {
|
|
503
|
+
recordFailure(cause, 'afterEach');
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
secondaryErrors.push(serializeError(classifyError(cause), { phase: 'afterEach' }));
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
catch (cause) {
|
|
512
|
+
recordFailure(cause, phase);
|
|
513
|
+
}
|
|
514
|
+
finally {
|
|
515
|
+
this.interruptSignal.removeEventListener('abort', onInterrupt);
|
|
516
|
+
if (openSession !== null && shared === undefined) {
|
|
517
|
+
await this.closeSession(openSession, attemptId, record, artifacts.sink, secondaryErrors);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
// Size and digest land asynchronously; the record is read right after.
|
|
521
|
+
await artifacts.settle();
|
|
522
|
+
record.durationMs = Date.now() - startedMs;
|
|
523
|
+
record.steps = [...steps.all()];
|
|
524
|
+
if (failure === undefined) {
|
|
525
|
+
record.status = 'passed';
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
record.status = classifyAttemptStatus(failure, timedOut, this.interruptSignal.aborted);
|
|
529
|
+
record.error = serializeError(failure, { phase: failurePhase ?? phase });
|
|
530
|
+
}
|
|
531
|
+
if (cache !== undefined && record.status !== 'interrupted') {
|
|
532
|
+
// Settled only after the status is classified: an interrupted attempt
|
|
533
|
+
// implicates nothing — it writes nothing and evicts nothing — so Ctrl-C
|
|
534
|
+
// can never evict a good entry. On a failure, confirmation stops at what
|
|
535
|
+
// had been verified when the failure landed — later teardown steps
|
|
536
|
+
// prove nothing about the flow.
|
|
537
|
+
await flushStagedTraces(cache, failure === undefined ? steps.lastVerifiedStepIndex : lastVerifiedAtFailure);
|
|
538
|
+
}
|
|
539
|
+
return record;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* The status of a failed attempt. An interrupt outranks everything except a
|
|
544
|
+
* timeout that had already fired: the attempt then timed out, whatever
|
|
545
|
+
* arrived after.
|
|
546
|
+
*/
|
|
547
|
+
function classifyAttemptStatus(failure, timedOut, interrupted) {
|
|
548
|
+
if (interrupted && !timedOut)
|
|
549
|
+
return 'interrupted';
|
|
550
|
+
if (timedOut || failure instanceof TestTimeoutError || failure.code === 'TEST_TIMEOUT') {
|
|
551
|
+
return 'timed-out';
|
|
552
|
+
}
|
|
553
|
+
return 'failed';
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/run/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Attempt-scoped fixture graph (spec 02-test-api.md, 08-platforms.md). */
|
|
2
|
+
import type { AgentCacheContext } from '../cache/context.ts';
|
|
3
|
+
import type { TargetSession } from '../backend/surface.ts';
|
|
4
|
+
import type { DebugTrace } from '../internal/debug.ts';
|
|
5
|
+
import { Deadline } from '../internal/time.ts';
|
|
6
|
+
import type { ResolvedConfig, ResolvedTarget } from '../config/resolve.ts';
|
|
7
|
+
import type { SetupSession, TestFixtures } from '../types.ts';
|
|
8
|
+
import type { StepRecord, StepRecorder } from './steps.ts';
|
|
9
|
+
export interface ArtifactSink {
|
|
10
|
+
/** Absolute attempt artifact directory, for runner-written artifacts. */
|
|
11
|
+
readonly dir: string;
|
|
12
|
+
/** Registers a produced artifact and returns its report artifact ID. */
|
|
13
|
+
register(kind: 'screenshot' | 'trace' | 'video' | 'download' | 'log', relativePath: string): string;
|
|
14
|
+
}
|
|
15
|
+
export interface AttemptEnvironment {
|
|
16
|
+
readonly config: ResolvedConfig;
|
|
17
|
+
readonly target: ResolvedTarget;
|
|
18
|
+
readonly session: TargetSession;
|
|
19
|
+
readonly steps: StepRecorder;
|
|
20
|
+
readonly signal: AbortSignal;
|
|
21
|
+
readonly runId: string;
|
|
22
|
+
readonly attemptId: string;
|
|
23
|
+
readonly testDeadline: Deadline;
|
|
24
|
+
readonly artifacts: ArtifactSink;
|
|
25
|
+
/** Completed steps agent prompts quote as prior context; serial members see the whole group. */
|
|
26
|
+
readonly priorSteps: () => readonly StepRecord[];
|
|
27
|
+
/** Trusted test/group agent context appended after config.agent.context. */
|
|
28
|
+
readonly agentContext: string | undefined;
|
|
29
|
+
/** Stages one captured session state; only setup attempts provide this. */
|
|
30
|
+
readonly saveSession: ((name: string) => Promise<void>) | undefined;
|
|
31
|
+
/** The attempt's trace cache context, or undefined when caching is off. */
|
|
32
|
+
readonly cache?: AgentCacheContext;
|
|
33
|
+
/** `--debug` phase timings; absent when the caller collects none. */
|
|
34
|
+
readonly debug?: DebugTrace;
|
|
35
|
+
}
|
|
36
|
+
/** Builds the lazy fixture graph for one attempt. */
|
|
37
|
+
export declare function createFixtures(environment: AttemptEnvironment): TestFixtures & {
|
|
38
|
+
readonly session: SetupSession;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/run/fixtures.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAI3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,QAAQ,EAAe,MAAM,qBAAqB,CAAC;AAS5D,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAA0B,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,KAAK,EAAY,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CACN,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,EAC3D,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC;CACX;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,gGAAgG;IAChG,QAAQ,CAAC,UAAU,EAAE,MAAM,SAAS,UAAU,EAAE,CAAC;IACjD,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IACpE,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IACnC,qEAAqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAC5B,WAAW,EAAE,kBAAkB,GAC9B,YAAY,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CA4GnD"}
|