From 473b08a3f9bda39e188ca22054bf4a7d57fb054c Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Wed, 24 Jul 2024 13:43:59 +0200 Subject: [PATCH] create full task runner --- packages/playwright-ct-core/src/vitePlugin.ts | 2 +- packages/playwright/src/plugins/index.ts | 2 +- packages/playwright/src/runner/runner.ts | 14 ++------- packages/playwright/src/runner/tasks.ts | 30 +++++++++++++------ 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/packages/playwright-ct-core/src/vitePlugin.ts b/packages/playwright-ct-core/src/vitePlugin.ts index dbe31310c2..178e272159 100644 --- a/packages/playwright-ct-core/src/vitePlugin.ts +++ b/packages/playwright-ct-core/src/vitePlugin.ts @@ -48,7 +48,7 @@ export function createPlugin(): TestRunnerPlugin { configDir = configDirectory; }, - populateDependencies: async (config: FullConfig, configDir: string) => { + populateDependencies: async () => { await buildBundle(config, configDir); }, diff --git a/packages/playwright/src/plugins/index.ts b/packages/playwright/src/plugins/index.ts index e1c7355600..3502d90966 100644 --- a/packages/playwright/src/plugins/index.ts +++ b/packages/playwright/src/plugins/index.ts @@ -20,7 +20,7 @@ import type { ReporterV2 } from '../reporters/reporterV2'; export interface TestRunnerPlugin { name: string; setup?(config: FullConfig, configDir: string, reporter: ReporterV2): Promise; - populateDependencies?(config: FullConfig, configDir: string): Promise; + populateDependencies?(): Promise; begin?(suite: Suite): Promise; end?(): Promise; teardown?(): Promise; diff --git a/packages/playwright/src/runner/runner.ts b/packages/playwright/src/runner/runner.ts index da2c1052f0..da3d32ea31 100644 --- a/packages/playwright/src/runner/runner.ts +++ b/packages/playwright/src/runner/runner.ts @@ -22,7 +22,7 @@ import type { FullResult, TestError } from '../../types/testReporter'; import { webServerPluginsForConfig } from '../plugins/webServerPlugin'; import { collectFilesForProject, filterProjects } from './projectUtils'; import { createReporters } from './reporters'; -import { TestRun, createTaskRunner, createTaskRunnerForList } from './tasks'; +import { TestRun, createTaskRunner, createTaskRunnerForFindRelatedTests, createTaskRunnerForList } from './tasks'; import type { FullConfigInternal } from '../common/config'; import { runWatchModeLoop } from './watchMode'; import type { Suite } from '../common/test'; @@ -138,18 +138,10 @@ export class Runner { } async findRelatedTestFiles(mode: 'in-process' | 'out-of-process', files: string[]): Promise { - const result = await this.loadAllTests(mode); - if (result.status !== 'passed' || !result.suite) - return { errors: result.errors, testFiles: [] }; + const taskRunner = createTaskRunnerForFindRelatedTests(this._config, mode); + await taskRunner.run(new TestRun(this._config), 0); const resolvedFiles = (files as string[]).map(file => path.resolve(process.cwd(), file)); - - for (const plugin of this._config.plugins) { - if (!plugin.instance) - plugin.instance = typeof plugin.factory === 'function' ? await plugin.factory() : plugin.factory; - - await plugin.instance.populateDependencies?.(this._config.config, this._config.configDir); - } return { testFiles: affectedTestFiles(resolvedFiles) }; } } diff --git a/packages/playwright/src/runner/tasks.ts b/packages/playwright/src/runner/tasks.ts index ee38e6a3ab..198e754c64 100644 --- a/packages/playwright/src/runner/tasks.ts +++ b/packages/playwright/src/runner/tasks.ts @@ -63,7 +63,7 @@ export class TestRun { export function createTaskRunner(config: FullConfigInternal, reporters: ReporterV2[]): TaskRunner { const taskRunner = TaskRunner.create(reporters, config.config.globalTimeout); addGlobalSetupTasks(taskRunner, config); - taskRunner.addTask('load tests', createLoadTask('in-process', { filterOnly: true, filterOnlyChanged: true, failOnLoadErrors: true })); + taskRunner.addTask('load tests', createLoadTask('in-process', { filterOnly: true, failOnLoadErrors: true })); addRunTasks(taskRunner, config); return taskRunner; } @@ -76,14 +76,14 @@ export function createTaskRunnerForWatchSetup(config: FullConfigInternal, report export function createTaskRunnerForWatch(config: FullConfigInternal, reporters: ReporterV2[], additionalFileMatcher?: Matcher): TaskRunner { const taskRunner = TaskRunner.create(reporters); - taskRunner.addTask('load tests', createLoadTask('out-of-process', { filterOnly: true, filterOnlyChanged: true, failOnLoadErrors: false, doNotRunDepsOutsideProjectFilter: true, additionalFileMatcher })); + taskRunner.addTask('load tests', createLoadTask('out-of-process', { filterOnly: true, failOnLoadErrors: false, doNotRunDepsOutsideProjectFilter: true, additionalFileMatcher })); addRunTasks(taskRunner, config); return taskRunner; } export function createTaskRunnerForTestServer(config: FullConfigInternal, reporters: ReporterV2[]): TaskRunner { const taskRunner = TaskRunner.create(reporters); - taskRunner.addTask('load tests', createLoadTask('out-of-process', { filterOnly: true, filterOnlyChanged: true, failOnLoadErrors: false, doNotRunDepsOutsideProjectFilter: true })); + taskRunner.addTask('load tests', createLoadTask('out-of-process', { filterOnly: true, failOnLoadErrors: false, doNotRunDepsOutsideProjectFilter: true })); addRunTasks(taskRunner, config); return taskRunner; } @@ -106,9 +106,18 @@ function addRunTasks(taskRunner: TaskRunner, config: FullConfigInternal return taskRunner; } -export function createTaskRunnerForList(config: FullConfigInternal, reporters: ReporterV2[], mode: 'in-process' | 'out-of-process', options: { failOnLoadErrors: boolean }): TaskRunner { +export function createTaskRunnerForList(config: FullConfigInternal, reporters: ReporterV2[], mode: 'in-process' | 'out-of-process', options: { failOnLoadErrors: boolean, populatePluginDependencies?: boolean }): TaskRunner { const taskRunner = TaskRunner.create(reporters, config.config.globalTimeout); - taskRunner.addTask('load tests', createLoadTask(mode, { ...options, filterOnly: false, filterOnlyChanged: false })); + taskRunner.addTask('load tests', createLoadTask(mode, { ...options, filterOnly: false })); + taskRunner.addTask('report begin', createReportBeginTask()); + return taskRunner; +} + +export function createTaskRunnerForFindRelatedTests(config: FullConfigInternal, mode: 'in-process' | 'out-of-process'): TaskRunner { + const taskRunner = TaskRunner.create([], config.config.globalTimeout); + for (const plugin of config.plugins) + taskRunner.addTask('plugin setup', createPluginSetupTask(plugin)); + taskRunner.addTask('load tests', createLoadTask(mode, { filterOnly: false, populatePluginDependencies: true, failOnLoadErrors: false })); taskRunner.addTask('report begin', createReportBeginTask()); return taskRunner; } @@ -222,16 +231,19 @@ function createListFilesTask(): Task { }; } -function createLoadTask(mode: 'out-of-process' | 'in-process', options: { filterOnly: boolean, filterOnlyChanged: boolean, failOnLoadErrors: boolean, doNotRunDepsOutsideProjectFilter?: boolean, additionalFileMatcher?: Matcher }): Task { +function createLoadTask(mode: 'out-of-process' | 'in-process', options: { populatePluginDependencies?: boolean, filterOnly: boolean, failOnLoadErrors: boolean, doNotRunDepsOutsideProjectFilter?: boolean, additionalFileMatcher?: Matcher }): Task { return { setup: async (reporter, testRun, errors, softErrors) => { await collectProjectsAndTestFiles(testRun, !!options.doNotRunDepsOutsideProjectFilter, options.additionalFileMatcher); await loadFileSuites(testRun, mode, options.failOnLoadErrors ? errors : softErrors); - let cliOnlyChangedMatcher: Matcher | undefined = undefined; - if (testRun.config.cliOnlyChanged && options.filterOnlyChanged) { + if (options.populatePluginDependencies || testRun.config.cliOnlyChanged) { for (const plugin of testRun.config.plugins) - await plugin.instance?.populateDependencies?.(testRun.config.config, testRun.config.configDir); + await plugin.instance?.populateDependencies?.(); + } + + let cliOnlyChangedMatcher: Matcher | undefined = undefined; + if (testRun.config.cliOnlyChanged) { const changedFiles = await detectChangedTests(testRun.config.cliOnlyChanged, testRun.config.configDir); cliOnlyChangedMatcher = file => changedFiles.has(file); }