From a3588a70ba0f8932dad937a0d46e13352f890a1c Mon Sep 17 00:00:00 2001 From: Salman Muin Kayser Chishti Date: Tue, 18 Nov 2025 14:21:47 +0000 Subject: [PATCH] update hash files test --- jest.config.js | 2 +- packages/exec/__tests__/exec.test.ts | 71 +++---------------- .../__tests__/scripts/spawn-wait-for-file.js | 39 ++++++++++ .../__tests__/scripts/stdoutputspecial.js | 4 +- packages/glob/__tests__/hash-files.test.ts | 11 +++ 5 files changed, 64 insertions(+), 63 deletions(-) create mode 100644 packages/exec/__tests__/scripts/spawn-wait-for-file.js diff --git a/jest.config.js b/jest.config.js index f25dbdc9..28929681 100644 --- a/jest.config.js +++ b/jest.config.js @@ -5,7 +5,7 @@ module.exports = { testEnvironment: 'node', testMatch: ['**/__tests__/*.test.ts'], transform: { - '^.+\\.ts$': 'ts-jest' + '^.+\\.ts$': ['ts-jest', {isolatedModules: true, diagnostics: {warnOnly: true}}] }, verbose: true } diff --git a/packages/exec/__tests__/exec.test.ts b/packages/exec/__tests__/exec.test.ts index 1f83ce4a..aff2ceb4 100644 --- a/packages/exec/__tests__/exec.test.ts +++ b/packages/exec/__tests__/exec.test.ts @@ -11,6 +11,11 @@ import * as io from '@actions/io' /* eslint-disable @typescript-eslint/unbound-method */ const IS_WINDOWS = process.platform === 'win32' +const SPAWN_WAIT_FOR_FILE = path.join( + __dirname, + 'scripts', + 'spawn-wait-for-file.js' +) let outstream: stream.Writable let errstream: stream.Writable @@ -365,35 +370,18 @@ describe('@actions/exec', () => { fs.writeFileSync(semaphorePath, '') const nodePath = await io.which('node', true) - const scriptPath = path.join(__dirname, 'scripts', 'wait-for-file.js') const debugList: string[] = [] const _testExecOptions = getExecOptions() _testExecOptions.delay = 500 - _testExecOptions.windowsVerbatimArguments = true _testExecOptions.listeners = { debug: (data: string) => { debugList.push(data) } } - let exitCode: number - if (IS_WINDOWS) { - const toolName: string = await io.which('cmd.exe', true) - const args = [ - '/D', // Disable execution of AutoRun commands from registry. - '/E:ON', // Enable command extensions. Note, command extensions are enabled by default, unless disabled via registry. - '/V:OFF', // Disable delayed environment expansion. Note, delayed environment expansion is disabled by default, unless enabled via registry. - '/S', // Will cause first and last quote after /C to be stripped. - '/C', - `"start "" /B "${nodePath}" "${scriptPath}" "file=${semaphorePath}""` - ] - exitCode = await exec.exec(`"${toolName}"`, args, _testExecOptions) - } else { - const toolName: string = await io.which('bash', true) - const args = ['-c', `node '${scriptPath}' 'file=${semaphorePath}' &`] + const args = [SPAWN_WAIT_FOR_FILE, `file=${semaphorePath}`] - exitCode = await exec.exec(`"${toolName}"`, args, _testExecOptions) - } + const exitCode = await exec.exec(`"${nodePath}"`, args, _testExecOptions) expect(exitCode).toBe(0) expect( @@ -411,36 +399,19 @@ describe('@actions/exec', () => { fs.writeFileSync(semaphorePath, '') const nodePath = await io.which('node', true) - const scriptPath = path.join(__dirname, 'scripts', 'wait-for-file.js') const debugList: string[] = [] const _testExecOptions = getExecOptions() _testExecOptions.delay = 500 - _testExecOptions.windowsVerbatimArguments = true _testExecOptions.listeners = { debug: (data: string) => { debugList.push(data) } } - let toolName: string - let args: string[] - if (IS_WINDOWS) { - toolName = await io.which('cmd.exe', true) - args = [ - '/D', // Disable execution of AutoRun commands from registry. - '/E:ON', // Enable command extensions. Note, command extensions are enabled by default, unless disabled via registry. - '/V:OFF', // Disable delayed environment expansion. Note, delayed environment expansion is disabled by default, unless enabled via registry. - '/S', // Will cause first and last quote after /C to be stripped. - '/C', - `"start "" /B "${nodePath}" "${scriptPath}" "file=${semaphorePath}"" & exit /b 123` - ] - } else { - toolName = await io.which('bash', true) - args = ['-c', `node '${scriptPath}' 'file=${semaphorePath}' & exit 123`] - } + const args = [SPAWN_WAIT_FOR_FILE, `file=${semaphorePath}`, 'exitCode=123'] await exec - .exec(`"${toolName}"`, args, _testExecOptions) + .exec(`"${nodePath}"`, args, _testExecOptions) .then(() => { throw new Error('Should not have succeeded') }) @@ -465,40 +436,20 @@ describe('@actions/exec', () => { fs.writeFileSync(semaphorePath, '') const nodePath = await io.which('node', true) - const scriptPath = path.join(__dirname, 'scripts', 'wait-for-file.js') const debugList: string[] = [] const _testExecOptions = getExecOptions() _testExecOptions.delay = 500 _testExecOptions.failOnStdErr = true - _testExecOptions.windowsVerbatimArguments = true _testExecOptions.listeners = { debug: (data: string) => { debugList.push(data) } } - let toolName: string - let args: string[] - if (IS_WINDOWS) { - toolName = await io.which('cmd.exe', true) - args = [ - '/D', // Disable execution of AutoRun commands from registry. - '/E:ON', // Enable command extensions. Note, command extensions are enabled by default, unless disabled via registry. - '/V:OFF', // Disable delayed environment expansion. Note, delayed environment expansion is disabled by default, unless enabled via registry. - '/S', // Will cause first and last quote after /C to be stripped. - '/C', - `"start "" /B "${nodePath}" "${scriptPath}" "file=${semaphorePath}"" & echo hi 1>&2` - ] - } else { - toolName = await io.which('bash', true) - args = [ - '-c', - `node '${scriptPath}' 'file=${semaphorePath}' & echo hi 1>&2` - ] - } + const args = [SPAWN_WAIT_FOR_FILE, `file=${semaphorePath}`, 'stderr=true'] await exec - .exec(`"${toolName}"`, args, _testExecOptions) + .exec(`"${nodePath}"`, args, _testExecOptions) .then(() => { throw new Error('Should not have succeeded') }) diff --git a/packages/exec/__tests__/scripts/spawn-wait-for-file.js b/packages/exec/__tests__/scripts/spawn-wait-for-file.js new file mode 100644 index 00000000..31a6cd0d --- /dev/null +++ b/packages/exec/__tests__/scripts/spawn-wait-for-file.js @@ -0,0 +1,39 @@ +const childProcess = require('child_process') +const path = require('path') + +function parseArgs() { + const result = {} + for (const arg of process.argv.slice(2)) { + const equalsIndex = arg.indexOf('=') + if (equalsIndex === -1) { + continue + } + const key = arg.slice(0, equalsIndex) + const value = arg.slice(equalsIndex + 1) + result[key] = value + } + + return result +} + +const args = parseArgs() +const filePath = args.file +if (!filePath) { + throw new Error('file is not specified') +} + +const waitScript = path.join(__dirname, 'wait-for-file.js') +const waitArgs = [waitScript, `file=${filePath}`] +const waitProcess = childProcess.spawn(process.execPath, waitArgs, { + stdio: 'inherit', + detached: false +}) + +waitProcess.unref() + +if (args.stderr === 'true') { + process.stderr.write('hi') +} + +const exitCode = args.exitCode ? parseInt(args.exitCode, 10) : 0 +process.exit(exitCode) diff --git a/packages/exec/__tests__/scripts/stdoutputspecial.js b/packages/exec/__tests__/scripts/stdoutputspecial.js index 6a641cd0..95f0ff42 100644 --- a/packages/exec/__tests__/scripts/stdoutputspecial.js +++ b/packages/exec/__tests__/scripts/stdoutputspecial.js @@ -1,8 +1,8 @@ //first half of © character -process.stdout.write(Buffer.from([0xC2]), (err) => { +process.stdout.write(Buffer.from([0xC2]), () => { //write in the callback so that the second byte is sent separately setTimeout(() => { process.stdout.write(Buffer.from([0xA9])) //second half of © character - }, 5000) + }, 100) }) diff --git a/packages/glob/__tests__/hash-files.test.ts b/packages/glob/__tests__/hash-files.test.ts index 51ed3ee6..7f87807b 100644 --- a/packages/glob/__tests__/hash-files.test.ts +++ b/packages/glob/__tests__/hash-files.test.ts @@ -4,6 +4,7 @@ import {hashFiles} from '../src/glob' import {promises as fs} from 'fs' const IS_WINDOWS = process.platform === 'win32' +const ORIGINAL_GITHUB_WORKSPACE = process.env['GITHUB_WORKSPACE'] /** * These test focus on the ability of globber to find files @@ -12,6 +13,16 @@ const IS_WINDOWS = process.platform === 'win32' describe('globber', () => { beforeAll(async () => { await io.rmRF(getTestTemp()) + process.env['GITHUB_WORKSPACE'] = process.cwd() + }) + + afterAll(async () => { + if (ORIGINAL_GITHUB_WORKSPACE) { + process.env['GITHUB_WORKSPACE'] = ORIGINAL_GITHUB_WORKSPACE + } else { + delete process.env['GITHUB_WORKSPACE'] + } + await io.rmRF(getTestTemp()) }) it('basic hashfiles test', async () => {