When running tests using `--runTestsByPath <some-path>`, the tests were
being run twice because jest-runner-vscode
[resolves test paths](0c98dc12ad/packages/jest-runner-vscode/src/runner.ts (L57-L66)),
while the original arguments were also still passed to Jest. So, the
arguments Jest would receive would look something like
`test/vscode-tests/no-workspace/databases/local-databases/locations.test.ts /Users/koesie10/github/vscode-codeql/extensions/ql-vscode/test/vscode-tests/no-workspace/databases/local-databases/locations.test.ts`
which would cause Jest to run the tests twice. This fixes this by
resolving the paths to their absolute paths, and then removing any
duplicates.
166 lines
8.2 KiB
Diff
166 lines
8.2 KiB
Diff
diff --git a/node_modules/jest-runner-vscode/dist/child/environment.js b/node_modules/jest-runner-vscode/dist/child/environment.js
|
|
index 1ac28d5..f91f216 100644
|
|
--- a/node_modules/jest-runner-vscode/dist/child/environment.js
|
|
+++ b/node_modules/jest-runner-vscode/dist/child/environment.js
|
|
@@ -10,6 +10,21 @@ const wrap_io_1 = __importDefault(require("./wrap-io"));
|
|
const load_pnp_1 = __importDefault(require("./load-pnp"));
|
|
const ipc = new ipc_client_1.default('env');
|
|
class VSCodeEnvironment extends jest_environment_node_1.default {
|
|
+ constructor(config, context) {
|
|
+ super(config, context);
|
|
+ // The _VSCODE_NODE_MODULES is a proxy which will require a module if any property
|
|
+ // on it is accessed. This is a workaround for the fact that jest will call
|
|
+ // _isMockFunction on the module, which will cause that function to be required.
|
|
+ this.global._VSCODE_NODE_MODULES = new Proxy(this.global._VSCODE_NODE_MODULES, {
|
|
+ get(target, prop) {
|
|
+ if (prop === '_isMockFunction') {
|
|
+ return undefined;
|
|
+ }
|
|
+ return target[prop];
|
|
+ },
|
|
+ });
|
|
+ }
|
|
+
|
|
async setup() {
|
|
await super.setup();
|
|
await (0, load_pnp_1.default)();
|
|
diff --git a/node_modules/jest-runner-vscode/dist/child/runner.js b/node_modules/jest-runner-vscode/dist/child/runner.js
|
|
index 0663c5c..bdf4a8b 100644
|
|
--- a/node_modules/jest-runner-vscode/dist/child/runner.js
|
|
+++ b/node_modules/jest-runner-vscode/dist/child/runner.js
|
|
@@ -18,10 +18,13 @@ async function run() {
|
|
const ipc = new ipc_client_1.default('child');
|
|
const disconnected = new Promise(resolve => ipc.on('disconnect', resolve));
|
|
try {
|
|
- const { PARENT_JEST_OPTIONS } = process_1.default.env;
|
|
+ const { PARENT_JEST_OPTIONS, PARENT_CWD } = process_1.default.env;
|
|
if (!PARENT_JEST_OPTIONS) {
|
|
throw new Error('PARENT_JEST_OPTIONS is not defined');
|
|
}
|
|
+ if (PARENT_CWD) {
|
|
+ process_1.default.chdir(PARENT_CWD);
|
|
+ }
|
|
const options = JSON.parse(PARENT_JEST_OPTIONS);
|
|
const jestOptions = [
|
|
...options.args,
|
|
@@ -39,6 +42,9 @@ async function run() {
|
|
...(argv.projects?.map(project => path_1.default.resolve(project)) || []),
|
|
options.workspacePath,
|
|
]);
|
|
+ const testPaths = new Set(argv._.map(testPath => path_1.default.resolve(testPath)));
|
|
+ argv._ = [...testPaths];
|
|
+
|
|
await (0, core_1.runCLI)(argv, [...projects]);
|
|
}
|
|
catch (error) {
|
|
diff --git a/node_modules/jest-runner-vscode/dist/public-types.d.ts b/node_modules/jest-runner-vscode/dist/public-types.d.ts
|
|
index 57716e5..d8614af 100644
|
|
--- a/node_modules/jest-runner-vscode/dist/public-types.d.ts
|
|
+++ b/node_modules/jest-runner-vscode/dist/public-types.d.ts
|
|
@@ -59,4 +59,5 @@ export interface RunnerOptions {
|
|
* code, or download progress. Defaults to `false`.
|
|
*/
|
|
quiet?: boolean;
|
|
+ retries?: number;
|
|
}
|
|
diff --git a/node_modules/jest-runner-vscode/dist/run-vscode.d.ts b/node_modules/jest-runner-vscode/dist/run-vscode.d.ts
|
|
index 8657ace..4d35409 100644
|
|
--- a/node_modules/jest-runner-vscode/dist/run-vscode.d.ts
|
|
+++ b/node_modules/jest-runner-vscode/dist/run-vscode.d.ts
|
|
@@ -16,5 +16,7 @@ export declare type RunVSCodeOptions = {
|
|
onFailure: JestRunner.OnTestFailure;
|
|
ipc: InstanceType<typeof IPC>;
|
|
quiet?: boolean;
|
|
+ attempt?: number;
|
|
+ maxRetries?: number;
|
|
};
|
|
-export default function runVSCode({ vscodePath, args, jestArgs, env, tests, globalConfig, filterOutput, onStart, onResult, onFailure, ipc, quiet, }: RunVSCodeOptions): Promise<void>;
|
|
+export default function runVSCode(options: RunVSCodeOptions): Promise<void>;
|
|
diff --git a/node_modules/jest-runner-vscode/dist/run-vscode.js b/node_modules/jest-runner-vscode/dist/run-vscode.js
|
|
index 5d8e513..7e556ee 100644
|
|
--- a/node_modules/jest-runner-vscode/dist/run-vscode.js
|
|
+++ b/node_modules/jest-runner-vscode/dist/run-vscode.js
|
|
@@ -5,8 +5,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const child_process_1 = __importDefault(require("child_process"));
|
|
const console_1 = __importDefault(require("console"));
|
|
-async function runVSCode({ vscodePath, args, jestArgs, env, tests, globalConfig, filterOutput, onStart, onResult, onFailure, ipc, quiet, }) {
|
|
- return await new Promise(resolve => {
|
|
+const fs_1 = __importDefault(require("fs"));
|
|
+const path_1 = __importDefault(require("path"));
|
|
+const os_1 = __importDefault(require("os"));
|
|
+async function runVSCode(options) {
|
|
+ const { vscodePath, args, jestArgs, env, tests, globalConfig, filterOutput, onStart, onResult, onFailure, ipc, quiet, attempt, maxRetries, } = options;
|
|
+ const tempUserDir = await fs_1.default.promises.mkdtemp(path_1.default.resolve(os_1.default.tmpdir(), 'jest-runner-vscode-user-data-'));
|
|
+ return await new Promise(promiseResolve => {
|
|
+ const resolve = () => {
|
|
+ fs_1.default.rm(tempUserDir, { recursive: true }, () => {
|
|
+ promiseResolve();
|
|
+ });
|
|
+ };
|
|
const useStdErr = globalConfig.json || globalConfig.useStderr;
|
|
const log = useStdErr
|
|
? console_1.default.error.bind(console_1.default)
|
|
@@ -82,7 +92,11 @@ async function runVSCode({ vscodePath, args, jestArgs, env, tests, globalConfig,
|
|
ipc.server.on('stdout', onStdout);
|
|
ipc.server.on('stderr', onStderr);
|
|
ipc.server.on('error', onError);
|
|
- const vscode = child_process_1.default.spawn(vscodePath, args, { env: environment });
|
|
+ const launchArgs = args;
|
|
+ if (!hasArg('user-data-dir', launchArgs)) {
|
|
+ launchArgs.push(`--user-data-dir=${tempUserDir}`);
|
|
+ }
|
|
+ const vscode = child_process_1.default.spawn(vscodePath, launchArgs, { env: environment });
|
|
if (!silent && !filterOutput) {
|
|
vscode.stdout.pipe(process.stdout);
|
|
vscode.stderr.pipe(process.stderr);
|
|
@@ -99,6 +113,29 @@ async function runVSCode({ vscodePath, args, jestArgs, env, tests, globalConfig,
|
|
exited = true;
|
|
const exit = code ?? signal ?? '<unknown>';
|
|
const message = `VS Code exited with exit code ${exit}`;
|
|
+ const currentAttempt = attempt ?? 0;
|
|
+ const incompleteTests = tests.some(test => !completedTests.has(test));
|
|
+ if (maxRetries &&
|
|
+ maxRetries > 0 &&
|
|
+ currentAttempt < maxRetries &&
|
|
+ incompleteTests) {
|
|
+ silent || quiet || log(message);
|
|
+ const newAttempt = currentAttempt + 1;
|
|
+ const newTests = tests.filter(test => !completedTests.has(test));
|
|
+ ipc.server.off('testFileResult', onTestFileResult);
|
|
+ ipc.server.off('testStart', onTestStart);
|
|
+ ipc.server.off('testFileStart', onTestStart);
|
|
+ ipc.server.off('stdout', onStdout);
|
|
+ ipc.server.off('stderr', onStderr);
|
|
+ ipc.server.off('error', onError);
|
|
+ await runVSCode({
|
|
+ ...options,
|
|
+ tests: newTests,
|
|
+ attempt: newAttempt,
|
|
+ });
|
|
+ resolve();
|
|
+ return;
|
|
+ }
|
|
if (typeof code !== 'number' || code !== 0) {
|
|
silent || quiet || console_1.default.error(message);
|
|
const error = vscodeError ?? childError ?? new Error(message);
|
|
@@ -138,3 +175,6 @@ async function runVSCode({ vscodePath, args, jestArgs, env, tests, globalConfig,
|
|
});
|
|
}
|
|
exports.default = runVSCode;
|
|
+function hasArg(argName, argList) {
|
|
+ return argList.some(a => a === `--${argName}` || a.startsWith(`--${argName}=`));
|
|
+}
|
|
diff --git a/node_modules/jest-runner-vscode/dist/runner.js b/node_modules/jest-runner-vscode/dist/runner.js
|
|
index e24c976..c374022 100644
|
|
--- a/node_modules/jest-runner-vscode/dist/runner.js
|
|
+++ b/node_modules/jest-runner-vscode/dist/runner.js
|
|
@@ -107,6 +107,7 @@ class VSCodeTestRunner {
|
|
onFailure,
|
|
ipc,
|
|
quiet: vscodeOptions.quiet,
|
|
+ maxRetries: vscodeOptions.retries,
|
|
});
|
|
}
|
|
catch (error) {
|