@git.zone/tstest 2.5.1 → 2.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/tstest.classes.runtime.node.d.ts +1 -1
- package/dist_ts/tstest.classes.runtime.node.js +31 -29
- package/dist_ts/tstest.plugins.d.ts +2 -1
- package/dist_ts/tstest.plugins.js +3 -2
- package/package.json +2 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/tstest.classes.runtime.node.ts +32 -30
- package/ts/tstest.plugins.ts +2 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/tstest',
|
|
6
|
-
version: '2.5.
|
|
6
|
+
version: '2.5.2',
|
|
7
7
|
description: 'a test utility to run tests that match test/**/*.ts'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHFEQUFxRDtDQUNuRSxDQUFBIn0=
|
|
@@ -24,7 +24,7 @@ export declare class NodeRuntimeAdapter extends RuntimeAdapter {
|
|
|
24
24
|
*/
|
|
25
25
|
createCommand(testFile: string, options?: RuntimeOptions): RuntimeCommand;
|
|
26
26
|
/**
|
|
27
|
-
* Execute a test file in Node.js
|
|
27
|
+
* Execute a test file in Node.js using tsrun's spawnPath API
|
|
28
28
|
*/
|
|
29
29
|
run(testFile: string, index: number, total: number, options?: RuntimeOptions): Promise<TapParser>;
|
|
30
30
|
}
|
|
@@ -25,17 +25,11 @@ export class NodeRuntimeAdapter extends RuntimeAdapter {
|
|
|
25
25
|
try {
|
|
26
26
|
// Check Node.js version
|
|
27
27
|
const nodeVersion = process.version;
|
|
28
|
-
// Check if tsrun is available
|
|
29
|
-
|
|
30
|
-
cwd: process.cwd(),
|
|
31
|
-
onError: () => {
|
|
32
|
-
// Ignore error
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
if (result.exitCode !== 0) {
|
|
28
|
+
// Check if tsrun module is available (imported as dependency)
|
|
29
|
+
if (!plugins.tsrun || !plugins.tsrun.spawnPath) {
|
|
36
30
|
return {
|
|
37
31
|
available: false,
|
|
38
|
-
error: 'tsrun not found
|
|
32
|
+
error: 'tsrun module not found or outdated (requires version 1.6.0+)',
|
|
39
33
|
};
|
|
40
34
|
}
|
|
41
35
|
return {
|
|
@@ -77,30 +71,36 @@ export class NodeRuntimeAdapter extends RuntimeAdapter {
|
|
|
77
71
|
};
|
|
78
72
|
}
|
|
79
73
|
/**
|
|
80
|
-
* Execute a test file in Node.js
|
|
74
|
+
* Execute a test file in Node.js using tsrun's spawnPath API
|
|
81
75
|
*/
|
|
82
76
|
async run(testFile, index, total, options) {
|
|
83
77
|
this.logger.testFileStart(testFile, this.displayName, index, total);
|
|
84
78
|
const tapParser = new TapParser(testFile + ':node', this.logger);
|
|
85
79
|
const mergedOptions = this.mergeOptions(options);
|
|
86
|
-
// Build
|
|
87
|
-
|
|
80
|
+
// Build spawn options
|
|
81
|
+
const spawnOptions = {
|
|
82
|
+
cwd: mergedOptions.cwd || process.cwd(),
|
|
83
|
+
env: { ...mergedOptions.env },
|
|
84
|
+
args: [],
|
|
85
|
+
stdio: 'pipe',
|
|
86
|
+
};
|
|
87
|
+
// Add --web flag if needed
|
|
88
88
|
if (process.argv.includes('--web')) {
|
|
89
|
-
|
|
89
|
+
spawnOptions.args.push('--web');
|
|
90
90
|
}
|
|
91
91
|
// Set filter tags as environment variable
|
|
92
92
|
if (this.filterTags.length > 0) {
|
|
93
|
-
|
|
93
|
+
spawnOptions.env.TSTEST_FILTER_TAGS = this.filterTags.join(',');
|
|
94
94
|
}
|
|
95
95
|
// Check for 00init.ts file in test directory
|
|
96
96
|
const testDir = plugins.path.dirname(testFile);
|
|
97
97
|
const initFile = plugins.path.join(testDir, '00init.ts');
|
|
98
|
-
let runCommand = `tsrun ${testFile}${tsrunOptions}`;
|
|
99
98
|
const initFileExists = await plugins.smartfile.fs.fileExists(initFile);
|
|
100
|
-
//
|
|
99
|
+
// Determine which file to run
|
|
100
|
+
let fileToRun = testFile;
|
|
101
101
|
let loaderPath = null;
|
|
102
|
+
// If 00init.ts exists, create a loader file
|
|
102
103
|
if (initFileExists) {
|
|
103
|
-
// Create a temporary loader file that imports both 00init.ts and the test file
|
|
104
104
|
const absoluteInitFile = plugins.path.resolve(initFile);
|
|
105
105
|
const absoluteTestFile = plugins.path.resolve(testFile);
|
|
106
106
|
const loaderContent = `
|
|
@@ -109,9 +109,11 @@ import '${absoluteTestFile.replace(/\\/g, '/')}';
|
|
|
109
109
|
`;
|
|
110
110
|
loaderPath = plugins.path.join(testDir, `.loader_${plugins.path.basename(testFile)}`);
|
|
111
111
|
await plugins.smartfile.memory.toFs(loaderContent, loaderPath);
|
|
112
|
-
|
|
112
|
+
fileToRun = loaderPath;
|
|
113
113
|
}
|
|
114
|
-
|
|
114
|
+
// Spawn the test process using tsrun's spawnPath API
|
|
115
|
+
// Pass undefined for fromFileUrl since fileToRun is already an absolute path
|
|
116
|
+
const tsrunProcess = plugins.tsrun.spawnPath(fileToRun, undefined, spawnOptions);
|
|
115
117
|
// If we created a loader file, clean it up after test execution
|
|
116
118
|
if (loaderPath) {
|
|
117
119
|
const cleanup = () => {
|
|
@@ -124,8 +126,8 @@ import '${absoluteTestFile.replace(/\\/g, '/')}';
|
|
|
124
126
|
// Ignore cleanup errors
|
|
125
127
|
}
|
|
126
128
|
};
|
|
127
|
-
|
|
128
|
-
|
|
129
|
+
tsrunProcess.childProcess.on('exit', cleanup);
|
|
130
|
+
tsrunProcess.childProcess.on('error', cleanup);
|
|
129
131
|
}
|
|
130
132
|
// Start warning timer if no timeout was specified
|
|
131
133
|
let warningTimer = null;
|
|
@@ -145,14 +147,14 @@ import '${absoluteTestFile.replace(/\\/g, '/')}';
|
|
|
145
147
|
let timeoutId;
|
|
146
148
|
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
147
149
|
timeoutId = setTimeout(async () => {
|
|
148
|
-
// Use
|
|
149
|
-
await
|
|
150
|
+
// Use tsrun's terminate() to gracefully kill the process
|
|
151
|
+
await tsrunProcess.terminate();
|
|
150
152
|
reject(new Error(`Test file timed out after ${this.timeoutSeconds} seconds`));
|
|
151
153
|
}, timeoutMs);
|
|
152
154
|
});
|
|
153
155
|
try {
|
|
154
156
|
await Promise.race([
|
|
155
|
-
tapParser.handleTapProcess(
|
|
157
|
+
tapParser.handleTapProcess(tsrunProcess.childProcess),
|
|
156
158
|
timeoutPromise
|
|
157
159
|
]);
|
|
158
160
|
// Clear timeout if test completed successfully
|
|
@@ -165,18 +167,18 @@ import '${absoluteTestFile.replace(/\\/g, '/')}';
|
|
|
165
167
|
}
|
|
166
168
|
// Handle timeout error
|
|
167
169
|
tapParser.handleTimeout(this.timeoutSeconds);
|
|
168
|
-
// Ensure
|
|
170
|
+
// Ensure process is killed if still running
|
|
169
171
|
try {
|
|
170
|
-
|
|
172
|
+
tsrunProcess.kill('SIGKILL');
|
|
171
173
|
}
|
|
172
174
|
catch (killError) {
|
|
173
|
-
// Process
|
|
175
|
+
// Process might already be dead
|
|
174
176
|
}
|
|
175
177
|
await tapParser.evaluateFinalResult();
|
|
176
178
|
}
|
|
177
179
|
}
|
|
178
180
|
else {
|
|
179
|
-
await tapParser.handleTapProcess(
|
|
181
|
+
await tapParser.handleTapProcess(tsrunProcess.childProcess);
|
|
180
182
|
}
|
|
181
183
|
// Clear warning timer if it was set
|
|
182
184
|
if (warningTimer) {
|
|
@@ -185,4 +187,4 @@ import '${absoluteTestFile.replace(/\\/g, '/')}';
|
|
|
185
187
|
return tapParser;
|
|
186
188
|
}
|
|
187
189
|
}
|
|
188
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
190
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN0ZXN0LmNsYXNzZXMucnVudGltZS5ub2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdHN0ZXN0LmNsYXNzZXMucnVudGltZS5ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsSUFBSSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQ0wsY0FBYyxHQUlmLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUduRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsY0FBYztJQUlwRCxZQUNVLE1BQW9CLEVBQ3BCLGtCQUF1QixFQUFFLGtEQUFrRDtJQUMzRSxjQUE2QixFQUM3QixVQUFvQjtRQUU1QixLQUFLLEVBQUUsQ0FBQztRQUxBLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFLO1FBQ3ZCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLGVBQVUsR0FBVixVQUFVLENBQVU7UUFQckIsT0FBRSxHQUFZLE1BQU0sQ0FBQztRQUNyQixnQkFBVyxHQUFXLFNBQVMsQ0FBQztJQVN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYztRQUNsQixJQUFJLENBQUM7WUFDSCx3QkFBd0I7WUFDeEIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUVwQyw4REFBOEQ7WUFDOUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMvQyxPQUFPO29CQUNMLFNBQVMsRUFBRSxLQUFLO29CQUNoQixLQUFL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
|
|
@@ -14,7 +14,8 @@ import * as smartshell from '@push.rocks/smartshell';
|
|
|
14
14
|
import * as tapbundle from '../dist_ts_tapbundle/index.js';
|
|
15
15
|
export { consolecolor, smartbrowser, smartchok, smartdelay, smartfile, smartlog, smartnetwork, smartpromise, smartshell, tapbundle, };
|
|
16
16
|
import * as tsbundle from '@git.zone/tsbundle';
|
|
17
|
-
|
|
17
|
+
import * as tsrun from '@git.zone/tsrun';
|
|
18
|
+
export { tsbundle, tsrun };
|
|
18
19
|
import figures from 'figures';
|
|
19
20
|
export { figures };
|
|
20
21
|
import * as ws from 'ws';
|
|
@@ -18,11 +18,12 @@ import * as tapbundle from '../dist_ts_tapbundle/index.js';
|
|
|
18
18
|
export { consolecolor, smartbrowser, smartchok, smartdelay, smartfile, smartlog, smartnetwork, smartpromise, smartshell, tapbundle, };
|
|
19
19
|
// @git.zone scope
|
|
20
20
|
import * as tsbundle from '@git.zone/tsbundle';
|
|
21
|
-
|
|
21
|
+
import * as tsrun from '@git.zone/tsrun';
|
|
22
|
+
export { tsbundle, tsrun };
|
|
22
23
|
// sindresorhus
|
|
23
24
|
import figures from 'figures';
|
|
24
25
|
export { figures };
|
|
25
26
|
// third party
|
|
26
27
|
import * as ws from 'ws';
|
|
27
28
|
export { ws };
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN0ZXN0LnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c3Rlc3QucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjO0FBQ2QsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0FBRWhCLG1CQUFtQjtBQUNuQixPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFDTCxXQUFXLEVBQ1osQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLCtCQUErQixDQUFDO0FBRTNELE9BQU8sRUFDTCxZQUFZLEVBQ1osWUFBWSxFQUNaLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsRUFDVixTQUFTLEdBQ1YsQ0FBQztBQUVGLGtCQUFrQjtBQUNsQixPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFFekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUUzQixlQUFlO0FBQ2YsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBRTlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUVuQixjQUFjO0FBQ2QsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxFQUNMLEVBQUUsRUFDSCxDQUFBIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/tstest",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "a test utility to run tests that match test/**/*.ts",
|
|
6
6
|
"exports": {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@api.global/typedserver": "^3.0.79",
|
|
23
23
|
"@git.zone/tsbundle": "^2.5.1",
|
|
24
|
-
"@git.zone/tsrun": "^1.
|
|
24
|
+
"@git.zone/tsrun": "^1.6.2",
|
|
25
25
|
"@push.rocks/consolecolor": "^2.0.3",
|
|
26
26
|
"@push.rocks/qenv": "^6.1.3",
|
|
27
27
|
"@push.rocks/smartbrowser": "^2.0.8",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -35,18 +35,11 @@ export class NodeRuntimeAdapter extends RuntimeAdapter {
|
|
|
35
35
|
// Check Node.js version
|
|
36
36
|
const nodeVersion = process.version;
|
|
37
37
|
|
|
38
|
-
// Check if tsrun is available
|
|
39
|
-
|
|
40
|
-
cwd: process.cwd(),
|
|
41
|
-
onError: () => {
|
|
42
|
-
// Ignore error
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
if (result.exitCode !== 0) {
|
|
38
|
+
// Check if tsrun module is available (imported as dependency)
|
|
39
|
+
if (!plugins.tsrun || !plugins.tsrun.spawnPath) {
|
|
47
40
|
return {
|
|
48
41
|
available: false,
|
|
49
|
-
error: 'tsrun not found
|
|
42
|
+
error: 'tsrun module not found or outdated (requires version 1.6.0+)',
|
|
50
43
|
};
|
|
51
44
|
}
|
|
52
45
|
|
|
@@ -96,7 +89,7 @@ export class NodeRuntimeAdapter extends RuntimeAdapter {
|
|
|
96
89
|
}
|
|
97
90
|
|
|
98
91
|
/**
|
|
99
|
-
* Execute a test file in Node.js
|
|
92
|
+
* Execute a test file in Node.js using tsrun's spawnPath API
|
|
100
93
|
*/
|
|
101
94
|
async run(
|
|
102
95
|
testFile: string,
|
|
@@ -109,28 +102,35 @@ export class NodeRuntimeAdapter extends RuntimeAdapter {
|
|
|
109
102
|
|
|
110
103
|
const mergedOptions = this.mergeOptions(options);
|
|
111
104
|
|
|
112
|
-
// Build
|
|
113
|
-
|
|
105
|
+
// Build spawn options
|
|
106
|
+
const spawnOptions: any = {
|
|
107
|
+
cwd: mergedOptions.cwd || process.cwd(),
|
|
108
|
+
env: { ...mergedOptions.env },
|
|
109
|
+
args: [] as string[],
|
|
110
|
+
stdio: 'pipe' as const,
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// Add --web flag if needed
|
|
114
114
|
if (process.argv.includes('--web')) {
|
|
115
|
-
|
|
115
|
+
spawnOptions.args.push('--web');
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
// Set filter tags as environment variable
|
|
119
119
|
if (this.filterTags.length > 0) {
|
|
120
|
-
|
|
120
|
+
spawnOptions.env.TSTEST_FILTER_TAGS = this.filterTags.join(',');
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
// Check for 00init.ts file in test directory
|
|
124
124
|
const testDir = plugins.path.dirname(testFile);
|
|
125
125
|
const initFile = plugins.path.join(testDir, '00init.ts');
|
|
126
|
-
let runCommand = `tsrun ${testFile}${tsrunOptions}`;
|
|
127
|
-
|
|
128
126
|
const initFileExists = await plugins.smartfile.fs.fileExists(initFile);
|
|
129
127
|
|
|
130
|
-
//
|
|
128
|
+
// Determine which file to run
|
|
129
|
+
let fileToRun = testFile;
|
|
131
130
|
let loaderPath: string | null = null;
|
|
131
|
+
|
|
132
|
+
// If 00init.ts exists, create a loader file
|
|
132
133
|
if (initFileExists) {
|
|
133
|
-
// Create a temporary loader file that imports both 00init.ts and the test file
|
|
134
134
|
const absoluteInitFile = plugins.path.resolve(initFile);
|
|
135
135
|
const absoluteTestFile = plugins.path.resolve(testFile);
|
|
136
136
|
const loaderContent = `
|
|
@@ -139,10 +139,12 @@ import '${absoluteTestFile.replace(/\\/g, '/')}';
|
|
|
139
139
|
`;
|
|
140
140
|
loaderPath = plugins.path.join(testDir, `.loader_${plugins.path.basename(testFile)}`);
|
|
141
141
|
await plugins.smartfile.memory.toFs(loaderContent, loaderPath);
|
|
142
|
-
|
|
142
|
+
fileToRun = loaderPath;
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
-
|
|
145
|
+
// Spawn the test process using tsrun's spawnPath API
|
|
146
|
+
// Pass undefined for fromFileUrl since fileToRun is already an absolute path
|
|
147
|
+
const tsrunProcess = plugins.tsrun.spawnPath(fileToRun, undefined, spawnOptions);
|
|
146
148
|
|
|
147
149
|
// If we created a loader file, clean it up after test execution
|
|
148
150
|
if (loaderPath) {
|
|
@@ -156,8 +158,8 @@ import '${absoluteTestFile.replace(/\\/g, '/')}';
|
|
|
156
158
|
}
|
|
157
159
|
};
|
|
158
160
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
+
tsrunProcess.childProcess.on('exit', cleanup);
|
|
162
|
+
tsrunProcess.childProcess.on('error', cleanup);
|
|
161
163
|
}
|
|
162
164
|
|
|
163
165
|
// Start warning timer if no timeout was specified
|
|
@@ -180,15 +182,15 @@ import '${absoluteTestFile.replace(/\\/g, '/')}';
|
|
|
180
182
|
|
|
181
183
|
const timeoutPromise = new Promise<void>((_resolve, reject) => {
|
|
182
184
|
timeoutId = setTimeout(async () => {
|
|
183
|
-
// Use
|
|
184
|
-
await
|
|
185
|
+
// Use tsrun's terminate() to gracefully kill the process
|
|
186
|
+
await tsrunProcess.terminate();
|
|
185
187
|
reject(new Error(`Test file timed out after ${this.timeoutSeconds} seconds`));
|
|
186
188
|
}, timeoutMs);
|
|
187
189
|
});
|
|
188
190
|
|
|
189
191
|
try {
|
|
190
192
|
await Promise.race([
|
|
191
|
-
tapParser.handleTapProcess(
|
|
193
|
+
tapParser.handleTapProcess(tsrunProcess.childProcess),
|
|
192
194
|
timeoutPromise
|
|
193
195
|
]);
|
|
194
196
|
// Clear timeout if test completed successfully
|
|
@@ -200,16 +202,16 @@ import '${absoluteTestFile.replace(/\\/g, '/')}';
|
|
|
200
202
|
}
|
|
201
203
|
// Handle timeout error
|
|
202
204
|
tapParser.handleTimeout(this.timeoutSeconds);
|
|
203
|
-
// Ensure
|
|
205
|
+
// Ensure process is killed if still running
|
|
204
206
|
try {
|
|
205
|
-
|
|
207
|
+
tsrunProcess.kill('SIGKILL');
|
|
206
208
|
} catch (killError) {
|
|
207
|
-
// Process
|
|
209
|
+
// Process might already be dead
|
|
208
210
|
}
|
|
209
211
|
await tapParser.evaluateFinalResult();
|
|
210
212
|
}
|
|
211
213
|
} else {
|
|
212
|
-
await tapParser.handleTapProcess(
|
|
214
|
+
await tapParser.handleTapProcess(tsrunProcess.childProcess);
|
|
213
215
|
}
|
|
214
216
|
|
|
215
217
|
// Clear warning timer if it was set
|
package/ts/tstest.plugins.ts
CHANGED