|
| 1 | +import type { ContextTestEnvironment } from '../../types/worker' |
1 | 2 | import type { Logger } from '../logger' |
2 | 3 | import type { StateManager } from '../state' |
3 | 4 | import type { PoolOptions, PoolTask, WorkerResponse } from './types' |
@@ -213,15 +214,17 @@ export class Pool { |
213 | 214 | const index = this.sharedRunners.findIndex(runner => isEqualRunner(runner, task)) |
214 | 215 |
|
215 | 216 | if (index !== -1) { |
216 | | - return this.sharedRunners.splice(index, 1)[0] |
| 217 | + const runner = this.sharedRunners.splice(index, 1)[0] |
| 218 | + runner.reconfigure(task) |
| 219 | + return runner |
217 | 220 | } |
218 | 221 | } |
219 | 222 |
|
220 | 223 | const options: PoolOptions = { |
221 | 224 | distPath: this.options.distPath, |
222 | 225 | project: task.project, |
223 | 226 | method, |
224 | | - environment: task.environment, |
| 227 | + environment: task.context.environment, |
225 | 228 | env: task.env, |
226 | 229 | execArgv: task.execArgv, |
227 | 230 | } |
@@ -289,11 +292,47 @@ function isEqualRunner(runner: PoolRunner, task: PoolTask) { |
289 | 292 | if (task.isolate) { |
290 | 293 | throw new Error('Isolated tasks should not share runners') |
291 | 294 | } |
| 295 | + if (runner.worker.name !== task.worker || runner.project !== task.project) { |
| 296 | + return false |
| 297 | + } |
| 298 | + // by default, check that the environments are the same |
| 299 | + // some workers (like vmThreads/vmForks) do not need this check |
| 300 | + if (!runner.worker.canReuse) { |
| 301 | + return isEnvironmentEqual(task.context.environment, runner.environment) |
| 302 | + } |
| 303 | + return runner.worker.canReuse(task) |
| 304 | +} |
| 305 | + |
| 306 | +function isEnvironmentEqual(env1: ContextTestEnvironment, env2: ContextTestEnvironment): boolean { |
| 307 | + if (env1.name !== env2.name) { |
| 308 | + return false |
| 309 | + } |
| 310 | + return deepEqual(env1.options, env2.options) |
| 311 | +} |
| 312 | + |
| 313 | +function deepEqual(obj1: any, obj2: any): boolean { |
| 314 | + if (obj1 === obj2) { |
| 315 | + return true |
| 316 | + } |
| 317 | + if (obj1 == null || obj2 == null) { |
| 318 | + return obj1 === obj2 |
| 319 | + } |
| 320 | + if (typeof obj1 !== 'object' || typeof obj2 !== 'object') { |
| 321 | + return false |
| 322 | + } |
| 323 | + |
| 324 | + const keys1 = Object.keys(obj1) |
| 325 | + const keys2 = Object.keys(obj2) |
| 326 | + |
| 327 | + if (keys1.length !== keys2.length) { |
| 328 | + return false |
| 329 | + } |
| 330 | + |
| 331 | + for (const key of keys1) { |
| 332 | + if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) { |
| 333 | + return false |
| 334 | + } |
| 335 | + } |
292 | 336 |
|
293 | | - return ( |
294 | | - runner.worker.name === task.worker |
295 | | - && runner.project === task.project |
296 | | - && runner.environment.name === task.environment.name |
297 | | - && (!runner.worker.canReuse || runner.worker.canReuse(task)) |
298 | | - ) |
| 337 | + return true |
299 | 338 | } |
0 commit comments