From c2366710f5a2fce802cb0419270fa31059f11573 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Fri, 15 Mar 2024 13:51:29 +0100 Subject: [PATCH] fix(deps): apply env vars back to the main process for reporters --- packages/playwright/src/common/process.ts | 3 ++- packages/playwright/src/runner/dispatcher.ts | 2 -- packages/playwright/src/runner/tasks.ts | 6 +++++- tests/playwright-test/deps.spec.ts | 22 ++++++++++++++++++-- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/packages/playwright/src/common/process.ts b/packages/playwright/src/common/process.ts index 23de620649..74b262f2cb 100644 --- a/packages/playwright/src/common/process.ts +++ b/packages/playwright/src/common/process.ts @@ -63,6 +63,7 @@ if (process.env.PW_TS_ESM_LOADER_ON) let processRunner: ProcessRunner | undefined; let processName: string | undefined; const startingEnv = { ...process.env }; +const kPredefinedWorkerEnvs = new Set(['TEST_WORKER_INDEX', 'TEST_PARALLEL_INDEX']); process.on('message', async (message: any) => { if (message.method === '__init__') { @@ -77,7 +78,7 @@ process.on('message', async (message: any) => { } if (message.method === '__stop__') { const keys = new Set([...Object.keys(process.env), ...Object.keys(startingEnv)]); - const producedEnv: EnvProducedPayload = [...keys].filter(key => startingEnv[key] !== process.env[key]).map(key => [key, process.env[key] ?? null]); + const producedEnv: EnvProducedPayload = [...keys].filter(key => startingEnv[key] !== process.env[key] && !kPredefinedWorkerEnvs.has(key)).map(key => [key, process.env[key] ?? null]); sendMessageToParent({ method: '__env_produced__', params: producedEnv }); await gracefullyCloseAndExit(); return; diff --git a/packages/playwright/src/runner/dispatcher.ts b/packages/playwright/src/runner/dispatcher.ts index da2b759aa6..8b8e3a239b 100644 --- a/packages/playwright/src/runner/dispatcher.ts +++ b/packages/playwright/src/runner/dispatcher.ts @@ -36,7 +36,6 @@ export class Dispatcher { private _finished = new ManualPromise(); private _isStopped = true; - private _allTests: TestCase[] = []; private _config: FullConfigInternal; private _reporter: ReporterV2; private _failureTracker: FailureTracker; @@ -159,7 +158,6 @@ export class Dispatcher { async run(testGroups: TestGroup[], extraEnvByProjectId: EnvByProjectId) { this._extraEnvByProjectId = extraEnvByProjectId; this._queue = testGroups; - this._allTests = testGroups.map(g => g.tests).flat(); for (const group of testGroups) this._updateCounterForWorkerHash(group.workerHash, +1); this._isStopped = false; diff --git a/packages/playwright/src/runner/tasks.ts b/packages/playwright/src/runner/tasks.ts index 1cd57034e4..efb7394b5e 100644 --- a/packages/playwright/src/runner/tasks.ts +++ b/packages/playwright/src/runner/tasks.ts @@ -315,8 +315,12 @@ function createRunTestsTask(): Task { } }, teardown: async ({ phases }) => { - for (const { dispatcher } of phases.reverse()) + for (const { dispatcher, projects } of phases.reverse()) { + for (const project of projects) + process.env = { ...process.env, ...dispatcher.producedEnvByProjectId().get(project.project.id) }; + dispatcher.producedEnvByProjectId(); await dispatcher.stop(); + } }, }; } diff --git a/tests/playwright-test/deps.spec.ts b/tests/playwright-test/deps.spec.ts index 26417bd7bc..9a0cf85522 100644 --- a/tests/playwright-test/deps.spec.ts +++ b/tests/playwright-test/deps.spec.ts @@ -82,11 +82,29 @@ test('should inherit env changes from dependencies', async ({ runInlineTest }) = console.log('\\n%%E-' + process.env.SET_IN_A + '-' + process.env.SET_IN_B + '-' + process.env.SET_OUTSIDE); }); `, - }, {}, { SET_OUTSIDE: 'outside' }); + 'myReporter.ts': ` + export default class MyReporter { + onEnd() { + console.log('\\n%%Reporter-onEnd-TEST_WORKER_INDEX=' + process.env.TEST_WORKER_INDEX); + console.log('\\n%%Reporter-onEnd-TEST_PARALLEL_INDEX=' + process.env.TEST_PARALLEL_INDEX); + console.log('\\n%%Reporter-onEnd-' + process.env.SET_IN_A + '-' + process.env.SET_IN_B + '-' + process.env.SET_OUTSIDE); + } + } + ` + }, { reporter: './myReporter.ts,list' }, { SET_OUTSIDE: 'outside' }); expect(result.passed).toBe(5); expect(result.failed).toBe(0); expect(result.skipped).toBe(0); - expect(result.outputLines.sort()).toEqual(['A', 'B', 'C-valuea-undefined-undefined', 'D-undefined-valueb-outside', 'E-undefined-valueb-outside']); + expect(result.outputLines.sort()).toEqual([ + 'A', + 'B', + 'C-valuea-undefined-undefined', + 'D-undefined-valueb-outside', + 'E-undefined-valueb-outside', + 'Reporter-onEnd-TEST_PARALLEL_INDEX=undefined', + 'Reporter-onEnd-TEST_WORKER_INDEX=undefined', + 'Reporter-onEnd-valuea-valueb-undefined', + ]); }); test('should not run projects with dependencies when --no-deps is passed', async ({ runInlineTest }) => {