From a18c3685f18b1496c6fca9f7265d68be8a41097c Mon Sep 17 00:00:00 2001 From: mato533 Date: Mon, 16 Jun 2025 10:13:05 +0900 Subject: [PATCH 01/16] docs: update readme about `webdriverio.workerIdleTimeout` --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1fd9206..82e3598 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ This extension contributes the following settings: - `webdriverio.nodeExecutable`: The path to the Node.js executable. If not assigned, WebdriverIO try to resolve the node path from environment valuables of `PATH`. - `webdriverio.configFilePattern`: Glob pattern for WebdriverIO configuration file +- `webdriverio.workerIdleTimeout`: If no processing is performed in the Worker for the set amount of time(defined by seconds), the Worker is terminated. If processing is requested again, it will be started automatically. - `webdriverio.logLevel`: Set the logLevel - `webdriverio.showOutput`: Show WebdriverIO output in the test result when set `true` this option From a0e8027112b919d367bad0a73db0e8d1492f56f5 Mon Sep 17 00:00:00 2001 From: mato533 Date: Mon, 16 Jun 2025 10:20:01 +0900 Subject: [PATCH 02/16] feat: add parameter of workerIdleTimeout --- packages/vscode-wdio-config/src/index.ts | 1 + packages/vscode-wdio-constants/src/index.ts | 2 ++ packages/vscode-webdriverio/package.json | 11 ++++++++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/vscode-wdio-config/src/index.ts b/packages/vscode-wdio-config/src/index.ts index 5246eef..6450631 100644 --- a/packages/vscode-wdio-config/src/index.ts +++ b/packages/vscode-wdio-config/src/index.ts @@ -33,6 +33,7 @@ export class ExtensionConfigManager extends EventEmitter implements ExtensionCon configFilePattern && configFilePattern.length > 0 ? configFilePattern : [...DEFAULT_CONFIG_VALUES.configFilePattern], + workerIdleTimeout: config.get('workerIdleTimeout', DEFAULT_CONFIG_VALUES.workerIdleTimeout), showOutput: this.resolveBooleanConfig(config, 'showOutput', DEFAULT_CONFIG_VALUES.showOutput), logLevel: config.get('logLevel', DEFAULT_CONFIG_VALUES.logLevel), } diff --git a/packages/vscode-wdio-constants/src/index.ts b/packages/vscode-wdio-constants/src/index.ts index 662eadc..3a5d452 100644 --- a/packages/vscode-wdio-constants/src/index.ts +++ b/packages/vscode-wdio-constants/src/index.ts @@ -2,6 +2,7 @@ export interface WebdriverIOConfig { nodeExecutable: string | undefined configFilePattern: string[] + workerIdleTimeout: number showOutput: boolean logLevel: string } @@ -11,6 +12,7 @@ export const EXTENSION_ID = 'webdriverio' export const DEFAULT_CONFIG_VALUES: WebdriverIOConfig = { nodeExecutable: undefined, configFilePattern: ['**/*wdio*.conf*.{ts,js,mjs,cjs,cts,mts}'], + workerIdleTimeout: 600, showOutput: true, logLevel: 'info', } as const diff --git a/packages/vscode-webdriverio/package.json b/packages/vscode-webdriverio/package.json index 125630c..4e6bf1d 100644 --- a/packages/vscode-webdriverio/package.json +++ b/packages/vscode-webdriverio/package.json @@ -100,7 +100,12 @@ "default": [ "**/*wdio*.conf*.{ts,js,mjs,cjs,cts,mts}" ], - "description": "Glob pattern for WebdriverIO configuration file" + "markdownDescription": "Glob pattern for WebdriverIO configuration file" + }, + "webdriverio.workerIdleTimeout": { + "markdownDescription": "If no processing is performed in the Worker for the set amount of time(defined by seconds), the Worker is terminated. If processing is requested again, it will be started automatically.", + "type": "number", + "default": 600 }, "webdriverio.logLevel": { "type": "string", @@ -113,12 +118,12 @@ "silent" ], "default": "info", - "description": "Set the logLevel" + "markdownDescription": "Set the logLevel" }, "webdriverio.showOutput": { "type": "boolean", "default": true, - "description": "Show WebdriverIO output in the test result" + "markdownDescription": "Show WebdriverIO output in the test result" } } } From 96570f294bf0439cf7e0fe60a332a19f39ffe7ae Mon Sep 17 00:00:00 2001 From: mato533 Date: Mon, 16 Jun 2025 16:38:27 +0900 Subject: [PATCH 03/16] feat: add typed event --- packages/vscode-wdio-constants/src/index.ts | 6 ++++++ packages/vscode-wdio-types/src/config.ts | 13 ++++++++++--- packages/vscode-wdio-types/src/utils.ts | 6 ++++++ packages/vscode-wdio-utils/src/index.ts | 16 ++++++++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/packages/vscode-wdio-constants/src/index.ts b/packages/vscode-wdio-constants/src/index.ts index 3a5d452..e684e61 100644 --- a/packages/vscode-wdio-constants/src/index.ts +++ b/packages/vscode-wdio-constants/src/index.ts @@ -1,4 +1,8 @@ /* c8 ignore start */ +type ToEventConfig = { + [K in keyof T as `update:${string & K}`]: T[K] +} + export interface WebdriverIOConfig { nodeExecutable: string | undefined configFilePattern: string[] @@ -7,6 +11,8 @@ export interface WebdriverIOConfig { logLevel: string } +export type WebdriverIOConfigEvent = ToEventConfig + export const EXTENSION_ID = 'webdriverio' export const DEFAULT_CONFIG_VALUES: WebdriverIOConfig = { diff --git a/packages/vscode-wdio-types/src/config.ts b/packages/vscode-wdio-types/src/config.ts index 8ed5a38..fd504f2 100644 --- a/packages/vscode-wdio-types/src/config.ts +++ b/packages/vscode-wdio-types/src/config.ts @@ -1,7 +1,6 @@ -import type EventEmitter from 'node:events' import type { DEFAULT_CONFIG_VALUES } from '@vscode-wdio/constants' import type * as vscode from 'vscode' -import type { WebdriverIOConfig } from './utils.js' +import type { TypedEventEmitterInterface, WebdriverIOConfig } from './utils.js' export type ConfigPropertyNames = typeof DEFAULT_CONFIG_VALUES extends Record ? K[] : never @@ -10,7 +9,15 @@ export type WorkspaceData = { wdioConfigFiles: string[] } -export interface ExtensionConfigManagerInterface extends EventEmitter, vscode.Disposable { +type ToEventConfig = { + [K in keyof T as `update:${string & K}`]: T[K] +} + +export type WebdriverIOConfigEvent = ToEventConfig + +export interface ExtensionConfigManagerInterface + extends TypedEventEmitterInterface, + vscode.Disposable { isMultiWorkspace: boolean globalConfig: WebdriverIOConfig workspaces: WorkspaceData[] diff --git a/packages/vscode-wdio-types/src/utils.ts b/packages/vscode-wdio-types/src/utils.ts index 70fd70d..8551484 100644 --- a/packages/vscode-wdio-types/src/utils.ts +++ b/packages/vscode-wdio-types/src/utils.ts @@ -1,3 +1,4 @@ +import type { EventEmitter } from 'node:events' import type { LOG_LEVEL } from '@vscode-wdio/constants' export type { WebdriverIOConfig } from '@vscode-wdio/constants' @@ -14,3 +15,8 @@ export interface LoggerInterface { type ValueOf = T[keyof T] export type NumericLogLevel = ValueOf + +export interface TypedEventEmitterInterface> extends EventEmitter { + emit(event: K, data: Events[K]): boolean + on(event: K, listener: (data: Events[K]) => void | Promise): this +} diff --git a/packages/vscode-wdio-utils/src/index.ts b/packages/vscode-wdio-utils/src/index.ts index 5bc87de..d7805c5 100644 --- a/packages/vscode-wdio-utils/src/index.ts +++ b/packages/vscode-wdio-utils/src/index.ts @@ -1,2 +1,18 @@ +import { EventEmitter } from 'node:events' + +import type { TypedEventEmitterInterface } from '@vscode-wdio/types' + export * from './normalize.js' export * from './watcher.js' + +export class TypedEventEmitter> + extends EventEmitter + implements TypedEventEmitterInterface { + emit(event: K, data: Events[K]): boolean { + return super.emit(event as string, data) + } + + on(event: K, listener: (data: Events[K]) => void | Promise): this { + return super.on(event as string, listener) as this + } +} From f7db576de529ad18398ecd8a8a9f4f774ce4c1db Mon Sep 17 00:00:00 2001 From: mato533 Date: Mon, 16 Jun 2025 16:44:52 +0900 Subject: [PATCH 04/16] feat: add worker idle timeout functionality --- packages/vscode-wdio-api/src/idleMonitor.ts | 220 ++++++++++++++++++++ packages/vscode-wdio-api/src/manager.ts | 106 ++++++++-- packages/vscode-wdio-api/src/worker.ts | 79 ++++++- packages/vscode-wdio-constants/src/index.ts | 5 - packages/vscode-wdio-test/src/manager.ts | 2 +- packages/vscode-wdio-test/src/repository.ts | 44 +++- packages/vscode-wdio-test/src/runHandler.ts | 2 +- packages/vscode-wdio-types/src/api.ts | 13 +- packages/vscode-wdio-types/src/test.ts | 2 +- packages/vscode-wdio-worker/src/handler.ts | 28 +-- 10 files changed, 435 insertions(+), 66 deletions(-) create mode 100644 packages/vscode-wdio-api/src/idleMonitor.ts diff --git a/packages/vscode-wdio-api/src/idleMonitor.ts b/packages/vscode-wdio-api/src/idleMonitor.ts new file mode 100644 index 0000000..e2bbf31 --- /dev/null +++ b/packages/vscode-wdio-api/src/idleMonitor.ts @@ -0,0 +1,220 @@ +import EventEmitter from 'node:events' + +import { log } from '@vscode-wdio/logger' + +export interface IdleMonitorOptions { + /** + * Idle timeout in seconds + * Set to 0 or negative value to disable timeout + */ + idleTimeout: number +} + +export interface IdleMonitorInterface { + /** + * Start monitoring for idle timeout + */ + start(): void + + /** + * Stop monitoring and clear any pending timeout + */ + stop(): void + + /** + * Reset the idle timer (called when worker is accessed) + */ + resetTimer(): void + + /** + * Update the idle timeout configuration + * @param timeout New timeout value in seconds (0 or negative to disable) + */ + updateTimeout(timeout: number): void + + /** + * Pause the idle timer (called when RPC operation starts) + */ + pauseTimer(): void + + /** + * Resume the idle timer (called when RPC operation completes) + */ + resumeTimer(): void + + /** + * Check if monitoring is currently active + */ + isActive(): boolean + + /** + * Add event listener for idle timeout events + * @param event Event name ('idleTimeout') + * @param listener Event listener function + */ + on(event: 'idleTimeout', listener: () => void): this +} + +/** + * Monitor worker idle state and emit timeout events + */ +export class IdleMonitor extends EventEmitter implements IdleMonitorInterface { + private _timer: NodeJS.Timeout | null = null + private _isActive = false + private _isPaused = false + private _idleTimeout: number + private _isTimeoutDisabled = false + private readonly _workerId: string + + constructor(workerId: string, options: IdleMonitorOptions) { + super() + this._workerId = workerId + const timeoutSeconds = options.idleTimeout + this._isTimeoutDisabled = timeoutSeconds <= 0 + this._idleTimeout = this._isTimeoutDisabled ? 0 : timeoutSeconds * 1000 // Convert seconds to milliseconds + + if (this._isTimeoutDisabled) { + log.debug(`[${this._workerId}] IdleMonitor created with timeout disabled`) + } else { + log.debug(`[${this._workerId}] IdleMonitor created with timeout: ${this._idleTimeout}ms`) + } + } + + /** + * Start monitoring for idle timeout + */ + public start(): void { + if (this._isActive) { + log.debug(`[${this._workerId}] IdleMonitor already active`) + return + } + + this._isActive = true + this.resetTimer() + log.debug(`[${this._workerId}] IdleMonitor started`) + } + + /** + * Stop monitoring and clear any pending timeout + */ + public stop(): void { + if (!this._isActive) { + return + } + + this._isActive = false + this._isPaused = false + this.clearTimer() + log.debug(`[${this._workerId}] IdleMonitor stopped`) + } + + /** + * Reset the idle timer (called when worker is accessed) + */ + public resetTimer(): void { + if (!this._isActive || this._isPaused || this._isTimeoutDisabled) { + return + } + + this.clearTimer() + this.startTimer() + log.trace(`[${this._workerId}] IdleMonitor timer reset`) + } + + /** + * Pause the idle timer (called when RPC operation starts) + */ + public pauseTimer(): void { + if (!this._isActive || this._isTimeoutDisabled) { + return + } + + this._isPaused = true + this.clearTimer() + log.trace(`[${this._workerId}] IdleMonitor timer paused`) + } + + /** + * Resume the idle timer (called when RPC operation completes) + */ + public resumeTimer(): void { + if (!this._isActive || this._isTimeoutDisabled) { + return + } + + this._isPaused = false + this.startTimer() + log.trace(`[${this._workerId}] IdleMonitor timer resumed`) + } + + /** + * Update the idle timeout configuration + * @param timeout New timeout value in milliseconds + */ + public updateTimeout(timeout: number): void { + const newTimeout = timeout * 1000 + if (newTimeout === this._idleTimeout) { + return + } + + const oldTimeout = this._idleTimeout + const timeoutSeconds = timeout + this._isTimeoutDisabled = timeoutSeconds <= 0 + this._idleTimeout = this._isTimeoutDisabled ? 0 : timeoutSeconds * 1000 + + if (this._isTimeoutDisabled) { + log.debug(`[${this._workerId}] IdleMonitor updated with timeout disabled`) + } else { + log.debug(`[${this._workerId}] IdleMonitor timeout updated: ${oldTimeout}ms -> ${timeout}ms`) + } + + // Restart timer with new timeout if currently active + if (this._isActive) { + this.resetTimer() + } + } + + /** + * Check if monitoring is currently active + */ + public isActive(): boolean { + return this._isActive + } + + /** + * Clear the current timer + */ + private clearTimer(): void { + if (this._timer) { + clearTimeout(this._timer) + this._timer = null + } + } + + /** + * Start a new timer with current timeout value + */ + private startTimer(): void { + if (this._isPaused || this._isTimeoutDisabled) { + return + } + + this._timer = setTimeout(() => { + log.debug(`[${this._workerId}] Worker idle timeout reached after ${this._idleTimeout}ms`) + this.handleIdleTimeout() + }, this._idleTimeout) + } + + /** + * Handle idle timeout event + */ + private handleIdleTimeout(): void { + // Stop monitoring first to prevent multiple timeout events + this.stop() + + log.info(`[${this._workerId}] Worker idle timeout triggered`) + + // Emit idle timeout event + this.emit('idleTimeout') + } +} diff --git a/packages/vscode-wdio-api/src/manager.ts b/packages/vscode-wdio-api/src/manager.ts index 68eb903..add1750 100644 --- a/packages/vscode-wdio-api/src/manager.ts +++ b/packages/vscode-wdio-api/src/manager.ts @@ -8,7 +8,7 @@ import type { ServerManagerInterface, WdioExtensionWorkerInterface } from '@vsco import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' export class ServerManager implements ServerManagerInterface { - private _serverPool = new Map() + private _workerPool = new Map() private _pendingOperations = new Map>() private latestId = 0 // Semaphore to track the overall operation (for complete sequential execution) @@ -16,12 +16,12 @@ export class ServerManager implements ServerManagerInterface { private _operationQueue: (() => Promise)[] = [] constructor(private readonly configManager: ExtensionConfigManagerInterface) { - configManager.on('update:nodeExecutable', async (nodeExecutable: string) => { + configManager.on('update:nodeExecutable', async (nodeExecutable: string | undefined) => { log.debug(`Restart worker using webdriverio.nodeExecutable: ${nodeExecutable}`) - const cwds = Array.from(this._serverPool.keys()) + const cwds = Array.from(this._workerPool.keys()) await Promise.all( cwds.map(async (cwd) => { - const worker = this._serverPool.get(cwd) + const worker = this._workerPool.get(cwd) if (worker) { await this.stopWorker(cwd, worker) } @@ -35,6 +35,12 @@ export class ServerManager implements ServerManagerInterface { vscode.window.showErrorMessage(errorMessage) } }) + + // Listen for worker idle timeout configuration changes + configManager.on('update:workerIdleTimeout', async (workerIdleTimeout: number) => { + log.debug(`Update worker idle timeout: ${workerIdleTimeout}s`) + await this.updateWorkersIdleTimeout(workerIdleTimeout) + }) } /** @@ -73,7 +79,7 @@ export class ServerManager implements ServerManagerInterface { const normalizedConfigPath = normalize(configPaths) const wdioDirName = dirname(normalizedConfigPath) log.debug(`[server manager] detecting server: ${wdioDirName}`) - const server = this._serverPool.get(wdioDirName) + const server = this._workerPool.get(wdioDirName) if (server) { return server } @@ -98,7 +104,7 @@ export class ServerManager implements ServerManagerInterface { // Find workers that need to be stopped const stoppingPromises: Promise[] = [] - for (const [cwd, worker] of this._serverPool.entries()) { + for (const [cwd, worker] of this._workerPool.entries()) { if (!newConfigDirs.has(cwd)) { log.debug(`[server manager] stopping unnecessary worker: ${cwd}`) stoppingPromises.push(this.stopWorker(cwd, worker)) @@ -114,7 +120,7 @@ export class ServerManager implements ServerManagerInterface { const startingPromises: Promise[] = [] const workerCwds = Array.from(newConfigDirs) for (const cwd of workerCwds) { - if (!this._serverPool.has(cwd)) { + if (!this._workerPool.has(cwd)) { this.latestId++ startingPromises.push(this.startWorker(this.latestId, cwd)) } @@ -127,6 +133,59 @@ export class ServerManager implements ServerManagerInterface { }) } + /** + * Update idle timeout configuration for all active workers + * @param idleTimeout Idle timeout in milliseconds + */ + private async updateWorkersIdleTimeout(idleTimeout: number): Promise { + const updatePromises: Promise[] = [] + + for (const [cwd, worker] of this._workerPool.entries()) { + if (worker.isConnected()) { + log.debug(`[server manager] updating idle timeout for worker: ${cwd}`) + const updatePromise = this.updateWorkerIdleTimeout(worker, idleTimeout) + updatePromises.push(updatePromise) + } + } + + if (updatePromises.length > 0) { + await Promise.all(updatePromises) + } + } + + /** + * Update idle timeout configuration for a specific worker + * @param worker Worker to update + * @param idleTimeout Idle timeout in milliseconds + */ + private async updateWorkerIdleTimeout(worker: WdioExtensionWorkerInterface, idleTimeout: number): Promise { + try { + worker.updateIdleTimeout(idleTimeout) + log.debug(`[server manager] successfully updated idle timeout for worker ${worker.cid}`) + } catch (error) { + const errorMessage = `Failed to update idle timeout for worker ${worker.cid}: ${error instanceof Error ? error.message : String(error)}` + log.error(errorMessage) + // Don't throw error to prevent stopping other workers from being updated + } + } + + /** + * Handle worker idle timeout notification + * This method is called when a worker sends an idle timeout notification + * @param workerCwd Worker's current working directory + */ + public async handleWorkerIdleTimeout(workerCwd: string): Promise { + log.debug(`[server manager] received idle timeout notification for worker: ${workerCwd}`) + + const worker = this._workerPool.get(workerCwd) + if (worker) { + await this.stopWorker(workerCwd, worker) + log.debug(`[server manager] worker stopped due to idle timeout: ${workerCwd}`) + } else { + log.warn(`[server manager] received idle timeout for unknown worker: ${workerCwd}`) + } + } + private async queueOperation(operation: () => Promise): Promise { // Execute immediately if no operation is in progress if (!this._operationLock) { @@ -172,7 +231,7 @@ export class ServerManager implements ServerManagerInterface { private async startWorker(id: number, workerCwd: string): Promise { // Return existing server if already created - const existingServer = this._serverPool.get(workerCwd) + const existingServer = this._workerPool.get(workerCwd) if (existingServer) { return existingServer } @@ -198,12 +257,29 @@ export class ServerManager implements ServerManagerInterface { private async createWorker(id: number, configPaths: string): Promise { const strId = `#${String(id)}` - const server = new WdioExtensionWorker(this.configManager, strId, configPaths) - await server.start() - await server.waitForStart() + const worker = new WdioExtensionWorker(this.configManager, strId, configPaths) + + // Set up idle timeout notification handler + worker.on('idleTimeout', () => { + this.handleWorkerIdleTimeout(configPaths) + }) + + await worker.start() + await worker.waitForStart() + + // Send initial idle timeout configuration + const idleTimeout = this.configManager.globalConfig.workerIdleTimeout + if ( + idleTimeout !== undefined && + 'updateIdleTimeout' in worker && + typeof worker.updateIdleTimeout === 'function' + ) { + worker.updateIdleTimeout(idleTimeout) + } + log.debug(`[server manager] server was registered: ${configPaths}`) - this._serverPool.set(configPaths, server) - return server + this._workerPool.set(configPaths, worker) + return worker } private async stopWorker(configPath: string, worker: WdioExtensionWorkerInterface): Promise { @@ -228,13 +304,13 @@ export class ServerManager implements ServerManagerInterface { private async executeStopWorker(configPath: string, worker: WdioExtensionWorkerInterface): Promise { log.trace(`shutdown the worker ${worker.cid} for ${configPath}`) await worker.stop() - this._serverPool.delete(configPath) + this._workerPool.delete(configPath) } public async dispose() { return this.queueOperation(async () => { const stopPromises: Promise[] = [] - for (const [cwd, worker] of this._serverPool.entries()) { + for (const [cwd, worker] of this._workerPool.entries()) { log.trace(`shutdown the worker ${worker.cid} for ${cwd}`) stopPromises.push(this.stopWorker(cwd, worker)) } diff --git a/packages/vscode-wdio-api/src/worker.ts b/packages/vscode-wdio-api/src/worker.ts index 8be7f96..b6eee35 100644 --- a/packages/vscode-wdio-api/src/worker.ts +++ b/packages/vscode-wdio-api/src/worker.ts @@ -1,22 +1,31 @@ import { spawn, type ChildProcess } from 'node:child_process' -import EventEmitter from 'node:events' import { createServer as createHttpServer, type Server } from 'node:http' import { resolve } from 'node:path' import * as v8 from 'node:v8' import { log } from '@vscode-wdio/logger' +import { TypedEventEmitter } from '@vscode-wdio/utils' import { createBirpc } from 'birpc' import getPort from 'get-port' +import { IdleMonitor, type IdleMonitorInterface } from './idleMonitor.js' import { createWss, loggingFn, resolveNodePath } from './utils.js' -import type { ExtensionApi, WdioExtensionWorkerInterface, WorkerApi } from '@vscode-wdio/types/api' +import type { + ExtensionApi, + WdioExtensionWorkerEvents, + WdioExtensionWorkerInterface, + WorkerApi, +} from '@vscode-wdio/types/api' import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' import type * as vscode from 'vscode' import type { WebSocketServer } from 'ws' const WORKER_PATH = resolve(__dirname, 'worker.cjs') -export class WdioExtensionWorker extends EventEmitter implements WdioExtensionWorkerInterface { + +export class WdioExtensionWorker + extends TypedEventEmitter + implements WdioExtensionWorkerInterface { protected configManager: ExtensionConfigManagerInterface public cid: string protected cwd: string @@ -27,6 +36,7 @@ export class WdioExtensionWorker extends EventEmitter implements WdioExtensionWo private _workerConnected = false private _server: Server | null = null private _wss: WebSocketServer | null = null + private _idleMonitor: IdleMonitorInterface constructor(configManager: ExtensionConfigManagerInterface, cid: string = '#0', cwd: string) { super() @@ -34,6 +44,15 @@ export class WdioExtensionWorker extends EventEmitter implements WdioExtensionWo this.cwd = cwd this.configManager = configManager + // Initialize idle monitor + const idleTimeout = this.configManager.globalConfig.workerIdleTimeout + this._idleMonitor = new IdleMonitor(this.cid, { idleTimeout }) + + // Forward idle timeout events + this._idleMonitor.on('idleTimeout', () => { + this.emit('idleTimeout', undefined) + }) + const psListener = () => { if (this._workerProcess && !this._workerProcess.killed) { log.debug('Extension host exiting - ensuring worker process is terminated') @@ -112,10 +131,13 @@ export class WdioExtensionWorker extends EventEmitter implements WdioExtensionWo // Handle process exit wp.on('exit', (code) => { - log.debug(`Worker process exited with code ${code}`) + log.debug(`Worker${this.cid} process exited with code ${code}`) this._workerProcess = null this._workerRpc = null this._workerConnected = false + + // Stop idle monitoring when worker process exits + this._idleMonitor.stop() }) } @@ -129,7 +151,6 @@ export class WdioExtensionWorker extends EventEmitter implements WdioExtensionWo /** * Connect to worker via WebSocket */ - public async waitForStart(): Promise { if (!this._workerPort) { throw new Error('Worker port not set') @@ -168,6 +189,9 @@ export class WdioExtensionWorker extends EventEmitter implements WdioExtensionWo log.debug('Worker connection closed') this._workerConnected = false this._workerRpc = null + + // Stop idle monitoring when connection is closed + this._idleMonitor.stop() } }) @@ -180,14 +204,20 @@ export class WdioExtensionWorker extends EventEmitter implements WdioExtensionWo resolve() }) }).then(() => { + // Start idle monitoring after successful connection + this._idleMonitor.start() this.startHealthCheck() log.debug('Worker process started successfully') }) } + /** * Stop the worker process */ public async stop(): Promise { + // Stop idle monitoring first + this._idleMonitor.stop() + let shutdownSucceeded = false // Set a timeout for graceful shutdown @@ -203,9 +233,11 @@ export class WdioExtensionWorker extends EventEmitter implements WdioExtensionWo await Promise.race([this._workerRpc.shutdown(), timeoutPromise]) shutdownSucceeded = true - log.debug('Worker process shutdown gracefully') + log.debug(`Worker${this.cid} process shutdown gracefully`) } catch (error) { - log.debug(`Error during worker shutdown: ${error instanceof Error ? error.message : String(error)}`) + log.debug( + `Error during worker${this.cid} shutdown: ${error instanceof Error ? error.message : String(error)}` + ) } } @@ -256,17 +288,38 @@ export class WdioExtensionWorker extends EventEmitter implements WdioExtensionWo }) this._server = null } - log.debug('Extension worker stopped completely') + this.emit('shutdown', undefined) + log.debug(`Extension worker${this.cid} stopped completely`) } /** * Get worker RPC interface + * This getter resets the idle timer when accessed */ public get rpc(): WorkerApi { if (!this._workerRpc || !this._workerConnected) { throw new Error('Worker not connected') } - return this._workerRpc + + // Reset idle timer when RPC is accessed + this._idleMonitor.resetTimer() + + return new Proxy(this._workerRpc, { + get: (target: WorkerApi, prop: K): any => { + const originalMethod = target[prop] + if (typeof originalMethod === 'function') { + return (async (...args: any[]) => { + this._idleMonitor.pauseTimer() + try { + return await (originalMethod as Function).apply(target, args) + } finally { + this._idleMonitor.resumeTimer() + } + }) as WorkerApi[K] + } + return originalMethod + }, + }) } /** @@ -286,6 +339,14 @@ export class WdioExtensionWorker extends EventEmitter implements WdioExtensionWo } } + /** + * Update idle timeout configuration + * @param timeout Idle timeout in milliseconds + */ + public updateIdleTimeout(timeout: number): void { + this._idleMonitor.updateTimeout(timeout) + } + private startHealthCheck() { const interval = setInterval(async () => { if (!this.isConnected()) { diff --git a/packages/vscode-wdio-constants/src/index.ts b/packages/vscode-wdio-constants/src/index.ts index e684e61..70bff5d 100644 --- a/packages/vscode-wdio-constants/src/index.ts +++ b/packages/vscode-wdio-constants/src/index.ts @@ -1,7 +1,4 @@ /* c8 ignore start */ -type ToEventConfig = { - [K in keyof T as `update:${string & K}`]: T[K] -} export interface WebdriverIOConfig { nodeExecutable: string | undefined @@ -11,8 +8,6 @@ export interface WebdriverIOConfig { logLevel: string } -export type WebdriverIOConfigEvent = ToEventConfig - export const EXTENSION_ID = 'webdriverio' export const DEFAULT_CONFIG_VALUES: WebdriverIOConfig = { diff --git a/packages/vscode-wdio-test/src/manager.ts b/packages/vscode-wdio-test/src/manager.ts index 0b2fd27..f339f5c 100644 --- a/packages/vscode-wdio-test/src/manager.ts +++ b/packages/vscode-wdio-test/src/manager.ts @@ -189,7 +189,7 @@ export class RepositoryManager extends MetadataRepository implements RepositoryM this._wdioConfigTestItems.push(configItem) const worker = await this.serverManager.getConnection(wdioConfigPath) - const repo = new TestRepository(this.controller, worker, wdioConfigPath, configItem) + const repo = new TestRepository(this.controller, worker, wdioConfigPath, configItem, this.serverManager) this._repos.add(repo) configItem.description = relative(workspaceTestItem.uri!.fsPath, dirname(wdioConfigPath)) diff --git a/packages/vscode-wdio-test/src/repository.ts b/packages/vscode-wdio-test/src/repository.ts index 0febe7d..a80c3bb 100644 --- a/packages/vscode-wdio-test/src/repository.ts +++ b/packages/vscode-wdio-test/src/repository.ts @@ -9,26 +9,49 @@ import { convertPathToUri, convertTestData } from './converter.js' import { MetadataRepository } from './metadata.js' import { filterSpecsByPaths } from './utils.js' -import type { WdioExtensionWorkerInterface } from '@vscode-wdio/types/api' +import type { ServerManagerInterface, WdioExtensionWorkerInterface } from '@vscode-wdio/types/api' import type { VscodeTestData, TestRepositoryInterface } from '@vscode-wdio/types/test' import type * as vscode from 'vscode' +class WorkerProxy extends MetadataRepository { + private _worker: WdioExtensionWorkerInterface | undefined + constructor( + private readonly _wdioConfigPath: string, + worker: WdioExtensionWorkerInterface, + private serverManager: ServerManagerInterface + ) { + super() + this._worker = worker + this._worker.on('shutdown', () => { + this._worker = undefined + }) + } + + async getWorker() { + if (!this._worker) { + this._worker = await this.serverManager.getConnection(this._wdioConfigPath) + } + return this._worker + } +} + /** * TestRepository class that manages all WebdriverIO tests at * the single WebdriverIO configuration file */ -export class TestRepository extends MetadataRepository implements TestRepositoryInterface { +export class TestRepository extends WorkerProxy implements TestRepositoryInterface { private _specPatterns: string[] = [] private _fileMap = new Map() private _framework: string | undefined = undefined constructor( public readonly controller: vscode.TestController, - public readonly worker: WdioExtensionWorkerInterface, + _worker: WdioExtensionWorkerInterface, public readonly wdioConfigPath: string, - private _wdioConfigTestItem: vscode.TestItem + private _wdioConfigTestItem: vscode.TestItem, + serverManager: ServerManagerInterface ) { - super() + super(wdioConfigPath, _worker, serverManager) } public get specPatterns() { @@ -47,7 +70,8 @@ export class TestRepository extends MetadataRepository implements TestRepository */ public async discoverAllTests(): Promise { try { - const config = await this.worker.rpc.loadWdioConfig({ configFilePath: this.wdioConfigPath }) + const worker = await this.getWorker() + const config = await worker.rpc.loadWdioConfig({ configFilePath: this.wdioConfigPath }) if (!config) { return @@ -80,7 +104,8 @@ export class TestRepository extends MetadataRepository implements TestRepository */ public async reloadSpecFiles(filePaths: string[] = []): Promise { try { - const config = await this.worker.rpc.loadWdioConfig({ configFilePath: this.wdioConfigPath }) + const worker = await this.getWorker() + const config = await worker.rpc.loadWdioConfig({ configFilePath: this.wdioConfigPath }) if (!config) { return } @@ -166,7 +191,8 @@ export class TestRepository extends MetadataRepository implements TestRepository this._fileMap.clear() } log.debug(`Spec files registration is started for: ${specs.length} files.`) - const testData = await this.worker.rpc.readSpecs({ specs }) + const worker = await this.getWorker() + const testData = await worker.rpc.readSpecs({ specs }) const fileTestItems = ( await Promise.all( @@ -323,7 +349,7 @@ export class TestRepository extends MetadataRepository implements TestRepository // The path of the Spec file is the third one, as it is the next level after Workspace,WdioConfig. const candidatePath = key.split(TEST_ID_SEPARATOR)[2] if (normalizedSpecFilePath === normalizePath(candidatePath)) { - log.trace(`Detected spec file :${value}`) + log.trace(`Detected spec file :${normalizedSpecFilePath}`) return value } } diff --git a/packages/vscode-wdio-test/src/runHandler.ts b/packages/vscode-wdio-test/src/runHandler.ts index fdb4d5e..2630cb7 100644 --- a/packages/vscode-wdio-test/src/runHandler.ts +++ b/packages/vscode-wdio-test/src/runHandler.ts @@ -78,7 +78,7 @@ export function createHandler( try { const runner = !isDebug - ? new TestRunner(testData.repository.worker) + ? new TestRunner(await testData.repository.getWorker()) : new DebugRunner( configManager, getWorkspaceFolder.call(repositoryManager, configManager, testData.testItem), diff --git a/packages/vscode-wdio-types/src/api.ts b/packages/vscode-wdio-types/src/api.ts index d382a8e..628e477 100644 --- a/packages/vscode-wdio-types/src/api.ts +++ b/packages/vscode-wdio-types/src/api.ts @@ -1,8 +1,7 @@ -import type EventEmitter from 'node:events' import type * as vscode from 'vscode' import type { ResultSet } from './reporter.js' import type { TestData } from './test.js' -import type { NumericLogLevel } from './utils.js' +import type { NumericLogLevel, TypedEventEmitterInterface } from './utils.js' export type WdioConfig = { specs: string[] @@ -120,24 +119,22 @@ export interface WorkerRunnerOptions { astCollect: boolean } -export interface WdioExtensionWorkerInterface extends EventEmitter { +export interface WdioExtensionWorkerInterface extends TypedEventEmitterInterface { cid: string rpc: WorkerApi start(): Promise waitForStart(): Promise stop(): Promise + updateIdleTimeout(timeout: number): void isConnected(): boolean ensureConnected(): Promise - emit(event: K, data: WdioExtensionWorkerEvents[K]): boolean - on( - event: K, - listener: (data: WdioExtensionWorkerEvents[K]) => void - ): this } export interface WdioExtensionWorkerEvents { stdout: string stderr: string + idleTimeout: undefined + shutdown: undefined } export interface ServerManagerInterface extends vscode.Disposable { diff --git a/packages/vscode-wdio-types/src/test.ts b/packages/vscode-wdio-types/src/test.ts index f57d949..49119f6 100644 --- a/packages/vscode-wdio-types/src/test.ts +++ b/packages/vscode-wdio-types/src/test.ts @@ -16,10 +16,10 @@ export interface RepositoryManagerInterface extends vscode.Disposable { export interface TestRepositoryInterface extends MetadataRepositoryInterface, vscode.Disposable { readonly controller: vscode.TestController - readonly worker: WdioExtensionWorkerInterface readonly wdioConfigPath: string specPatterns: string[] framework: string + getWorker(): Promise discoverAllTests(): Promise reloadSpecFiles(filePaths?: string[]): Promise removeSpecFile(specPath: string): void diff --git a/packages/vscode-wdio-worker/src/handler.ts b/packages/vscode-wdio-worker/src/handler.ts index a18c3f7..c8a4b79 100644 --- a/packages/vscode-wdio-worker/src/handler.ts +++ b/packages/vscode-wdio-worker/src/handler.ts @@ -7,6 +7,7 @@ import type { LoadConfigOptions, WdioConfig, WorkerApi } from '@vscode-wdio/type import type { WorkerMetaContext } from '@vscode-wdio/types/worker' export function createWorker(context: WorkerMetaContext): WorkerApi { + let _shutdownRequest: Promise | null return { /** * Run WebdriverIO tests @@ -31,25 +32,18 @@ export function createWorker(context: WorkerMetaContext): WorkerApi { context.log.info('Shutting down worker process') context.shutdownRequested = true context.log.info('Worker received shutdown request') - - // Implement safe shutdown procedure - try { - // Give pending tasks a chance to complete - if (context.pendingCalls.length > 0) { - await new Promise((resolve) => setTimeout(resolve, 500)) - } - - // Close WebSocket connection - context.ws.close() - - // Set safety timeout in case WebSocket doesn't close + if (context.pendingCalls.length > 0) { + await new Promise((resolve) => setTimeout(resolve, 500)) + } + _shutdownRequest = new Promise((resolve) => { + // close after this request is returned. setTimeout(() => { + context.ws.close() + resolve() process.exit(0) - }, 2000) - } catch (error) { - console.error('Error during shutdown:', error) - process.exit(1) - } + }, 500) + }) + context.log.info('Worker shutdown requested!') }, } } From 9833d62f7cdc5e21a4e39d97e2219da4f9cfafce Mon Sep 17 00:00:00 2001 From: mato533 Date: Mon, 16 Jun 2025 16:45:34 +0900 Subject: [PATCH 05/16] test: adjust unit tests --- packages/vscode-wdio-api/tests/debug.test.ts | 6 ++++- .../vscode-wdio-api/tests/manager.test.ts | 10 ++++--- packages/vscode-wdio-api/tests/worker.test.ts | 11 ++++++-- .../vscode-wdio-config/tests/index.test.ts | 2 ++ .../vscode-wdio-test/tests/manager.test.ts | 8 ++++-- .../vscode-wdio-test/tests/repository.test.ts | 26 +++++++++++++++---- .../vscode-wdio-test/tests/runHandler.test.ts | 10 +++---- .../vscode-wdio-worker/tests/handler.test.ts | 23 +++++----------- 8 files changed, 61 insertions(+), 35 deletions(-) diff --git a/packages/vscode-wdio-api/tests/debug.test.ts b/packages/vscode-wdio-api/tests/debug.test.ts index d47d9a5..d210fb6 100644 --- a/packages/vscode-wdio-api/tests/debug.test.ts +++ b/packages/vscode-wdio-api/tests/debug.test.ts @@ -26,7 +26,11 @@ vi.mock('vscode', async () => { // Mock logger vi.mock('@vscode-wdio/logger', () => import('../../../tests/__mocks__/logger.js')) -const mockConfigManager = {} as unknown as ExtensionConfigManagerInterface +const mockConfigManager = { + globalConfig: { + workerIdleTimeout: 600, + }, +} as unknown as ExtensionConfigManagerInterface describe('DebugRunner', () => { let workspaceFolder: vscode.WorkspaceFolder diff --git a/packages/vscode-wdio-api/tests/manager.test.ts b/packages/vscode-wdio-api/tests/manager.test.ts index 07615d6..e08e267 100644 --- a/packages/vscode-wdio-api/tests/manager.test.ts +++ b/packages/vscode-wdio-api/tests/manager.test.ts @@ -19,6 +19,7 @@ vi.mock('../src/worker.js', () => { WdioExtensionWorker.prototype.start = vi.fn().mockResolvedValue(undefined) WdioExtensionWorker.prototype.waitForStart = vi.fn().mockResolvedValue(undefined) WdioExtensionWorker.prototype.stop = vi.fn().mockResolvedValue(undefined) + WdioExtensionWorker.prototype.on = vi.fn() return { WdioExtensionWorker } }) @@ -35,6 +36,9 @@ vi.mock('../src/utils.js', async (importActual) => { }) const mockConfigManager = { + globalConfig: { + workerIdleTimeout: 600, + }, on: vi.fn(), } as unknown as ExtensionConfigManagerInterface @@ -297,14 +301,14 @@ describe('ServerManager', () => { const stopWorker = (serverManager as any).stopWorker.bind(serverManager) // Get the worker from the server pool - const worker = (serverManager as any)._serverPool.get('/path/to') + const worker = (serverManager as any)._workerPool.get('/path/to') // Execute await stopWorker('/path/to', worker) // Assert expect(worker.stop).toHaveBeenCalledTimes(1) - expect((serverManager as any)._serverPool.has('/path/to')).toBe(false) + expect((serverManager as any)._workerPool.has('/path/to')).toBe(false) }) it('should return the same promise for concurrent stop calls', async () => { @@ -315,7 +319,7 @@ describe('ServerManager', () => { const stopWorker = (serverManager as any).stopWorker.bind(serverManager) // Get the worker from the server pool - const worker = (serverManager as any)._serverPool.get('/path/to') + const worker = (serverManager as any)._workerPool.get('/path/to') // Add tracking let executeStopWorkerCalls = 0 diff --git a/packages/vscode-wdio-api/tests/worker.test.ts b/packages/vscode-wdio-api/tests/worker.test.ts index cfadc66..6395d4a 100644 --- a/packages/vscode-wdio-api/tests/worker.test.ts +++ b/packages/vscode-wdio-api/tests/worker.test.ts @@ -25,6 +25,9 @@ vi.mock('birpc', () => { } }) vi.mock('get-port') + +vi.mock('vscode', () => import('../../../tests/__mocks__/vscode.cjs')) + vi.mock('@vscode-wdio/logger', () => import('../../../tests/__mocks__/logger.js')) vi.mock('../src/utils.js', () => { @@ -90,7 +93,11 @@ describe('WdioExtensionWorker', () => { vi.mocked(createBirpc).mockReturnValue(mockBirpc) // Create worker instance - worker = new WdioExtensionWorker({} as unknown as ExtensionConfigManagerInterface, '#1', '/test/path') + worker = new WdioExtensionWorker( + { globalConfig: { workerIdleTimeout: 600 } } as unknown as ExtensionConfigManagerInterface, + '#1', + '/test/path' + ) }) afterEach(() => { @@ -387,7 +394,7 @@ describe('WdioExtensionWorker', () => { ;(worker as any)._workerConnected = true // Verify RPC is returned - expect(worker.rpc).toBe(mockBirpc) + expect(worker.rpc.loadWdioConfig).toBe(mockBirpc.loadWdioConfig) }) it('should throw error when not connected', () => { diff --git a/packages/vscode-wdio-config/tests/index.test.ts b/packages/vscode-wdio-config/tests/index.test.ts index b16f6e3..a2effef 100644 --- a/packages/vscode-wdio-config/tests/index.test.ts +++ b/packages/vscode-wdio-config/tests/index.test.ts @@ -87,8 +87,10 @@ describe('ExtensionConfigManager', () => { // Verify expect(instance.globalConfig).toEqual({ configFilePattern: customConfigFilePattern, + nodeExecutable: undefined, showOutput: customShowOutput, logLevel: customLogLevel, + workerIdleTimeout: 600, }) }) diff --git a/packages/vscode-wdio-test/tests/manager.test.ts b/packages/vscode-wdio-test/tests/manager.test.ts index a5f4d50..b7ad46a 100644 --- a/packages/vscode-wdio-test/tests/manager.test.ts +++ b/packages/vscode-wdio-test/tests/manager.test.ts @@ -78,7 +78,9 @@ describe('RepositoryManager', () => { // Setup ServerManager mock serverManager = new ServerManager(configManager) - vi.spyOn(serverManager, 'getConnection').mockResolvedValue({} as unknown as WdioExtensionWorkerInterface) + vi.spyOn(serverManager, 'getConnection').mockResolvedValue({ + on: vi.fn(), + } as unknown as WdioExtensionWorkerInterface) // Stub configManager vi.spyOn(configManager, 'workspaces', 'get').mockReturnValue(fakeWorkspaces) @@ -159,7 +161,9 @@ describe('RepositoryManager', () => { }, ] vi.spyOn(configManager, 'workspaces', 'get').mockReturnValue(fakeWorkspaces) - vi.spyOn(serverManager, 'getConnection').mockResolvedValue({} as unknown as WdioExtensionWorkerInterface) + vi.spyOn(serverManager, 'getConnection').mockResolvedValue({ + on: vi.fn(), + } as unknown as WdioExtensionWorkerInterface) await repositoryManager.initialize() repositoryManager.registerToTestController() diff --git a/packages/vscode-wdio-test/tests/repository.test.ts b/packages/vscode-wdio-test/tests/repository.test.ts index b871d98..546e5f0 100644 --- a/packages/vscode-wdio-test/tests/repository.test.ts +++ b/packages/vscode-wdio-test/tests/repository.test.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode' import { mockCreateTestItem, MockTestItemCollection } from '../../../tests/utils.js' import { TestRepository } from '../src/repository.js' -import type { WdioConfig, WdioExtensionWorkerInterface } from '@vscode-wdio/types/api' +import type { ServerManagerInterface, WdioConfig, WdioExtensionWorkerInterface } from '@vscode-wdio/types/api' // Mock dependencies vi.mock('vscode', async () => import('../../../tests/__mocks__/vscode.cjs')) @@ -30,6 +30,7 @@ describe('TestRepository', () => { let readFile: ReturnType let readSpecsStub: ReturnType let runProfileDisposeStub: ReturnType + let serverManager: ServerManagerInterface beforeEach(() => { vi.resetAllMocks() @@ -54,6 +55,7 @@ describe('TestRepository', () => { ]) mockWorker = { + on: vi.fn(), rpc: { loadWdioConfig: vi.fn().mockResolvedValue({ framework: 'mocha', @@ -70,8 +72,16 @@ describe('TestRepository', () => { } } + serverManager = vi.fn() as unknown as ServerManagerInterface + // Create repository with mocked dependencies - testRepository = new MockTestRepository(testController, mockWorker, mockWdioConfigPath, wdioConfigTestItem) + testRepository = new MockTestRepository( + testController, + mockWorker, + mockWdioConfigPath, + wdioConfigTestItem, + serverManager + ) testRepository.setMetadata(wdioConfigTestItem, { uri: mockWdioConfigUri, @@ -94,10 +104,10 @@ describe('TestRepository', () => { // Group 1: Initialization and basic functionality describe('Initialization and Resource Management', () => { - it('should initialize with provided dependencies', () => { + it('should initialize with provided dependencies', async () => { // Verify expect(testRepository.controller).toBe(testController) - expect(testRepository.worker).toBe(mockWorker) + expect(await testRepository.getWorker()).toBe(mockWorker) expect(testRepository.wdioConfigPath).toBe(mockWdioConfigPath) }) @@ -126,7 +136,13 @@ describe('TestRepository', () => { it('should throw error if framework is accessed before loading config', () => { // Create new instance without loading config - const repo = new TestRepository(testController, mockWorker, mockWdioConfigPath, wdioConfigTestItem) + const repo = new TestRepository( + testController, + mockWorker, + mockWdioConfigPath, + wdioConfigTestItem, + serverManager + ) // Verify expect(() => repo.framework).toThrow('The configuration for WebdriverIO is not loaded') diff --git a/packages/vscode-wdio-test/tests/runHandler.test.ts b/packages/vscode-wdio-test/tests/runHandler.test.ts index fa9bcbd..dcd97ae 100644 --- a/packages/vscode-wdio-test/tests/runHandler.test.ts +++ b/packages/vscode-wdio-test/tests/runHandler.test.ts @@ -242,7 +242,7 @@ describe('Run Handler', () => { // Setup const mockSpecTestData = createTestItem('spec1', { isConfigFile: true, - repository: { worker: {}, framework: 'mocha' }, + repository: { getWorker: vi.fn(), framework: 'mocha' }, }) testItemMap.set(mockSpecTestData.testItem, mockSpecTestData.metadata) @@ -277,7 +277,7 @@ describe('Run Handler', () => { // Setup const mockSpecTestData = createTestItem('spec1', { isSpecFile: true, - repository: { worker: {} }, + repository: { getWorker: vi.fn() }, }) testItemMap.set(mockSpecTestData.testItem, mockSpecTestData.metadata) @@ -332,7 +332,7 @@ describe('Run Handler', () => { const mockParentTestData = createTestItem('scenario1', { type: 'scenario', isTestcase: true, - repository: { framework: 'cucumber', worker: {} }, + repository: { framework: 'cucumber', getWorker: vi.fn() }, }) const mockStepTestData = createTestItem( @@ -340,7 +340,7 @@ describe('Run Handler', () => { { type: 'step', isTestcase: true, - repository: { framework: 'cucumber', worker: {} }, + repository: { framework: 'cucumber', getWorker: vi.fn() }, }, mockParentTestData.testItem ) @@ -371,7 +371,7 @@ describe('Run Handler', () => { // Setup const mockTestData = createTestItem('test1', { isSpecFile: true, - repository: { framework: 'mocha', worker: {} }, + repository: { framework: 'mocha', getWorker: vi.fn() }, }) testItemMap.set(mockTestData.testItem, mockTestData.metadata) diff --git a/packages/vscode-wdio-worker/tests/handler.test.ts b/packages/vscode-wdio-worker/tests/handler.test.ts index b8f23d5..f1c6416 100644 --- a/packages/vscode-wdio-worker/tests/handler.test.ts +++ b/packages/vscode-wdio-worker/tests/handler.test.ts @@ -143,11 +143,14 @@ describe('handler', () => { }) it('should close WebSocket connection during shutdown', async () => { + vi.useFakeTimers() + // Act await workerApi.shutdown() - + vi.advanceTimersByTime(1000) // Assert expect(mockContext.ws.close).toHaveBeenCalled() + vi.useRealTimers() }) it('should set a safety timeout during shutdown', async () => { @@ -155,10 +158,10 @@ describe('handler', () => { await workerApi.shutdown() // Assert - expect(mockSetTimeout).toHaveBeenCalledWith(expect.any(Function), 2000) + expect(mockSetTimeout).toHaveBeenCalledWith(expect.any(Function), 500) // Verify the safety timeout callback will exit with code 0 - const safetyCallback = timeoutCallbacks.find((tc) => tc.ms === 2000)?.callback + const safetyCallback = timeoutCallbacks.find((tc) => tc.ms === 500)?.callback if (safetyCallback) { safetyCallback() expect(mockExit).toHaveBeenCalledWith(0) @@ -167,20 +170,6 @@ describe('handler', () => { } }) - it('should handle errors during shutdown', async () => { - // Arrange - Make ws.close throw an error - mockContext.ws.close = vi.fn().mockImplementation(() => { - throw new Error('WebSocket close error') - }) - - // Act - await workerApi.shutdown() - - // Assert - expect(mockConsoleError).toHaveBeenCalledWith('Error during shutdown:', expect.any(Error)) - expect(mockExit).toHaveBeenCalledWith(1) - }) - describe('loadWdioConfig', () => { // Create a mock context const mockContext: WorkerMetaContext = { From 9467768ae10f244b5f9c08b5547a22c11f8f181b Mon Sep 17 00:00:00 2001 From: mato533 Date: Mon, 16 Jun 2025 17:17:24 +0900 Subject: [PATCH 06/16] chore: update package name --- CONTRIBUTING.md | 2 +- assets/build.png | Bin 226280 -> 226459 bytes packages/vscode-wdio-config/src/index.ts | 11 +-- packages/vscode-wdio-config/src/watcher.ts | 14 +-- .../vscode-wdio-config/tests/watcher.test.ts | 12 +-- packages/vscode-wdio-logger/src/logger.ts | 4 +- .../package.json | 2 +- .../src/debug.ts | 6 +- .../src/idleMonitor.ts | 57 +----------- .../src/index.ts | 2 +- .../src/manager.ts | 24 ++--- .../src/run.ts | 4 +- .../src/utils.ts | 4 +- .../src/worker.ts | 24 ++--- .../tests/debug.test.ts | 4 +- .../tests/manager.test.ts | 72 +++++++-------- .../tests/run.test.ts | 6 +- .../tests/utils.test.ts | 4 +- .../tests/worker.test.ts | 6 +- .../tsconfig.json | 0 packages/vscode-wdio-test/package.json | 2 +- packages/vscode-wdio-test/src/converter.ts | 2 +- packages/vscode-wdio-test/src/manager.ts | 19 ++-- packages/vscode-wdio-test/src/metadata.ts | 4 +- packages/vscode-wdio-test/src/reporter.ts | 4 +- packages/vscode-wdio-test/src/repository.ts | 20 ++--- packages/vscode-wdio-test/src/runHandler.ts | 8 +- .../vscode-wdio-test/tests/converter.test.ts | 2 +- .../vscode-wdio-test/tests/manager.test.ts | 20 ++--- .../vscode-wdio-test/tests/repository.test.ts | 14 +-- .../vscode-wdio-test/tests/runHandler.test.ts | 10 +-- packages/vscode-wdio-types/package.json | 8 +- packages/vscode-wdio-types/src/config.ts | 6 +- packages/vscode-wdio-types/src/index.ts | 2 +- .../src/{api.ts => server.ts} | 8 +- packages/vscode-wdio-types/src/test.ts | 20 ++--- packages/vscode-wdio-types/src/utils.ts | 4 +- packages/vscode-wdio-types/src/worker.ts | 57 +++++++++++- packages/vscode-wdio-utils/src/index.ts | 4 +- packages/vscode-wdio-worker/src/client.ts | 2 +- packages/vscode-wdio-worker/src/handler.ts | 2 +- packages/vscode-wdio-worker/src/logger.ts | 8 +- .../vscode-wdio-worker/src/parsers/index.ts | 2 +- packages/vscode-wdio-worker/src/test.ts | 8 +- .../vscode-wdio-worker/tests/handler.test.ts | 2 +- .../vscode-wdio-worker/tests/index.test.ts | 6 +- .../vscode-wdio-worker/tests/logger.test.ts | 2 +- .../tests/parsers/index.test.ts | 2 +- packages/vscode-webdriverio/package.json | 2 +- packages/vscode-webdriverio/src/extension.ts | 12 +-- .../tests/extension.test.ts | 20 ++--- pnpm-lock.yaml | 82 +++++++++--------- 52 files changed, 304 insertions(+), 318 deletions(-) rename packages/{vscode-wdio-api => vscode-wdio-server}/package.json (95%) rename packages/{vscode-wdio-api => vscode-wdio-server}/src/debug.ts (97%) rename packages/{vscode-wdio-api => vscode-wdio-server}/src/idleMonitor.ts (77%) rename packages/{vscode-wdio-api => vscode-wdio-server}/src/index.ts (61%) rename packages/{vscode-wdio-api => vscode-wdio-server}/src/manager.ts (92%) rename packages/{vscode-wdio-api => vscode-wdio-server}/src/run.ts (96%) rename packages/{vscode-wdio-api => vscode-wdio-server}/src/utils.ts (96%) rename packages/{vscode-wdio-api => vscode-wdio-server}/src/worker.ts (94%) rename packages/{vscode-wdio-api => vscode-wdio-server}/tests/debug.test.ts (99%) rename packages/{vscode-wdio-api => vscode-wdio-server}/tests/manager.test.ts (82%) rename packages/{vscode-wdio-api => vscode-wdio-server}/tests/run.test.ts (98%) rename packages/{vscode-wdio-api => vscode-wdio-server}/tests/utils.test.ts (98%) rename packages/{vscode-wdio-api => vscode-wdio-server}/tests/worker.test.ts (99%) rename packages/{vscode-wdio-api => vscode-wdio-server}/tsconfig.json (100%) rename packages/vscode-wdio-types/src/{api.ts => server.ts} (90%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0a9c92c..31f3712 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -132,7 +132,7 @@ This Extension consists of several packages. Eventually, these packages will be
**Service Layer**
@vscode-wdio/config (constants, logger, utils)
-└── @vscode-wdio/api (constants, logger, utils)
+└── @vscode-wdio/server (constants, logger, utils)

**Integration Layer**
├── @vscode-wdio/worker (constants, utils)
diff --git a/assets/build.png b/assets/build.png index dba9630991d322bb4a67e3efcc78d1f273ea0779..e287fdb9e83cfd782d694a80c250ef20eebfd9dd 100644 GIT binary patch literal 226459 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%0D3LPMu5r|i4hq58GPI%;X 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ħy0G0-=*kTQiGu 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˝QOuzDL(c9rm{N6IM>yB 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 literal 226280 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 _Su6Se=B(Q0Dujv32KXKb5 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

F9#WS7^hM^>MdG`s` z_N=@7V`eGEQx*5{px3WGXT7w-!ge09M@(a{Qc`%LRm+m4uGdlrViEC-ht;XFmK)5q!knt*km0!uhWf9Dk~~d3J3_ibsD>w30Mc3{P4+>`(a^>X6ELX zAUJ_jInRC^TW2`RcH+MZKC{fT5bu?JJVCoLDwO@%vMibHLDIF!A3wYs%wGOwm+8Pw zS!iA)+%>a9fEI+kFCh^CuXe-1g9iZx72tz6m2JRr^1FY3`$^~{u!a+`lR+jRw|vl; z*}4_?> zI0x@B35x;Z`#dY_I6NVEPD%mw4<68Q@$&8y7N!TXfXS+&u1_50S@frY> zLYjVJaWM1KS^PSYQJiBL&aR+e}|960}-yLYjYN*fHI22llP-hBoRvdMP05g#4|_LY53 zaY~9Zn}@B9&5rq*nHh%LdRPY2OP6Zq5JYH1wds&hzFuo*jC-f3ZsSn>Tc9YzJ&- zW@jBgo`#vw#7~Ga78CHhv<1RBCDUKLP{EFcK}QBoFF1E_Vt;6Z(zl2DK4K-T4Is|9 z&x?wlEo5NpN!Kiav?dThAVl^d(ZxzfrjWhWHrCOOJE!3GuxSIZBc`}IqKST$4AkARBk zN5J&^-~s^M5TqR*^Mk0UhENHMbE2>eH|VxG?46sP{SqTY86*3!LE80^zztlYI&Y;0@{M^!)T0I1<%68PHPeKAsiA3B7O0>>TRF*B|-H8p7#eo4v5gNrB^f@}ny zePV<|V7-oO{5>8J*;IumltWOEmYV4R-6`6(W83%d{$Y+72=PcRn0cn@3tSXqtr>bI zMURq_d8i{JKIINzTS92-_m+jDMT~B0C~l*0#iGf(%cS2JAY_vgl$e>a@b zP%YfBVMEiqzx(FgWP#snJ+-Vn&!0cv75Proaw5y2Tq5@Bi~~?)hd%)(nq&YXp+w^F z*NlBit88p#>fq_90)EIm$6am^!k;G}R{tzh(TTlMwrK<(!qU%&=R8KgZIKk06>NHO2 z3F&~gQ;n0z^4)FIbv2WXe}{Iq=~CAD+H;5SY2u%6w^6i6fT(JpJ?oEfjy>`s0$$9} zW*g)YnW9C$K+p=C}9ZE_{`YVT|-SBpzzlg~a!6rnZ zyj9w6>w?;$aU;V+lw43hE-tRUD2&t7)12y0nz9rt(jbZ0e>Ai*f_8p|fiLZ|l`!u{ zJLfxda7a2_z6I#pE^}-GbiHxu;K`TI&7W@1uo6 z%y~;-|9(Z(&s%u|dWMGGkt6|e@yFp*VyQ?=(o3pRgfZ#{RcI_!@|>bmL#X2I(&HAk z6D@sI<5G_px71`>*;tB1z4dxHyy28U_@Fmq8fOWraz4d|y}x}JOH{C5j~b^3({A1B z)c+XIT7!jHtgi;Tr&>nuDusuKnM%CGf~l9tgN;9nW473mX8^9 z*0r3COlofY$`Yl-yp}isz=Y=!41f$}z1zNScM&9)I@v$hj4rmUiS7~;^Vps~At51D zv1R4ubw((}L_pHlcM~BV4-T%w*+-(T{@eAUq9X8GW_0;MFJoil2-ibRa#!+Lpe%q& zRlR;qLaP89hMrG&M8KFhUXZTgeh>=8#}gT!6_UtMu{$$QwyT_JIUCLQOyxPPd1F+P^l|5#9_-^+@%4vgqA2*C1Tha z#KwoahhUih4W@JF&XHo4AMDt(C&Y)EnG>=V;!dblJaBI0@ab^H;wFUfC8ZE$i@eppJm&z!Sm=Z9p7$it)&*Jn@7^KoYAhtKxa znTaG+R+@B!>TRW=@%ydX;$%rPbZU!+Qs+&A=0T-a=gHf=NyXPEsah#YeIt4xZEs64 zk~5t#A32T0|K;xR+&6FDEFP|PGD7fj0R@>0vEax&4FGg2V>CX2B&?{?kq=}CHPusL zy3uFH@AF$4S(VFt+JD1IdN;VUHwCf-YglV_zm`_BFz;>!o0tJH6u#2xcF(d{Fn?RfuHK8)vi}*OVHKQ z3iSWiy5HzV~EsCq~qMi8ZKZr5~1nrVAg?0=T`qDba*Ww=^3fPkt zt6BZ^n=UoG@(zuSS)K{dFE*6p(J##Il|CcMbLtMotE%?Vy&oXw5;5a|E@ z{XSvxp)0K!DDtZ_@@S`#j%ALPI4#&y>%M*aCO&!b*$r#JfrpPD-vbH(#pgt12YXZI z`ANsy6{_K3j75QG{$4WTPuAwUGOMZ&jGD-8a{l}-G{rg(<(!p00tH_Qy)2&k83C$@ ze!6-Qol!54Xir9w02ag%xGRjWLoSo~;9jV$_&OfiS^(5baN!U}rDZQ3nw_2XdtEOr z`KT>xuw=X(b)IzZxR%JwY9ZxAvZ+iR1m@dMPm$C%Q&6& zM92JGVPWAALUVO-vhF!IX09NRKn>I!%--gWS~&%0&J0lz}@w^AYb=ikipvxmjRo+c+B*Y8>P>R^4{)rY$o7%sUa zBN+T}2T^t%ZIO&1Km#J3mX`cP#_@YAKV-=XnYBs^}ZQVCQg^wVJW1#aGg0hVQo z7l^nLQI_#>hWWYq`8|a_KKXK?@>AQJcql0;VM6ZwH8b-tK0btjSMxQz>$7Lia_YZp zYKnchDZJ^5=nAaH!P}eIk0KoH1&d(_#_aXk9G=5^iah>|;^h#*KU#%qyiDYb>9AAiSXi)A z+sB}rt%u1jzC#<3ebB71t?jgLXJXV&X}7SYws@p|D&FoYgE0li(+}41jlE1u+pM9XF(?`g@JSV~d1MM%HmRS%saA#>FVa3!*sVo(AE~r zJ*Rm&ak_tO%pVv$noiBi{b0cxT4;MZ;X!RZtjaDnXz@%ALg?@aftsrOZnV63M2<7@ zYyc_}*-!{6IQVV|@fjWfC;-<&GQKMDc!2e~WEcZ1b5(W5L!L(;$#ESP7blkC^-W$z z_7_1$5W2yj&A+X1JfX%iY6H-A_U&L~ME==dn_ohL8TsF+@XuVUEAy51FcA}BU^dIn zvrWKdV!4rH{>n#vJG>Smfk$i}@QGZwr!p&lhQQBVW%w7528R_YFYE0o9>_G{zJ~wgDxGeINmXhc# z;}^c@{%A|UPY@6Bzt9iSzCl?D-Ym^aLP{;?x!0p}v&WT{Ib~!F^M~U$SFSR|j<$dN zcnewaXj^)sZa^|pQ`@4er+4Gg9(r;kktVlD38huWxgfHTI1&iY!MivHT@b=?4REqZ zQZ)lKWz;r|?j+^r(gVn&_cI0{jxrBvhv~MCwRL9G98klnynRnjJt#B%ucj z{hVhyh|*G7}Yxwkq4kc18c>2vyn=9q0M`ECh;yd%J93 zBPRlJ;_GMvnY#_qYY4pb(mR-$i4p*|Vdvy@TwgzoD)w1%+!x!27FVE2?k?n1E6LUu zfQr6%0!om)?N#YR!^GBPq05h*7$&NF9tUwuYlK(R5%xj->EG?WWQ zX)nvevvFc#g0^=%GD$?{fUGVeCgzPfAU0VyMktO|? zf=k5VV&PL|Fb{D_iFRtfHZIzudUq@X?Q$nyO=THgfJ104ZcoGOG{;2tY1aK#Dr}=NCH}RBlp$v zwLZ0gu)cu6yDKXO5yU`I;+T4}?f@b|3KuVO z1hdN$a}gjVh!+?-cU=BItvxT#Tq$F{zh-KllwQ-q%i`j*`RYhd=184~hi7cKZS!XP zsnc{1lZegE#Kb8tzXxCi!!X|JJk`Ixy?+=H;fsjdfphs5${!@ecF6tx%0Q$SaCC?O z!&Zsz{!tE%v|=U^)n_?l{=9KVp#_TDcKfBqd$GctygvKUf|YC`hO$y+J=**cdN4-SM z2HhM}Pg}PZ{FSjZ+He>i&ZcV{=*gLD$3;5r#S3EOVj7W|fvJJ&=NTDy5&gnxIUcU7 zsrex=^2pnTY7KBOklniF3;Q(Oj<~66X!s~3*kJ|8jz~ZK|G{V}n9OXl`o7rIHAn#l z5)LNe;K2cRUvn)D^lY>5t!)e~xxef2UoHTw9Qz?ZD~7=D1~{!bvk zho%q~9!?Cck?5G1?)|5KPY>4M$Aw|y_V?>Bkcr?X(Lf=E5d&9;5BuMLj_QFl37$CV zR%z)Gj7iv}$7k+OOu4%2I_iB}Tbup!ZXVfIZTmwU_gWFu_iw zbQKlvMh33Ht5?y}3$^g%ZQAt`F)6TOm2FOjkSH-!MNGrk*c>G6ZOjl6BSe(U0R2$v z*&KdHI*tKp;S&?bQV_C2jBxwSJz6o66wJ)b(}lvoHUP=QEM=0fw9Sv6Qf4AT1rl!T zId{ssyNFCyEU_4NtLH+Pl}HIpx9VvPy!B@&LgsTCp{WaK@4@V>O>|ZToji`x2zf)U zy&w{`H{yM+1(}mxnn-!6s;WA?QV6riX6Z@!P{Nu1>ecDSaIPk5iC)#a&_xhuc9?n` zcvwV)SUZ%l1PqHIrb`IdxGxlK(rZL+P;pLZYAWmMZr{$pP&3!j;uYyt>ymZ(dtFa*v_KUDK3tDz4D1gO z6GHmIo9`5Q~}5CMx}rRKWN+gf+M z+FFV1nfY=zB~6sI>cvl}#Z$0X3I2`#cL3#X7U$s{aKI!H9sLIoV$4itGjgtuAUQiTMzl$w(bxGR%T7B0)_JgGsP*>3Zhbyp32N z<Nwl_IOJ`tU7#JEFBHV!}Qz%x1dxR#1u5S0^i*RJq z6@spPdlz2+{(Uv3qf%^kj5rcJ!=~%iF;LiocH?T7ikaPLR*x>!i{&mYc`OYwR}v8W z0ZNy7+>MP9M$S=5zQ;wo0Zp-ctQArTAJ)Qx3W^UNN6zLr)QB6pBr;n{`#7E%mjdrN zDZQe?I6r-6YU-$mhYXNV?E$oD+TQ!QgvHSL`eb|blP5~gQ?&U22UOcHUAmNN^i=u3 zh0x$0r%Yvt4VtWH(o#;+iHYJaD9p&tt|hiaPtVr=%4@$vA3ah!{-~AnRu+Zdr~*o2 z65LPtfy9i|857S9IKV|klGBCuKRXLzJUTQXK)QZUOPv}FIAr=MMZ*=D!T%;#L};RT z&VZXDjZK5orvT&B`Nx;rNZYoMs}s+@g-!xb4glhLW+v2w4KQ4ZYzBsRIfaGEJdP;r z^yj%4=t)l@!V{+*Rdh|!MJG=8fpli0kcx2$^5IJ*o;AT{@w`DdV1Yp8eVF{9-?8H`kCGY$EBIH7KN-jpFh%d6&(Rk# z|GyFNF(oB$l$as5BhEC1J>ML5Vtn)>`9O+pnzcY2PSZWuw5)mqMiqENLtm53ju#l_Hm zT2l1ovD#pz5i)-`6Fc7H0RwvB=0KX>n#X(I19b%kAg@diS!hs)-LkDL?~(gSjxc_6 zDMa?({_LW4MC@k7`b6D>u_aK63nL$5iRw$lTz%QysM?L)vv6V@-j4RCVPB%alWI3= zA?BudLg=dA-T%u1obbD=qOSBQNK7loX%uRU4>48H(T?VhTFU8)&W8Zh7C=?xN+(A( zauUcE+9oFQ!ww#Bmk6oZ!=vmE+qLBzaefx8#Gs&ANNue$o1`6yh`|(IBj)Mh^Vosj z5hVGHp?%Hq*fXlhxcVFs6IK8pD(6atFFX+91ZQc{=4R8m21}y z!Gg_ko3ql%3VZV8`{>0FTR`rMK%#*%eVI)>=+TSfKY1>*h!_SuH;P9`4wOrs=3^XeJTU%# zOj1~YzDckxp#?X1J1&kLsU-ppC!Vteq;Qa4inIa{C7>HIdqX4#iE*Kv3%8SezuD15 zRTM)~Cx%(pwgciRM0~Q{&|&M%n+>QVC3e5Qs)7>@A^ukj@Dl{~LC7TNZ4gj*oIHJ+ z30c|QvSyr5Y7y%JOVrWR+jp+My|wjeVxmI+G!5o<+}uhcdHJ!2iDj{k(*{urW;ju$ zclk0mUPeIL3u6fXM*QGB$kxt}4CJ-3%oC;}Q3#4~-AP6d2erF|DoD_|2hq{g5)y^{ zHv}>7_U@e;Bv!TcYB+natBDaMxUO)1IPW}z+m23xu(4Ld3DzU@1tQCyrT$IC(VU)%Uqxa05&3fUnCNcBlr%kE-8&{Lzam^$ zm*+u`Z>#L_WF&^Us(GG>cXoAw)lLgL$Pk28SlC`YqkK$!4>i4p7SsrFUYFCD5W`}4 zi*NB!&_AL|p>JjNJ^!kdyzw_Z&{@JDSSsXBYrRfPUqKRGlGjqwBPdUk4XP(WbqJji z18Dh$h5KMf5>JN+I0Kqqo84$#CgFMc@?}_@>+N23_mnhW2caH0i5Xb!jL(uDe}o{@ z+4sMuAm+~Bzo*`RI`b$x29cx#u!%WV$Nd1kl?a9t!G6r45TSXMZIG`?tKP$iU;?p@Ro~ zPG@Woa%L|E<%IU8Sz0NIq%*W|MidID8utN&!DOqUQVT}x!$kIfNf_)Y@M4x06n~-F=8`MOWo|s3R)zs9|ig%WM z>TfZDWaj@Uy4cPHAHlaJ>RMvTIi~&Rb`jPf*WVrH01>o?H<#yJF)5qcqxAU`1rmuP z2(1u7;OXC8*Y-gsmB(Nck)NzWkA-OY1Wu-clT!gz+<)>0ggavR8f5?ojEDwe#;&IL zq~B;6zzvXmLVmvfdT}T(2yLt*;ka_{-+%G|E(d6|;<y7b=IM9e;-{Rx)-5b>CF@2e*AcaS1WD}4X) z4ov2})rA5E{y@3~gG@uJT;H^LTb|Nai+@sXWaODKU~s(W1Gw!mRX9{};cLAzU<8`! zfH5dXL;*Ef{=S;$5`R%AwyUqMlJhy=1!ngkorhG9`E+;ChjTu@5X5C=su`GDzkU8|rTz>m5o_8sk%}!0+q7zYP^UQZ% z`8`?DzAQ_WywYdePb#FePrmV?_JBkI6dZ)~u88M?w<% zcNFvJ=vzK_QsK)_bQe=D9d;O>?oV?V`H+9LU9r>%uF&if4-~#sJB84>+1(}{SABkSoy>WDg@Ci*UpY-ttZCWA+)9% zl{ym(fM<|lr0dVap*LOZI?V~9ZHkC^zU3#3D!V8L?$jAnHmBBMM5G2uGJ#Dxc(5QJ z6f4pXtSl}40W`1gJ+;w@io^Ic@_5XLjP>uNf`&tp1tCtxbw)mUB9NdLA!uZQkM*aq zp6D&lSZ}@|Ret3UG4Y1cfU%DWcSWvdT&fG+xoa1(s0Htt6rQWBEzr!=fTGvpPYH~T zD_B_YZDkd^fW->jDSSuJs6=K?I%MAYkcErOSPOTuxjp0t>VuIT$tRir(s6t9=>Xw{ z&GCa@N!kyt$C1gm?$C`&Yt1-wh$YMD4&G`Z;{3yac>4hG7R>rX_WKM^a&C^gZvu#j zsmd$J>5JKPGGZNS16lT64CR}%?I|Hb3Q`Wkf!9%M5_OZ+A|oTGaDG2!otG$anG~cX zdDE?)ICiobi+~r#DB_}FxFLs@@ZyDu#Vfr++a8PFvf@r|`BPXgJoJN(-CQykrb9?!ji4?Edq!|`t0<|uEv%Lph}_4UO&jko2ZP~$x#J7rvjka2v50S`6zh>6#w^r3sZ!qV04BAYqX3PBe@L8>qV zQ*1Y|F7}AamF^;YnmuyFa$$xzJHG@27i@U9%ex<3pnvM>>Z2bMD0%Q?YtB>YBm&uB z@d+&sE*e}D!XQnq35ku}?YS_UfYW9bAz*v~#E3x72ItPbbQ(W>ws4YLwfCa}8X2Y|21SD8!!&=;!i9H_nKxbX zF$8r)^cw2wd@($L3Bg>*7gzQ-P-M02lah*pzIY2`sX|xV4j{L)FG*^ZVsn&QFc`uV z1gIS6pXa`R&Zt96;*@ zV||!JZER{9>&WAM_3D+FRqKhLy7A+dqJ_lP2V4LxtNZfBKl{FAa`U!rXYTOg9Z`5BzLc&(2Ifv!D!_R#K@R)Tedr%xO;b8}zp-`z)?!#V_$yK$1DB<(qehljD28l6MS zC%21)8{#YuVf4}rX>i!AqE6rS<(6ml&K4?%o!oG9h?@3koSf$q#EE#X9C7;D8ICHQ zW|U2r$oQ_lUi*y=z7l2}?2}h7l{4^N9?GWsPqDRVQwQUeD^D0(HI#StAlWS{mTDMEtrg6Q^6X-7V2iH_e}RcQ^VIMibC zGL!8Xh(L4$P!FR`+67jplIu#6lev+p_~nxp2;4#(c+4@K?;I*uz^!@APxg(#=)M3Q zM?d3q5MFXZ+#YnVRzVG_&kzuhLQGh%g-1v1m#lM#QC!0N(=Y}lVroJ)9RlR;fCq}? zjufKtK-~JzwQpw|l@5-M`rW-tnUa!{oWB1JW{tx>j^TAkc>Y9`7+fC3C&hh!A~HJq z(v>Sbl*QiKA>Qf=R8C+J4tSW~7*S}>ons9bIF+ax%7eEW+0RcHb>>^*6>3ND(8K7x z6#R5YR+bk5;UKu2z~m6dCDq1b?vQ;>pFXXhZFu&lZq0t@-#^aYqhV2iIgMGf1eeKP z6y+-?>h;}ZT&Hef#dA@V1Wu*Dg%t88j9>4$ad`=`r#W#Q`$c0BqL+04o!KIgejz0k zNU+h0NnvRpJPNplG1b1?W^gC~Lw2)@TNAfSOG`UD(X$J|*n;;Smd);y9v&&9FoX~G z<$3e56E(=V5~Y@DOBgiUCd^eJ?LUlHHYA=ew8eAu2LK0QXe@RZ!Kk9?yD)wn4ZWYg zeCQJELAQx?%FAqB&8YJM2s^tGlfJ& zL$hfW{2~&`78rmS!ARanf7M+CZ#QD|WoBjBJ37AY=!gPhPBR*oe-snbh}Wuw%{N29 zdlVUY0%)D+UU(1&1_l@4g5;(9xXKcRs_Yzc;)dmJ1=_3AsN_%{wjAt*N$y`CUqA{1ooax0(txHp6e3^S(-R9dC*9}?9k(t( zCZ=@}`t-v+Y~Q)F9z#Mf!F4M1cCg808I`{3{I-Qd?IAt{n;oxcd;9)<0Qv$BBAm5v z7+(8^ky7o_w>Q<3$aa5!UH;}NiqG1ACR;n#^mt%UQ24yY{{8z|4_iHRE>;NJKx~GU z*vdl|yO@}iaRQLaBHjt|PV5^%kS&w^=6k)Az}u-ryp~*3wBiLPV-*;yuy&Zy*QbqP%J;YGc$wT{ z-2CA~Ft$j#Q94~>SUsQ$hRqR+2|y>q!8`#twNu253WZ(Fw%g$6_SFKMQF}n&Z+}h! zdSPu_;`IH_C=y_j+*9rzfoLY*McpdX0&FoN1@UgrFrf7%Gqc&o8ZJ){k4QOBX!@{2+bMZ5FI0<5@0_1XKVT?YCI#i+0olU zL0i$ne)aOd4N$G;@^&o&wiYz0$PE0ljfUpyU`+tYry|F3qB{z>SsS>Vxpx@NIZE7y z6*ES7)dS&msTOeoHDg!?IV*7(kgRcrr_-FJmP#n^h)E?V|O=NMer!4g~r8wAdoYVI6<&(f0B0k zj&pXqpx`jk6MlSoh?l6P6J2Qi`*-gKNB9d6 zb5bco#uQOBn9GzD8kI6tREDA`B9bx}No3e0VN;~u@3Nosem>_p&pDf2|NnjeersLp zx~{cWLA1POA`YV@M0}Ix>vrwhxdi_(Ypc?ac%Pl0ABb5VBot>AJwEc@En-oLv7h@s zqVl#3K1?6$t*FR^KFy&+#exYs58%!|Pg{2!;lBSyg$jgT)W~gcaCA;I+f@Bh5qI~z z`#o9`M_OxWoW3)S$pxA)QcMycgakb`(;qmlb}lpm_0wBOD~F%o-ZSfJuzqgRAs&Gn z7e0v|UnE}(;x`4&buKI@S}ttN4A>Dc_VgzCP^>HK>o)Qw63?E!cH>5qPMtdOIDCN? zf9`A?${qeq#=JEqMNo?Q^GUy6RqT4;so_iIE4{dSWgkA=W^Muv>sfTphG@AgTPD@k zgMQPMQh5JkJ=PNBvBd@1nmOG)0>$`iyR8{uXpE`p+pf<|kwwTZFA?i{ajq$6J~JKY zW^j8=-xFP01Q9PLPM8n@=mBu_J{QDi`*!DGxXH70kNsDD6ju{0geKa#b7zrOkPcaS zBlm1+QSx@^kxIoOEtD9Br7`CbO0j~-T0&FuLWKu4t-H*>^%Q=EK?bW}3 zpyn8VJ&!Mo$kh+~RiuE5=A^r~#FU8BPEHI!7aU{1Y}xM9r*(lNQDe5Mei=UXfGI)A zs!N;XD>_OCXa%@H{Yn$uF=kSj#Zhtz;+%JDBf7ob@@GTN%)6ZH+qCte;Tuwu)moXv zbvH7aWqZ7o3J5<>?;iI+kBR5b?O&@rcJI+4E4T2Grkrz}^!?Lwa|%~t*R#EQ;%k}B z;0Tk@cg}@91R5D|H*mxErM8Ne+iX5o-MdAl2A&?)(ufCQb#awLig{a;1Kp^d1?h%+ z)iEG(0%t}r0Re1UTJpk`l&-iPrB5#>u8($WER(k>yPe-?|co>VM^S$6F%V_7{|QO>tu@e4^Os7CygSVBzzm;t5)Vg!EMek zGFSoTSx_X6A=eRFY*Y^*8`i$E4UMXu1(!r!;=s$p{M;X4HK}4>u2$2K-0+Vdmr4b; zrExQyCHDNnJ4cO!|76inHHX4ijn>d}X2O6;Qeg}SKKGPs)1$s>fz4D@77^d+M6+{r z{KM~}xEDFJJ(*+dh|l5xh}~q#FQXwtZjMs7njt6FR>C<>Nqy$wTwMLSyu9GVbe-~u z6MlY;@hT;(J+_G{P4+i-y#%ledE-g5vHql)N>vurcG)>O0~g$Qfeb+6lvhm|7WCSk1lpOXoP2H5-8ZnWO(Yf)}PCC))~!paGqsK4}yo@0KP zZlh3N_q;AGj!FSWY7J^Itnmk%y2FD$m~1=SgW~S#Ij7a=ioDJ&CIOnFm_6us@`;0! z(`uM)NSzySenS{UMYkfnhP{)MY50hZiK(gMF_u(J^>c3vx`;AZU;X)I>&RB#Nl62S zum6@=RMe5Q^3UUh`F;Pzd#Hyo0gHzT|E3HVn-pr$`{1v3CI?1PC*C^EuKs+ZVzUdwEkpFdY&uEIbQZ+ot%e9A|U+QB1$Bp&p$ zR*LLS&%MY`{8|Px)n##3;%v{w7CFTCgw&+O60l7#F5FcFrN+$Jv+Z47E%{1%7?sm3 zH0yf9bZ9rP+cfImk5A8`jNd=&U|#O+!k_~%+T^6i?K*e9Ly&j>_O2yY!u~;=)%AHk zYEj>4oL$KO!}S%pi5fbv%kZd$*LUQnPX>uo0{E3QY5?FmncU^w^R)A)e)XJp5r;2@ z4+G8?(jmO&ec`x@eSfvm-(KH;YLQU*N`x z{gVrOkF}EHK5^QCDYqUyI!FO`a@JdN-yu>l85Pm)$`i-QkRRbWPQzwUoRG-N>j{_d zxfYSjXu0BRGc9?mr01hY=e`@B2#W*~FyFnkd+v6Mb}H$yl+z5jIiP+?Yn!h{S*7x| zSc3eDfB%`@q(zrIGy^z4K66ychEH5HqKehxNynM!VDe$#w-1jk>&_@!1^lh0HGs;B zp`Dom6 zGQ9IJ_dP(kRiB;>C9TWMRY-%WX$G3Pr}2}@bl8N1gtPr7a`|Cza(EXE*|;BV+5$@Q zA$hba6d7j#4582>{E-J!8=x1)!uwr&{5Y7JPG-TLnV&(PT>I{ELRY%HpA;7de|Y2* zHFh5bzac?x1s6vMNWwd$aqjx=RJPyV6*SV(Ioayz&-evvIGF36URtZet9J?Fiq=ylh4kQ^NXRzC4^VHE1#sG=J$U=`MSWck;a5*ze<6pZuxwPDomls=(JEk%{u>jm zH(3YCPI(#D2r~><&0GiS>h2~%cYp51XvLjt_B_qZjJOy4l6$idpJ8p=W5c?1d`yhE zc@ZiBI=B@I{soH&*=|F!2U3koM zRxvd-1+-*Q{hsE=Z>#?bl5tRYgAeTD%2!SPV_z8MHi@YD%= zxb4E>IEaJhW@bBDskHSS7pTZ&n~8+eMqYW}H(2Re%>Y9&AFuhS6qknwUYw?~6L&vH z>OkfRh-{%#AQptMxv0-~hNaZrJQI33=r+7>0QwRCa9aG-@|2NbQFrF84<+8z ztkRsenl@76>V?&BRl!9;j~6!WrMbUahBO@-y1J(v3+g!Pz)+}`6LSx$mAQ7QXCCc4 zD>QxO)3?72Y^VNzUI1sh$CgF;YB!=@3X15hr?-a=AtZ`;^q72-E?`i?DxJqCrp233 zc%m-dpphMro^rcQxexe1y${8a3_0c8;yXdFh@6$;vZk_RZjIiYS;rIm;kuQg9e_9h z@h9bW%X+kABmSP{@R(!A_JoG!LUEC z;@91{@prFltwvq!65-oxROB+{Gm3sr+}?tM-i2{Tqn6vK1^nJ$(IwpZ-|G4$1|6Xd zk1hT2uAqlz6!;gBuQ8b;2sT z34kxx1NFt_LELCwNcj5okABUB+7{n2YE%DbPJt(<#kV@=l>-GA+H&3S%^b%f-t zyf)g=3|vb%p4rVN-2A()IV2w-Cl7`t>D)PKVgc&M%Zup^Eje`Erz5S5h@r3@dWMG6 zuh^6BZ!1jDG>hkE@)L7l_A#CBT|TtFkTPV5`{!c-=qAGZFR5={lzm-yWjI8oD7x3t$fC?|Z^7lXAUQ36}`82=eg?;QH_&mWZuZWA45 zaFPeRmb?Zh1B+KzmJHXL&}T?J(M+B!+`95y8&lJ*6m?T56nd%t99eNT$FlK2KVSE- zEs5{Pjdr~Ho}dTaSh_uAZsT+JPRuxcB3bdyty`KpI`a8AAWfB&B1qmiBXSkzRTYsx z1Nk8LKmh2ev3Cx&(F!LSO=q^`B1VjglL}P(?D_MRZf-Nu`f84CIp^XkKd#s+n$4(w zCRkb?r=7$ zXeat@W^CG2`vOk7U8pYMur1+u0x;^psCQLg1M8Q~z8A6iOQ=`v3uvo@AyekJ$ske;Tv;}DL|wJL^wJ^67HMq{ zmcygL;jzV>%k6A6sHv5*gQFu%UYv?@^JdMWT^^p`+rN7KI@`NJqs6plNXiL&c_(Bb z@bhzlX;-0wQ*QS@ht~y5A+tjRIaw=TUTci@qi(QR4OR@WeS1L9DogHs_KUe0n~pO0 zTZ5>`L&sYY1*0{@$fz)3{z#*BpXR)Iv7(n{*d1X1E+(Y?K_u1-DQH@wQd0q4-1OT> zq_zym|865jT$z%V$RWBHF}jf`inYawc4Oq3k!u$}Nz~+~=zdM;uNg)W5CmN;bU4#7 zBt!7T%8;F(A&1Bxz*I=6|3G@We{5pw(7~>gzrM*M$Bv5(kNG#G+8Bfl(y_(FzxvG` zI}Q{`sSfcf`vbLbHZB{6%#eGJz^+Yr^7q)@ZCbaMy&P1$|EKvi+m3;UFI4z+^tM)x z)QBqT`o4xs9*I5b#N5dj)mpdC+T2JHn`$>WP%!zc(o%0&C%LIlBckFc)dY;uZjUL6 z^F#kdXM{`WKTh))T+&X|b4o0k`sflIeMz`T$P%1$q?X=o{uTjM8*DRKHeuU+l()Wro`7~;2|qC4mx z!>`b|d3g@lf@*($NT|h9^yPX=8}y|%TbY=_6!%Utk8%673SmX1T4TItJdYELXk)z#G#Y>qDc?q1rab7u?E47~Y) z%!zIMd@Z6psZ}-kc5GAG3NhEZYuEnKq283B|5qmvhZ5X|Uhmnf*H-8r?3+T!KuL>4 zQdjFi0ofo9SOMaQ;@|R{-1u}Fo>5Ij4PWgB%A3Nwx?0+PHU{+PaoAwI$*zZ)*4QWG zHUvPj>x(chRBq*Jb!-kd_GpfwRn!Ui$Oxafx%;Zy^NOxZi6pb=5sVH4V)fwDn;!Pn zE(fIFg+dEIR8EoOOMfXv?371pZB5!F@H(2PcD@NUi6VIXPlYzE-){yk%J4iUSl$gA zZVtYOGIyX-M!UkWmVa@GjlEqb3!&mPAE8KJCI`2`rS92AB7iI+Na!Z zZ;~#P*w7xxwr8Yx6GFH4$i96INAV07-;ZsMb-5flhEl%`Sj9QR#*9&YEC{(n$bs@d z#sQSO0+Zw05sk72-b04AV^gs>JZLwxh0UWit)mVIabI3+=%8h}iFR2X1}yvw4%#KSmst~tg{MJ# z_g)na1aN>5{x=3QAR49EiZyGFp=+Vb#?5uyF5e3`_IP0R(`4uUMdj(OfUVfvwKq>4 zJNB>t8D2>7_Dh#q5ch-B;!9tA8R9cZsVbQ0(R=fKp3a3e?_2TUdHsssl#h}zxN)t9 zrQn88)jPOA!dB51l&n|~L?4^K=QZYugo-x7Gsq!lEq;7P1AcC(D0PO0e%d|41`m07 z{kk82bYgClTKP2=^9&d`@D;`)Dqcx(30e6Jy zW?D~?R2A_^9A}ddM&_{@YtqxI6%Otsc9!r3$1_}-7W&}CiQDvJBl4~g z`~SlpaZ_dwhnfzt)68D-4WH&8yG%u~DX;2bKht63qYIcpa*dzB*DFQY1VRq*tX|=- zs?q1g<=n1(|M$Ur_K>F)pPX|NjaOJbidhH>U&!Nct{YVe?ObKLh`JdVBtJ;@-9U(8 z7zrw0YiLe#E*F3cv=uNT4jYHq(as+5`-NIPdic;^yn;GcZYb0su3qSX%XfFN+)j0x6ebo+h7f;wtFZE5E z!K08c2FFs$MkSsIktUi#pJ>C-y|KK@nA2fu30Hx4PnoiZ>p2<~f@2XTd4fnRrX`3| zk%VD-7olP^9AZlRRIL>AHVJ^Es5R?9mo~_#uQTQhNt%*U7FCfvg-jcqoxV*RIOvx& zmtDuEUa=~y_rQUzVbeC%|6WI3B}ZO?`#)XvwHt-atoBNp(}JiZCQR7YYD@Sqk9`!2 zlnR@vyQwm>u3p^?aE_nr5(0rT{y*}K%HCSF`oL(S**@)_J^d+%lI*gYgc>+s+oeA6 z@1?DxRDNxkJ$(20F=T9sfLJZ`pG@Co^EcJF=tvkKD0CfetY{j{U56v#2Dc{d!ba^B zUrfy5Q*w%z1_3&@MY@+kgn@exu=j$4EDiF_lbK4KDQ@a3B~ zH^`0sb>G~Upm1x3p3zO%FR5T{5+-vpLH7&6QS=SQ&s`V~#Jmm*F^OWK>g!jX0X;^O zN}pWWXiW6$!T38u1ysn26)Pg=<@!C^o|>2#VdAIk65M-i{JBN9T5+VtAw~Wn);d@1!y5GT!pa_a!WqJF zl-)x5>%R%zy6B$6Qz2YD_#(uLOq6K!a+k+vcH=?dbzrnGUGH(Fp$vb-ch!rz6#u49 zf@@ub*1}}u5He-~IZ*^mtdO{ z)N07Gxu}p&$Sujo`@8}s#N5IHk9yEmgiK(nO!v3vg6iL&x@}d&f}^sr?)%55g2kL+ zZ-6>EI0vZQZ#uQp+@VchBcmKC-ELC${e4I~rmkc%ZofVM)97xV$}fZuv(lFWlfvRG zl^LYR`29U6br`au8}-)>3c2h%$-SEa{@)iwD`wPwX@=7_%w;Xa&KG2USzjO)4;U-S zCzPQ8g!mc3Y9?_nAzGRFu%FMin%IZo?U0^bL)wq@FO)SV-Y}fFlZYhf>-#b^%e}dE z20H=+oiI1BRfu2MDApq68o3^mSJV+Y!j9ksqS`*oBLt6Z;r&Bki~7wWx#cuMb6z(B z14F8J_Rpx@$A1V!*%@oV_Bb-Hv9&3iPm+|9;=uEhTWpeDXll|kGK`G4ACFQZU!Hfq zxbRrhG5#uc#1Gjcq3>5~2-BDSn^J7j zwJf%fW>F9XWu*Gxbt`-3D=-&h;U6A5Gk#$K4!0w~Famn*Ry3fTgY zJiySd5tgd-QM7b>7Fdba0$q`c%K%6L$5G(OQ?i3E}(qXJON) zL9QVL6x?leOpG6fYgRh6!$lHPRMPKXshzLxxhs?5uQ@hT0f_$<<7qG`|W)U_lg!)CFVvTm!Nl1MdL{@hVWY zkPYC794K`-ul*xc5}xvsr8k!FqWj&uH%@C(yv#HZFMxEZ?%Zh}uhe%(8U6`Kj9m;U zItM$;@U`6 z4}Gj*3-LuB@L$=Kq6iz~LV^R1A_>Ql$B!MVDdKkAM9Bu~C>;;V?j%lo%dw{(DQfVGe zm@$~jZdp+{?L1$hCv`s1w^sv%muV+vpYO-tdIhTA)pcYTwV7zIJSNkrQ}-2>H`Ux> z1vU~3EYOUL?!znog1-9(nHd} zEHH~M&~yL1Kn81wwh6UYq_x9oPxQ|+S$*&Zyhux7A+$ozNueTSJxN>FpL)Ro-4cDp zTzT#;`2(01w2y^JB?V?;f!NdZm>}@Ukr_YM2~`E}|YnJK^*(s?}kK2cSieAOILM8MFZa=c?1Q?a^gE&cg=za@Y3Vyi(^ ztP?7}_^Mq$wer;si%^5@n7RQ+VmRY4fh{ML{+(TqmA(H+MQLhxJR@#Dyg;~Lc8#U?K8a_NXnpi0uo+cm{$3v6vC#KwMf5h&aZrT zPm|DMo8lrPar2+2;&2l0Tgt!b^Ttn{o%Uw>V>s(Be4@Y7Lmyv#6}EN*f+F!pD-(-J zG+#HjKI87jx~RvFD<4d0wM)bJpfHEL2FE*xBHf0bAhov!CkTmM?$%XFGdGrlJdidM zo=**V!xkS6mJkOXioT1@wpAzaXXdLML1gd0dB65!yDo^b%9;IWP+)fm}-uc%<;+GoQG~eBuUPd4G#^$~5k{ zFZE2pL=SA$zP%~GO9AH>p7D2n|F#+CNMS}tS1@)bo=uO(15^2&nrm?7X^89e3!0`R$%`@0X7aG() zRG8}L$Dxy9{%P6*!FxM>I_#A4sBiAqd5?$zNtpE5)YpS|WXcRB{60_I-QD$&f5lh> z=Sszk4X_yqN&v{nO~Xe1{??imMH=$o_`#eof`|%V(aKM)kG9egiBYgSq&0pHDb3{c ztQ4uCc#p712SZZ7nGCbU#SD$!oXahZvs}(;2sBG#j~^GjQH?KOd=qrmNz;pDGVIP@ z0j^WU6nnex`9(eVSDVt>@s#2Kb~72KkW*X$olBm{B1_j0h_x2<(cDy1-k#fFdtrqg z`;d?fnX6q2?9~Zw7POqrBUDB*AxSVDB`0LSTfQ;VPYTbw&PO$oTZAb~TzV9<+K;^o z2C?_qd6~`S^=m0%>Iw}%F(C;M1MwVm8zJ{y@%jEt8DGSe+#qa|K<#JGgjE4XN-76Hm zX%`nEisDT+Pi{voA|v(vHnYC^Rg031Kjvcdxgo%f|3<>vxV%#+_d;lRQr|AzHeAD4 zFz$tm7v{{2JgxWFH_ z`M2&b&*u~IW32cBzyhgf@uxAxQE$;rH9TA~4`K@z%Xgx`=q+6~;-K2q(NI}IQBiS5 z!n{2AgP;oCzJ04PQr6Hn9iHYI7OS1V!B%$rS&{DHn;-Uzd4e%!D;2dKpC92LmeoY5 zs^~of)IWVX;~DUR2nYEvqBzkCj6ooKhF`rTSq=g9;|4y=UyOc1E}3x2Oi`j7E86i7)H&& zzW|mDy1nDeOun)s1yLxOxzF41??&z=uQnE}{&MQ^L-~#PH2#zYlYn5WO7ik10YVan zZv2@HdRoktH{^kL93{HqZvF{X;AjReO?l@wl8sQ4K*t;;q;&&tN5-D`{o_%vso(8O zwD`PRm(sU5ZC%26E~{LI6!Vr^V~I=#6l~{;9F(k1kyH!`;`a>}-y3C3|3n_eVzZ4S z@Wdh}=Ya|g`Rj!W9pO9w{C^}JYfLrs4ukAmu+A7#l$|b$QEIEztJf0nPAq_I`=4Lu z@<2Neu=KFs$zfG{LoCYtx(svAJnL{Sya3dh==UqvuGI}5 zINi*LjD=Z0&TMuh8QwZ$(?-nGoG9}hTMoLynkhz*fpN{1lCuCU&6fRw$EUsODuj~R z`t?7Xo%d)WOSdf*nkqqc#$%#JtUQ{HpqP}Drdr~rygr)Z+@dAF8N{vWtsnJMVAemGU@k!;gL}JnCDx>B73oE@Td!2dh-;W+^3Sl6#mP z+LJlZVl|Nea1u}e+9NrKrv(yMu=p(GQRh0qtp81@!!}cz@N_0kj-zaB&QJJP!7};1 z&OfWe{&RWompmQw`mayV-!M6>7rBtaS?6un;p=@jZyp`F?4Jkm;$3N8`|wIcgzm!8 zhezw4?lsb__V?MhDSCaUJor6l2HJpH+qTo+{WyEdh`a*)6fa%h*{K#4t9;c=46%Jk z2w}@-*Z)&dXhrt{4$xY;3>MGifC5qsdjkWdzQ+Ux4^_=ObAEow5UP#V_amU{lXGL$ z5)M!pNcdr^-rkTa<%b}sDI&{wZzB5x_`a~3&d%A{_KcBt93Fux3uIqe$|Y%z`hqfN z3mP5`rHdr7CLl$$y1rUG=JbpYbT0h+Vc1FL8=R%81cjZ*{e7~+`EnwLZ_Ku%XQzGM z=id0k32EDyP+U73LBVg@3!P3F2!mX?jRG8N{t%}(~gJZg~We81=T zz%I?F99v&{Ye7t0ehq9RUW%6<^S-&id`iAKH7jKYM6<|8{KY)z1?j2+sghL8oVWfk z00zJjWIVWGOhLDN?RVtK2$V^?E#qc!Ii4pE%84d9F%sh)Cwo-;Y%Cdvs(d&;90?aG4z zTU3NlS!M6vPlOYAPw9a3T&6>mFVt{KL5fz!US3MNJ_dh{2h)$=B1u@v*#8yhKEqIl8MS{4oE&WRlV z(}<;xrG$2Xw9UnjfKdv(HkWkqe__0zNi{-SruaGh90xO+_X|Uy^|7GivUo=$5Pvq+ zalOXSRj;@I#5OVi*zY~aZncIR-r6d=pcHzQ)uW2(85k^rT=AP6n7>V0JJ2Ac>}Ak_ z7>&v8(zQwHDt)-QKP|?^zjfa6^9bBey`Sd&on875`!&=fRMPsY*Au8IZ5g10f*ggP z)00b>TjLZz@3IlBkJ-%cCu;Bio>K(VEn;ix^5@bM+U&P#up#beX$r*y3CIiX?iWb& zU|5?w9dIK$a{g-J;FDb*D)Y6Gp&$0MRI)Om<*+3brgUzRtDeGBiO`r# ze`c=3!6YwtgNcpWE~T!xe-Hb^jMX6b5; zBXW!RjPK>wum9rN^oUJAwycYd+LUw^x;RKrL0@5oj>pxC*G9YB{TminFu9k*#n4)nJ|3q{{3_J>@T=g zbVN5BSJZ-Y*?3CPmEmU=_?n@P#nEET8Pzg2PPaH%sL!qrezt)Sr+Qft%@11Lp*{x;UKGWQz#?9TlWn*hubt1^oSdOc z1C<|rFrtfdx23*>eE<`b!&Zr8xNKQ-S?5MifnO>xy#Mcxb;o~QG)UX{YY+{5LXAov zj-O+PgN6_^|8vnKv45`5j8k!L6FCqIQ2@3B$Hd(!j{&`mcgo`E-2`$P_I%Z}*sd^w zd)pa{0CVWhGQ10UbQCF2iZ>~^ck}DfGTw3$q1Zk6$_ln#_AbGPrW%SthRY;4Z^_w(j zJm}{KsmP9xKzMBEgzS=%Fgo#1%$<=0xz(U9RC8toXj|H~vB-(Jw)_jfPFk;a@1C?b zwLu(I)@Pduoz>JvIXb>EfB2Zjo|xSsh+w$cggRij*)FsPV69jYAQ}XAJar1M${YMb z#(asJZY)3;{r1`r1|8$8>DbSYi+4q{C~fZT}A*6!x-Eu!b=k z5=|5+hho98(z=QM)Tg*zOqkFjr8E`(W~6jxHoHjgj-4mQfTjkfR;A7{8m_r)Lv65F|-F-%M%z zk$t5>*o9MZzb^L0BUDDWZ3OpWPMX_pI47vhSU1~*yzBKjB}a1}9;&Nvxn$ zSJ4lF`}ZC_^5-GC_MU5^crG<{X~(J96&1BGI&kiV6`Pp@w@5*cPjm;C zz@y$~{``C#)B_k!ASNVqq_=F7e_~P}Z zj$3jFN#*l$>XQMqirwMrX6dP9Ar}rH*xv!u970?jz-(=mEWJB0At7YE7OBY4Gv5F~ zmVZMx(;v@BRmsS!ncRbG)=vmTtRsJZ(7}WHLLMsUDRf|XTF*Xx{@FRA1^4C-GceT^ zb}`;>AQ|#TQBmmLJ$n|2sh+d_h7>}#Xmi)jI4<8%+|<|9c+3aXNKfU}x2~uiU7!6} z?ZF*5#3){VHsZq@O1?=&j}dugs(RO5Kawha>Wg0FZ=5tD^)hE&pU0d&fSCS!bO5*Y z2IYY~MiJE=A+vU&XZwji0^S1OC6VYXPU;HOSYskN2WRkzNC{%a9; zg@q{|pyYg?p?`;vlLjyWS0=34J3HSRw&DA(ikZH92Aw){CP0WfgcWu2<9K}7HOz25 z#NYG3U4B+0a8J*q#KZ+$#g3OZX}z|m3Pg1O{15VovofdYkIrcFGA)vt$@|^x&#a1~H3RJY_Fhz#<0+LlzY}_M|nZ z{#O03A3Iz03%<=jk%PT;bnF4+BWCT>yHj5>XA@~G;a&ClSkE&6phNI+d^vrlY*{!v zzgPU>@$WxvQRu%G+*bTfg$+sDbTjU)(5~NZ*MUIs zlHOJ&6_v5XXX>BraF?0bx2R;7nl9A`rpeSgN{XeXFGJvsWL_xWw?2J7@tShlUksek zj?cYHen3!&Hlo^jhypYD-|RAkn7pv(FmAo!9GbxK?^ttZd$x1b+q=AZg zb|5Hi9i1%FNuX3Tm`VgT7gs6Oc+=j_(O|y)ZJSEnmTnHLo}@08Mj^BaF&;>}d&SJ! zvOy^-71J=t0DTJ>%0rK2b9sK0N>%(^dp_qhy%cN9uwkS5tV~nB>vkZYE|yGy^~(<* zcG6f?N^;8Ni8N;h1-WV=)-2)Eao;@+DEeC^%lmfu7XByiQ=R!hMiaD#Yw^c&AjU7_ zzz4qwB|b3Q_}1IwP&>9|`yR*7)m8S$PuFl#(daWXW7BX3YpoO>!o8{?4&V1`javub z7PuznZK!;!t7DZkb;oj33GtZLg^^^G+)gStYKexRrlmPOe3R`U39_O41!I6{WFZv{ z(H2l5HMG&4p}|e-#W2!k}sS0ZhvMprcsz4hQO zxNoGqe^h-I!zh#eV8^;bk1sXtae4uY{{@e)J?EvnU;U?`BR`Ag`Ed+3P;S;tCNayH zwKi?KVP^PmR;cOd(G3{!+i7?zEY-b-568`&tHEu&7jNB*$qfrR0z$zG<61axV-f7% z3YzRoD$qIXd5WjQ7*yX7IP>ax7h)%M?So@Et1ixw<4y@CM}xu|Z|%)A=zo(*lTOD( zwJ!V=6dWx3%1OvMV4Xet_c!9;BSCh-ca;tAB%`a{?#wuk9wWoKxiO8lX4x65zHDu< zfBPQS96c3ke{liG$lXJ9LP=XP5B{viZnbNQ`1r*dpG89wKelwm5ZZgQ2sKOw$#xrN zqDNp&-}GBn+AcNK^!$f}DVi|_Mdr&DG8GRyPLjsS)0ZY`SsQ1TuM+Hx^@5!sE$Ljk zhO=$}t-n8Cm2770yo`^h-pnKk&swz0KT4a4d&~q7{PcXe_I}wo3w9hID8qiJf(W-V z!<5hKM6oM@&e`2M&0EFw9%4IHTu zD4<$@idksL4*ZiB!@6kt8nn&QqfN9d$cz`xAR2%2IPuGlh)%HKl72e(cEks5@+|e) zZs-u0;kHY2G(G*zdYa4{51^)X(wng2o%M17H$%o$6elTZdUo&COHmr4c#}XqAD(6w z{j>nD=tdDub*LE|DO{kkyFF1U(=MoCs>uH&(TE32XK)av6e!1$R%$LT1Ne$nUvjoM@z?Y^l%RX3YAVeu;S_~h4 zxqrVBCC%6Nq^Z5k$)O466&jUv>O$G`N*dy1SLrgWL(iT))5{K5ya-xmgUiw0#!sx}WPS=gQRdYl*_$yu8K=vKNQ>-ZaeV>FIg%)Ykv_G|9Z8rOAkRs(P!C zZ=@QA6h*|wHjx66j>Vv-kO%i3KRzC9Fp|QfiB!OtM+mj?s+Z?CTr5c-^a(3qy5GLFym=Ybs=+K9Cy!kFN9Og_~<+*x~X-P|sQbL!V^KgQ_;!N?=zT~UOk z7uOpu(FJnA!i-@y8u4hh{o|t3d}-o-x1mGTi404=jbB4*t=uFkedUJ-pHtS?U*i1j z+%S4VPFDFUfkCvhl~g|e(VsV%9y4a#*s<(fY%1$dSbJ-3zH{Ads<`su&fyp4^uukk znVPW&YkZj=XlLB&g;d0+Rovz|9km7Wp7|9q`1;wY;;uDhLjWTIs~dmq4o>c13J z^bR+dcy(ztoO1DjKQ*H!Emr4~3x5UU`~~ketbTDg6!?%{{-h)WtIe;&0q@*atQbY) zMa)0E82X_$UaHyD(5}B zw6+;B4aDKBD5cplNfhE*C3)e}vm;KOdKR~hM6`v#3BuFFB1AYsnL-&_;jpwX*>0a>d0jncLIkrVZ!&I;r$C1B@a$wV+}j zMhlR}z_;;#PAvT1`SqWmb|@~GyS{ny zf}4u-GB)Mugz<$t=G~EmOIZ)s>xcd^KJeG4w90NeI=6L>(&XXsxRY{kD2Ed1#EcpK zx5jib2i2N;Fkh!?M>JTeq+-jKh9&>{e+@Te#gH!tn165Np_<2fouxOScHc4iN-+L!B;Q=0(@Wt0&L z-o$!)G*h{cX;+nAzy$c9dJ?-8L5QiZ_NdAg6S)D=xdA7Wx-#|g*Vfjzvi-@Ga&&R@ zk0HTGIu}(nH>TYTN_K_{@HPP4o6l#@g-NTdod8L+nJ?km+xWj+`PuRBl$7=pC`hk@ z$Z;MtOO4*+`0eMvOWL$+_r=k@c0;OEbd_!ddso{VO{fTVn;qw)4ZifdGH@dE^w~~= zU&GJWcdY558|EX*kZd?pnZSOldGiAJT}-nc+$V6v_axYodFu5eR<5iHJQyW~3Zdw~ z{O|tw{jW0{Y1P}hcW+BnwG|jfLg$VTZ5w3ao4gEj){~Sa?Lnc;8Sq2Cp7M08QcWLZ zSlOw$b*my(kseQ$#qcnrC-7B$dTy-Xot(TT zx?%jwOI*$Qms?^s^Mh)#=Os`C_67EG30+ocey+>uw5dzoX;dG;PvsXw2_P&)K!R$h7iff_fOz~New-XQq)b)*#` zWmrPZ_M1|uQ}-XAG)|m2!J(9;D1x7e1!U6nVu(>~UEO8V`fS|g?Vaglp6hQ;KODxp zW(^vM-BN)f4bRdwu${BpTt(~Ivzw`Im66KBJgXBgcZnZ2Q*ckM(BbgWtgi84^)#*I z?>p=G?nz+H@=jEE**1t`F15XsD-69#)Y$#GCDQ>Iais?0^CfMO!xdTPy9+egjooT6 zGkzbl~@Rpc{0EDIL~Uhjtb0G~gef&+B+Bw$SS6f!+`ng>%7w`TDLQ1@puwtp)FHv9)? zX@SexkFlUb6aF_u)RHe3IL+g5&EKO<4B$SR^R3WvF1tOJuIYE~hu3_wi4&^=e1mwI zn9xRci0+*+zf*2P{g*d+ojgC~FB%j7)s@H2&Jslhc?+qj-+g{DsYzDTXV%Xf0%NS8 zkf6t_x`xr^^Y@C`yg*O4aPRuOoAew1TCDlx^8m06xuj}2GdKqIX^Y*Wo38Hf>*cIg z7>d`$n}#16+r-rNA7WPAn$=)y*5>WoCvI5ZecXs^B_&;C#rd{v-jwzNoc_E(EnVH_ z09Tn|4FS*?3VT-1Ftsn!Nka6M_#@4{q?DxY*^HdPxThyX@liZH0oHIrMhQdhCgEPD zK|+PZjas!3cP}c1D(EX24~O)H1a=*HL#+M;fibqWAr&({V>pHgBc*v}X4HWk=>&^? z2M^XQaFzfBzDxO_rT*;Mv(itW0$9@Mb~*f51zpEiVYpT>aEI?8qA{lYH^05cOe~zT z3&25@8fueB_bw16iYftuTi)EXQ=TVQ$i>suE#J*LgllPaoA%z1h>WN?65D1%{q(T| zRD58vxp*wL`^Tr=D?_0*dpGID_O932Ocwp?e>LW)R|`)^u4v8NFW_lq6$gtgSZ~@c zld*SlFvMZ6HFtK^KM!?q$+f3gBnyp!h@+BAUN)N_l^YWA)yoE!?>-y1aqevM@ zBzN0EQD1EhekW6`WPU6k+@7C%h(QacEjo1f-IGsN^+U9TkW$9ViV2(=H8f$yam~}N zaMTy*od>(at{NrMa*SzJftYd)x=02WZ}J*3R?FJ_79D0-m3BaYiZMs_mNZf6km+`6 z(CO6FcKP8W-%>f$GhtE%K8A23Dr160;iE@4AZmaVIc{rah-k)GelUTZv9faxSXpL! z;?M66(H0sSDvL*8v!C>H{OgJ0ofm1+V%Mm37W{}DJi95X2g@!W4_9%XUWtZcL<1Tt^p#Gsl15E)r0TJ(shKpFJ!@|9Cnjl-(o z@`iP_D7{RMdePq1C!Fag-Kjni@TE*_NWqzUU-g;I__;j2+U;D4~5=!*wV%R zy3SUD^G2YvTzmdpgPz?zV0fglph*Py@88~AV{Uy3g#J@7B+L)QRyFnM*b$PAW%w>8 zMsnU?MBZw2s?T5u=;p6W0!Q%}?K(6Oj*3cqij~!7e%->SXC1gs5Og2Fwp8+2Y2c?Q zP^bblTjt>)>aM>yKh*K}n(fS&?|=tp8|)sXL?W1!%`O8V5Pg}3OLO-Ed;3OYYF=rg z#_8)rjf@zK)s6-V*Dv<4&{W#ZRkt=m0Zr&QnEf3v>#zXXG*xXz825bWR^$U8RZ??A z+#g^bnWzPG0x8;)1D zf6-`kjSI4P{LKw)53OQc5LPa^k%V}m(}W^DcLav=v8Lnm6fM{vW=?0(8Y6q5}N76r>(GtYDxf97y8!;`7#hFV5*F2#bUWGbQLk z6f*z-UWiE2+TqAWEYsm?8aZ!h#*S}aAR<{Rw|~as37uMZ?6?DEsubl9SyGW%$juZL z6?u5)G({ z&)D>P@x7L2%rNKg$v!s@|3>SB)KHA#>A^sMAtKJ5`#N}8LJz_IR0@Puf1shrd6dX6gC+y) z$tI(5grH*f(^K)m=voE=NT%IP+$-KYLD7U6*4;e_wd()I8Y=^+yVestR@OQrVM zsElRcx}FNBy9s!cms5s8rsB=Et^9hf#g~#J%x`D}H$at*-Dv?P8&rROi;}n*jF)dc zj|UQ1)s3No723WnFx$zFC_=9LukX4T4pa#KyvcJKr}OxYqd7qEyI20HA}rl|@IdAs za1^e%-o=-K8QV{&L*&wHaAL(@TJIS2mahiJEX`XbQxrhL(3tMGKZG1Ue81DQ`OZWI zVe~%(Y40sHF8t@u5nKQJry-G$>F_Nu7|4}p_2`<2MudI3raH+3<2cBw2-4>0F=Kpq zU~S2KswhIzeTx^M<`^f%;;2zucrPU+d^n;f0pA8p(>ELkG{iXTivha62^5hq+LXG65_@pa9cEAi4ZI+!nuUa z_;oY!hT^!nhxV5GD#iAHbQX{@V|^zcYvTFyrgR(84)LPzMWGv(ELkEGXLtf*Im)39 zX&RIMt3ono&+GsHE0DK&YxD;Uh>U3!%0Q2wGLl0gs4_+vfV>t(L|Z9u3VY&?-la*QwHU1zzyw5o0YFu&l^n)}ymcCGd)Qf?z!V za&s1sk|Re!`>|+adFoQ;j2yyl!PH3+w&`QO_%!vom4qw&yW>O$LsM@P{oAG zwCAz;9j?b>k(aqIQk4S+C}-xkv4EKq0|&1~fxr&}%Vf$pX<;)1&?PRB`Jsxh;SvGs zi_9CppsY15#jAWe> z=Y;)4+7^(~{?rvj;>K`KsXYo-c~t6QZtm#g0F8ZgEma$ZYWzxq5^X3?n() zK!WtamwCWrT=maeb9y)o*Kx`4<7W!}f^AP3VZ{{pnKVB@lwt@t>e$vZnph!yk$J0L zF9CrOnzoV&#jCAeXowInkiJb3XtA+!cOB0Kj_yb!<13AOvULN&7$DgNQ^6aJ2Mj=Z z(k|>-$~FQpR@sHM)m1dxjf7`18Up95Ss#Of4o7ee(10NBD-9?p@|^vJ#vL_%^SRoJ zv>(dcbs7}5@=We~1Qdr5tuwI<0A|IEf$PDU(H(cMa@Q~vW)TRVj!-yw@V2a974JGY zs*Kpi1eC?C8(VYLBqi`lWqcQ8!Ykbk$0H*fa3j(QJLnQJH5fNx`~sI8ZcB05t>+VT zph0}FbWsaRvj~pncGR&-%F0`CUA48yix|qU>!zjEn5AW69x^aUwoR=WL2Cr8pc)^} z4=Xf55hL6EkFWOB3pL3DXUt_Zr5wNW2}(J@k&!k2Xapv3$jEV0`IwkAEZ%!Khy=jJ zPejZCsbb5mk4J~61{#M%D=HUS(iqryYWn2vf1%CAeb+r5STb{aXa;QO5C{UI!&DnYM*IisoOol(7Z3)clxn}%QO3bz$m@aY7*yq%#3Nbw<@K!&42dBWYIg5_ zZTzl);rn~juS9d=byyooW?b>ase03GYy^JN&a{PT6I3$`TwMdnZFW>{jN}%zg`YwD zgn46Y`SgtyWIprIrq0ehSoq#CC}5wtGg59MJYkL55*^*6t%dHfp-%dSLl{Xh?~3Qs zs9uX|ArsUzGEE`+0?cFvMqHCW08#u#=iWfv7sWIQL8@UOS{ zUN=Uc5%qReEPmZ-(vcye*lYLg3%=5vzZBtzfI1$rvZuu%Z+PVytJXZ(_Z~K&1Fi8q zGW?6pSO+#kBZFO;L_L1DIJYF)bK>n721qlKGDl3ULkA_Al#TivRZtN79<`VWx*k3Y zKYA20@7`5~G^X?WI!=x~2>zJpR}4Agw&6^0YLu2)Pad^Qauf|50rK$L;>!B~V4&D% z5_nc_uCiPu&n`Q;b!eb}0mm`bMe>3^1)DNaM! zbS5@WIcdBJ$O!Rre&!Q45UV8~gDkwLb`B1H_#k@-1X=uAM|KMk*Q6a(f|?6OBG1-@ zoszVOJnvrV`a4*4y1pPwg3VSaW4Yjv5L9<5?+ytQPns7Vg!x$u0SegW{26f~QfNkf zT_@D;NUhH|omf0&ed|Gha0Cp$hVo^#gvg3W3xZP#>Zm1WHIlNNw})6XFCNYmHFSSkJOJPWb0@b zvJ^wOv^jAJ=|5^Ad{w&YY0Nm}D%~%pPsq`rr%aj>K?Q{$i|YrIJ%lx&Qn}G$WUT@n zbu(hk_s8x%aNu>&WFD@-ZVnNSK|!;OdqlrDVfFq&;rx6Wq9RERB-;%;|D3qQ(~(ON zS~A5vOrs&6jy+`EU5>>n03?_8kJTf(1)~WCjy?B0cHeeO$~0C~DN?>>Lb2^7m`Op!ze0HPUm~`W7$an<#I#XXWZJDTnV8js$*zG=MkPPt@^k)Xh8AWTiJRls9T~= z%ZOcp3~*6JON;Y!bGLA1sk2+a%1aXGgp6Y`FUhYdn2Qk}V&%^p)bsrzBJ{9CFz8B~YCV)QbZtr;q zd*f$z;fnkXTkKU=<8*TOq|mK!c_2i=MB*60St`^uCex)?wqJG2Tx#q|*t-J-cRv4x`4`WfQY>@{*a8jh4x0*6Vfk(JvNasEWC+wVPZZ2iz z(}2-+XtwHv&jMUNgqa@XOBg;za5MqA{$Y%I?8{%Q9Wu+Mr!}IAD;AN36ezkzcQXw8 zhW{Xdl~G&C)j8@Eaa8;X_<^{KR#ZZqTA91YLlfT~UDP7s6EQ_m)YN<#UCgLC-?TJi z-B%MiPqodqW+8^O5R)~SN@nozaCiZW0Jg`PccQB?Y?#Lu7F;i2S>#Mu(xW=(n=`fJ zFJZ7@?}h$eD$1i2v(V%SE;DxSzW>QA7Nrrdkm$yo4cOmrHm*9HcW|;GQz@aO-d?7!oB?%O|p{9Qt_l7t9F6tY7oN`r)~ zq|lJiFv}iEsiaUuRzk%|l!lQ}ilnS0DKZMDk-b;n`{BGkzuWEi-}n2uouBJ=T~6|T zzh2LA9FKK~uLJux!^YmjkpX93EG~|^o_pCwo8GA))-Jo&GhR>|7De(IpXux5ZU-F$ z)DR6fkM#WVImX5P&$$eeOPqsVKrqFl?Jld=(gm_dmL*K!*()S+6m6|M%w6vru-W>D z=ROwk1C^T%Vss#LHLQ2iPJsv&TjND*qY5Sf5NsKe@a~@dx|~Dg=d4$X^8E!IfoA86@o|%5by^ zBIxAL!m#8W92rd~n7`PEp7P*mZ-W?I_f2`zBJ1YBPH(HFTOAG19?Su^kMBft5=d24 zvE|AI3a*R9o!0*P*pz~6jsr+Cd+zVb(V192*EW$8jfvsP-24o%4c@>1NlVl7X#d&L zqLLR~CoLxUqq1Cn7-}dFoeWHLYm-rC1LgFKKHOLo%$#L6L7R~NH{l{2xaQ9gzOdlq zlK;x_-6p-%uJfZcHc=RMB@_bB)Tr=HUk^6|MFVxVp~DiAhe$Ao6PrsJA@=vt3?3|P z8T^72iJXkAAE}Y~(fcW|5a$gC97kGq@4w1wBoBil@iGfb7qcj(&ID0abrQr7Q3Kn0 z9fdZYqS@ci_QyBbiffR{`rthQD#81t9HZviwd!Zheh)R610vsCeS9`bX^Dcy_rr|# z^e{*UrS<0q23Qdf(OS+k4o`$2>2;%xBPX;zJox3MfNMI9}afz zrDac59?xssH`eKZhw`7V%CsbnS(~1pM;_&}2Sn?I`4uT<8!ihfFju3dbEa|7$cO-H z{AL8fciY2H5iXrNYB+let@qjD7w|Mb`JFk7%eSs~H>4S!+&^~5j=$=%VaULVe_1Q2 zIomx1elxl2t@U)Ck9kx8Pw2{YuU)6Qz&%C~_oB48$x&}dB?9iaa!(Pt*%g?g?BIA* z%+eO1Rt=&D#{}^hr3*S&nB$PjqAtF+US3@lH^0v8cI5D3p)Y_f0hvMt|EHlwzIcht zTavgkJ4Shy?ks$2>`2h0b%b^>*wTsRD!W*eZ-cL6!|6?$FpPLgOi23P|8-1amO=Ch zCILB%;-ncY9SjoDo2Xl~L}x?6833)|`Y3y?q}Zay5OrJTl66uRH5WSzZ6>??03T=v z!HtOX)Ya7$>)pyCZB*wBmt%mU2~iF^C*XQbsWneXOk^O7AeRTNj!r+PEnYkT-JPEm zGtT#jTt^V*t}5Zt|NDFz1gZClK&CJWl6t+LQ{p);D_n0$c$$Tmo=vQ7Un~EdWK5hx%_)8 zMqz+=@xej5VqF+@Bxdfx&%){=#m)gZANr#fn&xaVK_=SZ72=wK)E3;0`M}W7#$ET! zE@;ZxqVoWeHuIN5dAKAcv>f{DT^-R&GzD6!PnNTgx?*bN5<8)DIG0PgJzbHkMQTN- zAQT>;55P?u0Pg!$EdHM9!B>*FY?-Sr`dF&JxU=*8{f)sf_5tLIJCdt|X3PSZi)B*# zF*PVX5tkhka_SPdcagO%fF)JbKHw}UK)1ouv$W{p=qNZLMG-^MHXMKr`j`If->;VS zvoFh0^XiG@u2Hnoq1hdY{M{R(NJ1>clK>RWDSi7x4DRzi7*6hq5+ZFCUHaBU*(XH*=lkLqk=?a z)lLM+#>N>AW9&xUmTe#~pAZl(F10!1=0c)=6M-;Y5U(Yh>pbCL&2ZjklMfQ%`V zJSa+M4o6TKc7f9rE=*4Pchmqt!kI72XjjlvS|Aza5W2}Wbm+t*%*JQMG$SH)rT#269&X zYr++%Ar1~?K$ZDuK{nD43hNlLBS^it6QJ(@w6kLI5C%n<>pfN5)Rh&I{0{M62ga41 zvhtS6^N}AJ)4>^{0$6cH)@cd*c0O}ehCot_S@@*S%l;3y*}*91lCseYQU-{1<);Ei zOii>3Yk_y9vigrh3PiNiFpRAWGbV$+<4nCI!@YNlb^#Gc7~6|3{p62t5NqP-*}Z2E!u!h(?Q17+{e+;!djjnQW^oyD6jG-g zy4eV7&faVzDV#w~jQWpZ&2zK~*nq=J%$n4FGAfhWjg8?7+MBem zs0S?oR9E#xYXN<#eEf2^C-SNC? z!KR9e2fLQlR8|(PcxL)>Z_PKrWx;@m9GEbxd9a0&LgZzTvRG`Sp?7t6znFQjiG;48 zg%+rq5;gOwy@9)6?)3CBEsKiIO#kq^{>B^oF(?B@1I%6Xg{xlBBMv4Ja3R`LMSCGO zWPpvNCY^0}i9>_hV)Ww8(y@?PJ!pqnAPlv@=QzWVJA4CK+_H1$2Ab4y^_vH0%wMLA zq-(wCxu_JD{`h3rP1`aarj~PU>bd1D=t-MELg_XRx*Za4<7@ zooI-pIVaO%J;VjX!LVG9aRxfOiDzj<*;7{`0%w!~-MhV9NT+5_R3BWsjvQxYfchOoE+d}|KzXcEuU>KFQrlfKNERHu z{_2y3r@4$5bnEI>fkH(WHI%#rdS#ZI;Gb-E!QTb{cGk19P%r7`)BiOn%SIVaC8*~= z|G1A1F+eRENheH4>x$u009@}TCRdZhK!?S{jWauW?~-Xr6DXtvL}bY;D~La805k_M z-fK(}{J+E95nHAkM!mF$3^OOY;#i^O3w7qZwq*_RE#G%ZPP*TDx1Ff&QQv{K z|M~vBJ$m&plbG1p1{~ol`GsEn`sIO*&Syu{WS!`;!{WON?j%^Ejvsc=SJCu5`uE?m ztN)a@gCi168U4SUivkJK&WM(Zrmj)gl#lE6Oj1mv8!Y|WzLtF3oFQm%3XX9{*D|i&%~knR1JYB?B>a z6`Ss;S7J&o;ClA+k8MmVA!8g|Ms2c)w|9!7M<+B~T>@S>yi90(0rMG@rYJU%2ILKb0$hjYE);;y0&1~nG7A!e?R8UtOhj$|29X#>R=$(_icFZam?!NnH%nJ>~!6c;zH-OF~UvA=QV!iAyG z59=ZG`Yme*3;}(4lT-;o59I**`zkhF_R%S6 z(t>8T-6ByDs3Eecqu(KFlw-p$CM*bpUL^Ouq)Z4|?tFcPAS6eQ9NB!^5M2cMh88PV z4q?DTAfJC95X{Eghfkf_;d@WBx42?KUbdudMwkP5RT$V+jpx)JU-ZVb0t_ueXK)ho zaxt;od-RJVI#4|jHMlm~uI>hj_6AQZu!DiCOB^daM>scProO+b0O@o(X-4ZT=18_z zeac_iV(mY#3R~QVp+Kqv&%s5Da+21Z605#wX^6p~VopJ)1;~_Uw9R79IKFPFYmE{Y zJ+kca2R|M@ms9m#dNgrmvRy?}Wx01dqBgc;E>dJxcnC@TVwl2Y?`fntCceb#U0n25 z|Mg-DLxsZM7UF9dA&ZcmD&9#v2qKx~?XdgjNI{L=LeeUHMtwJ6$x?%_#nYh6Z-te* zBn=WnM1)C$et!n#(E`FQ*rG3q#uw~FU!C6LV_I1rz) zH<~ViULkgKxvF9Z^?;Xv7N{3@qrR?+2y1veQyj){WN5G{Buq`h*d-uBl3RR7*6gL% z>VVP!hltN8ewzrEgtA4pP-{^Ch^B5(sQKM4Mbe!o>xWb-LhQixE2&1Uj!)(%icz>b#(zN_fSl0i*3j5~$eG@Lt)?e&Bh-E|;FpdNH=rL)V7H+W#0{ZE>m z`#PE-H3ZkoyvvkB8|Ad!1SKyO`-(5G*Mj{?Rt?)-^ye0lOL?r4;DMysQx1qZb5wOj z5ygCI1-*a(GZhOBwmPi6@%#W?5p0I&?T1z$d93lm1A8)MVI8VK zX`Bcz?7%6H8CeuOgv?#cv{bV?s%}C1b?vCJcrAg7-MG=acWd60R|w4C{m<{OF7caZ z(lAM#K*Xp7!F1#mGp8hnCcpRUU*GDboj2IJDINy^km0GN@Aq2Fp2m$uFNlVt7rj4u zoY}N^=#Mp82PU5u*%h@$9w|bzr2C#D_NIb~%3jhZ?J0xNfTOdoj#)PEHoOMx++ttiiq} znzl!9bEt^)g!+<0>Dup|)h4muR+Fz6~0bBMNw+t<#R_Q+dY%7jDsUO7+f*vcy=t%B(jM6keD}UCUY_H>T z+EfAwXczuI7MEO--(kaYxkw3gMwV*S{0chh>nCsx}R0HrC~Cw{k2H( z)?zop&{n*e?nn098)$wJM=ey9)iJ}aNNHHRyG>U}SYG!-2RK;*^Q(jftNrt{Cq&la z#$7u@uJ=N`y|_(-K#OK|w-;K`Xi0p&_4c04%unSRy+IZ6kl?~=1^gxcMs>pOXDfYgaiN{cW_#tQEn}utMH{apeYbK4D<>;WCJKn zAeK7xeXOcWQX>(G$ypoPw)OPw7~4f(363Q_0W5W=V~ysF1!LbFn_;P%Ltiq*!IGo) zwGe?+j~o1YDZRZqk`>3zU;NqGVC!P3<|5mfZV;%76N)y4G9W9jy!^+3(!_ZC@;;($ z#gQb+A@m)dYsT*1ZAYY;6a~P0zaD zpavFGq3;x(4Xk6C`}lC>$Hvn-9%=XgzTpA$Z27}1?nXYHG3C_~&4a<~@!hvZGSuWerD0Bh%Yw)SobDh&W;hDgr6K7o(>o z2OgviCcHEEbbdxg7)rgk1eBR<3ktAm!J}|%JL@kb% zdaO1%fv?96y^-0LD#$HZw5SZlx>x6&yf$hDmT+!v?(m|Q2Aa0s%utLJ1qM<|xQJQK zW3oi#$+ba!Q5RajEM|CodRNhJQ|E4`sj;%U^mR`UlgA&Vd1biSyYDL{RCUk}15E{c zB_BC!S&Xh086Dw}Ec=n?+-pK+upzJBx#+5aj>t>H_8NT!p+uXTIeNWm8=`0gul6iz z1^gd*-OEc~#E@u5Ub_C^-t@RhaV3Wpc$Wa@BpF8#>?ZMAY7vuS=Q$5`tdw`_?W=n}^ARqqw}}=u)-d z538k#=PrH1?I8Kv_hN1zlL?(-B(}HD&eT*(xFf-i&;|=QwLSOrY}PkcAV7MweLOhP zrU0zpi?NIk4a$AoONZTm$Kv)D!Vk1}_wJ4_TB z#l?ZR`=rsvXA(ZCW5Ntx!3GM!m7niS_8B#2E0voY9vx^7&x_U>#**;`M!K%>sXI`! z7!@j_%Josz=As4=B?D7|(u|U(k#QJCS^0!wj=Cvg@7-IT#tTkQrKVI`I-t$Q+{X%a z-{;~({pX*T=jJ$I@;!6LY4$@98p*?^3T{|)_vX#nr3SZu^fiA~J_+DrV+5cQ(g%;!OEdBmLpPmB2Mj-4Y0Rz43{A6R!CnyZP?W%=)0WXW5bB!gA zIr`9{UeK%1uN(~F90Q)-BEjCU!8YxBi%FSx=QXF5>g(SqxuJn?uyhzSYZ6ogLwGfF z_hK0$Ny|$hTwP#tL5`9m31y&hMji0w{Dj;oOZw<{?ks%Kzv!d57{FX_B(~k~w_~9e z6VGk#<9(>eN%;_466W(ME#>kW^Ba*c8C))P)bWMuwxzBG*I8 z-^_%51qcil;Ml~TB$8a8!tVy?=2Fn9iL(H4P(H-Fm@qSEW^@yHecH4L1W1_)>4R}+ ziqi6R*;k(0zr+_rwlz_1)8<&sh&lhK1!&Xz$O=gTqn@?Lq|U5NzAo=r4Ni@-i>}-4 zb=$S0JEg2u`7)8k%c=EIXYK7n#~yV0r(>$=_>*__Uzm4)Znq1^ZB_Hr9tJF{VTEqw|t}g zL1}0Sl+1f0#phD`_PRAM&iFq1QS+D&7&i4nx-q{z(=+Uj|J(+db;lU8oOpP>KifPw zb6~Zz(@h5lJ_JBAA42pH_+r>WYEMVT_qznME!GH#&|zc8Zt^wp-AipH9v$!!G4lVd zo4Y_S0#dfzZ{KI# zp*I`<`Ks&Hf7`ytO8wf7b6BF{#9ag|p`^OWLd&PQ1@GqmqjPi5N1PiVt|4|MFP1!& z77~-iK@K~Muu5Z4BHva5ct|zEI(AR%tYvVY{r1|!ot@i=NrIcYEQY?UM@tx*djF{n zcABP*(>VPFD;nYUr>eVBEBdq&KG{t`%$S?m1%k zO{I#qv!+h~eQId3S7qHil{k9J*i~{smXugh^Tqm(9(`@`&_$6JbG%i{?fHCmD^9_( zE^Bc0Js*rk*l&J2o?q{oq5B$nZTR8qYCd?f{rU?x43+ymXm`x{S)GeD_by+ZJC3y7 zZ|eD1Lk3=WnHgNScd-3Vc{T8D<}}%I#+`|@ZwLe*DzQAYynh>GogUj80s}Lq z;N_~q(?MzdHJ?yO%Y+`*&RXJW#?_Awnn0`-0J69kxj;lFhZIx0)fF}@%UI(__p4>i z{TyXGSW6IzY=Hv@ZfB36#}A~LN)uk5hjlqXqlLyX(~r6xr@jga+M=m)gY{s}q|D8I z$K712(J%95{}bGRTlVa^Hn3CO1LKpH9bU)OCIv>cQULA9lzRutP3m~;<7t#Aqys~WK-S~+YJ~muBIj(`H zQp2`?ug2TAC2Op2tKpl+K3Jquq1@&l(?RX&4a%oJn1&1#nF8-e)ubunxz_dfKhhs4 zMmVYGIcfU3lBzhu;{h+OH2eL;yRG$ikg+kUCFGXHdnfJ zRn$B7YKX?lx!o<+@6%xjP|?=MoXY4#%(+@yKffSP+NjlhuK6qJyXvMH4tA<&m0dqL zExP*5{?%}HF>okr=`!M(0?k%9Q(Qd zbCAaY&J<20VLgEea`29n#gsgw*Eh%bQPIah(*Z-W=xMPyz4&SpTQ(({nydkW(;zrx zRb4U|6Ww&3TC+JNZ|eDT#GRX$9rrf4`@m&Mb(43;IyyKzXRYnM9}fjP$9nLmx)mk8 z;?w&D&Nut)vfuOOod=VrPVN4oH3q8|FIK+f&EH&&&=NzCxs6T8`d+i^x6;;jC#*p_ zl8W&=FR`!%dlF$F(-U2tuXkzAXb|o+L}cWcthV>{UI@|$<#&m84lQ6#=I;L2TDq)U`=4PU($`Q^t=rTKt959i zSGrs|TiSFxgP)ZMEhaBb58jHibpR8gohMjip}G+t6fK`Qd04Eh9lkj~q0`%RKYx_K z06z~nkYNxMrVw6dZUy zXb^|FJa&hpjyaiIJ!Kjvkh~tOKeOa0EIcTIQy>|99-L_bHHPiPHS5%|(rO?Q;T)KO zCWf)hr|E`VO;Urgv~(*DzxheW5!=foyY`;Fzi-0j%)`GexAY?%JN93d&oz60RN(Z~ zP|Ga?tw5{US{%$kMRUHARN3p*HtMmFzZa(-n&qsn6W_zX;!;FL#H%-VOG`a3=8rR| zX=Z-ta$!9sZ1;{@c)Xo`S!cHMwSq;G`jF^IYrq?E8F6<5}XD?yDY{c zK1CUeEov-AV^o$DYb3w&=*nRUza~mgfK++vLx!BqI5F>|iWg%2qW|Y4=+hz-Ems=ziq$1Iv9vVtzzoB!nmok~Xu3Bmb*sQID~S)m#CyqAr0(jxClfGR${r?YJuVJ;#j6k-RkF=JP& zSK^SOYvu8$k`Tlq+p_pczi6ON-rUaqL6#ClKnYC*w+4K1(JOWyqhGA4AQl~?e#P`D zaicVp$W+W-T;lG{`Y&x_kn*15c=aG7+CyWY)W2*~gkD+P_U&CtI^Vi;Cm5ZP^hyvx zIUKsPca;y>+EgNofR*i545a;7MtFf347i9a9&$&ym7kZbcKbHxr2kj0iE+*V>q@jf z5_AW|$=*ll-&CGfK|wRGF3g5#7~G0(B8W;DMsLTL)JGEgjqGiZ>&H6iJ_5<*kUyv4+)zmjO^uYL4CJ;`ErXr#SrH5sT< zuvnlHXxpO9-C73#8zgg7s0P|085Sk{e#MDS?N|j8quzu?S(NG-$%%YC6BSF$j-CgL{HDe&FdzsFSLW;;%#ia zJ@Va}egg)CAl^W+;dox#)_VfiA#W7Cpm!aDyq4=%TWSoHVFIYIuJ{dWSWii{-lUft z?Jh1C9yH1ZYihI7EN(&n25rX%DmC)2t)=~*dA_6L5xbjXw0_k>A;C5^gYZ zpweVAs=uP2#lnSsxZp()0_lFj$i@dH4(h?iFlq=@Tr;DiqIP!gQujDE*5WDmHPym} z79Tv=*(2*;m>!a|6$(mn=!d?G$3Wo6`cjO>91r}Es(N+)xZ`Zx&dLG%+8(dyd@Re? z-Q8mN=J5tP0cZTJAACu59c*F}J7oqjUhP<+dNmg!9haa#mV9;E{7YC#053X+MMhd< zQ{TLIZ)M5yewwyfz%dQbdWa)m1Tf>0LLU}@IYQA%yp;I$g>^<}CZ;CV-2z4pQ==na zTl(d7>)Ve-^Z=^VC%iK-r=-&t9RUL_0?p}PIC)sSeJ6f{HdFaJg6~2Pix2$c)hkzq zaU3g#Q5YJIRf+5ZQ4i@^JZ{=s$w_QAboI(zdz4O)@*va?2p5up8O~$EEmU)$CIqXb zlzl|1;w20k_hR%H2$6(3&v!z{jpdrsU;O&kTL3edK~b}@F^amYa^*oJh`op#Eak)r zF>>;<1Q?IGGXehLDQ6YhItlCpPLG7^>u6%awrt%YXc$m8q?U-9fS|?Dhqfk{)Ok_c z6(&8J=9q>0Aum5)^vmQ&*#P^pLSp?lb6xC+_2#))yanV;Z<}OqaIG`PAV(2qz?qeG zD*|Kf0h%RF`KmS#BJtc&!bm@~2;IcTnZY6u&mdh2Z||AlAacqgX+-IJ!YIVTt*(VC zTGv!24kC4*SYr5ONuTdOf6hR3BDz^o(xQ73Jo>_~58(sTd|PnWip~>lGIBd+&^KXi z%Fhj0a(iiVax$1sQ{6666vq)Ag@Drpzu^6qLmb;aAOoiI~~=})-Vk0a@h zXMT>7%mUF}BIHjodU~KkkSk&K5@E$9>+0&7oq148pe$?zqW!gwY#RoLzmFowr!cA& zkZ422=u5USjsQKaLZTk&ryLg17!!kfFW#1&O0>$AW3#~l{sCC(b3F+LOX7|B{PMV2 zO|)sQ5c9m310v@=c~a!y)4q<}_-^SC6g2WXS+sV$2D0F3YWZ7wanMCXL~L$eaR2`9 z>s=G5E(m`gSLeC(@BCk@q?6nai5caU`; z51RzVWt7XzJFg`#7`qILi9H--qlq$?D(Jw0bs+SMd+)N+B&{ch22l)?n5EpPG;~(y z^#xR)A85G0Y~Jb77oRQ^f>x4rC@OK|S)(IkamsPYbr&D2gjg9b z=!os=zD(?P3a!F_hVDkz{}`zo{Mf!aJ7-i^mSjR%Gb@^42 z>4@)ucXN>g@*Ph2lG0KO5E436aYL|B6B1@-)#O1})oiC|x%~bU-}`^Vkzg9QRAE#l z8Dz(H0KST-OOg2d!R_Buhol)jjaDzo0VnqTc(+)SRf!8Rmud0!DJ|r)V~p@AbdQkW z3BWA9;U>tP9zz2PtPCS2q)fX_^|?-=Hvhuhta^;S1SXcnuzAasR+_cvppoN{b+v$Z zC{abwtc1tp1Sr+PfOvJQIaQ0#s2G8wIrgp(+=^dV-VCw85)mrSHC9#Mm((%qkF~Mm z$JPx}2Z`_X*sSjL&s0h37U>xSdxwhVacseR<*QLCw_wOVtDmYl& zbL><4xnMvG6tKaArc}HdG#+$cS+cQ_ZObI>k5`L|g7|ox@xAaG;em5y3T#cExf%Fp zh4aD;Md8(lJ$8wrWB%*1-t5y@UlVr;f)ooPG+!_D)`U(^c;XXLDx=nSFy8^GI178q z9YION@{W~RTn8+44tt3*j*onhIZy-IDSa9|1gBrCkgrg!XkJ7!^6Blv_Ox|*jFc4F zOlCsnAQ)NkH6eaq@bTGbL2qdjkUI+w+c)qbnM1g9{A#*!{5{4oueIZL+TD+Kf=Q~5BUbB2pMfaliapO_eq1`4~IE$V1AUDKir-J!lib8;b7tzu=n)a zi%$rS6zHNQD-d!%A80^7v8so$af|;rbTR(Rjz?z-SyTrBk`$s;OLI2LiTt?W+O?UU z{*|Nz@LDT{ld6eT~_<3?oVu)7W(xNoSrArFaD!~0oF zno8UwMI#k?Q;rHTWD?jXh9YXQdohMul8+Cn3+YPn1_Ucne{8f?Omt#Z$b1~_jCD|k z+7xEH!U8ohz;oYni*VodZjyu$P}G0Ehb1|um)k`Z_T(-5lJ-~NNa&q5kq3|}E4;B; zTvK`r*~W1CN7tNsy2p;<_ac&-cZjSm60V|9|NoN$7{yLYLoh%#x{5GnwD97+1?`rG znwz|r-@o?aKyTqIJXQ=_Cx;hqIjNd16jG!aDGO(yUfuSsSv8EC837fRr(ob`B zcbaUwK~;ytbv=|bvOqUq-)ot6{G>T)Aj0_Z0v9~W&(9yu?h=a^f1k{> z0G4w|r=SB*`a3^`3(WD>O@~;dKL8-}X(KYZ&X2k?&=KT=(2cu8OHPbQWUJ@!+^Ims z%Mq}o?=BXxWFtUUo}B1#4Ivn^J(-jv9$K(cD!ry)k|J$`_w}2og&Jg~9)JMKl9?7W zh#b!4=LwsL7_B&QP;5x!HuYF_ZHFw~>}zOb%^MLS0B0>38b@-wpVw*ACLGU?m}RlR zc!j9O-$ne$B%bN7y`&fvt&+c{L!C|a_+*$XsIf(`>i zxT7tQ;)2`nUd-L@+@d1af#nvxB@)cbob@vLl#qY}v}5V_QMqaMmNt-Gz=`^p-95fi|7z+h89{HOoMxuTl)Ruc*swnVx35{Y&i((RP#8?oz zgdPnL$4O?kz5UJjiyPK-l{6AQI_%+J=;& zCybh9XPNJ1+ey7Lmp~U39HRRJwO9v!B|k+|Z4{-PD85k_N&^NLs$yzt`tAF7ASO*7 zm-T`LsgA}70RGaLy}?S1mTlQ1foK(m zG(KdiZ!*G3r%dbh;lxk&E0X-BdJ(-5=#ey_g190Yk_qRf{Y+Q?Y9+}zDQ>yLRC7Qf zr6*;zWn|T@1SS|!xS)YW@t+Fc__p(Uh{N;Lf{w7OVv%$eBz#mUJaEr+ASER-aa7awe>*$A^OP|TbR!)ZnD zJt{-883qJQs@AU(AMK~CgS;zOLJ1YvLQT}X$M$ZSXFDme{>D2xjsU_M3H5yBsWX(b z4-T-t+5|a_CVK1kYd>libCMVB(55_i)M`_HN8Gg@G;cvSo}UbzyI>(DULOh=-cfF* zrbXy%)3!}QfQzDd&nqYHilN>#e&ojr{{D z1FJ#?OT`_{`ty6t*s)y@9CcF~hC1NZzh67mOws6q-pd1rvWgps5 z%p@6|7$!4IqP*?s?VN_~sWz`MEU+kknVsn~cHD}PY1kV_BA~j0j=}lTt%=j8k6GWS zwFQjlm3bF_mv;X1)+i^_w_>(Q54REJYqE^CSAB+d4lmndm;PpRciv(sKs$>3PJng3 z?>|kOI`s;gPv;>Iz7(PHaXOl86`wv+o`@p!#ORA=hEu0QJj(PLjPCmYBQ5eJ(?JeK zgwt_RRtLm^!Eiw%F(7aeo74Yy|85@uxb&FYul8U+Q6}*u-8er;IP(246>+~5WmwT~ zba{GD8-^g&$UHQrbdhARv>$rj>b6f4E*|b&S2Jeg$jqDed)n!$&}B#)rl4qNq*bU% zkLwTLue!0qd-i5aY@`zWA%R^eC^gcWj9<}YdzWF{qI?cP;9w9QxF!9D{FR|;0)Gk? z=f*TU6iuK|vz*Iq#Ba}e#ZkIu{2(|Yxg-TSrqn&N*ruUH&Ed;i(g&p^mrp3Ebc+MJ zsiJ$7^dlU3mv*+)Re|l4IZK%GH*x0Qwz_|*kx_md8#xOz+P1V>RCsq&aH&pI2w5tk zeS_+lK^tv!ey0v3L<0ZD93<&4kCV)Z-v?>@{m1X>%`|b&^ zMFMU3Zb}$`jK&-uqrnoR!*XT$d!a2TMws5)RWQH zhd4_JoNo&5KwD@xdvw^d``rL8k;h3)vj|w?Zp@p14&WLwkAw>n;LwYh63p=Zman0Z z1~zY^5X&>bC+Bxg+q=kgH|q{(wOz^^*$$Eot<1wCHuJ9`>m)U+to}4_VqO8fxKHl5 zf9(alO%pANQvb67N^8Q29>g<4dn++&9B2E_p4}aG+-%v0YU|?(@DsR@%psRy8*sfh z;me5*n0gSEE7fKWHBJgBxU~(SzRV`1yC|ImpF?8l1#mn6<7GEc`O{W+2WSkS@C8SW+Z~A|NSw8t zeEz3q1+uvJdKs;FNrCk@x-C3h{Q0yDQ6@2zuz1Vd(R>uWb!93qZw@!0)4{!QIV8JaP3q=ats4G^sf?b#C~< zJLA-UZ5N}*kt2mCwAF%5B~#5G$i4=m z0#UF>ZQEu={~bnw|-v@yMxRF0S03U$q4b%VsVJjUL;7PB)cegw?4M zaC1$n$z5AjT{^5Txb(eJS5RWR?LTs4ltRW$_F4UF>5~^PMk+RQ?CixO&wi1K(F^?j z^|6{)bMwgmM@%1u9Ju#@0bQ^$0CugH@2luQJ(PFn&NjRryE!+afFCyl6K~;$)M(v$ zBwd*`M`r$zvGhFhd#l&f{%pTs;X*xrGG!8dqHguHU$Y6?-;YYGde5Fcqru{>sD5^y zeTYu2v4x`F^C>S!5Z18$FXKln#Ffb|tE@N|b22wN0B!FCr`f_mpJrsGhf31!+&_m8 zkK}gkoc<-SQ*%wt5=Wovru)HwJ-FPA_Ki3Z|3xz+sq91&{nrS9y%AE~v1wri^eB)z z2C4sDH^?HH#a93#GlI@b;#QT0(LUTf)XwYeh<0*JVsS^YvB5|Hj6QIgsR=y`Le;k0 z6fSUzJZWw6Csq65_Q?}&yd69AcPGsrJxxvbpmK;}{ zK0s$^jao!1;L)SKOJkU8rKcEy{Zf#12PU%UD=fczn5`b2s8pxkX0+ZLhAhT9sfRJZ zJ$&rl=iK655SX}+bS`ezV#SZFx94Xxs%KGY+z-i4EU6i>#@;bEPqQyN(H?a|Eue0( z)Bifz8#f)#Uh-^xn-r_YUGqrcQEgquI+}1ds;*CFnrDULgZ#&?y9h_n zyD$`-EPhN07gjT%t%ah?ei*`K8qLE}+f()QslLZ+iifS>T6@2*{QPo~ZWr4bLXgNN zM)4H?Ycx?y?yJXwPl))>`G%-zS}nYG+QC8`w;q1fSZf z8yLeOHyYG5_ctOuP#4#Y-H?w+OO*qDyE03h8$EyaYq3rkDztE;>t92jJb!KjBv=-6 z>!00bt9HsK=bTG5vT~>N=!itW1Mu-dN~UURJfBg^dvZB-=Gn$=wWca%EopQ;P|>Yq z@BS~E&R@2|Ox(jq_mQcn>wy4!$Du4FVzrN)F>C;vJ=A+j*?wN(#T`#+vA&u>&E!3N z=;HGN&H64Je-1t`M)iqEF0hovH6SrbzwrI0TV=b?YOh%RYLNKG3qqT99KjGdd#ATq z4`22h6C ziyOY~y{&=wd_VPT(Q^imG!yuS)t3Ew1u6H4V1loA4C+mHgQD=fY6tmSM_np3A z!XzuCg{6bM!&ayUOzGx96I^7%5xkUj9R1a%Bt!A`;x(2--`lT&9z(1Qm$E`!*Yr%;)SUNXIyU7kjOkG1+-Zi_nM;D-J3hknb+tP zhz^U*jG?uKb36Q+gn%^vv1y6lY?CpC3&t%Eh%w3^I&sFLj~btUm1fjPjuM_p4VVUA zpy!tX&sPuF)}IPs7u^yPgnz6m3IW)ByLLa-sl(FMFLv5#+E%TcpR&qAmBwxpxCfD9 zhjSL-utKgjgPzq$&t4ErOe0;hsGqZEWsW7JC2R#zbOK^f<5(M0-+E*BTwd;Y9`cQ zdN;OsxAA<-RTRW6ShdzLYkZ<{I0x9N%r912`qgg8(sv5T^`di<(S+d=(yxia;)eY+ zX!3eg07$tmOm?22{p$AphsO@QgE&D=H`RSm24LObyq$KRr=Y-+&9mxC*cH2PBG9dQCz8O8cbsKe1Zc42nbqS`X-`_a8YZJtdYe`J% z^=jxin%{t!swe+jR?A(!pCZ(NGrOPT_UEhQdYtn>_q)W0bIn}hm|<1|&A*nWX1^at z?JY&PrtmZBrk2paY-#5S{|ODjy6SDohZYG!lTC2Mujot0>mew`o6ED5QK1Y>R! z#N5&)o|Vw{(D7H<}YJBy;dOCR-rnxw5hR^y=Ts>#TyGxpt;0h=Sr~bz0|} zA1Jiz<*S6(xxUkQ)W4IKSYD@=k-^AA2#R5OUqVa#j!{|?sYVgK^h0$67HRImuV$wE zXTO=Zn)^_9#u@I$fijF!#!^wn%cy5LHUgCD?3fZWA<-^}EiN-uF`tW9Sn@YnraNv# zh))3;`0}@ThGt(*dT$b0&kk}>&e#4~0mGeQR9}HlE1zrMSU zVT7?OyAW(3fm))H5=X)Na;9oAuJIXk5xK zpOBq3CL2srGz2gNPPug#S#`j-hc_@D&_Zw1gcUXmso+EvE72Yz$h-Dq)zBD}36ELQ zmtpo&h>FJqm-_ThO#IVo~$9>5RDSMJXe(PVU!^C%Yj~;$uGs3$^&!P)$vtfETpX5orDOEu z8T)&OrFQ0*LM;zOO|CmQbiC!}Cd$PLMh&~K`ugk7y8#~`B!sCpdb;wM_c7nJzF&J3 z#xA=4d&rH`brnK3ulR!_MhJ@W`RJo^SG+wJ0&-r5PHM)4^tIc!xKiDPU|JL0nBR## zMw#s^LHr;#5&&}ehNv(A4AWn(kT4`gW_3WPqJZn%k$!GgJb?fKh{h>sx_tRj&T&`(?o*5zAx#g5FnA;8oa{m}u?Q z-r|aPtxNjnd3U3Qb>J0ArYhz$+ij|kcUC&~*ksPj5ETNuPsVpcs2tPxH-zv@am`UC zhQ5k?mwd8;q+jM@u-$g%i5fy~#nKs7gsV2ATMPsaqF0!Yi}cIpyT0+i4a?)aHe`ND z0%R5o1#&(KaC3{BwEm=1IosgcPGcWw|7wvA&j*gEo@uPpprv)v0?(%unfcoba z`;EqBB!senboB7DMk{X2YpT(_IV#PHS6#Kv8uGdraQh-d=`hyQrAE<)I94T~vP;~` z;@4(e-B89;lMbe#vwuPhD^_tjf>e|2;m{?vf;+;w;C>((B3SYkSI^Bde zH1?W!NG${M?Sp_aDMfNaD&Db(i^gb?fMS`HhDm=T3UcA@clIa8si(=xs*rQ41r7;^CDW@^C-r>|KOR)%;&HzC>d z{BQ+Lr;_4ugL_QF?a;iyv8hs=+xTvNMhaez>FNCCJg;mF0wOlk{%RQ?&!$!q+K+~-a| zPreFMRZ;e-$ZU+jQtk$Ly@Jxvw_QIyBSUZIU}={?tlhyYane*fjo&_;mYo7i)RO&u z%Y!6@1)+<0?vpO)c)l~d*K&3@fRd>B~tEmn_Opyc>CJon!aQbQ*OLTd*9Su&DCc?&Yg$4x%szm0RqX5xaLIrrm2E z`|X_q&(>?d`kQX*$&+2&Q%@D#4Ytq)Mb;xoV)dTf%!Yg>J(Lz56rr5>r$PA-A3y%q z4|0!Uu%rqZ74s9?CdyVi$)ic5)Aj#D=?8Ecr)7*V=wUT%zGr)4Nq2X5Ilmk3b`x+5=r0HY_2Wv>z0_S<>tR%nw1mOlJm?6#V<58-*mL1eLGfh%m zp`u7lN$EiUbo{d^CuQ1&-oW_CafS=j0nu>Hz0 zggz*7#Q6*8<4)c>f4rE9dbW(TvQnrMNcQ1E?eF80;{0K;4q|M*^}X`b;IqPs@fRvW zX-)`n?kIY+7busMhME2TG$9Ha2Y!4krFz+Knv~)2E4zMmpL}ept{j!dy?4>P2=byE zv>AP7^DQItUbgM)X?Ng;7UUR}tu<2ME2K4CK^=XC|2=}vI%|`?K_@cNR204Y_3H%3 zqR0B~!Vy*-J=RQ@!aSlMp&YiROUU7I_+3M1?EK#Qg&6|rXyza7p!jW$Q%IZ(hij9M z<)Ic0qfNZqXCTViP)?F&++2X17c+ME7!5FV58b&e78<~6z=dmHq6bBBH_<>d7-HI{ zHhfTFfoMvu04a=s;>cROO5e^a-54J99tl4)N zXn`yw49p(PLs#Cqd=-$3PC!NAGd0a`{TcHdi=mYSA;3%8Pzw$}|Leo3F+T?|a=4mE zD_w3#;p$`@6Lm8~Els^8qT}XU<-E=k(5>zY)CbmG7qzZVNF}Fo9R< z3bKV`NTZJ;fl}+j+n7HC{>@moLPc50gefJ|s&1y8P2J3*oF;yc!83O&3_KwlMg3wB`I#TEeiLMsBN!MVw@>CIE%c| z?=>eMhO#r1hSAYnA&lS(tiq|7(z*R+_Q|MM9$DKyU8ivrMI*U`sy z?sw1#yF%WV>;)vfYC;HeyXyjB=&YWLj22Ehv&qo0V+A`UTY9&5YfZJJ^zZ^dV*iUd zkQ19+l&$IR;Zb58Tf^{iH9_BB(3mO>+r4|YAisBN8YgA?B@T`%^-FB9?B4gCV917D zyDoovo(9>2Hg;P7+iQ!B5jN^lyBq}AyycDHp#vN7$*@UptqnAzSkRk+E1Lu2GHq=v zn^q3NT{_u|jZx{0=T)@qacUW)sK?9=8Nr!5?R41QhMKmc z5KBjaokjz@t8?ur2OvO;7D~h{?xCSJ#b5))Lb}v3CN5)#Po8{oc)pXS?UH@^(TDGN z_t`UKnTGIZ7$(zx@_G7ab?}|l7a=d7sf}p<>GRO2EP%Q|wv%02s>M|#)6U5KyqZyR zH&9(U)v-~kZTIV@+axlB108Tqh|z;yhbHX2Ol1OJA*38^sLX?*%$I7H^++=^WW|@G zxsiYs;gn?^$pn;4ND}plDSO1|K7OF+-I#gx!~6KSoVw{ltzL*dqBt`%d^1EFyr&Fc zBb!FxIV^KBr&F?{@LUAP$Lrqh+~*-^MeMh~uT;wq1MjgC^Q{G)Nb>7}!bSx0Z3%|xVxXSPc|11*?-sKji^S}A~V(?V2R5NGI|Q)&vz-V;XiDKSwN< znBtM#RUBUKRHtU_xHH;BW=P_~;S3=0mD59?~)O9J=VVHsTt$u zeVq>GRQ}4Zq&Dk7v4(PWA4~8v5jDKvzpNhVt07A6MxANF9+hYXgj`BUKcOw_kX|?E z?jk`Q5iZye+nUwxt3Os+&n~lZ{WplWSH+n@j4-x?Y&7#s@_A(EGB$X69mB16Z45NU z@uS+Hf!j&0A<001w2+qzr32)2Bcr6rQ;z)c(fe8S_Jla#SdfUC$OxnE-A~1oABg8I z6rWR93l?h!8&Cx8B9q|z0i#QXt-J<8ln_T^G>-H>jVWR+_oc)R@=g{SB{{p((uu_k z#mQ96A_J=;Mt5dpFAUb>>VoKNZx}5E26G&#T>7a^{_5AXf} zqy**ErfGXKnW#xIH_pYSDF=J0pL?T2$ENon;m^K&9W)swRmyse+x<6K>LI2{@fEZl z=|-jg5i@BZ!8(Z2tFn?K)!#;D-t(&CTYs_`JgjmA}2Yy1KAl{dlaI{LAG>Fd-Sx^yT?opRu2?_1hg$QBH|Ji)A75`om;iN?LKaUHxekp zhPgPG>kvg|0Idh@M)z&gMvl_Rw3|6IVPg7fo+n73(%Gplp~U%BRtkFqCnw!E@Yv;4 zFSP#4R*^a}b}ZYdZ5HF!I^xx%_#xGMvvxOV=yYe5&d3(TQiO&^CMTbcx$WDV$TbcF zxqJQ|C-1F0MqqMBuED{g0@YT{(5s%NTVFa&b553|`FCh9;7u3F}JdSejTh z$-%*b%x&Q+xELy?`2HNOYK|ig>16;HbQJ}F>?lqz4v41sL=CGbTMxV0kY4aF=B!!l>d-p_^DTXlmZ;D^{F79k_&X&3yF~H5Nf|0(o zk;IZbb{d2%K0rN?BXRN3qWhgYbsA=%sjNUV<@oVe^2y3Tjw6f{Sx@g*az$AQ(Bris$>=y#)D`~aFj%iXb>VYF+&qPO4=`V5~mzy zy`1aUVc3pOo@tN~gOtFPgH2skW$LIGA1EK)k-EyV<2IR7@}Ui)WB%LwhqZrNQZUGY zi57&BN59zi_$7eNC13%UWl_+}XtvL;EqW79CRCevW4!BMz9TS3 z{@W389fhU%jJYjI&L>wE*XiSO{MLUnv;_DG8^U{Lntx_<&vf+7B!ut->yCW_#Fp; zH9{|Z70eyn2(d=ZGitQ8le2R!RjzQKq+fAAL4bwg*1mssS@g7_qeqSm^Zh8MZbbQi ze*cu35HEJTZ-?OG#$2#+EG=I?2+V~I79_4?g34$5P_DVnm{AA(N>aDMc5-B>+pJkO zg)vK%xPll(piGVT2mq$e&Y(357M5t6*hJIst2$y^~jpjmv-RPlUa2*n5?qGUx#sarA6mO zHNVV<9Y1p?_?sjb?;Jyy5xv~U%geU@L`~ZPi3~*rJ?6zr{>h5C-rFed%W_V#tBC+T zXg9|*EhXjOJ2T&uhjY&fcZ&x}K8o0B(Fg`(2IV7IAGll*hI>Wq5d)XJY0LSN0xNmc zG4;u|SDHGc7{iM;SQ0H>LOhU5d<>3`W z$$Gt_zwJ*+lHe3AUFv>07f;l17Qn7cU7>^Mo5_-h=k3T5cn$Yz=^@V|uVYT=77a4?Tazsv(d zJSC^4^{&FF)0itseQP~(WI?ySUJMkHoE;dP#62Egr*i?2yjd{aKDObZ>bfzp1A)N) zMvD{`;jvesoF-c1A`?;2bxPyMqvj_ZYHbzor^n$W3=~L-M67TQz{?+?*_DWu8#iot zmu*s;p56G!quy0OO4P8tbL91190u*+^E^5CwQ|ORN`qucMUb~h3nUqvISe-P9%;Is zEhT10%Cz-FlOmA~pv4;CyjQ$JvdjM)Up2_8BT`%sJ#JD&yJO_b=*j9 zbN_A@3-tz5YjUm}?awL7%_Nq4C?ui(Wn;nOvq9t=qS324w#DMb$p1n#BnnxUBr{Wl zT7u8w2U1MQeOYvq2NQj*zegjNf_%u}wrlikCkwf|$9}F?pb7RHE}rZ{*Y5l_qK2~n zi{KewHKXA9Y*($|i#p0{19aN=t$K>ChpqMhQ1u>gJ@4=TzmXNr=}`7eQ&!m_iZr#9 zWJJ@bL{>H_qpYSvD3wC8%Bmy{4YD(iQe=b^+53OLob&np{=e_-d%Jx;$LFZ``}KN0 zukm<1uE!+^fkZya{lmW+^w<2PURcn2tLMOhCmox*ei$zeviJQ{6df&?NO?q3G~uKQ z!$)KDJ1LIeJt2u+yo(4byuDxPSjPk9iO=Z6rIkL-iXx(V1j@%oKY5bJttze3OlTl0Lv?*CMsCV??bQ0)F8W|Mu!A0fk0`gW zPlc}8&ZlobjQ!KX$154hj%@F{$7D?3?i&T8Ap^wH0JC}H-n?h+37w{ z*0M{=jKw`;>eXTv;*t!e&pZB!nuPA+#M8EIFJH3Uf_NLhtt}5{(4_Oe?FuH6Y3^o+ z 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�$`a28cA^yUZ5RRHZaA$y?YPy*A5&u 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 LexCT*im(0~3?BeB diff --git a/packages/vscode-wdio-config/src/index.ts b/packages/vscode-wdio-config/src/index.ts index 6450631..2381c9c 100644 --- a/packages/vscode-wdio-config/src/index.ts +++ b/packages/vscode-wdio-config/src/index.ts @@ -6,14 +6,9 @@ import { convertUriToPath, normalizePath } from '@vscode-wdio/utils' import * as vscode from 'vscode' import { findWdioConfig } from './find.js' -import type { - WebdriverIOConfig, - ConfigPropertyNames, - WorkspaceData, - ExtensionConfigManagerInterface, -} from '@vscode-wdio/types' - -export class ExtensionConfigManager extends EventEmitter implements ExtensionConfigManagerInterface { +import type { WebdriverIOConfig, ConfigPropertyNames, WorkspaceData, IExtensionConfigManager } from '@vscode-wdio/types' + +export class ExtensionConfigManager extends EventEmitter implements IExtensionConfigManager { private _isInitialized = false private _isMultiWorkspace = false private _globalConfig: WebdriverIOConfig diff --git a/packages/vscode-wdio-config/src/watcher.ts b/packages/vscode-wdio-config/src/watcher.ts index 5bcac02..44f9b6f 100644 --- a/packages/vscode-wdio-config/src/watcher.ts +++ b/packages/vscode-wdio-config/src/watcher.ts @@ -1,14 +1,14 @@ import { convertUriToPath, normalizePath, FileWatcherManager, type WatchPattern } from '@vscode-wdio/utils' -import type { ServerManagerInterface } from '@vscode-wdio/types/api' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' -import type { RepositoryManagerInterface } from '@vscode-wdio/types/test' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' +import type { IWorkerManager } from '@vscode-wdio/types/server' +import type { IRepositoryManager } from '@vscode-wdio/types/test' import type * as vscode from 'vscode' export class ConfigFileWatcher extends FileWatcherManager { constructor( - public readonly configManager: ExtensionConfigManagerInterface, - private readonly serverManager: ServerManagerInterface, - private readonly repositoryManager: RepositoryManagerInterface, + public readonly configManager: IExtensionConfigManager, + private readonly workerManager: IWorkerManager, + private readonly repositoryManager: IRepositoryManager, private readonly testfileWatcher: FileWatcherManager ) { super() @@ -53,7 +53,7 @@ export class ConfigFileWatcher extends FileWatcherManager { const workspaceUris = this.configManager.removeWdioConfig(wdioConfigPath) for (const workspaceUri of workspaceUris) { this.repositoryManager.removeWdioConfig(workspaceUri, wdioConfigPath) - await this.serverManager.reorganize(this.configManager.getWdioConfigPaths()) + await this.workerManager.reorganize(this.configManager.getWdioConfigPaths()) } this.testfileWatcher.refreshWatchers() } diff --git a/packages/vscode-wdio-config/tests/watcher.test.ts b/packages/vscode-wdio-config/tests/watcher.test.ts index c0da93d..d890914 100644 --- a/packages/vscode-wdio-config/tests/watcher.test.ts +++ b/packages/vscode-wdio-config/tests/watcher.test.ts @@ -5,8 +5,8 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import * as vscode from 'vscode' import { ConfigFileWatcher } from '../src/watcher.js' -import type { ServerManagerInterface } from '@vscode-wdio/types/api' -import type { RepositoryManagerInterface } from '@vscode-wdio/types/test' +import type { IWorkerManager } from '@vscode-wdio/types/server' +import type { IRepositoryManager } from '@vscode-wdio/types/test' import type { ExtensionConfigManager } from '../src/index.js' // Mock dependencies @@ -53,8 +53,8 @@ class MockTestFileWatcher extends FileWatcherManager { describe('ConfigFileWatcher', () => { let watcher: ConfigFileWatcher let mockConfigManager: ExtensionConfigManager - let mockServerManager: ServerManagerInterface - let mockRepositoryManager: RepositoryManagerInterface + let mockServerManager: IWorkerManager + let mockRepositoryManager: IRepositoryManager let mockRepo1: any let mockRepo2: any let mockUri: vscode.Uri @@ -81,12 +81,12 @@ describe('ConfigFileWatcher', () => { repos: [mockRepo1, mockRepo2], addWdioConfig: vi.fn(), removeWdioConfig: vi.fn(), - } as unknown as RepositoryManagerInterface + } as unknown as IRepositoryManager // Create mock server manager mockServerManager = { reorganize: vi.fn().mockResolvedValue(undefined), - } as unknown as ServerManagerInterface + } as unknown as IWorkerManager // Create mock config manager mockConfigManager = { diff --git a/packages/vscode-wdio-logger/src/logger.ts b/packages/vscode-wdio-logger/src/logger.ts index a6f86b8..68852ff 100644 --- a/packages/vscode-wdio-logger/src/logger.ts +++ b/packages/vscode-wdio-logger/src/logger.ts @@ -2,7 +2,7 @@ import { EXTENSION_ID, LOG_LEVEL } from '@vscode-wdio/constants' import * as vscode from 'vscode' import { FileLogger } from './fileLogger.js' -import type { LoggerInterface, WdioLogLevel } from '@vscode-wdio/types' +import type { ILogger, WdioLogLevel } from '@vscode-wdio/types' export const LOG_LEVEL_NAMES: Record = { [LOG_LEVEL.TRACE]: 'TRACE', @@ -13,7 +13,7 @@ export const LOG_LEVEL_NAMES: Record = { [LOG_LEVEL.SILENT]: 'SILENT ', } as const -export class VscodeWdioLogger implements LoggerInterface, vscode.Disposable { +export class VscodeWdioLogger implements ILogger, vscode.Disposable { private _timezoneString: string | undefined private _disposables: vscode.Disposable[] = [] private _logLevel: LOG_LEVEL diff --git a/packages/vscode-wdio-api/package.json b/packages/vscode-wdio-server/package.json similarity index 95% rename from packages/vscode-wdio-api/package.json rename to packages/vscode-wdio-server/package.json index f952d9a..849c28d 100644 --- a/packages/vscode-wdio-api/package.json +++ b/packages/vscode-wdio-server/package.json @@ -1,5 +1,5 @@ { - "name": "@vscode-wdio/api", + "name": "@vscode-wdio/server", "version": "0.3.2", "private": true, "type": "module", diff --git a/packages/vscode-wdio-api/src/debug.ts b/packages/vscode-wdio-server/src/debug.ts similarity index 97% rename from packages/vscode-wdio-api/src/debug.ts rename to packages/vscode-wdio-server/src/debug.ts index 0c50b7c..8dbc2ca 100644 --- a/packages/vscode-wdio-api/src/debug.ts +++ b/packages/vscode-wdio-server/src/debug.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode' import { TestRunner } from './run.js' import { WdioExtensionWorker } from './worker.js' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' import type { TestItemMetadata } from '@vscode-wdio/types/test' let debuggerId = 0 @@ -23,7 +23,7 @@ export class DebugRunner extends TestRunner { private _runController: AbortController | null = null constructor( - configManager: ExtensionConfigManagerInterface, + configManager: IExtensionConfigManager, workspaceFolder: vscode.WorkspaceFolder | undefined, token: vscode.CancellationToken, workerCwd: string, @@ -80,7 +80,7 @@ export class WdioExtensionDebugWorker extends WdioExtensionWorker { private _debugTerminationCallback: (() => void) | null = null constructor( - configManager: ExtensionConfigManagerInterface, + configManager: IExtensionConfigManager, cid: string = '#0', cwd: string, private _workspaceFolder: vscode.WorkspaceFolder | undefined, diff --git a/packages/vscode-wdio-api/src/idleMonitor.ts b/packages/vscode-wdio-server/src/idleMonitor.ts similarity index 77% rename from packages/vscode-wdio-api/src/idleMonitor.ts rename to packages/vscode-wdio-server/src/idleMonitor.ts index e2bbf31..f54dda0 100644 --- a/packages/vscode-wdio-api/src/idleMonitor.ts +++ b/packages/vscode-wdio-server/src/idleMonitor.ts @@ -2,63 +2,12 @@ import EventEmitter from 'node:events' import { log } from '@vscode-wdio/logger' -export interface IdleMonitorOptions { - /** - * Idle timeout in seconds - * Set to 0 or negative value to disable timeout - */ - idleTimeout: number -} - -export interface IdleMonitorInterface { - /** - * Start monitoring for idle timeout - */ - start(): void - - /** - * Stop monitoring and clear any pending timeout - */ - stop(): void - - /** - * Reset the idle timer (called when worker is accessed) - */ - resetTimer(): void - - /** - * Update the idle timeout configuration - * @param timeout New timeout value in seconds (0 or negative to disable) - */ - updateTimeout(timeout: number): void - - /** - * Pause the idle timer (called when RPC operation starts) - */ - pauseTimer(): void - - /** - * Resume the idle timer (called when RPC operation completes) - */ - resumeTimer(): void - - /** - * Check if monitoring is currently active - */ - isActive(): boolean - - /** - * Add event listener for idle timeout events - * @param event Event name ('idleTimeout') - * @param listener Event listener function - */ - on(event: 'idleTimeout', listener: () => void): this -} +import type { WorkerIdleMonitorOptions, IWorkerIdleMonitor } from '@vscode-wdio/types/worker' /** * Monitor worker idle state and emit timeout events */ -export class IdleMonitor extends EventEmitter implements IdleMonitorInterface { +export class WorkerIdleMonitor extends EventEmitter implements IWorkerIdleMonitor { private _timer: NodeJS.Timeout | null = null private _isActive = false private _isPaused = false @@ -66,7 +15,7 @@ export class IdleMonitor extends EventEmitter implements IdleMonitorInterface { private _isTimeoutDisabled = false private readonly _workerId: string - constructor(workerId: string, options: IdleMonitorOptions) { + constructor(workerId: string, options: WorkerIdleMonitorOptions) { super() this._workerId = workerId const timeoutSeconds = options.idleTimeout diff --git a/packages/vscode-wdio-api/src/index.ts b/packages/vscode-wdio-server/src/index.ts similarity index 61% rename from packages/vscode-wdio-api/src/index.ts rename to packages/vscode-wdio-server/src/index.ts index ef1ce9d..6f82d5b 100644 --- a/packages/vscode-wdio-api/src/index.ts +++ b/packages/vscode-wdio-server/src/index.ts @@ -1,3 +1,3 @@ -export { ServerManager } from './manager.js' +export { WdioWorkerManager } from './manager.js' export { TestRunner } from './run.js' export { DebugRunner } from './debug.js' diff --git a/packages/vscode-wdio-api/src/manager.ts b/packages/vscode-wdio-server/src/manager.ts similarity index 92% rename from packages/vscode-wdio-api/src/manager.ts rename to packages/vscode-wdio-server/src/manager.ts index add1750..75dc5b2 100644 --- a/packages/vscode-wdio-api/src/manager.ts +++ b/packages/vscode-wdio-server/src/manager.ts @@ -4,18 +4,18 @@ import { log } from '@vscode-wdio/logger' import * as vscode from 'vscode' import { WdioExtensionWorker } from './worker.js' -import type { ServerManagerInterface, WdioExtensionWorkerInterface } from '@vscode-wdio/types/api' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' +import type { IWorkerManager, IWdioExtensionWorker } from '@vscode-wdio/types/server' -export class ServerManager implements ServerManagerInterface { - private _workerPool = new Map() - private _pendingOperations = new Map>() +export class WdioWorkerManager implements IWorkerManager { + private _workerPool = new Map() + private _pendingOperations = new Map>() private latestId = 0 // Semaphore to track the overall operation (for complete sequential execution) private _operationLock = false private _operationQueue: (() => Promise)[] = [] - constructor(private readonly configManager: ExtensionConfigManagerInterface) { + constructor(private readonly configManager: IExtensionConfigManager) { configManager.on('update:nodeExecutable', async (nodeExecutable: string | undefined) => { log.debug(`Restart worker using webdriverio.nodeExecutable: ${nodeExecutable}`) const cwds = Array.from(this._workerPool.keys()) @@ -117,7 +117,7 @@ export class ServerManager implements ServerManagerInterface { } // Start new workers - const startingPromises: Promise[] = [] + const startingPromises: Promise[] = [] const workerCwds = Array.from(newConfigDirs) for (const cwd of workerCwds) { if (!this._workerPool.has(cwd)) { @@ -158,7 +158,7 @@ export class ServerManager implements ServerManagerInterface { * @param worker Worker to update * @param idleTimeout Idle timeout in milliseconds */ - private async updateWorkerIdleTimeout(worker: WdioExtensionWorkerInterface, idleTimeout: number): Promise { + private async updateWorkerIdleTimeout(worker: IWdioExtensionWorker, idleTimeout: number): Promise { try { worker.updateIdleTimeout(idleTimeout) log.debug(`[server manager] successfully updated idle timeout for worker ${worker.cid}`) @@ -229,7 +229,7 @@ export class ServerManager implements ServerManagerInterface { } } - private async startWorker(id: number, workerCwd: string): Promise { + private async startWorker(id: number, workerCwd: string): Promise { // Return existing server if already created const existingServer = this._workerPool.get(workerCwd) if (existingServer) { @@ -239,7 +239,7 @@ export class ServerManager implements ServerManagerInterface { // Return pending operation if one is in progress const pendingOperation = this._pendingOperations.get(`start:${workerCwd}`) if (pendingOperation) { - return pendingOperation as Promise + return pendingOperation as Promise } // Start a new process and track it @@ -282,7 +282,7 @@ export class ServerManager implements ServerManagerInterface { return worker } - private async stopWorker(configPath: string, worker: WdioExtensionWorkerInterface): Promise { + private async stopWorker(configPath: string, worker: IWdioExtensionWorker): Promise { // Return pending stop operation if one is in progress const pendingOperation = this._pendingOperations.get(`stop:${configPath}`) if (pendingOperation) { @@ -301,7 +301,7 @@ export class ServerManager implements ServerManagerInterface { } } - private async executeStopWorker(configPath: string, worker: WdioExtensionWorkerInterface): Promise { + private async executeStopWorker(configPath: string, worker: IWdioExtensionWorker): Promise { log.trace(`shutdown the worker ${worker.cid} for ${configPath}`) await worker.stop() this._workerPool.delete(configPath) diff --git a/packages/vscode-wdio-api/src/run.ts b/packages/vscode-wdio-server/src/run.ts similarity index 96% rename from packages/vscode-wdio-api/src/run.ts rename to packages/vscode-wdio-server/src/run.ts index 88f968f..2989260 100644 --- a/packages/vscode-wdio-api/src/run.ts +++ b/packages/vscode-wdio-server/src/run.ts @@ -2,7 +2,7 @@ import { log } from '@vscode-wdio/logger' import { getGrep, getRange, getCucumberSpec, getSpec } from './utils.js' -import type { RunTestOptions, WdioExtensionWorkerInterface } from '@vscode-wdio/types/api' +import type { RunTestOptions, IWdioExtensionWorker } from '@vscode-wdio/types/server' import type { TestItemMetadata, TestItemMetadataWithRepository } from '@vscode-wdio/types/test' import type * as vscode from 'vscode' @@ -16,7 +16,7 @@ export class TestRunner implements vscode.Disposable { private _stderr = '' private _listeners: Listeners | undefined - constructor(protected worker: WdioExtensionWorkerInterface) {} + constructor(protected worker: IWdioExtensionWorker) {} public get stdout() { return this._stdout diff --git a/packages/vscode-wdio-api/src/utils.ts b/packages/vscode-wdio-server/src/utils.ts similarity index 96% rename from packages/vscode-wdio-api/src/utils.ts rename to packages/vscode-wdio-server/src/utils.ts index bb157b6..fc256a7 100644 --- a/packages/vscode-wdio-api/src/utils.ts +++ b/packages/vscode-wdio-server/src/utils.ts @@ -6,7 +6,7 @@ import which from 'which' import { WebSocketServer } from 'ws' import type { Server } from 'node:http' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' import type { TestItemMetadataWithRepository } from '@vscode-wdio/types/test' import type { NumericLogLevel } from '@vscode-wdio/types/utils' import type * as vscode from 'vscode' @@ -95,7 +95,7 @@ export function getCucumberSpec(testItem: vscode.TestItem, metadata: TestItemMet return baseSpec } -export async function resolveNodePath(configManager: ExtensionConfigManagerInterface) { +export async function resolveNodePath(configManager: IExtensionConfigManager) { log.debug('Resolving the Node executable path') const configuredPath = configManager.globalConfig.nodeExecutable if (configuredPath && (await checkExistence(configuredPath))) { diff --git a/packages/vscode-wdio-api/src/worker.ts b/packages/vscode-wdio-server/src/worker.ts similarity index 94% rename from packages/vscode-wdio-api/src/worker.ts rename to packages/vscode-wdio-server/src/worker.ts index b6eee35..154ceb1 100644 --- a/packages/vscode-wdio-api/src/worker.ts +++ b/packages/vscode-wdio-server/src/worker.ts @@ -8,25 +8,19 @@ import { TypedEventEmitter } from '@vscode-wdio/utils' import { createBirpc } from 'birpc' import getPort from 'get-port' -import { IdleMonitor, type IdleMonitorInterface } from './idleMonitor.js' +import { WorkerIdleMonitor } from './idleMonitor.js' import { createWss, loggingFn, resolveNodePath } from './utils.js' -import type { - ExtensionApi, - WdioExtensionWorkerEvents, - WdioExtensionWorkerInterface, - WorkerApi, -} from '@vscode-wdio/types/api' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' +import type { ExtensionApi, WdioExtensionWorkerEvents, IWdioExtensionWorker, WorkerApi } from '@vscode-wdio/types/server' +import type { IWorkerIdleMonitor } from '@vscode-wdio/types/worker' import type * as vscode from 'vscode' import type { WebSocketServer } from 'ws' const WORKER_PATH = resolve(__dirname, 'worker.cjs') -export class WdioExtensionWorker - extends TypedEventEmitter - implements WdioExtensionWorkerInterface { - protected configManager: ExtensionConfigManagerInterface +export class WdioExtensionWorker extends TypedEventEmitter implements IWdioExtensionWorker { + protected configManager: IExtensionConfigManager public cid: string protected cwd: string protected disposables: vscode.Disposable[] = [] @@ -36,9 +30,9 @@ export class WdioExtensionWorker private _workerConnected = false private _server: Server | null = null private _wss: WebSocketServer | null = null - private _idleMonitor: IdleMonitorInterface + private _idleMonitor: IWorkerIdleMonitor - constructor(configManager: ExtensionConfigManagerInterface, cid: string = '#0', cwd: string) { + constructor(configManager: IExtensionConfigManager, cid: string = '#0', cwd: string) { super() this.cid = cid this.cwd = cwd @@ -46,7 +40,7 @@ export class WdioExtensionWorker // Initialize idle monitor const idleTimeout = this.configManager.globalConfig.workerIdleTimeout - this._idleMonitor = new IdleMonitor(this.cid, { idleTimeout }) + this._idleMonitor = new WorkerIdleMonitor(this.cid, { idleTimeout }) // Forward idle timeout events this._idleMonitor.on('idleTimeout', () => { diff --git a/packages/vscode-wdio-api/tests/debug.test.ts b/packages/vscode-wdio-server/tests/debug.test.ts similarity index 99% rename from packages/vscode-wdio-api/tests/debug.test.ts rename to packages/vscode-wdio-server/tests/debug.test.ts index d210fb6..bb4f5b0 100644 --- a/packages/vscode-wdio-api/tests/debug.test.ts +++ b/packages/vscode-wdio-server/tests/debug.test.ts @@ -7,7 +7,7 @@ import { DebugRunner, DebugSessionTerminatedError, WdioExtensionDebugWorker } fr import * as runModule from '../src/run.js' import * as workerModule from '../src/worker.js' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' // Mock VSCode vi.mock('vscode', async () => { @@ -30,7 +30,7 @@ const mockConfigManager = { globalConfig: { workerIdleTimeout: 600, }, -} as unknown as ExtensionConfigManagerInterface +} as unknown as IExtensionConfigManager describe('DebugRunner', () => { let workspaceFolder: vscode.WorkspaceFolder diff --git a/packages/vscode-wdio-api/tests/manager.test.ts b/packages/vscode-wdio-server/tests/manager.test.ts similarity index 82% rename from packages/vscode-wdio-api/tests/manager.test.ts rename to packages/vscode-wdio-server/tests/manager.test.ts index e08e267..e083f3e 100644 --- a/packages/vscode-wdio-api/tests/manager.test.ts +++ b/packages/vscode-wdio-server/tests/manager.test.ts @@ -2,9 +2,9 @@ import { dirname, join, normalize } from 'node:path' import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest' -import { ServerManager } from '../src/manager.js' +import { WdioWorkerManager } from '../src/manager.js' import { WdioExtensionWorker } from '../src/worker.js' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' vi.mock('vscode', () => import('../../../tests/__mocks__/vscode.cjs')) @@ -40,15 +40,15 @@ const mockConfigManager = { workerIdleTimeout: 600, }, on: vi.fn(), -} as unknown as ExtensionConfigManagerInterface +} as unknown as IExtensionConfigManager describe('ServerManager', () => { - let serverManager: ServerManager + let workerManager: WdioWorkerManager // Create a fresh instance of ServerManager before each test beforeEach(() => { vi.resetAllMocks() - serverManager = new ServerManager(mockConfigManager) + workerManager = new WdioWorkerManager(mockConfigManager) }) afterEach(() => { @@ -61,7 +61,7 @@ describe('ServerManager', () => { const configPaths = ['/path/to/wdio.config.js', '/path/to/wdio.config.ts', '/another/path/wdio.config.js'] // Execute - await serverManager.start(configPaths) + await workerManager.start(configPaths) // Assert expect(WdioExtensionWorker).toHaveBeenCalledTimes(2) @@ -74,7 +74,7 @@ describe('ServerManager', () => { }) it('should handle empty config paths array', async () => { - await serverManager.start([]) + await workerManager.start([]) expect(WdioExtensionWorker).not.toHaveBeenCalled() }) @@ -86,13 +86,13 @@ describe('ServerManager', () => { const configPath = join(process.cwd(), 'path', 'to', '/wdio.config.js') // First call to create server - const result = await serverManager.getConnection(configPath) + const result = await workerManager.getConnection(configPath) // Reset mocks before second call vi.clearAllMocks() // Execute - second call should use existing server - const cachedResult = await serverManager.getConnection(configPath) + const cachedResult = await workerManager.getConnection(configPath) // Assert - WdioExtensionWorker constructor should not be called again expect(WdioExtensionWorker).not.toHaveBeenCalled() @@ -106,7 +106,7 @@ describe('ServerManager', () => { const wdioDirName = dirname(configPath) // Execute - const result = await serverManager.getConnection(configPath) + const result = await workerManager.getConnection(configPath) // Assert expect(WdioExtensionWorker).toHaveBeenCalledTimes(1) @@ -117,10 +117,10 @@ describe('ServerManager', () => { it('should increment the id for each new worker', async () => { // Setup - create first worker - await serverManager.getConnection('/path/to/wdio.config.js') + await workerManager.getConnection('/path/to/wdio.config.js') // Execute - create second worker with different path - await serverManager.getConnection('/another/path/wdio.config.js') + await workerManager.getConnection('/another/path/wdio.config.js') // Assert expect(WdioExtensionWorker).toHaveBeenCalledTimes(2) @@ -134,10 +134,10 @@ describe('ServerManager', () => { // Setup - create multiple workers const configPaths = ['/path/to/wdio.config.js', '/another/path/wdio.config.js'] - await serverManager.start(configPaths) + await workerManager.start(configPaths) // Execute - await serverManager.dispose() + await workerManager.dispose() // Assert expect(vi.mocked(WdioExtensionWorker).mock.instances.length).toBe(2) @@ -146,7 +146,7 @@ describe('ServerManager', () => { it('should handle empty server pool', async () => { // Execute - await serverManager.dispose() + await workerManager.dispose() // Assert - should not throw an error expect(WdioExtensionWorker).not.toHaveBeenCalled() @@ -156,12 +156,12 @@ describe('ServerManager', () => { describe('reorganize', () => { it('should stop unnecessary workers and start new ones', async () => { // Setup - create initial workers - await serverManager.start(['/path/to/wdio.config.js', '/another/path/wdio.config.js']) + await workerManager.start(['/path/to/wdio.config.js', '/another/path/wdio.config.js']) vi.clearAllMocks() // Execute - reorganize with different paths - await serverManager.reorganize(['/path/to/wdio.config.js', '/new/path/wdio.config.js']) + await workerManager.reorganize(['/path/to/wdio.config.js', '/new/path/wdio.config.js']) // Assert // Should stop one worker @@ -182,8 +182,8 @@ describe('ServerManager', () => { const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) // Mock createWorker to add delay and tracking - const originalCreateWorker = (serverManager as any).createWorker.bind(serverManager) - vi.spyOn(serverManager as any, 'createWorker').mockImplementation((async ( + const originalCreateWorker = (workerManager as any).createWorker.bind(workerManager) + vi.spyOn(workerManager as any, 'createWorker').mockImplementation((async ( id: number, configPath: string ) => { @@ -193,9 +193,9 @@ describe('ServerManager', () => { }) as any) // Execute multiple operations concurrently - const promise1 = serverManager.getConnection('/path/1/wdio.config.js') - const promise2 = serverManager.getConnection('/path/2/wdio.config.js') - const promise3 = serverManager.getConnection('/path/3/wdio.config.js') + const promise1 = workerManager.getConnection('/path/1/wdio.config.js') + const promise2 = workerManager.getConnection('/path/2/wdio.config.js') + const promise3 = workerManager.getConnection('/path/3/wdio.config.js') // Wait for all operations to complete await Promise.all([promise1, promise2, promise3]) @@ -212,8 +212,8 @@ describe('ServerManager', () => { const startCount = { count: 0 } // Mock createWorker to track calls - const originalCreateWorker = (serverManager as any).createWorker.bind(serverManager) - vi.spyOn(serverManager as any, 'createWorker').mockImplementation((async ( + const originalCreateWorker = (workerManager as any).createWorker.bind(workerManager) + vi.spyOn(workerManager as any, 'createWorker').mockImplementation((async ( id: number, configPath: string ) => { @@ -225,7 +225,7 @@ describe('ServerManager', () => { // Execute multiple operations for the same path concurrently const promises = Array(5) .fill(null) - .map(() => serverManager.getConnection('/same/path/wdio.config.js')) + .map(() => workerManager.getConnection('/same/path/wdio.config.js')) // Wait for all operations to complete const results = await Promise.all(promises) @@ -248,7 +248,7 @@ describe('ServerManager', () => { const configPath = '/path/to/wdio.config.js' // Access private method using any cast - const startWorker = (serverManager as any).startWorker.bind(serverManager) + const startWorker = (workerManager as any).startWorker.bind(workerManager) // Execute const result = await startWorker(id, configPath) @@ -268,11 +268,11 @@ describe('ServerManager', () => { const configPath = '/path/to/wdio.config.js' // Access private method using any cast - const startWorker = (serverManager as any).startWorker.bind(serverManager) + const startWorker = (workerManager as any).startWorker.bind(workerManager) // Add tracking to see if createWorker is called multiple times let createWorkerCalls = 0 - vi.spyOn(serverManager as any, 'createWorker').mockImplementation((async (id: number, path: string) => { + vi.spyOn(workerManager as any, 'createWorker').mockImplementation((async (id: number, path: string) => { createWorkerCalls++ // Mock delay to ensure operations overlap await new Promise((resolve) => setTimeout(resolve, 50)) @@ -295,35 +295,35 @@ describe('ServerManager', () => { describe('stopWorker', () => { it('should stop a worker and remove it from the server pool', async () => { // Setup - create a worker first - await serverManager.getConnection('/path/to/wdio.config.js') + await workerManager.getConnection('/path/to/wdio.config.js') // Access private methods using any cast - const stopWorker = (serverManager as any).stopWorker.bind(serverManager) + const stopWorker = (workerManager as any).stopWorker.bind(workerManager) // Get the worker from the server pool - const worker = (serverManager as any)._workerPool.get('/path/to') + const worker = (workerManager as any)._workerPool.get('/path/to') // Execute await stopWorker('/path/to', worker) // Assert expect(worker.stop).toHaveBeenCalledTimes(1) - expect((serverManager as any)._workerPool.has('/path/to')).toBe(false) + expect((workerManager as any)._workerPool.has('/path/to')).toBe(false) }) it('should return the same promise for concurrent stop calls', async () => { // Setup - create a worker first - await serverManager.getConnection('/path/to/wdio.config.js') + await workerManager.getConnection('/path/to/wdio.config.js') // Access private methods using any cast - const stopWorker = (serverManager as any).stopWorker.bind(serverManager) + const stopWorker = (workerManager as any).stopWorker.bind(workerManager) // Get the worker from the server pool - const worker = (serverManager as any)._workerPool.get('/path/to') + const worker = (workerManager as any)._workerPool.get('/path/to') // Add tracking let executeStopWorkerCalls = 0 - vi.spyOn(serverManager as any, 'executeStopWorker').mockImplementation(async () => { + vi.spyOn(workerManager as any, 'executeStopWorker').mockImplementation(async () => { executeStopWorkerCalls++ // Mock delay to ensure operations overlap await new Promise((resolve) => setTimeout(resolve, 50)) diff --git a/packages/vscode-wdio-api/tests/run.test.ts b/packages/vscode-wdio-server/tests/run.test.ts similarity index 98% rename from packages/vscode-wdio-api/tests/run.test.ts rename to packages/vscode-wdio-server/tests/run.test.ts index 165bb7b..38f25b7 100644 --- a/packages/vscode-wdio-api/tests/run.test.ts +++ b/packages/vscode-wdio-server/tests/run.test.ts @@ -3,7 +3,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { createTestItem } from '../../../tests/utils.js' import { TestRunner } from '../src/run.js' -import type { WdioExtensionWorkerInterface } from '@vscode-wdio/types' +import type { IWdioExtensionWorker } from '@vscode-wdio/types' import type { ResultSet } from '@vscode-wdio/types/reporter' // Mock dependencies @@ -14,7 +14,7 @@ vi.mock('../src/debug.js', () => ({})) describe('TestRunner', () => { let testRunner: TestRunner - let mockWorker: WdioExtensionWorkerInterface + let mockWorker: IWdioExtensionWorker let mockRpc: any beforeEach(() => { @@ -35,7 +35,7 @@ describe('TestRunner', () => { removeListener: vi.fn(), ensureConnected: vi.fn().mockResolvedValue(undefined), rpc: mockRpc, - } as unknown as WdioExtensionWorkerInterface + } as unknown as IWdioExtensionWorker // Create test runner instance testRunner = new TestRunner(mockWorker) diff --git a/packages/vscode-wdio-api/tests/utils.test.ts b/packages/vscode-wdio-server/tests/utils.test.ts similarity index 98% rename from packages/vscode-wdio-api/tests/utils.test.ts rename to packages/vscode-wdio-server/tests/utils.test.ts index d093a83..0b69927 100644 --- a/packages/vscode-wdio-api/tests/utils.test.ts +++ b/packages/vscode-wdio-server/tests/utils.test.ts @@ -6,7 +6,7 @@ import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest' import which from 'which' import { loggingFn, resolveNodePath } from '../src/utils.js' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' vi.mock('vscode', async () => import('../../../tests/__mocks__/vscode.cjs')) vi.mock('@vscode-wdio/logger', () => import('../../../tests/__mocks__/logger.js')) @@ -51,7 +51,7 @@ describe('resolveNodePath', () => { globalConfig: { nodeExecutable: '', }, - } as unknown as ExtensionConfigManagerInterface + } as unknown as IExtensionConfigManager // Import which module after mocking diff --git a/packages/vscode-wdio-api/tests/worker.test.ts b/packages/vscode-wdio-server/tests/worker.test.ts similarity index 99% rename from packages/vscode-wdio-api/tests/worker.test.ts rename to packages/vscode-wdio-server/tests/worker.test.ts index 6395d4a..f92780c 100644 --- a/packages/vscode-wdio-api/tests/worker.test.ts +++ b/packages/vscode-wdio-server/tests/worker.test.ts @@ -8,8 +8,8 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { createWss } from '../src/utils.js' import { WdioExtensionWorker } from '../src/worker.js' -import type { ExtensionApi } from '@vscode-wdio/types/api' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' +import type { ExtensionApi } from '@vscode-wdio/types/server' import type * as WebSocket from 'ws' // Mock dependencies @@ -94,7 +94,7 @@ describe('WdioExtensionWorker', () => { // Create worker instance worker = new WdioExtensionWorker( - { globalConfig: { workerIdleTimeout: 600 } } as unknown as ExtensionConfigManagerInterface, + { globalConfig: { workerIdleTimeout: 600 } } as unknown as IExtensionConfigManager, '#1', '/test/path' ) diff --git a/packages/vscode-wdio-api/tsconfig.json b/packages/vscode-wdio-server/tsconfig.json similarity index 100% rename from packages/vscode-wdio-api/tsconfig.json rename to packages/vscode-wdio-server/tsconfig.json diff --git a/packages/vscode-wdio-test/package.json b/packages/vscode-wdio-test/package.json index c0ee549..3a34372 100644 --- a/packages/vscode-wdio-test/package.json +++ b/packages/vscode-wdio-test/package.json @@ -15,7 +15,7 @@ "clean": "shx rm -rf out dist coverage" }, "dependencies": { - "@vscode-wdio/api": "workspace:*", + "@vscode-wdio/server": "workspace:*", "@vscode-wdio/config": "workspace:*", "@vscode-wdio/constants": "workspace:*", "@vscode-wdio/logger": "workspace:*", diff --git a/packages/vscode-wdio-test/src/converter.ts b/packages/vscode-wdio-test/src/converter.ts index 88bb483..197894a 100644 --- a/packages/vscode-wdio-test/src/converter.ts +++ b/packages/vscode-wdio-test/src/converter.ts @@ -1,7 +1,7 @@ import path from 'node:path' import * as vscode from 'vscode' -import type { ReadSpecsResult } from '@vscode-wdio/types/api' +import type { ReadSpecsResult } from '@vscode-wdio/types/server' import type { TestData, SourceRange, VscodeTestData } from '@vscode-wdio/types/test' /** * Convert the parser's TestData to VSCode compatible TestData diff --git a/packages/vscode-wdio-test/src/manager.ts b/packages/vscode-wdio-test/src/manager.ts index f339f5c..198ace7 100644 --- a/packages/vscode-wdio-test/src/manager.ts +++ b/packages/vscode-wdio-test/src/manager.ts @@ -9,11 +9,8 @@ import { MetadataRepository } from './metadata.js' import { TestRepository } from './repository.js' import { createRunProfile } from './utils.js' import type { ExtensionConfigManager } from '@vscode-wdio/config' -import type { ServerManagerInterface as ServerManager } from '@vscode-wdio/types/api' -import type { - RepositoryManagerInterface, - TestRepositoryInterface as TestRepositoryInterface, -} from '@vscode-wdio/types/test' +import type { IWorkerManager } from '@vscode-wdio/types/server' +import type { IRepositoryManager, ITestRepository } from '@vscode-wdio/types/test' /** * workspace -- managed by this class @@ -25,8 +22,8 @@ import type { const LOADING_TEST_ITEM_ID = '_resolving' -export class RepositoryManager extends MetadataRepository implements RepositoryManagerInterface { - private readonly _repos = new Set() +export class RepositoryManager extends MetadataRepository implements IRepositoryManager { + private readonly _repos = new Set() private _loadingTestItem: vscode.TestItem private _workspaceTestItems: vscode.TestItem[] = [] private _wdioConfigTestItems: vscode.TestItem[] = [] @@ -36,7 +33,7 @@ export class RepositoryManager extends MetadataRepository implements RepositoryM constructor( public readonly controller: vscode.TestController, public readonly configManager: ExtensionConfigManager, - private readonly serverManager: ServerManager + private readonly workerManager: IWorkerManager ) { super() this._loadingTestItem = this.controller.createTestItem(LOADING_TEST_ITEM_ID, 'Resolving WebdriverIO Tests...') @@ -66,7 +63,7 @@ export class RepositoryManager extends MetadataRepository implements RepositoryM ) ) .then(() => this.registerToTestController()) - .then(() => this.serverManager.reorganize(configManager.getWdioConfigPaths())) + .then(() => this.workerManager.reorganize(configManager.getWdioConfigPaths())) }) } @@ -188,8 +185,8 @@ export class RepositoryManager extends MetadataRepository implements RepositoryM workspaceTestItem.children.add(configItem) this._wdioConfigTestItems.push(configItem) - const worker = await this.serverManager.getConnection(wdioConfigPath) - const repo = new TestRepository(this.controller, worker, wdioConfigPath, configItem, this.serverManager) + const worker = await this.workerManager.getConnection(wdioConfigPath) + const repo = new TestRepository(this.controller, worker, wdioConfigPath, configItem, this.workerManager) this._repos.add(repo) configItem.description = relative(workspaceTestItem.uri!.fsPath, dirname(wdioConfigPath)) diff --git a/packages/vscode-wdio-test/src/metadata.ts b/packages/vscode-wdio-test/src/metadata.ts index 03c3c06..2c597b6 100644 --- a/packages/vscode-wdio-test/src/metadata.ts +++ b/packages/vscode-wdio-test/src/metadata.ts @@ -1,7 +1,7 @@ -import type { MetadataRepositoryInterface, TestItemMetadata } from '@vscode-wdio/types/test' +import type { IMetadataRepository, TestItemMetadata } from '@vscode-wdio/types/test' import type * as vscode from 'vscode' -export class MetadataRepository implements MetadataRepositoryInterface { +export class MetadataRepository implements IMetadataRepository { private static testMetadataRepository = new WeakMap() public getMetadata(testItem: vscode.TestItem) { const metadata = MetadataRepository.testMetadataRepository.get(testItem) diff --git a/packages/vscode-wdio-test/src/reporter.ts b/packages/vscode-wdio-test/src/reporter.ts index cdb0b40..5906bce 100644 --- a/packages/vscode-wdio-test/src/reporter.ts +++ b/packages/vscode-wdio-test/src/reporter.ts @@ -2,7 +2,7 @@ import { log } from '@vscode-wdio/logger' import * as vscode from 'vscode' import type { ResultSet, TestSuite, Test } from '@vscode-wdio/types/reporter' -import type { TestRepositoryInterface } from '@vscode-wdio/types/test' +import type { ITestRepository } from '@vscode-wdio/types/test' /** * TestReporter class for handling WebdriverIO test results and updating VSCode TestItems @@ -15,7 +15,7 @@ export class TestReporter { * @param _run The current test run */ constructor( - private readonly _repository: TestRepositoryInterface, + private readonly _repository: ITestRepository, private readonly _run: vscode.TestRun ) {} diff --git a/packages/vscode-wdio-test/src/repository.ts b/packages/vscode-wdio-test/src/repository.ts index a80c3bb..9d0fa00 100644 --- a/packages/vscode-wdio-test/src/repository.ts +++ b/packages/vscode-wdio-test/src/repository.ts @@ -9,16 +9,16 @@ import { convertPathToUri, convertTestData } from './converter.js' import { MetadataRepository } from './metadata.js' import { filterSpecsByPaths } from './utils.js' -import type { ServerManagerInterface, WdioExtensionWorkerInterface } from '@vscode-wdio/types/api' -import type { VscodeTestData, TestRepositoryInterface } from '@vscode-wdio/types/test' +import type { IWorkerManager, IWdioExtensionWorker } from '@vscode-wdio/types/server' +import type { VscodeTestData, ITestRepository } from '@vscode-wdio/types/test' import type * as vscode from 'vscode' class WorkerProxy extends MetadataRepository { - private _worker: WdioExtensionWorkerInterface | undefined + private _worker: IWdioExtensionWorker | undefined constructor( private readonly _wdioConfigPath: string, - worker: WdioExtensionWorkerInterface, - private serverManager: ServerManagerInterface + worker: IWdioExtensionWorker, + private workerManager: IWorkerManager ) { super() this._worker = worker @@ -29,7 +29,7 @@ class WorkerProxy extends MetadataRepository { async getWorker() { if (!this._worker) { - this._worker = await this.serverManager.getConnection(this._wdioConfigPath) + this._worker = await this.workerManager.getConnection(this._wdioConfigPath) } return this._worker } @@ -39,19 +39,19 @@ class WorkerProxy extends MetadataRepository { * TestRepository class that manages all WebdriverIO tests at * the single WebdriverIO configuration file */ -export class TestRepository extends WorkerProxy implements TestRepositoryInterface { +export class TestRepository extends WorkerProxy implements ITestRepository { private _specPatterns: string[] = [] private _fileMap = new Map() private _framework: string | undefined = undefined constructor( public readonly controller: vscode.TestController, - _worker: WdioExtensionWorkerInterface, + _worker: IWdioExtensionWorker, public readonly wdioConfigPath: string, private _wdioConfigTestItem: vscode.TestItem, - serverManager: ServerManagerInterface + workerManager: IWorkerManager ) { - super(wdioConfigPath, _worker, serverManager) + super(wdioConfigPath, _worker, workerManager) } public get specPatterns() { diff --git a/packages/vscode-wdio-test/src/runHandler.ts b/packages/vscode-wdio-test/src/runHandler.ts index 2630cb7..9ff67b3 100644 --- a/packages/vscode-wdio-test/src/runHandler.ts +++ b/packages/vscode-wdio-test/src/runHandler.ts @@ -1,13 +1,13 @@ import { dirname } from 'node:path' -import { DebugRunner, TestRunner } from '@vscode-wdio/api' import { log } from '@vscode-wdio/logger' +import { DebugRunner, TestRunner } from '@vscode-wdio/server' import * as vscode from 'vscode' import { TestReporter } from './reporter.js' import { getRootTestItem } from './utils.js' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' import type { RepositoryManager } from './manager.js' class TestQueue { @@ -27,7 +27,7 @@ class TestQueue { } export function createHandler( - configManager: ExtensionConfigManagerInterface, + configManager: IExtensionConfigManager, repositoryManager: RepositoryManager, isDebug = false ) { @@ -132,7 +132,7 @@ function conversionCucumberStep(this: RepositoryManager, testItem: vscode.TestIt function getWorkspaceFolder( this: RepositoryManager, - configManager: ExtensionConfigManagerInterface, + configManager: IExtensionConfigManager, testItem: vscode.TestItem ) { if (!configManager.isMultiWorkspace) { diff --git a/packages/vscode-wdio-test/tests/converter.test.ts b/packages/vscode-wdio-test/tests/converter.test.ts index 8f8ddb6..98f598e 100644 --- a/packages/vscode-wdio-test/tests/converter.test.ts +++ b/packages/vscode-wdio-test/tests/converter.test.ts @@ -4,7 +4,7 @@ import { describe, it, expect, vi } from 'vitest' import * as vscode from 'vscode' import { convertPathToUri, convertTestData, isCucumberFeatureFile } from '../src/converter.js' -import type { ReadSpecsResult } from '@vscode-wdio/types/api' +import type { ReadSpecsResult } from '@vscode-wdio/types/server' // Mock dependencies vi.mock('vscode', () => import('../../../tests/__mocks__/vscode.cjs')) diff --git a/packages/vscode-wdio-test/tests/manager.test.ts b/packages/vscode-wdio-test/tests/manager.test.ts index b7ad46a..4378c33 100644 --- a/packages/vscode-wdio-test/tests/manager.test.ts +++ b/packages/vscode-wdio-test/tests/manager.test.ts @@ -1,8 +1,8 @@ import { join } from 'node:path' -import { ServerManager } from '@vscode-wdio/api' import { ExtensionConfigManager } from '@vscode-wdio/config' import { TEST_ID_SEPARATOR } from '@vscode-wdio/constants' +import { WdioWorkerManager } from '@vscode-wdio/server' import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import * as vscode from 'vscode' @@ -10,8 +10,8 @@ import { mockCreateTestItem, MockTestItemCollection } from '../../../tests/utils import { RepositoryManager } from '../src/manager.js' import { TestRepository } from '../src/repository.js' -import type { WdioExtensionWorkerInterface } from '@vscode-wdio/types/api' import type { WorkspaceData } from '@vscode-wdio/types/config' +import type { IWdioExtensionWorker } from '@vscode-wdio/types/server' // Mock dependencies vi.mock('vscode', async () => { @@ -38,7 +38,7 @@ vi.mock('../src/utils.js', () => { describe('RepositoryManager', () => { let fakeWorkspaceFolder: vscode.WorkspaceFolder let fakeWorkspaces: WorkspaceData[] - let serverManager: ServerManager + let workerManager: WdioWorkerManager let clearTestsStub: ReturnType let discoverAllTestsStub: ReturnType let controller: vscode.TestController @@ -77,10 +77,10 @@ describe('RepositoryManager', () => { ] // Setup ServerManager mock - serverManager = new ServerManager(configManager) - vi.spyOn(serverManager, 'getConnection').mockResolvedValue({ + workerManager = new WdioWorkerManager(configManager) + vi.spyOn(workerManager, 'getConnection').mockResolvedValue({ on: vi.fn(), - } as unknown as WdioExtensionWorkerInterface) + } as unknown as IWdioExtensionWorker) // Stub configManager vi.spyOn(configManager, 'workspaces', 'get').mockReturnValue(fakeWorkspaces) @@ -92,7 +92,7 @@ describe('RepositoryManager', () => { vi.spyOn(TestRepository.prototype, 'discoverAllTests').mockImplementation(discoverAllTestsStub) vi.spyOn(TestRepository.prototype, 'clearTests').mockImplementation(clearTestsStub) - repositoryManager = new RepositoryManager(controller, configManager, serverManager) + repositoryManager = new RepositoryManager(controller, configManager, workerManager) }) afterEach(() => { @@ -115,7 +115,7 @@ describe('RepositoryManager', () => { expect((repositoryManager as any)._workspaceTestItems.length).toBe(1) expect((repositoryManager as any)._wdioConfigTestItems.length).toBe(1) - expect(serverManager.getConnection).toHaveBeenCalledWith(fakeWorkspaces[0].wdioConfigFiles[0]) + expect(workerManager.getConnection).toHaveBeenCalledWith(fakeWorkspaces[0].wdioConfigFiles[0]) }) }) @@ -161,9 +161,9 @@ describe('RepositoryManager', () => { }, ] vi.spyOn(configManager, 'workspaces', 'get').mockReturnValue(fakeWorkspaces) - vi.spyOn(serverManager, 'getConnection').mockResolvedValue({ + vi.spyOn(workerManager, 'getConnection').mockResolvedValue({ on: vi.fn(), - } as unknown as WdioExtensionWorkerInterface) + } as unknown as IWdioExtensionWorker) await repositoryManager.initialize() repositoryManager.registerToTestController() diff --git a/packages/vscode-wdio-test/tests/repository.test.ts b/packages/vscode-wdio-test/tests/repository.test.ts index 546e5f0..5d7728e 100644 --- a/packages/vscode-wdio-test/tests/repository.test.ts +++ b/packages/vscode-wdio-test/tests/repository.test.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode' import { mockCreateTestItem, MockTestItemCollection } from '../../../tests/utils.js' import { TestRepository } from '../src/repository.js' -import type { ServerManagerInterface, WdioConfig, WdioExtensionWorkerInterface } from '@vscode-wdio/types/api' +import type { IWorkerManager, WdioConfig, IWdioExtensionWorker } from '@vscode-wdio/types/server' // Mock dependencies vi.mock('vscode', async () => import('../../../tests/__mocks__/vscode.cjs')) @@ -26,11 +26,11 @@ describe('TestRepository', () => { let testController: vscode.TestController let wdioConfigTestItem: vscode.TestItem let testRepository: TestRepository - let mockWorker: WdioExtensionWorkerInterface + let mockWorker: IWdioExtensionWorker let readFile: ReturnType let readSpecsStub: ReturnType let runProfileDisposeStub: ReturnType - let serverManager: ServerManagerInterface + let workerManager: IWorkerManager beforeEach(() => { vi.resetAllMocks() @@ -63,7 +63,7 @@ describe('TestRepository', () => { }), readSpecs: readSpecsStub, }, - } as unknown as WdioExtensionWorkerInterface + } as unknown as IWdioExtensionWorker readFile = vi.fn() class MockTestRepository extends TestRepository { @@ -72,7 +72,7 @@ describe('TestRepository', () => { } } - serverManager = vi.fn() as unknown as ServerManagerInterface + workerManager = vi.fn() as unknown as IWorkerManager // Create repository with mocked dependencies testRepository = new MockTestRepository( @@ -80,7 +80,7 @@ describe('TestRepository', () => { mockWorker, mockWdioConfigPath, wdioConfigTestItem, - serverManager + workerManager ) testRepository.setMetadata(wdioConfigTestItem, { @@ -141,7 +141,7 @@ describe('TestRepository', () => { mockWorker, mockWdioConfigPath, wdioConfigTestItem, - serverManager + workerManager ) // Verify diff --git a/packages/vscode-wdio-test/tests/runHandler.test.ts b/packages/vscode-wdio-test/tests/runHandler.test.ts index dcd97ae..b2bf3ba 100644 --- a/packages/vscode-wdio-test/tests/runHandler.test.ts +++ b/packages/vscode-wdio-test/tests/runHandler.test.ts @@ -1,11 +1,11 @@ -import { TestRunner } from '@vscode-wdio/api' import { log } from '@vscode-wdio/logger' +import { TestRunner } from '@vscode-wdio/server' import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { createTestItem } from '../../../tests/utils.js' import { TestReporter } from '../src/reporter.js' import { createHandler } from '../src/runHandler.js' -import type { ExtensionConfigManagerInterface } from '@vscode-wdio/types/config' +import type { IExtensionConfigManager } from '@vscode-wdio/types/config' import type { TestItemMetadata } from '@vscode-wdio/types/test' import type * as vscode from 'vscode' import type { RepositoryManager } from '../src/index.js' @@ -50,7 +50,7 @@ vi.mock('../src/utils.js', async (importActual) => { } }) -vi.mock('@vscode-wdio/api', () => { +vi.mock('@vscode-wdio/server', () => { const TestRunner = vi.fn() TestRunner.prototype.run = vi.fn() TestRunner.prototype.stdout = null @@ -70,7 +70,7 @@ vi.mock('../../src/config/index.js', () => ({ describe('Run Handler', () => { let mockTestRun: vscode.TestRun let mockToken: vscode.CancellationToken - let mockConfigManager: ExtensionConfigManagerInterface + let mockConfigManager: IExtensionConfigManager let runHandler: ReturnType let testItemMap: WeakMap let mockRepositoryManager: RepositoryManager @@ -97,7 +97,7 @@ describe('Run Handler', () => { globalConfig: { showOutput: true, }, - } as unknown as ExtensionConfigManagerInterface + } as unknown as IExtensionConfigManager testItemMap = new WeakMap() const mockGetMetadata = vi.fn().mockImplementation((testItem: vscode.TestItem) => testItemMap.get(testItem)) diff --git a/packages/vscode-wdio-types/package.json b/packages/vscode-wdio-types/package.json index 52378b8..f8ef287 100644 --- a/packages/vscode-wdio-types/package.json +++ b/packages/vscode-wdio-types/package.json @@ -8,10 +8,10 @@ "types": "./dist/index.d.ts", "import": "./dist/index.js" }, - "./api": { - "importSource": "./src/api.ts", - "types": "./dist/api.d.ts", - "import": "./dist/api.js" + "./server": { + "importSource": "./src/server.ts", + "types": "./dist/server.d.ts", + "import": "./dist/server.js" }, "./config": { "importSource": "./src/config.ts", diff --git a/packages/vscode-wdio-types/src/config.ts b/packages/vscode-wdio-types/src/config.ts index fd504f2..7a1a50c 100644 --- a/packages/vscode-wdio-types/src/config.ts +++ b/packages/vscode-wdio-types/src/config.ts @@ -1,6 +1,6 @@ import type { DEFAULT_CONFIG_VALUES } from '@vscode-wdio/constants' import type * as vscode from 'vscode' -import type { TypedEventEmitterInterface, WebdriverIOConfig } from './utils.js' +import type { ITypedEventEmitter, WebdriverIOConfig } from './utils.js' export type ConfigPropertyNames = typeof DEFAULT_CONFIG_VALUES extends Record ? K[] : never @@ -15,9 +15,7 @@ type ToEventConfig = { export type WebdriverIOConfigEvent = ToEventConfig -export interface ExtensionConfigManagerInterface - extends TypedEventEmitterInterface, - vscode.Disposable { +export interface IExtensionConfigManager extends ITypedEventEmitter, vscode.Disposable { isMultiWorkspace: boolean globalConfig: WebdriverIOConfig workspaces: WorkspaceData[] diff --git a/packages/vscode-wdio-types/src/index.ts b/packages/vscode-wdio-types/src/index.ts index e1fb76f..07b5a77 100644 --- a/packages/vscode-wdio-types/src/index.ts +++ b/packages/vscode-wdio-types/src/index.ts @@ -1,4 +1,4 @@ -export type * from './api.js' +export type * from './server.js' export type * from './config.js' export type * from './reporter.js' export type * from './test.js' diff --git a/packages/vscode-wdio-types/src/api.ts b/packages/vscode-wdio-types/src/server.ts similarity index 90% rename from packages/vscode-wdio-types/src/api.ts rename to packages/vscode-wdio-types/src/server.ts index 628e477..bc894ae 100644 --- a/packages/vscode-wdio-types/src/api.ts +++ b/packages/vscode-wdio-types/src/server.ts @@ -1,7 +1,7 @@ import type * as vscode from 'vscode' import type { ResultSet } from './reporter.js' import type { TestData } from './test.js' -import type { NumericLogLevel, TypedEventEmitterInterface } from './utils.js' +import type { NumericLogLevel, ITypedEventEmitter } from './utils.js' export type WdioConfig = { specs: string[] @@ -119,7 +119,7 @@ export interface WorkerRunnerOptions { astCollect: boolean } -export interface WdioExtensionWorkerInterface extends TypedEventEmitterInterface { +export interface IWdioExtensionWorker extends ITypedEventEmitter { cid: string rpc: WorkerApi start(): Promise @@ -137,8 +137,8 @@ export interface WdioExtensionWorkerEvents { shutdown: undefined } -export interface ServerManagerInterface extends vscode.Disposable { +export interface IWorkerManager extends vscode.Disposable { start(configPaths: string[]): Promise - getConnection(configPaths: string): Promise + getConnection(configPaths: string): Promise reorganize(configPaths: string[]): Promise } diff --git a/packages/vscode-wdio-types/src/test.ts b/packages/vscode-wdio-types/src/test.ts index 49119f6..55d6e2e 100644 --- a/packages/vscode-wdio-types/src/test.ts +++ b/packages/vscode-wdio-types/src/test.ts @@ -1,11 +1,11 @@ import type * as vscode from 'vscode' -import type { WdioExtensionWorkerInterface } from './api.js' -import type { ExtensionConfigManagerInterface } from './config.js' +import type { IExtensionConfigManager } from './config.js' +import type { IWdioExtensionWorker } from './server.js' -export interface RepositoryManagerInterface extends vscode.Disposable { +export interface IRepositoryManager extends vscode.Disposable { readonly controller: vscode.TestController - readonly configManager: ExtensionConfigManagerInterface - readonly repos: TestRepositoryInterface[] + readonly configManager: IExtensionConfigManager + readonly repos: ITestRepository[] initialize(): Promise addWdioConfig(workspaceUri: vscode.Uri, wdioConfigPath: string): Promise @@ -14,12 +14,12 @@ export interface RepositoryManagerInterface extends vscode.Disposable { refreshTests(): Promise } -export interface TestRepositoryInterface extends MetadataRepositoryInterface, vscode.Disposable { +export interface ITestRepository extends IMetadataRepository, vscode.Disposable { readonly controller: vscode.TestController readonly wdioConfigPath: string specPatterns: string[] framework: string - getWorker(): Promise + getWorker(): Promise discoverAllTests(): Promise reloadSpecFiles(filePaths?: string[]): Promise removeSpecFile(specPath: string): void @@ -87,7 +87,7 @@ export type TestItemMetadata = { isConfigFile: boolean isSpecFile: boolean isTestcase: boolean - repository?: TestRepositoryInterface // only workspace dose not have repository + repository?: ITestRepository // only workspace dose not have repository runProfiles?: vscode.TestRunProfile[] type?: TestType } @@ -95,8 +95,8 @@ export type TestItemMetadata = { export type TestItemMetadataWithRepository = Omit & Required> -export interface MetadataRepositoryInterface { +export interface IMetadataRepository { getMetadata(testItem: vscode.TestItem): TestItemMetadata - getRepository(testItem: vscode.TestItem): TestRepositoryInterface + getRepository(testItem: vscode.TestItem): ITestRepository setMetadata(testItem: vscode.TestItem, metadata: TestItemMetadata): void } diff --git a/packages/vscode-wdio-types/src/utils.ts b/packages/vscode-wdio-types/src/utils.ts index 8551484..2d2e330 100644 --- a/packages/vscode-wdio-types/src/utils.ts +++ b/packages/vscode-wdio-types/src/utils.ts @@ -4,7 +4,7 @@ export type { WebdriverIOConfig } from '@vscode-wdio/constants' export type WdioLogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent' -export interface LoggerInterface { +export interface ILogger { trace(message: unknown): void debug(message: unknown): void info(message: unknown): void @@ -16,7 +16,7 @@ type ValueOf = T[keyof T] export type NumericLogLevel = ValueOf -export interface TypedEventEmitterInterface> extends EventEmitter { +export interface ITypedEventEmitter> extends EventEmitter { emit(event: K, data: Events[K]): boolean on(event: K, listener: (data: Events[K]) => void | Promise): this } diff --git a/packages/vscode-wdio-types/src/worker.ts b/packages/vscode-wdio-types/src/worker.ts index 2b6b649..f3e8bf2 100644 --- a/packages/vscode-wdio-types/src/worker.ts +++ b/packages/vscode-wdio-types/src/worker.ts @@ -1,6 +1,6 @@ import type { WebSocket } from 'ws' import type { SourceRange, TestData } from './test.js' -import type { LoggerInterface } from './utils.js' +import type { ILogger } from './utils.js' export type TestCodeParser = (fileContent: string, uri: string) => TestData[] @@ -31,7 +31,7 @@ export type { SourceRange, TestData } export interface WorkerMetaContext { cwd: string - log: LoggerInterface + log: ILogger ws: WebSocket shutdownRequested: boolean pendingCalls: Array<() => void> @@ -55,3 +55,56 @@ export interface TagInfo { name: string range: SourceRange } + +export interface IWorkerIdleMonitor { + /** + * Start monitoring for idle timeout + */ + start(): void + + /** + * Stop monitoring and clear any pending timeout + */ + stop(): void + + /** + * Reset the idle timer (called when worker is accessed) + */ + resetTimer(): void + + /** + * Update the idle timeout configuration + * @param timeout New timeout value in seconds (0 or negative to disable) + */ + updateTimeout(timeout: number): void + + /** + * Pause the idle timer (called when RPC operation starts) + */ + pauseTimer(): void + + /** + * Resume the idle timer (called when RPC operation completes) + */ + resumeTimer(): void + + /** + * Check if monitoring is currently active + */ + isActive(): boolean + + /** + * Add event listener for idle timeout events + * @param event Event name ('idleTimeout') + * @param listener Event listener function + */ + on(event: 'idleTimeout', listener: () => void): this +} + +export interface WorkerIdleMonitorOptions { + /** + * Idle timeout in seconds + * Set to 0 or negative value to disable timeout + */ + idleTimeout: number +} diff --git a/packages/vscode-wdio-utils/src/index.ts b/packages/vscode-wdio-utils/src/index.ts index d7805c5..cba5f39 100644 --- a/packages/vscode-wdio-utils/src/index.ts +++ b/packages/vscode-wdio-utils/src/index.ts @@ -1,13 +1,13 @@ import { EventEmitter } from 'node:events' -import type { TypedEventEmitterInterface } from '@vscode-wdio/types' +import type { ITypedEventEmitter } from '@vscode-wdio/types' export * from './normalize.js' export * from './watcher.js' export class TypedEventEmitter> extends EventEmitter - implements TypedEventEmitterInterface { + implements ITypedEventEmitter { emit(event: K, data: Events[K]): boolean { return super.emit(event as string, data) } diff --git a/packages/vscode-wdio-worker/src/client.ts b/packages/vscode-wdio-worker/src/client.ts index 69d56f5..d4d0de1 100644 --- a/packages/vscode-wdio-worker/src/client.ts +++ b/packages/vscode-wdio-worker/src/client.ts @@ -6,7 +6,7 @@ import { WebSocket } from 'ws' import { createWorker } from './handler.js' import { getLogger } from './logger.js' import type { NumericLogLevel } from '@vscode-wdio/types' -import type { ExtensionApi, WorkerApi } from '@vscode-wdio/types/api' +import type { ExtensionApi, WorkerApi } from '@vscode-wdio/types/server' export function createRpcClient(cid: string, url: string) { let rpc: ExtensionApi | null = null diff --git a/packages/vscode-wdio-worker/src/handler.ts b/packages/vscode-wdio-worker/src/handler.ts index c8a4b79..94c569f 100644 --- a/packages/vscode-wdio-worker/src/handler.ts +++ b/packages/vscode-wdio-worker/src/handler.ts @@ -3,7 +3,7 @@ import { normalizePath } from '@vscode-wdio/utils/node' import { getLauncherInstance } from './cli.js' import { parse } from './parsers/index.js' import { runTest } from './test.js' -import type { LoadConfigOptions, WdioConfig, WorkerApi } from '@vscode-wdio/types/api' +import type { LoadConfigOptions, WdioConfig, WorkerApi } from '@vscode-wdio/types/server' import type { WorkerMetaContext } from '@vscode-wdio/types/worker' export function createWorker(context: WorkerMetaContext): WorkerApi { diff --git a/packages/vscode-wdio-worker/src/logger.ts b/packages/vscode-wdio-worker/src/logger.ts index 4348a5a..ccdb8c9 100644 --- a/packages/vscode-wdio-worker/src/logger.ts +++ b/packages/vscode-wdio-worker/src/logger.ts @@ -1,15 +1,15 @@ import { LOG_LEVEL } from '@vscode-wdio/constants' -import type { LoggerInterface, NumericLogLevel } from '@vscode-wdio/types' -import type { ExtensionApi } from '@vscode-wdio/types/api' +import type { ILogger, NumericLogLevel } from '@vscode-wdio/types' +import type { ExtensionApi } from '@vscode-wdio/types/server' -const weakLoggers = new WeakMap() +const weakLoggers = new WeakMap() export function getLogger(client: ExtensionApi) { const logger = weakLoggers.get(client) if (logger) { return logger } - class Logger implements LoggerInterface { + class Logger implements ILogger { constructor(private readonly _client: ExtensionApi) {} private log(loglevel: NumericLogLevel, message: unknown) { diff --git a/packages/vscode-wdio-worker/src/parsers/index.ts b/packages/vscode-wdio-worker/src/parsers/index.ts index b39340f..12150dc 100644 --- a/packages/vscode-wdio-worker/src/parsers/index.ts +++ b/packages/vscode-wdio-worker/src/parsers/index.ts @@ -2,7 +2,7 @@ import * as fs from 'node:fs/promises' import path from 'node:path' import { getAstParser, getCucumberParser } from './utils.js' -import type { ReadSpecsOptions } from '@vscode-wdio/types/api' +import type { ReadSpecsOptions } from '@vscode-wdio/types/server' import type { WorkerMetaContext } from '@vscode-wdio/types/worker' async function parseFeatureFile(context: WorkerMetaContext, contents: string, normalizeSpecPath: string) { diff --git a/packages/vscode-wdio-worker/src/test.ts b/packages/vscode-wdio-worker/src/test.ts index f71b055..b524376 100644 --- a/packages/vscode-wdio-worker/src/test.ts +++ b/packages/vscode-wdio-worker/src/test.ts @@ -4,9 +4,9 @@ import { dirname, isAbsolute, join, resolve } from 'node:path' import { getLauncherInstance } from './cli.js' import { getTempConfigCreator, isWindows } from './utils.js' -import type { RunTestOptions, TestResultData } from '@vscode-wdio/types/api' import type { ResultSet } from '@vscode-wdio/types/reporter' -import type { LoggerInterface } from '@vscode-wdio/types/utils' +import type { RunTestOptions, TestResultData } from '@vscode-wdio/types/server' +import type { ILogger } from '@vscode-wdio/types/utils' import type { WorkerMetaContext } from '@vscode-wdio/types/worker' import type { RunCommandArguments } from '@wdio/cli' @@ -149,7 +149,7 @@ async function getOutputDir(this: WorkerMetaContext) { } } -async function extractResultJson(log: LoggerInterface, outputDir: string | undefined): Promise { +async function extractResultJson(log: ILogger, outputDir: string | undefined): Promise { if (outputDir) { try { await fs.access(outputDir, fs.constants.R_OK) @@ -174,7 +174,7 @@ async function extractResultJson(log: LoggerInterface, outputDir: string | undef return [] } -async function removeResultDir(log: LoggerInterface, outputDir: string) { +async function removeResultDir(log: ILogger, outputDir: string) { try { log.debug('Remove all files...') await fs.rm(outputDir, { recursive: true, force: true }) diff --git a/packages/vscode-wdio-worker/tests/handler.test.ts b/packages/vscode-wdio-worker/tests/handler.test.ts index f1c6416..4996471 100644 --- a/packages/vscode-wdio-worker/tests/handler.test.ts +++ b/packages/vscode-wdio-worker/tests/handler.test.ts @@ -4,7 +4,7 @@ import { getLauncherInstance } from '../src/cli.js' import { createWorker } from '../src/handler.js' import * as parsers from '../src/parsers/index.js' import * as test from '../src/test.js' -import type { LoadConfigOptions, WorkerApi } from '@vscode-wdio/types/api' +import type { LoadConfigOptions, WorkerApi } from '@vscode-wdio/types/server' import type { WorkerMetaContext } from '@vscode-wdio/types/worker' import type { WebSocket } from 'ws' diff --git a/packages/vscode-wdio-worker/tests/index.test.ts b/packages/vscode-wdio-worker/tests/index.test.ts index fc4170d..f2d1a4e 100644 --- a/packages/vscode-wdio-worker/tests/index.test.ts +++ b/packages/vscode-wdio-worker/tests/index.test.ts @@ -2,8 +2,8 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { createRpcClient } from '../src/client.js' import { startWorker } from '../src/index.js' -import type { ExtensionApi } from '@vscode-wdio/types/api' -import type { LoggerInterface } from '@vscode-wdio/types/utils' +import type { ExtensionApi } from '@vscode-wdio/types/server' +import type { ILogger } from '@vscode-wdio/types/utils' import type { WebSocket } from 'ws' // Mock the modules @@ -53,7 +53,7 @@ describe('worker/index', () => { vi.mocked(createRpcClient).mockReturnValue({ ws: mockWs as unknown as WebSocket, client: vi.fn() as unknown as ExtensionApi, - log: mockLog as unknown as LoggerInterface, + log: mockLog as unknown as ILogger, }) }) diff --git a/packages/vscode-wdio-worker/tests/logger.test.ts b/packages/vscode-wdio-worker/tests/logger.test.ts index e42c0ad..1e7e4d7 100644 --- a/packages/vscode-wdio-worker/tests/logger.test.ts +++ b/packages/vscode-wdio-worker/tests/logger.test.ts @@ -2,7 +2,7 @@ import { LOG_LEVEL } from '@vscode-wdio/constants' import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { getLogger } from '../src/logger.js' -import type { ExtensionApi } from '@vscode-wdio/types/api' +import type { ExtensionApi } from '@vscode-wdio/types/server' describe('Logger', () => { // Mock the ExtensionApi client diff --git a/packages/vscode-wdio-worker/tests/parsers/index.test.ts b/packages/vscode-wdio-worker/tests/parsers/index.test.ts index 2a11eb6..28d15c3 100644 --- a/packages/vscode-wdio-worker/tests/parsers/index.test.ts +++ b/packages/vscode-wdio-worker/tests/parsers/index.test.ts @@ -7,7 +7,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { parse } from '../../src/parsers/index.js' import { getAstParser, getCucumberParser } from '../../src/parsers/utils.js' -import type { ReadSpecsOptions } from '@vscode-wdio/types/api' +import type { ReadSpecsOptions } from '@vscode-wdio/types/server' import type { WorkerMetaContext, TestData, CucumberTestData } from '@vscode-wdio/types/worker' // Mock fs module diff --git a/packages/vscode-webdriverio/package.json b/packages/vscode-webdriverio/package.json index 4e6bf1d..9d1fc8e 100644 --- a/packages/vscode-webdriverio/package.json +++ b/packages/vscode-webdriverio/package.json @@ -45,7 +45,7 @@ "clean": "shx rm -rf out dist coverage" }, "devDependencies": { - "@vscode-wdio/api": "workspace:*", + "@vscode-wdio/server": "workspace:*", "@vscode-wdio/config": "workspace:*", "@vscode-wdio/constants": "workspace:*", "@vscode-wdio/logger": "workspace:*", diff --git a/packages/vscode-webdriverio/src/extension.ts b/packages/vscode-webdriverio/src/extension.ts index 2bceaf3..fc515ca 100644 --- a/packages/vscode-webdriverio/src/extension.ts +++ b/packages/vscode-webdriverio/src/extension.ts @@ -1,7 +1,7 @@ -import { ServerManager } from '@vscode-wdio/api' import { ConfigFileWatcher, ExtensionConfigManager } from '@vscode-wdio/config' import { EXTENSION_ID } from '@vscode-wdio/constants' import { log } from '@vscode-wdio/logger' +import { WdioWorkerManager } from '@vscode-wdio/server' import { RepositoryManager, TestfileWatcher } from '@vscode-wdio/test' import * as vscode from 'vscode' @@ -25,7 +25,7 @@ class WdioExtension implements vscode.Disposable { constructor( private controller = vscode.tests.createTestController(EXTENSION_ID, 'WebdriverIO'), private configManager = new ExtensionConfigManager(), - private serverManager = new ServerManager(configManager) + private workerManager = new WdioWorkerManager(configManager) ) {} async activate() { @@ -35,14 +35,14 @@ class WdioExtension implements vscode.Disposable { const configPaths = this.configManager.getWdioConfigPaths() // Start worker process asynchronously - const starting = this.serverManager.start(configPaths) + const starting = this.workerManager.start(configPaths) // Create Manages and watchers - const repositoryManager = new RepositoryManager(this.controller, this.configManager, this.serverManager) + const repositoryManager = new RepositoryManager(this.controller, this.configManager, this.workerManager) const testfileWatcher = new TestfileWatcher(repositoryManager) const configFileWatcher = new ConfigFileWatcher( this.configManager, - this.serverManager, + this.workerManager, repositoryManager, testfileWatcher ) @@ -52,7 +52,7 @@ class WdioExtension implements vscode.Disposable { testfileWatcher, configFileWatcher, repositoryManager, - this.serverManager, + this.workerManager, this.configManager, this.controller, ] diff --git a/packages/vscode-webdriverio/tests/extension.test.ts b/packages/vscode-webdriverio/tests/extension.test.ts index 2fefc62..450550e 100644 --- a/packages/vscode-webdriverio/tests/extension.test.ts +++ b/packages/vscode-webdriverio/tests/extension.test.ts @@ -1,6 +1,6 @@ -import { ServerManager } from '@vscode-wdio/api' import { ExtensionConfigManager } from '@vscode-wdio/config' import { log } from '@vscode-wdio/logger' +import { WdioWorkerManager } from '@vscode-wdio/server' import { RepositoryManager } from '@vscode-wdio/test' import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import * as vscode from 'vscode' @@ -25,12 +25,12 @@ vi.mock('vscode', async () => { }) vi.mock('@vscode-wdio/logger', () => import('../../../tests/__mocks__/logger.js')) -vi.mock('@vscode-wdio/api', () => { - const ServerManager = vi.fn() - ServerManager.prototype.start = vi.fn(() => Promise.resolve()) - ServerManager.prototype.dispose = vi.fn(() => Promise.resolve()) +vi.mock('@vscode-wdio/server', () => { + const WdioWorkerManager = vi.fn() + WdioWorkerManager.prototype.start = vi.fn(() => Promise.resolve()) + WdioWorkerManager.prototype.dispose = vi.fn(() => Promise.resolve()) - return { ServerManager } + return { WdioWorkerManager } }) vi.mock('@vscode-wdio/config', () => { const ExtensionConfigManager = vi.fn() @@ -95,7 +95,7 @@ describe('extension', () => { // vi.mocked(TestRunner).mock.instances[0].run // expect(vi.mocked(ExtensionConfigManager).mock.instances[0].initialize).toHaveBeenCalled() - expect(vi.mocked(ServerManager).mock.instances[0].start).toHaveBeenCalled() + expect(vi.mocked(WdioWorkerManager).mock.instances[0].start).toHaveBeenCalled() expect(vi.mocked(RepositoryManager).mock.instances[0].initialize).toHaveBeenCalled() expect(vi.mocked(RepositoryManager).mock.instances[0].registerToTestController).toHaveBeenCalled() @@ -106,7 +106,7 @@ describe('extension', () => { it('should handle server start error gracefully', async () => { // Arrange const errorMessage = 'Failed to start server' - vi.mocked(ServerManager.prototype.start).mockRejectedValueOnce(new Error(errorMessage)) + vi.mocked(WdioWorkerManager.prototype.start).mockRejectedValueOnce(new Error(errorMessage)) // Act await activate(fakeContext) @@ -118,9 +118,9 @@ describe('extension', () => { ) }) - it('should continue activation even when serverManager.start rejects', async () => { + it('should continue activation even when workerManager.start rejects', async () => { // Arrange - vi.mocked(ServerManager.prototype.start).mockRejectedValueOnce(new Error('Server failed')) + vi.mocked(WdioWorkerManager.prototype.start).mockRejectedValueOnce(new Error('Server failed')) // Act await activate(fakeContext) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3c961c0..79616d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -159,40 +159,6 @@ importers: specifier: ^7.7.2 version: 7.7.2 - packages/vscode-wdio-api: - dependencies: - '@vscode-wdio/constants': - specifier: workspace:* - version: link:../vscode-wdio-constants - '@vscode-wdio/logger': - specifier: workspace:* - version: link:../vscode-wdio-logger - '@vscode-wdio/utils': - specifier: workspace:* - version: link:../vscode-wdio-utils - birpc: - specifier: ^2.3.0 - version: 2.3.0 - get-port: - specifier: ^7.1.0 - version: 7.1.0 - which: - specifier: ^5.0.0 - version: 5.0.0 - ws: - specifier: ^8.18.1 - version: 8.18.2 - devDependencies: - '@types/which': - specifier: ^3.0.4 - version: 3.0.4 - '@types/ws': - specifier: ^8.18.1 - version: 8.18.1 - '@vscode-wdio/types': - specifier: workspace:* - version: link:../vscode-wdio-types - packages/vscode-wdio-config: dependencies: '@vscode-wdio/constants': @@ -240,11 +206,42 @@ importers: specifier: ^9.13.0 version: 9.15.0 - packages/vscode-wdio-test: + packages/vscode-wdio-server: dependencies: - '@vscode-wdio/api': + '@vscode-wdio/constants': + specifier: workspace:* + version: link:../vscode-wdio-constants + '@vscode-wdio/logger': + specifier: workspace:* + version: link:../vscode-wdio-logger + '@vscode-wdio/utils': + specifier: workspace:* + version: link:../vscode-wdio-utils + birpc: + specifier: ^2.3.0 + version: 2.3.0 + get-port: + specifier: ^7.1.0 + version: 7.1.0 + which: + specifier: ^5.0.0 + version: 5.0.0 + ws: + specifier: ^8.18.1 + version: 8.18.2 + devDependencies: + '@types/which': + specifier: ^3.0.4 + version: 3.0.4 + '@types/ws': + specifier: ^8.18.1 + version: 8.18.1 + '@vscode-wdio/types': specifier: workspace:* - version: link:../vscode-wdio-api + version: link:../vscode-wdio-types + + packages/vscode-wdio-test: + dependencies: '@vscode-wdio/config': specifier: workspace:* version: link:../vscode-wdio-config @@ -254,6 +251,9 @@ importers: '@vscode-wdio/logger': specifier: workspace:* version: link:../vscode-wdio-logger + '@vscode-wdio/server': + specifier: workspace:* + version: link:../vscode-wdio-server '@vscode-wdio/utils': specifier: workspace:* version: link:../vscode-wdio-utils @@ -327,9 +327,6 @@ importers: packages/vscode-webdriverio: devDependencies: - '@vscode-wdio/api': - specifier: workspace:* - version: link:../vscode-wdio-api '@vscode-wdio/config': specifier: workspace:* version: link:../vscode-wdio-config @@ -342,6 +339,9 @@ importers: '@vscode-wdio/reporter': specifier: workspace:* version: link:../vscode-wdio-reporter + '@vscode-wdio/server': + specifier: workspace:* + version: link:../vscode-wdio-server '@vscode-wdio/test': specifier: workspace:* version: link:../vscode-wdio-test @@ -8329,7 +8329,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 22.15.30 + '@types/node': 20.19.0 '@types/yargs-parser@21.0.3': {} From bf10be648ef8f25ba6093f232ff09ae6002019f0 Mon Sep 17 00:00:00 2001 From: mato533 Date: Mon, 16 Jun 2025 17:48:36 +0900 Subject: [PATCH 07/16] chore: update idleMonitor --- .../vscode-wdio-server/src/idleMonitor.ts | 20 ++++--- packages/vscode-wdio-server/src/manager.ts | 2 +- packages/vscode-wdio-server/src/run.ts | 6 +- packages/vscode-wdio-server/src/worker.ts | 31 ++++++----- .../vscode-wdio-server/tests/debug.test.ts | 4 ++ packages/vscode-wdio-server/tests/run.test.ts | 4 ++ packages/vscode-wdio-types/src/server.ts | 55 ++++++++++++++++++- packages/vscode-wdio-types/src/worker.ts | 53 ------------------ 8 files changed, 96 insertions(+), 79 deletions(-) diff --git a/packages/vscode-wdio-server/src/idleMonitor.ts b/packages/vscode-wdio-server/src/idleMonitor.ts index f54dda0..41c8f48 100644 --- a/packages/vscode-wdio-server/src/idleMonitor.ts +++ b/packages/vscode-wdio-server/src/idleMonitor.ts @@ -2,7 +2,7 @@ import EventEmitter from 'node:events' import { log } from '@vscode-wdio/logger' -import type { WorkerIdleMonitorOptions, IWorkerIdleMonitor } from '@vscode-wdio/types/worker' +import type { WorkerIdleMonitorOptions, IWorkerIdleMonitor } from '@vscode-wdio/types/server' /** * Monitor worker idle state and emit timeout events @@ -10,7 +10,7 @@ import type { WorkerIdleMonitorOptions, IWorkerIdleMonitor } from '@vscode-wdio/ export class WorkerIdleMonitor extends EventEmitter implements IWorkerIdleMonitor { private _timer: NodeJS.Timeout | null = null private _isActive = false - private _isPaused = false + private _pauseCounter = 0 private _idleTimeout: number private _isTimeoutDisabled = false private readonly _workerId: string @@ -52,7 +52,7 @@ export class WorkerIdleMonitor extends EventEmitter implements IWorkerIdleMonito } this._isActive = false - this._isPaused = false + this._pauseCounter = 0 this.clearTimer() log.debug(`[${this._workerId}] IdleMonitor stopped`) } @@ -61,7 +61,7 @@ export class WorkerIdleMonitor extends EventEmitter implements IWorkerIdleMonito * Reset the idle timer (called when worker is accessed) */ public resetTimer(): void { - if (!this._isActive || this._isPaused || this._isTimeoutDisabled) { + if (!this._isActive || this._pauseCounter > 0 || this._isTimeoutDisabled) { return } @@ -78,7 +78,7 @@ export class WorkerIdleMonitor extends EventEmitter implements IWorkerIdleMonito return } - this._isPaused = true + this._pauseCounter++ this.clearTimer() log.trace(`[${this._workerId}] IdleMonitor timer paused`) } @@ -91,9 +91,11 @@ export class WorkerIdleMonitor extends EventEmitter implements IWorkerIdleMonito return } - this._isPaused = false - this.startTimer() - log.trace(`[${this._workerId}] IdleMonitor timer resumed`) + this._pauseCounter-- + if (this._pauseCounter < 1) { + this.startTimer() + log.trace(`[${this._workerId}] IdleMonitor timer resumed`) + } } /** @@ -144,7 +146,7 @@ export class WorkerIdleMonitor extends EventEmitter implements IWorkerIdleMonito * Start a new timer with current timeout value */ private startTimer(): void { - if (this._isPaused || this._isTimeoutDisabled) { + if (this._pauseCounter > 0 || this._isTimeoutDisabled) { return } diff --git a/packages/vscode-wdio-server/src/manager.ts b/packages/vscode-wdio-server/src/manager.ts index 75dc5b2..2af26f8 100644 --- a/packages/vscode-wdio-server/src/manager.ts +++ b/packages/vscode-wdio-server/src/manager.ts @@ -160,7 +160,7 @@ export class WdioWorkerManager implements IWorkerManager { */ private async updateWorkerIdleTimeout(worker: IWdioExtensionWorker, idleTimeout: number): Promise { try { - worker.updateIdleTimeout(idleTimeout) + worker.idleMonitor.updateTimeout(idleTimeout) log.debug(`[server manager] successfully updated idle timeout for worker ${worker.cid}`) } catch (error) { const errorMessage = `Failed to update idle timeout for worker ${worker.cid}: ${error instanceof Error ? error.message : String(error)}` diff --git a/packages/vscode-wdio-server/src/run.ts b/packages/vscode-wdio-server/src/run.ts index 2989260..4468d2c 100644 --- a/packages/vscode-wdio-server/src/run.ts +++ b/packages/vscode-wdio-server/src/run.ts @@ -16,7 +16,9 @@ export class TestRunner implements vscode.Disposable { private _stderr = '' private _listeners: Listeners | undefined - constructor(protected worker: IWdioExtensionWorker) {} + constructor(protected worker: IWdioExtensionWorker) { + worker.idleMonitor.pauseTimer() + } public get stdout() { return this._stdout @@ -153,6 +155,6 @@ export class TestRunner implements vscode.Disposable { } async dispose() { - // noting to do + this.worker.idleMonitor.resumeTimer() } } diff --git a/packages/vscode-wdio-server/src/worker.ts b/packages/vscode-wdio-server/src/worker.ts index 154ceb1..9b66d36 100644 --- a/packages/vscode-wdio-server/src/worker.ts +++ b/packages/vscode-wdio-server/src/worker.ts @@ -12,8 +12,13 @@ import { WorkerIdleMonitor } from './idleMonitor.js' import { createWss, loggingFn, resolveNodePath } from './utils.js' import type { IExtensionConfigManager } from '@vscode-wdio/types/config' -import type { ExtensionApi, WdioExtensionWorkerEvents, IWdioExtensionWorker, WorkerApi } from '@vscode-wdio/types/server' -import type { IWorkerIdleMonitor } from '@vscode-wdio/types/worker' +import type { + ExtensionApi, + WdioExtensionWorkerEvents, + IWdioExtensionWorker, + WorkerApi, + IWorkerIdleMonitor, +} from '@vscode-wdio/types/server' import type * as vscode from 'vscode' import type { WebSocketServer } from 'ws' @@ -23,6 +28,7 @@ export class WdioExtensionWorker extends TypedEventEmitter { + this.idleMonitor.on('idleTimeout', () => { this.emit('idleTimeout', undefined) }) @@ -131,7 +136,7 @@ export class WdioExtensionWorker extends TypedEventEmitter { // Start idle monitoring after successful connection - this._idleMonitor.start() + this.idleMonitor.start() this.startHealthCheck() log.debug('Worker process started successfully') }) @@ -210,7 +215,7 @@ export class WdioExtensionWorker extends TypedEventEmitter { // Stop idle monitoring first - this._idleMonitor.stop() + this.idleMonitor.stop() let shutdownSucceeded = false @@ -296,18 +301,18 @@ export class WdioExtensionWorker extends TypedEventEmitter(target: WorkerApi, prop: K): any => { const originalMethod = target[prop] if (typeof originalMethod === 'function') { return (async (...args: any[]) => { - this._idleMonitor.pauseTimer() + this.idleMonitor.pauseTimer() try { return await (originalMethod as Function).apply(target, args) } finally { - this._idleMonitor.resumeTimer() + this.idleMonitor.resumeTimer() } }) as WorkerApi[K] } @@ -338,7 +343,7 @@ export class WdioExtensionWorker extends TypedEventEmitter { setDebugTerminationCallback: vi.fn().mockImplementation((callback: () => void) => { terminationCallback = callback }), + idleMonitor: { + pauseTimer: vi.fn(), + resumeTimer: vi.fn(), + }, } as unknown as WdioExtensionDebugWorker mockWorkerResult = { diff --git a/packages/vscode-wdio-server/tests/run.test.ts b/packages/vscode-wdio-server/tests/run.test.ts index 38f25b7..c7fb259 100644 --- a/packages/vscode-wdio-server/tests/run.test.ts +++ b/packages/vscode-wdio-server/tests/run.test.ts @@ -35,6 +35,10 @@ describe('TestRunner', () => { removeListener: vi.fn(), ensureConnected: vi.fn().mockResolvedValue(undefined), rpc: mockRpc, + idleMonitor: { + pauseTimer: vi.fn(), + resumeTimer: vi.fn(), + }, } as unknown as IWdioExtensionWorker // Create test runner instance diff --git a/packages/vscode-wdio-types/src/server.ts b/packages/vscode-wdio-types/src/server.ts index bc894ae..79b229e 100644 --- a/packages/vscode-wdio-types/src/server.ts +++ b/packages/vscode-wdio-types/src/server.ts @@ -122,10 +122,10 @@ export interface WorkerRunnerOptions { export interface IWdioExtensionWorker extends ITypedEventEmitter { cid: string rpc: WorkerApi + idleMonitor: IWorkerIdleMonitor start(): Promise waitForStart(): Promise stop(): Promise - updateIdleTimeout(timeout: number): void isConnected(): boolean ensureConnected(): Promise } @@ -142,3 +142,56 @@ export interface IWorkerManager extends vscode.Disposable { getConnection(configPaths: string): Promise reorganize(configPaths: string[]): Promise } + +export interface IWorkerIdleMonitor { + /** + * Start monitoring for idle timeout + */ + start(): void + + /** + * Stop monitoring and clear any pending timeout + */ + stop(): void + + /** + * Reset the idle timer (called when worker is accessed) + */ + resetTimer(): void + + /** + * Update the idle timeout configuration + * @param timeout New timeout value in seconds (0 or negative to disable) + */ + updateTimeout(timeout: number): void + + /** + * Pause the idle timer (called when RPC operation starts) + */ + pauseTimer(): void + + /** + * Resume the idle timer (called when RPC operation completes) + */ + resumeTimer(): void + + /** + * Check if monitoring is currently active + */ + isActive(): boolean + + /** + * Add event listener for idle timeout events + * @param event Event name ('idleTimeout') + * @param listener Event listener function + */ + on(event: 'idleTimeout', listener: () => void): this +} + +export interface WorkerIdleMonitorOptions { + /** + * Idle timeout in seconds + * Set to 0 or negative value to disable timeout + */ + idleTimeout: number +} diff --git a/packages/vscode-wdio-types/src/worker.ts b/packages/vscode-wdio-types/src/worker.ts index f3e8bf2..8eaf279 100644 --- a/packages/vscode-wdio-types/src/worker.ts +++ b/packages/vscode-wdio-types/src/worker.ts @@ -55,56 +55,3 @@ export interface TagInfo { name: string range: SourceRange } - -export interface IWorkerIdleMonitor { - /** - * Start monitoring for idle timeout - */ - start(): void - - /** - * Stop monitoring and clear any pending timeout - */ - stop(): void - - /** - * Reset the idle timer (called when worker is accessed) - */ - resetTimer(): void - - /** - * Update the idle timeout configuration - * @param timeout New timeout value in seconds (0 or negative to disable) - */ - updateTimeout(timeout: number): void - - /** - * Pause the idle timer (called when RPC operation starts) - */ - pauseTimer(): void - - /** - * Resume the idle timer (called when RPC operation completes) - */ - resumeTimer(): void - - /** - * Check if monitoring is currently active - */ - isActive(): boolean - - /** - * Add event listener for idle timeout events - * @param event Event name ('idleTimeout') - * @param listener Event listener function - */ - on(event: 'idleTimeout', listener: () => void): this -} - -export interface WorkerIdleMonitorOptions { - /** - * Idle timeout in seconds - * Set to 0 or negative value to disable timeout - */ - idleTimeout: number -} From a72b7e0912fca1d2bc1166be37f42bcc1d063fe3 Mon Sep 17 00:00:00 2001 From: mato533 Date: Tue, 17 Jun 2025 00:47:26 +0900 Subject: [PATCH 08/16] test: add unit test for idleTimer --- .../vscode-wdio-server/src/idleMonitor.ts | 4 +- .../tests/idleMonitor.test.ts | 554 ++++++++++++++++++ 2 files changed, 556 insertions(+), 2 deletions(-) create mode 100644 packages/vscode-wdio-server/tests/idleMonitor.test.ts diff --git a/packages/vscode-wdio-server/src/idleMonitor.ts b/packages/vscode-wdio-server/src/idleMonitor.ts index 41c8f48..a11519c 100644 --- a/packages/vscode-wdio-server/src/idleMonitor.ts +++ b/packages/vscode-wdio-server/src/idleMonitor.ts @@ -91,8 +91,8 @@ export class WorkerIdleMonitor extends EventEmitter implements IWorkerIdleMonito return } - this._pauseCounter-- - if (this._pauseCounter < 1) { + this._pauseCounter = this._pauseCounter - 1 < 0 ? 0 : this._pauseCounter - 1 + if (this._pauseCounter < 1 && !this._timer) { this.startTimer() log.trace(`[${this._workerId}] IdleMonitor timer resumed`) } diff --git a/packages/vscode-wdio-server/tests/idleMonitor.test.ts b/packages/vscode-wdio-server/tests/idleMonitor.test.ts new file mode 100644 index 0000000..8794b8f --- /dev/null +++ b/packages/vscode-wdio-server/tests/idleMonitor.test.ts @@ -0,0 +1,554 @@ +import { log } from '@vscode-wdio/logger' +import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest' + +import { WorkerIdleMonitor } from '../src/idleMonitor.js' + +// Mock the logger module +vi.mock('@vscode-wdio/logger', () => ({ + log: { + debug: vi.fn(), + trace: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }, +})) + +describe('WorkerIdleMonitor', () => { + let monitor: WorkerIdleMonitor + let mockLoggerDebug: ReturnType + let mockLoggerTrace: ReturnType + let mockLoggerInfo: ReturnType + + beforeEach(() => { + // Reset all mocks before each test + vi.clearAllMocks() + vi.useFakeTimers() + + // Get references to mocked logger functions + mockLoggerDebug = vi.mocked(log.debug) + mockLoggerTrace = vi.mocked(log.trace) + mockLoggerInfo = vi.mocked(log.info) + }) + + afterEach(() => { + // Clean up after each test + if (monitor) { + monitor.stop() + } + vi.useRealTimers() + vi.restoreAllMocks() + }) + + describe('Constructor', () => { + it('should create monitor with valid timeout', () => { + // Arrange & Act + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 300 }) + + // Assert + expect(monitor.isActive()).toBe(false) + expect(mockLoggerDebug).toHaveBeenCalledWith('[test-worker] IdleMonitor created with timeout: 300000ms') + }) + + it('should create monitor with disabled timeout when timeout is 0', () => { + // Arrange & Act + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 0 }) + + // Assert + expect(monitor.isActive()).toBe(false) + expect(mockLoggerDebug).toHaveBeenCalledWith('[test-worker] IdleMonitor created with timeout disabled') + }) + + it('should create monitor with disabled timeout when timeout is negative', () => { + // Arrange & Act + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: -10 }) + + // Assert + expect(monitor.isActive()).toBe(false) + expect(mockLoggerDebug).toHaveBeenCalledWith('[test-worker] IdleMonitor created with timeout disabled') + }) + }) + + describe('start()', () => { + beforeEach(() => { + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 5 }) + }) + + it('should start monitoring and set active state', () => { + // Arrange & Act + monitor.start() + + // Assert + expect(monitor.isActive()).toBe(true) + expect(mockLoggerDebug).toHaveBeenCalledWith('[test-worker] IdleMonitor started') + }) + + it('should not start monitoring if already active', () => { + // Arrange + monitor.start() + vi.clearAllMocks() + + // Act + monitor.start() + + // Assert + expect(mockLoggerDebug).toHaveBeenCalledWith('[test-worker] IdleMonitor already active') + }) + + it('should start timer when timeout is enabled', () => { + // Arrange + const timeoutSpy = vi.spyOn(global, 'setTimeout') + + // Act + monitor.start() + + // Assert + expect(timeoutSpy).toHaveBeenCalledWith(expect.any(Function), 5000) + }) + + it('should not start timer when timeout is disabled', () => { + // Arrange + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 0 }) + const timeoutSpy = vi.spyOn(global, 'setTimeout') + + // Act + monitor.start() + + // Assert + expect(timeoutSpy).not.toHaveBeenCalled() + }) + }) + + describe('stop()', () => { + beforeEach(() => { + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 5 }) + }) + + it('should stop monitoring and clear timer', () => { + // Arrange + monitor.start() + const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout') + + // Act + monitor.stop() + + // Assert + expect(monitor.isActive()).toBe(false) + expect(clearTimeoutSpy).toHaveBeenCalled() + expect(mockLoggerDebug).toHaveBeenCalledWith('[test-worker] IdleMonitor stopped') + }) + + it('should not do anything if already stopped', () => { + // Arrange + vi.clearAllMocks() + + // Act + monitor.stop() + + // Assert + expect(mockLoggerDebug).not.toHaveBeenCalled() + }) + + it('should reset pause counter when stopped', () => { + // Arrange + monitor.start() + monitor.pauseTimer() + monitor.pauseTimer() // Multiple pauses + + // Act + monitor.stop() + + // Assert - Should be able to resume properly after restart + monitor.start() + monitor.pauseTimer() + monitor.resumeTimer() + expect(mockLoggerTrace).toHaveBeenCalledWith('[test-worker] IdleMonitor timer resumed') + }) + }) + + describe('resetTimer()', () => { + beforeEach(() => { + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 5 }) + }) + + it('should reset timer when active and not paused', () => { + // Arrange + monitor.start() + const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout') + const setTimeoutSpy = vi.spyOn(global, 'setTimeout') + vi.clearAllMocks() + + // Act + monitor.resetTimer() + + // Assert + expect(clearTimeoutSpy).toHaveBeenCalled() + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 5000) + expect(mockLoggerTrace).toHaveBeenCalledWith('[test-worker] IdleMonitor timer reset') + }) + + it('should not reset timer when not active', () => { + // Arrange + const setTimeoutSpy = vi.spyOn(global, 'setTimeout') + + // Act + monitor.resetTimer() + + // Assert + expect(setTimeoutSpy).not.toHaveBeenCalled() + expect(mockLoggerTrace).not.toHaveBeenCalled() + }) + + it('should not reset timer when paused', () => { + // Arrange + monitor.start() + monitor.pauseTimer() + const setTimeoutSpy = vi.spyOn(global, 'setTimeout') + vi.clearAllMocks() + + // Act + monitor.resetTimer() + + // Assert + expect(setTimeoutSpy).not.toHaveBeenCalled() + expect(mockLoggerTrace).not.toHaveBeenCalled() + }) + + it('should not reset timer when timeout is disabled', () => { + // Arrange + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 0 }) + monitor.start() + const setTimeoutSpy = vi.spyOn(global, 'setTimeout') + + // Act + monitor.resetTimer() + + // Assert + expect(setTimeoutSpy).not.toHaveBeenCalled() + expect(mockLoggerTrace).not.toHaveBeenCalled() + }) + }) + + describe('pauseTimer()', () => { + beforeEach(() => { + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 5 }) + }) + + it('should pause timer and increment pause counter', () => { + // Arrange + monitor.start() + const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout') + vi.clearAllMocks() + + // Act + monitor.pauseTimer() + + // Assert + expect(clearTimeoutSpy).toHaveBeenCalled() + expect(mockLoggerTrace).toHaveBeenCalledWith('[test-worker] IdleMonitor timer paused') + }) + + it('should handle multiple pauses correctly', () => { + // Arrange + monitor.start() + vi.clearAllMocks() + + // Act + monitor.pauseTimer() + monitor.pauseTimer() + monitor.pauseTimer() + + // Assert + expect(mockLoggerTrace).toHaveBeenCalledTimes(3) + }) + + it('should not pause when not active', () => { + // Arrange + const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout') + + // Act + monitor.pauseTimer() + + // Assert + expect(clearTimeoutSpy).not.toHaveBeenCalled() + expect(mockLoggerTrace).not.toHaveBeenCalled() + }) + + it('should not pause when timeout is disabled', () => { + // Arrange + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 0 }) + monitor.start() + const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout') + + // Act + monitor.pauseTimer() + + // Assert + expect(clearTimeoutSpy).not.toHaveBeenCalled() + expect(mockLoggerTrace).not.toHaveBeenCalled() + }) + }) + + describe('resumeTimer()', () => { + beforeEach(() => { + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 5 }) + }) + + it('should resume timer after single pause', () => { + // Arrange + monitor.start() + monitor.pauseTimer() + const setTimeoutSpy = vi.spyOn(global, 'setTimeout') + vi.clearAllMocks() + + // Act + monitor.resumeTimer() + + // Assert + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 5000) + expect(mockLoggerTrace).toHaveBeenCalledWith('[test-worker] IdleMonitor timer resumed') + }) + + it('should handle multiple pause/resume correctly', () => { + // Arrange + monitor.start() + monitor.pauseTimer() + monitor.pauseTimer() + monitor.pauseTimer() + const setTimeoutSpy = vi.spyOn(global, 'setTimeout') + vi.clearAllMocks() + + // Act - First two resumes should not start timer + monitor.resumeTimer() + monitor.resumeTimer() + expect(setTimeoutSpy).not.toHaveBeenCalled() + expect(mockLoggerTrace).not.toHaveBeenCalled() + + // Third resume should start timer + monitor.resumeTimer() + + // Assert + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 5000) + expect(mockLoggerTrace).toHaveBeenCalledWith('[test-worker] IdleMonitor timer resumed') + }) + + it('should not resume when not active', () => { + // Arrange + const setTimeoutSpy = vi.spyOn(global, 'setTimeout') + + // Act + monitor.resumeTimer() + + // Assert + expect(setTimeoutSpy).not.toHaveBeenCalled() + expect(mockLoggerTrace).not.toHaveBeenCalled() + }) + + it('should not resume when timeout is disabled', () => { + // Arrange + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 0 }) + monitor.start() + const setTimeoutSpy = vi.spyOn(global, 'setTimeout') + + // Act + monitor.resumeTimer() + + // Assert + expect(setTimeoutSpy).not.toHaveBeenCalled() + expect(mockLoggerTrace).not.toHaveBeenCalled() + }) + }) + + describe('updateTimeout()', () => { + beforeEach(() => { + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 5 }) + }) + + it('should update timeout to new value', () => { + // Arrange + monitor.start() + vi.clearAllMocks() + + // Act + monitor.updateTimeout(10) + + // Assert + expect(mockLoggerDebug).toHaveBeenCalledWith('[test-worker] IdleMonitor timeout updated: 5000ms -> 10ms') + }) + + it('should disable timeout when set to 0', () => { + // Arrange + monitor.start() + vi.clearAllMocks() + + // Act + monitor.updateTimeout(0) + + // Assert + expect(mockLoggerDebug).toHaveBeenCalledWith('[test-worker] IdleMonitor updated with timeout disabled') + }) + + it('should disable timeout when set to negative value', () => { + // Arrange + monitor.start() + vi.clearAllMocks() + + // Act + monitor.updateTimeout(-5) + + // Assert + expect(mockLoggerDebug).toHaveBeenCalledWith('[test-worker] IdleMonitor updated with timeout disabled') + }) + + it('should not update when same timeout value', () => { + // Arrange + monitor.start() + vi.clearAllMocks() + + // Act + monitor.updateTimeout(5) + + // Assert + expect(mockLoggerDebug).not.toHaveBeenCalled() + }) + + it('should reset timer when active and timeout changes', () => { + // Arrange + monitor.start() + const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout') + const setTimeoutSpy = vi.spyOn(global, 'setTimeout') + vi.clearAllMocks() + + // Act + monitor.updateTimeout(10) + + // Assert + expect(clearTimeoutSpy).toHaveBeenCalled() + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 10000) + }) + }) + + describe('Timeout behavior', () => { + beforeEach(() => { + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 5 }) + }) + + it('should emit idleTimeout event when timer expires', () => { + // Arrange + monitor.start() + const idleTimeoutHandler = vi.fn() + monitor.on('idleTimeout', idleTimeoutHandler) + + // Act + vi.advanceTimersByTime(5000) + + // Assert + expect(idleTimeoutHandler).toHaveBeenCalledTimes(1) + expect(mockLoggerInfo).toHaveBeenCalledWith('[test-worker] Worker idle timeout triggered') + }) + + it('should stop monitoring after timeout event', () => { + // Arrange + monitor.start() + const idleTimeoutHandler = vi.fn() + monitor.on('idleTimeout', idleTimeoutHandler) + + // Act + vi.advanceTimersByTime(5000) + + // Assert + expect(monitor.isActive()).toBe(false) + }) + + it('should not timeout when paused', () => { + // Arrange + monitor.start() + monitor.pauseTimer() + const idleTimeoutHandler = vi.fn() + monitor.on('idleTimeout', idleTimeoutHandler) + + // Act + vi.advanceTimersByTime(10000) + + // Assert + expect(idleTimeoutHandler).not.toHaveBeenCalled() + }) + + it('should timeout after resuming from pause', () => { + // Arrange + monitor.start() + monitor.pauseTimer() + const idleTimeoutHandler = vi.fn() + monitor.on('idleTimeout', idleTimeoutHandler) + + // Act + vi.advanceTimersByTime(3000) // Should not timeout while paused + monitor.resumeTimer() + vi.advanceTimersByTime(5000) // Should timeout after resume + + // Assert + expect(idleTimeoutHandler).toHaveBeenCalledTimes(1) + }) + + it('should not timeout when timeout is disabled', () => { + // Arrange + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 0 }) + monitor.start() + const idleTimeoutHandler = vi.fn() + monitor.on('idleTimeout', idleTimeoutHandler) + + // Act + vi.advanceTimersByTime(100000) + + // Assert + expect(idleTimeoutHandler).not.toHaveBeenCalled() + }) + }) + + describe('Edge cases', () => { + it('should handle rapid start/stop cycles', () => { + // Arrange + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 5 }) + + // Act & Assert - Should not throw errors + expect(() => { + monitor.start() + monitor.stop() + monitor.start() + monitor.stop() + monitor.start() + }).not.toThrow() + }) + + it('should handle rapid pause/resume cycles', () => { + // Arrange + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 5 }) + monitor.start() + + // Act & Assert - Should not throw errors + expect(() => { + monitor.pauseTimer() + monitor.resumeTimer() + monitor.pauseTimer() + monitor.pauseTimer() + monitor.resumeTimer() + monitor.resumeTimer() + }).not.toThrow() + }) + + it('should handle excessive resume calls gracefully', () => { + // Arrange + const setTimeoutSpy = vi.spyOn(global, 'setTimeout') + monitor = new WorkerIdleMonitor('test-worker', { idleTimeout: 5 }) + monitor.start() + + // Act + monitor.resumeTimer() // Resume without pause + monitor.resumeTimer() // Resume again + monitor.resumeTimer() // Resume again + + // Assert - Should only start timer once + expect(setTimeoutSpy).toHaveBeenCalledTimes(1) + }) + }) +}) From c29c82ab326a369193534f4844cdd9fb514c4215 Mon Sep 17 00:00:00 2001 From: mato533 Date: Tue, 17 Jun 2025 01:16:57 +0900 Subject: [PATCH 09/16] ci: separate workspace and basic scenario --- .github/workflows/ci-e2e.yml | 13 ++++++++----- .github/workflows/ci-smoke.yml | 2 +- e2e/package.json | 9 +++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci-e2e.yml b/.github/workflows/ci-e2e.yml index 2b7e14a..404eff7 100644 --- a/.github/workflows/ci-e2e.yml +++ b/.github/workflows/ci-e2e.yml @@ -15,13 +15,14 @@ env: VSCODE_WDIO_E2E_COMPATIBILITY_MODE: ${{ inputs.compatibility-mode }} jobs: - unit: - name: E2E Tests (${{ matrix.os }}.${{ matrix.node-version }}) + e2e: + name: E2E Tests - ${{ matrix.scenario }} (${{ matrix.os }}.${{ matrix.node-version }}) strategy: fail-fast: false matrix: node-version: ['20'] os: ['ubuntu-latest', 'windows-latest', 'macos-latest'] + scenario: ['basic', 'workspace'] runs-on: ${{ matrix.os }} steps: - name: 👷 Checkout @@ -47,15 +48,17 @@ jobs: path: e2e/.wdio-vscode-service - name: 🧪 Run the e2e test - run: pnpm run test:e2e + env: + E2E_SCENARIO: ${{ matrix.scenario }} + run: pnpm --filter @vscode-wdio/e2e run test:e2e:${E2E_SCENARIO} shell: bash - name: 📦 Upload Test Logs on Failure uses: ./.github/workflows/actions/upload-archive if: failure() with: - name: ${{ inputs.compatibility-mode == 'yes' && 'compatibility' || 'e2e' }}-logs-${{ matrix.os }} - output: ${{ inputs.compatibility-mode == 'yes' && 'compatibility' || 'e2e' }}-logs-${{ matrix.os }}.zip + name: ${{ inputs.compatibility-mode == 'yes' && 'compatibility' || 'e2e' }}-${{ matrix.scenario }}-logs-${{ matrix.os }} + output: ${{ inputs.compatibility-mode == 'yes' && 'compatibility' || 'e2e' }}-${{ matrix.scenario }}-logs-${{ matrix.os }}.zip paths: e2e/logs - name: 🐛 Debug Build diff --git a/.github/workflows/ci-smoke.yml b/.github/workflows/ci-smoke.yml index c9bec43..b013a97 100644 --- a/.github/workflows/ci-smoke.yml +++ b/.github/workflows/ci-smoke.yml @@ -9,7 +9,7 @@ env: TURBO_TELEMETRY_DISABLED: 1 jobs: - unit: + smoke: name: Smoke Tests (${{ matrix.os }}.${{ matrix.node-version }}) strategy: fail-fast: false diff --git a/e2e/package.json b/e2e/package.json index 80eb67c..c06b4fe 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -10,10 +10,11 @@ } }, "scripts": { - "test:e2e": "run-s test:e2e:*", - "test:e2e:mocha": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=mocha xvfb-maybe pnpm run wdio", - "test:e2e:jasmine": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=jasmine xvfb-maybe pnpm run wdio", - "test:e2e:cucumber": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=cucumber xvfb-maybe pnpm run wdio", + "test:e2e": "run-s test:e2e:basic test:e2e:workspace", + "test:e2e:basic": "run-s test:e2e:basic:*", + "test:e2e:basic:mocha": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=mocha xvfb-maybe pnpm run wdio", + "test:e2e:basic:jasmine": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=jasmine xvfb-maybe pnpm run wdio", + "test:e2e:basic:cucumber": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=cucumber xvfb-maybe pnpm run wdio", "test:e2e:workspace": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=workspace xvfb-maybe pnpm run wdio", "test:smoke": "run-s test:smoke:*", "test:smoke:update-config": "xvfb-maybe wdio run ./wdioSmoke.conf.ts", From 53989a3af55aed056fab9e4c50801df386ffef26 Mon Sep 17 00:00:00 2001 From: mato533 Date: Tue, 17 Jun 2025 02:43:14 +0900 Subject: [PATCH 10/16] ci:update ci workflow --- .github/workflows/ci-lint.yml | 9 +-------- .github/workflows/ci.yml | 13 ++++++------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml index 6624ade..361ebe6 100644 --- a/.github/workflows/ci-lint.yml +++ b/.github/workflows/ci-lint.yml @@ -1,4 +1,4 @@ -name: Lint +name: Static code analysis on: workflow_call: @@ -28,13 +28,6 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: ⬇️ Download Build Archive - uses: ./.github/workflows/actions/download-archive - with: - name: vscode-webdriverio - path: . - filename: vscode-webdriverio-build.zip - - name: 📃 Run the lint run: pnpm run style:fix shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2326474..f77c097 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,33 +21,32 @@ jobs: os: 'ubuntu-latest' lint: - name: Lint - needs: [build] + name: Static code analysis uses: ./.github/workflows/ci-lint.yml typecheck: name: Typecheck - needs: [build] + needs: [lint, build] uses: ./.github/workflows/ci-typecheck.yml unit: name: Unit - needs: [build] + needs: [lint, build] uses: ./.github/workflows/ci-unit.yml e2e: name: E2E - needs: [build] + needs: [lint, build] uses: ./.github/workflows/ci-e2e.yml compatibility: name: Compatibility - needs: [build] + needs: [lint, build] uses: ./.github/workflows/ci-e2e.yml with: compatibility-mode: 'yes' smoke: name: Smoke - needs: [build, e2e] + needs: [lint, build, e2e, compatibility] uses: ./.github/workflows/ci-smoke.yml From 423e8ed0433bb8f2cb90da97a0ae0e8668a751c4 Mon Sep 17 00:00:00 2001 From: mato533 Date: Tue, 17 Jun 2025 01:40:11 +0900 Subject: [PATCH 11/16] ci: update env name --- .github/workflows/ci-lint.yml | 9 ++------- e2e/package.json | 8 ++++---- e2e/tests/basic.spec.ts | 2 +- e2e/tests/basicCucumber.spec.ts | 2 +- e2e/wdio.conf.ts | 16 +++++++++++----- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml index 361ebe6..97bf024 100644 --- a/.github/workflows/ci-lint.yml +++ b/.github/workflows/ci-lint.yml @@ -11,12 +11,7 @@ env: jobs: lint: name: Lint - strategy: - fail-fast: false - matrix: - node-version: ['20'] - os: ['ubuntu-latest'] - runs-on: ${{ matrix.os }} + runs-on: 'ubuntu-latest' steps: - name: 👷 Checkout uses: actions/checkout@v4.2.2 @@ -26,7 +21,7 @@ jobs: - name: 🛠️ Setup workspace uses: ./.github/workflows/actions/setup-workspace with: - node-version: ${{ matrix.node-version }} + node-version: '20' - name: 📃 Run the lint run: pnpm run style:fix diff --git a/e2e/package.json b/e2e/package.json index c06b4fe..df21cfb 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -12,10 +12,10 @@ "scripts": { "test:e2e": "run-s test:e2e:basic test:e2e:workspace", "test:e2e:basic": "run-s test:e2e:basic:*", - "test:e2e:basic:mocha": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=mocha xvfb-maybe pnpm run wdio", - "test:e2e:basic:jasmine": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=jasmine xvfb-maybe pnpm run wdio", - "test:e2e:basic:cucumber": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=cucumber xvfb-maybe pnpm run wdio", - "test:e2e:workspace": "cross-env VSCODE_WDIO_E2E_FRAMEWORK=workspace xvfb-maybe pnpm run wdio", + "test:e2e:basic:mocha": "cross-env VSCODE_WDIO_E2E_SCENARIO=mocha xvfb-maybe pnpm run wdio", + "test:e2e:basic:jasmine": "cross-env VSCODE_WDIO_E2E_SCENARIO=jasmine xvfb-maybe pnpm run wdio", + "test:e2e:basic:cucumber": "cross-env VSCODE_WDIO_E2E_SCENARIO=cucumber xvfb-maybe pnpm run wdio", + "test:e2e:workspace": "cross-env VSCODE_WDIO_E2E_SCENARIO=workspace xvfb-maybe pnpm run wdio", "test:smoke": "run-s test:smoke:*", "test:smoke:update-config": "xvfb-maybe wdio run ./wdioSmoke.conf.ts", "wdio": "wdio run ./wdio.conf.ts" diff --git a/e2e/tests/basic.spec.ts b/e2e/tests/basic.spec.ts index e579cab..ab958fc 100644 --- a/e2e/tests/basic.spec.ts +++ b/e2e/tests/basic.spec.ts @@ -15,7 +15,7 @@ import { import type { SideBarView, ViewControl, Workbench } from 'wdio-vscode-service' -const targetFramework = (process.env.VSCODE_WDIO_E2E_FRAMEWORK || 'mocha') as 'mocha' | 'jasmine' +const targetFramework = (process.env.VSCODE_WDIO_E2E_SCENARIO || 'mocha') as 'mocha' | 'jasmine' const expected = createExpected(targetFramework) diff --git a/e2e/tests/basicCucumber.spec.ts b/e2e/tests/basicCucumber.spec.ts index 4b95c8d..60e5227 100644 --- a/e2e/tests/basicCucumber.spec.ts +++ b/e2e/tests/basicCucumber.spec.ts @@ -15,7 +15,7 @@ import { import type { SideBarView, ViewControl, Workbench } from 'wdio-vscode-service' -const targetFramework = process.env.VSCODE_WDIO_E2E_FRAMEWORK || 'mocha' +const targetFramework = process.env.VSCODE_WDIO_E2E_SCENARIO || 'mocha' const expected = createCucumberExpected() diff --git a/e2e/wdio.conf.ts b/e2e/wdio.conf.ts index f088bd1..7897897 100644 --- a/e2e/wdio.conf.ts +++ b/e2e/wdio.conf.ts @@ -9,7 +9,7 @@ import type { Frameworks } from '@wdio/types' type TestTargets = 'workspace' | 'mocha' | 'jasmine' | 'cucumber' const __dirname = path.dirname(url.fileURLToPath(import.meta.url)) -const target = (process.env.VSCODE_WDIO_E2E_FRAMEWORK || 'mocha') as TestTargets +const target = (process.env.VSCODE_WDIO_E2E_SCENARIO || 'mocha') as TestTargets const minimumVersion = minVersion(pkg.engines.vscode)?.version || 'stable' @@ -33,7 +33,15 @@ function defineSpecs(target: TestTargets) { const specs = defineSpecs(target) let screenshotCount = 0 -export function createBaseConfig(workspacePath: string): WebdriverIO.Config { +export function createBaseConfig(workspacePath: string, userSettings = {}): WebdriverIO.Config { + const resolvedUserSettings = Object.assign( + {}, + { + 'webdriverio.logLevel': 'trace', + }, + userSettings + ) + return { runner: 'local', tsConfigPath: './tsconfig.json', @@ -47,9 +55,7 @@ export function createBaseConfig(workspacePath: string): WebdriverIO.Config { // points to directory where extension package.json is located extensionPath: path.resolve('../packages/vscode-webdriverio'), // optional VS Code settings - userSettings: { - 'webdriverio.logLevel': 'trace', - }, + userSettings: resolvedUserSettings, workspacePath: path.resolve(workspacePath), }, 'wdio:enforceWebDriverClassic': true, From ae67feb2cee6090ac60192f57e6fda2b5097920e Mon Sep 17 00:00:00 2001 From: mato533 Date: Tue, 17 Jun 2025 02:40:47 +0900 Subject: [PATCH 12/16] ci: add smoke test for worker idle timeout --- e2e/assertions/index.ts | 14 +++- e2e/assertions/wdio.shim.d.ts | 1 + e2e/package.json | 3 +- e2e/tests/workerIdleTimeout.spec.ts | 83 +++++++++++++++++++++++ e2e/wdioSmoke.conf.ts | 29 ++++++-- packages/vscode-wdio-server/src/worker.ts | 2 +- 6 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 e2e/tests/workerIdleTimeout.spec.ts diff --git a/e2e/assertions/index.ts b/e2e/assertions/index.ts index 3cee567..abd7d37 100644 --- a/e2e/assertions/index.ts +++ b/e2e/assertions/index.ts @@ -1,5 +1,5 @@ import type { MatcherContext } from 'expect' -import type { TreeItem } from 'wdio-vscode-service' +import type { TreeItem, Workbench } from 'wdio-vscode-service' import type { STATUS } from '../helpers/index.ts' export interface ExpectedTreeItem { @@ -92,6 +92,18 @@ try { async toMatchTreeStructure(tree: TreeItem[], expectedStructure: ExpectedTreeItem[]) { return await expectTreeToMatchStructure.call(this as unknown as MatcherContext, tree, expectedStructure) }, + async hasExpectedLog(workbench: Workbench, expectedLog: RegExp | string) { + const bottomBar = workbench.getBottomBar() + const outputView = await bottomBar.openOutputView() + await outputView.selectChannel('WebdriverIO') + const logs = await outputView.getText() + + const regexp = typeof expectedLog === 'string' ? new RegExp(expectedLog) : expectedLog + + const pass = logs.some((log) => regexp.test(log)) + const message = pass ? 'The log outputs include expected text.' : 'The expected text is not included' + return { pass, message } + }, }) } } catch (error) { diff --git a/e2e/assertions/wdio.shim.d.ts b/e2e/assertions/wdio.shim.d.ts index 917ba54..09e1558 100644 --- a/e2e/assertions/wdio.shim.d.ts +++ b/e2e/assertions/wdio.shim.d.ts @@ -4,6 +4,7 @@ declare global { namespace ExpectWebdriverIO { interface Matchers { toMatchTreeStructure(expectedStructure: ExpectedTreeItem[]): R + hasExpectedLog(expectedLog: RegExp | string): R } } } diff --git a/e2e/package.json b/e2e/package.json index df21cfb..5ab565f 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -17,7 +17,8 @@ "test:e2e:basic:cucumber": "cross-env VSCODE_WDIO_E2E_SCENARIO=cucumber xvfb-maybe pnpm run wdio", "test:e2e:workspace": "cross-env VSCODE_WDIO_E2E_SCENARIO=workspace xvfb-maybe pnpm run wdio", "test:smoke": "run-s test:smoke:*", - "test:smoke:update-config": "xvfb-maybe wdio run ./wdioSmoke.conf.ts", + "test:smoke:update-config": "cross-env VSCODE_WDIO_E2E_SCENARIO=config xvfb-maybe wdio run ./wdioSmoke.conf.ts", + "test:smoke:timeout": "cross-env VSCODE_WDIO_E2E_SCENARIO=timeout xvfb-maybe wdio run ./wdioSmoke.conf.ts", "wdio": "wdio run ./wdio.conf.ts" }, "devDependencies": { diff --git a/e2e/tests/workerIdleTimeout.spec.ts b/e2e/tests/workerIdleTimeout.spec.ts new file mode 100644 index 0000000..267a10f --- /dev/null +++ b/e2e/tests/workerIdleTimeout.spec.ts @@ -0,0 +1,83 @@ +import { browser, expect } from '@wdio/globals' + +import { createCucumberExpected } from '../helpers/cucumber.ts' +import { + STATUS, + clearAllTestResults, + clickTitleActionButton, + collapseAllTests, + getTestingSection, + openTestingView, + waitForResolved, + waitForTestStatus, +} from '../helpers/index.ts' + +import type { SideBarView, ViewControl, Workbench } from 'wdio-vscode-service' + +const targetFramework = process.env.VSCODE_WDIO_E2E_SCENARIO || 'mocha' + +const expected = createCucumberExpected() + +describe(`VS Code Extension Testing with ${targetFramework}`, function () { + this.retries(3) + let workbench: Workbench + let testingViewControl: ViewControl + let sideBarView: SideBarView + + beforeEach(async function () { + workbench = await browser.getWorkbench() + testingViewControl = await openTestingView(workbench) + sideBarView = workbench.getSideBar() + + const testingSection = await getTestingSection(sideBarView.getContent()) + await collapseAllTests(testingSection) + + await browser.waitUntil(async () => (await testingSection.getVisibleItems()).length === 1) + }) + + afterEach(async function () { + await clearAllTestResults(workbench) + }) + + it('should be displayed the testing screen at the sideBar', async function () { + expect(await testingViewControl.getTitle()).toBe('Testing') + expect(await sideBarView.getTitlePart().getTitle()).toBe('TESTING') + }) + + it('should resolve defined tests correctly', async function () { + const testingSection = await getTestingSection(sideBarView.getContent()) + const items = await testingSection.getVisibleItems() + + await waitForResolved(browser, items[0]) + + await expect(items).toMatchTreeStructure(expected.notRun) + }) + + it('should shutdown the work process after idle timeout was reached', async function () { + await new Promise((resolve) => setTimeout(resolve, 2000)) + + await expect(workbench).hasExpectedLog(/Worker#0 process shutdown gracefully/) + + const bottomBar = workbench.getBottomBar() + const outputView = await bottomBar.openOutputView() + await outputView.selectChannel('WebdriverIO') + await outputView.clearText() + }) + + it('should start work process and run test successfully', async function () { + const testingSection = await getTestingSection(sideBarView.getContent()) + const items = await testingSection.getVisibleItems() + + await waitForResolved(browser, items[0]) + + await clickTitleActionButton(sideBarView.getTitlePart(), 'Run Tests') + + await waitForTestStatus(browser, items[0], STATUS.PASSED) + + // assert that start work process + await expect(workbench).hasExpectedLog(/\[#1\] Worker process started successfully/) + + // assert that run test successfully + await expect(items).toMatchTreeStructure(expected.runAll) + }) +}) diff --git a/e2e/wdioSmoke.conf.ts b/e2e/wdioSmoke.conf.ts index c8d0cbf..04c220b 100644 --- a/e2e/wdioSmoke.conf.ts +++ b/e2e/wdioSmoke.conf.ts @@ -1,14 +1,29 @@ import { createBaseConfig } from './wdio.conf.ts' -const specs = [ - './tests/updateConfig.spec.ts', - './tests/updateSpec.spec.ts', - './tests/updateErrorSpec.spec.ts', - './tests/updateErrorConfig.spec.ts', -] +type TestTargets = 'config' | 'timeout' + +const target = (process.env.VSCODE_WDIO_E2E_SCENARIO || 'config') as TestTargets + +const workspace = target === 'config' ? '../samples/smoke/update-config' : '../samples/e2e/cucumber' + +function defineSpecs(target: TestTargets) { + switch (target) { + case 'config': + return [ + './tests/updateConfig.spec.ts', + './tests/updateSpec.spec.ts', + './tests/updateErrorSpec.spec.ts', + './tests/updateErrorConfig.spec.ts', + ] + default: + return ['./tests/workerIdleTimeout.spec.ts'] + } +} + +const specs = defineSpecs(target) export const config: WebdriverIO.Config = { - ...createBaseConfig('../samples/smoke/update-config'), + ...createBaseConfig(workspace, { 'webdriverio.logLevel': 'debug', 'webdriverio.workerIdleTimeout': 2 }), specs, maxInstances: 1, } diff --git a/packages/vscode-wdio-server/src/worker.ts b/packages/vscode-wdio-server/src/worker.ts index 9b66d36..107efa4 100644 --- a/packages/vscode-wdio-server/src/worker.ts +++ b/packages/vscode-wdio-server/src/worker.ts @@ -206,7 +206,7 @@ export class WdioExtensionWorker extends TypedEventEmitter Date: Tue, 17 Jun 2025 03:01:57 +0900 Subject: [PATCH 13/16] ci: update smoke test config --- e2e/wdioSmoke.conf.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/e2e/wdioSmoke.conf.ts b/e2e/wdioSmoke.conf.ts index 04c220b..802ff7a 100644 --- a/e2e/wdioSmoke.conf.ts +++ b/e2e/wdioSmoke.conf.ts @@ -22,8 +22,10 @@ function defineSpecs(target: TestTargets) { const specs = defineSpecs(target) +const settings = target === 'timeout' ? { 'webdriverio.logLevel': 'debug', 'webdriverio.workerIdleTimeout': 2 } : {} + export const config: WebdriverIO.Config = { - ...createBaseConfig(workspace, { 'webdriverio.logLevel': 'debug', 'webdriverio.workerIdleTimeout': 2 }), + ...createBaseConfig(workspace, settings), specs, maxInstances: 1, } From b40653e6de117cfee368915d969a6b7b1920df0a Mon Sep 17 00:00:00 2001 From: mato533 Date: Wed, 18 Jun 2025 15:18:41 +0900 Subject: [PATCH 14/16] test: update e2e assertions for log outputs --- e2e/assertions/index.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/e2e/assertions/index.ts b/e2e/assertions/index.ts index abd7d37..8d9d398 100644 --- a/e2e/assertions/index.ts +++ b/e2e/assertions/index.ts @@ -1,5 +1,5 @@ import type { MatcherContext } from 'expect' -import type { TreeItem, Workbench } from 'wdio-vscode-service' +import type { BottomBarPanel, TreeItem, Workbench } from 'wdio-vscode-service' import type { STATUS } from '../helpers/index.ts' export interface ExpectedTreeItem { @@ -94,18 +94,36 @@ try { }, async hasExpectedLog(workbench: Workbench, expectedLog: RegExp | string) { const bottomBar = workbench.getBottomBar() + const outputView = await bottomBar.openOutputView() await outputView.selectChannel('WebdriverIO') + await clickGlobalAction(bottomBar, bottomBar.locators.maximize) const logs = await outputView.getText() const regexp = typeof expectedLog === 'string' ? new RegExp(expectedLog) : expectedLog const pass = logs.some((log) => regexp.test(log)) + + await clickGlobalAction(bottomBar, bottomBar.locators.restore) const message = pass ? 'The log outputs include expected text.' : 'The expected text is not included' - return { pass, message } + return { pass, message: () => message } }, }) } } catch (error) { console.warn('Failed to extend expect:', error) } + +async function clickGlobalAction(bottomBar: BottomBarPanel, label: string) { + let action + try { + action = (await bottomBar.elem + .$(bottomBar.locators.globalActions) + .$(`.//a[contains(@aria-label, '${label}') and @role='checkbox']`)) as WebdriverIO.Element + } catch { + // the panel is already maximized + } + if (action) { + await action.click({}) + } +} From 3a5747671f61ed7efa35ea2be9a1d449badfcc51 Mon Sep 17 00:00:00 2001 From: mato533 Date: Wed, 18 Jun 2025 15:20:16 +0900 Subject: [PATCH 15/16] ci: add action for setting display resolution for all platform --- .../actions/set-screen-resolution/action.yml | 41 ++++++++++++++++ e2e/wdio.conf.ts | 9 ++++ infra/xvfb-patch/package.json | 8 ++++ infra/xvfb-patch/src/index.ts | 48 +++++++++++++++++++ infra/xvfb-patch/tsconfig.json | 6 +++ pnpm-lock.yaml | 2 + 6 files changed, 114 insertions(+) create mode 100644 .github/workflows/actions/set-screen-resolution/action.yml create mode 100644 infra/xvfb-patch/package.json create mode 100644 infra/xvfb-patch/src/index.ts create mode 100644 infra/xvfb-patch/tsconfig.json diff --git a/.github/workflows/actions/set-screen-resolution/action.yml b/.github/workflows/actions/set-screen-resolution/action.yml new file mode 100644 index 0000000..facb73f --- /dev/null +++ b/.github/workflows/actions/set-screen-resolution/action.yml @@ -0,0 +1,41 @@ +name: 'vscode-webdriverio Set screen resolution' +description: 'Set screen resolution' +inputs: + width: + description: 'screen width' + default: '1920' + height: + description: 'screen height' + default: '1080' +runs: + using: 'composite' + steps: + # https://github.com/actions/runner-images/issues/2935 + - name: Set display resolution on Windows + if: runner.os == 'Windows' + shell: pwsh + run: | + Set-DisplayResolution -Width ${{ inputs.width }} -Height ${{ inputs.height }} -Force + + # I don't know the details, but it appears that it needs to be maximized at the Webdriver level + # because it does not launch in full screen on Linux. + # However, as the following Issue states, Electron(base of vscode) can not be muximize by webdriver protocol. + # https://github.com/electron/electron/issues/33942 + # Therefore, GUI-based methods are used to maximize the screen. + # The process of maximizing screen size using xdotool is done in the before hook of wdio.conf.ts. + - name: Set display resolution on Linux + if: runner.os == 'Linux' + shell: bash + run: | + pnpm --filter @vscode-wdio/xvfb-patch run patch -w ${{ inputs.width }} -h ${{ inputs.height }} + echo "::group::apt install -y xdotool" + sudo apt install -y xdotool + echo "::endgroup::" + + # already use FHD resolution + - name: Set display resolution on MacOS + if: runner.os == 'macOS' + shell: bash + run: | + brew install displayplacer + displayplacer list diff --git a/e2e/wdio.conf.ts b/e2e/wdio.conf.ts index 7897897..95771c0 100644 --- a/e2e/wdio.conf.ts +++ b/e2e/wdio.conf.ts @@ -2,6 +2,7 @@ import * as path from 'node:path' import * as url from 'node:url' import { minVersion } from 'semver' +import shell from 'shelljs' import pkg from '../packages/vscode-webdriverio/package.json' with { type: 'json' } import type { Frameworks } from '@wdio/types' @@ -76,6 +77,14 @@ export function createBaseConfig(workspacePath: string, userSettings = {}): Webd timeout: 6000000, require: ['assertions/index.ts'], }, + before: async function (_capabilities, _specs, _browser) { + if (process.platform === 'linux') { + const result = shell.exec('xdotool search --onlyvisible --name code') + const windowId = result.stdout.trim() + shell.exec(`xdotool windowmove ${windowId} 0 0`) + shell.exec(`xdotool windowsize ${windowId} 100% 100%`) + } + }, afterTest: async function (_test: unknown, _context: unknown, result: Frameworks.TestResult) { if (!result.passed) { await browser.saveScreenshot(path.join(outputDir, `screenshot-${screenshotCount++}.png`)) diff --git a/infra/xvfb-patch/package.json b/infra/xvfb-patch/package.json new file mode 100644 index 0000000..541e5d7 --- /dev/null +++ b/infra/xvfb-patch/package.json @@ -0,0 +1,8 @@ +{ + "name": "@vscode-wdio/xvfb-patch", + "private": true, + "type": "module", + "scripts": { + "patch": "tsx ./src/index.ts" + } +} diff --git a/infra/xvfb-patch/src/index.ts b/infra/xvfb-patch/src/index.ts new file mode 100644 index 0000000..d9cb5ba --- /dev/null +++ b/infra/xvfb-patch/src/index.ts @@ -0,0 +1,48 @@ +import * as fs from 'node:fs' +import * as path from 'node:path' +import { fileURLToPath } from 'node:url' +import { parseArgs } from 'node:util' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const rootDir = path.resolve(__dirname, '../../..') +const filePath = path.join(rootDir, 'node_modules', 'xvfb-maybe', 'src', 'xvfb-maybe.js') + +const args = process.argv.slice(2) +const optionsDef = { + width: { + type: 'string', + short: 'w', + }, + height: { + type: 'string', + short: 'h', + }, +} as const + +const { values: options } = parseArgs({ args, options: optionsDef }) + +console.log('Adjust screen resolution') +console.log(` Width : ${options.width}`) +console.log(` Height: ${options.height}`) + +const insertBefore = "const dblDashPos = args.indexOf('--')," +const codeToInsert = ` args.unshift('--server-args=-screen 0 ${options.width}x${options.height}x24', '--');` + +const sourceCode = fs.readFileSync(filePath, 'utf-8') + +if (sourceCode.includes(codeToInsert)) { + console.log('🔧 xvfb-maybe is already patched') + process.exit(0) +} + +const lines = sourceCode.split('\n') +const index = lines.findIndex((line) => line.includes(insertBefore)) + +if (index !== -1) { + lines.splice(index, 0, codeToInsert) + const newCode = lines.join('\n') + fs.writeFileSync(filePath, newCode, 'utf-8') + console.log('\n✅ xvfb-maybe is patched successfully\n\n') +} else { + console.log('\n💥 could not find the target line.\n\n') +} diff --git a/infra/xvfb-patch/tsconfig.json b/infra/xvfb-patch/tsconfig.json new file mode 100644 index 0000000..ea50023 --- /dev/null +++ b/infra/xvfb-patch/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "resolveJsonModule": true + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6eb110c..ff4ad68 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -159,6 +159,8 @@ importers: specifier: ^7.7.2 version: 7.7.2 + infra/xvfb-patch: {} + packages/vscode-wdio-config: dependencies: '@vscode-wdio/constants': From 93f162eaff596cd5f908cadf0ca42d465a8e90de Mon Sep 17 00:00:00 2001 From: mato533 Date: Wed, 18 Jun 2025 15:22:20 +0900 Subject: [PATCH 16/16] ci: update ci workflow --- .github/workflows/ci-e2e.yml | 3 +++ .github/workflows/ci-smoke.yml | 15 ++++++++++++--- .github/workflows/ci.yml | 15 ++++++++++++--- e2e/package.json | 2 +- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci-e2e.yml b/.github/workflows/ci-e2e.yml index 404eff7..4ee481e 100644 --- a/.github/workflows/ci-e2e.yml +++ b/.github/workflows/ci-e2e.yml @@ -47,6 +47,9 @@ jobs: with: path: e2e/.wdio-vscode-service + - name: 🖥️ Set screen resolution + uses: ./.github/workflows/actions/set-screen-resolution + - name: 🧪 Run the e2e test env: E2E_SCENARIO: ${{ matrix.scenario }} diff --git a/.github/workflows/ci-smoke.yml b/.github/workflows/ci-smoke.yml index b013a97..1acc5df 100644 --- a/.github/workflows/ci-smoke.yml +++ b/.github/workflows/ci-smoke.yml @@ -4,6 +4,10 @@ on: workflow_call: # Make this a reusable workflow, no value needed # https://docs.github.com/en/actions/using-workflows/reusing-workflows + inputs: + scenario: + description: 'Smoke scenario' + type: string env: TURBO_TELEMETRY_DISABLED: 1 @@ -40,16 +44,21 @@ jobs: with: path: e2e/.wdio-vscode-service + - name: 🖥️ Set screen resolution + uses: ./.github/workflows/actions/set-screen-resolution + - name: 🚂 Run the smoke test - run: pnpm run test:smoke + env: + E2E_SCENARIO: ${{ inputs.scenario }} + run: pnpm --filter @vscode-wdio/e2e run test:smoke:${E2E_SCENARIO} shell: bash - name: 📦 Upload Test Logs on Failure uses: ./.github/workflows/actions/upload-archive if: failure() with: - name: smoke-logs-${{ matrix.os }} - output: smoke-logs-${{ matrix.os }}.zip + name: smoke-${{ inputs.scenario }}--logs-${{ matrix.os }} + output: smoke-${{ inputs.scenario }}-logs-${{ matrix.os }}.zip paths: e2e/logs - name: 🐛 Debug Build diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f77c097..6fca503 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,7 +46,16 @@ jobs: with: compatibility-mode: 'yes' - smoke: - name: Smoke - needs: [lint, build, e2e, compatibility] + smoke-config: + name: Smoke - Update Config + needs: [lint, build, e2e] uses: ./.github/workflows/ci-smoke.yml + with: + scenario: 'config' + + smoke-timeout: + name: Smoke - Worker idle timeout + needs: [lint, build, e2e] + uses: ./.github/workflows/ci-smoke.yml + with: + scenario: 'timeout' diff --git a/e2e/package.json b/e2e/package.json index 5ab565f..9d74cb3 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -17,7 +17,7 @@ "test:e2e:basic:cucumber": "cross-env VSCODE_WDIO_E2E_SCENARIO=cucumber xvfb-maybe pnpm run wdio", "test:e2e:workspace": "cross-env VSCODE_WDIO_E2E_SCENARIO=workspace xvfb-maybe pnpm run wdio", "test:smoke": "run-s test:smoke:*", - "test:smoke:update-config": "cross-env VSCODE_WDIO_E2E_SCENARIO=config xvfb-maybe wdio run ./wdioSmoke.conf.ts", + "test:smoke:config": "cross-env VSCODE_WDIO_E2E_SCENARIO=config xvfb-maybe wdio run ./wdioSmoke.conf.ts", "test:smoke:timeout": "cross-env VSCODE_WDIO_E2E_SCENARIO=timeout xvfb-maybe wdio run ./wdioSmoke.conf.ts", "wdio": "wdio run ./wdio.conf.ts" },