in src/testUtils.ts [425:510]
export function computeTestCommand(
testconfig: TestConfig,
targets: string[]
): {
args: Array<string>; // test command args.
outArgs: Array<string>; // compact test command args to show to user.
tmpCoverPath?: string; // coverage file path if coverage info is necessary.
addJSONFlag: boolean | undefined; // true if we add extra -json flag for stream processing.
} {
const args: Array<string> = ['test'];
// user-specified flags
const argsFlagIdx = testconfig.flags?.indexOf('-args') ?? -1;
const userFlags = argsFlagIdx < 0 ? testconfig.flags : testconfig.flags.slice(0, argsFlagIdx);
const userArgsFlags = argsFlagIdx < 0 ? [] : testconfig.flags.slice(argsFlagIdx);
// flags to limit test time
if (testconfig.isBenchmark) {
args.push('-benchmem', '-run=^$');
} else {
args.push('-timeout', testconfig.goConfig['testTimeout']);
}
// tags flags only if user didn't set -tags yet.
const testTags: string = getTestTags(testconfig.goConfig);
if (testTags && userFlags.indexOf('-tags') === -1) {
args.push('-tags', testTags);
}
// coverage flags
let tmpCoverPath: string | undefined;
if (testconfig.applyCodeCoverage) {
tmpCoverPath = getTempFilePath('go-code-cover');
args.push('-coverprofile=' + tmpCoverPath);
const coverMode = testconfig.goConfig['coverMode'];
switch (coverMode) {
case 'default':
break;
case 'set':
case 'count':
case 'atomic':
args.push('-covermode', coverMode);
break;
default:
vscode.window.showWarningMessage(
`go.coverMode=${coverMode} is illegal. Use 'set', 'count', 'atomic', or 'default'.`
);
}
}
// all other test run/benchmark flags
args.push(...targetArgs(testconfig));
const outArgs = args.slice(0); // command to show
// if user set -v, set -json to emulate streaming test output
const addJSONFlag = (userFlags.includes('-v') || testconfig.goTestOutputConsumer) && !userFlags.includes('-json');
if (addJSONFlag) {
args.push('-json'); // this is not shown to the user.
}
if (targets.length > 4) {
outArgs.push('<long arguments omitted>');
} else {
outArgs.push(...targets);
}
args.push(...targets);
// ensure that user provided flags are appended last (allow use of -args ...)
// ignore user provided -run flag if we are already using it
if (args.indexOf('-run') > -1) {
removeRunFlag(userFlags);
}
args.push(...userFlags);
outArgs.push(...userFlags);
args.push(...userArgsFlags);
outArgs.push(...userArgsFlags);
return {
args,
outArgs,
tmpCoverPath,
addJSONFlag
};
}