mirror of
https://github.com/actions/toolkit
synced 2025-05-10 00:53:10 +00:00
Add getExecOutput function (#814)
* Add getExecOutput function * Add tests for exec output * Modify tests to not rely on buffer size, but only test larger output * Handle split multi-byte characters + PR feedback * Fix tests * Lint * Update how split byte are sent for tests
This commit is contained in:
parent
566ea66979
commit
ddd04b6997
5 changed files with 265 additions and 13 deletions
|
@ -636,6 +636,165 @@ describe('@actions/exec', () => {
|
|||
expect(output.trim()).toBe(`args[0]: "hello"${os.EOL}args[1]: "world"`)
|
||||
})
|
||||
|
||||
it('correctly outputs for getExecOutput', async () => {
|
||||
const stdErrPath: string = path.join(
|
||||
__dirname,
|
||||
'scripts',
|
||||
'stderroutput.js'
|
||||
)
|
||||
const stdOutPath: string = path.join(
|
||||
__dirname,
|
||||
'scripts',
|
||||
'stdoutoutput.js'
|
||||
)
|
||||
const nodePath: string = await io.which('node', true)
|
||||
|
||||
const {exitCode: exitCodeOut, stdout} = await exec.getExecOutput(
|
||||
`"${nodePath}"`,
|
||||
[stdOutPath],
|
||||
getExecOptions()
|
||||
)
|
||||
|
||||
expect(exitCodeOut).toBe(0)
|
||||
expect(stdout).toBe('this is output to stdout')
|
||||
|
||||
const {exitCode: exitCodeErr, stderr} = await exec.getExecOutput(
|
||||
`"${nodePath}"`,
|
||||
[stdErrPath],
|
||||
getExecOptions()
|
||||
)
|
||||
expect(exitCodeErr).toBe(0)
|
||||
expect(stderr).toBe('this is output to stderr')
|
||||
})
|
||||
|
||||
it('correctly outputs for getExecOutput with additional listeners', async () => {
|
||||
const stdErrPath: string = path.join(
|
||||
__dirname,
|
||||
'scripts',
|
||||
'stderroutput.js'
|
||||
)
|
||||
const stdOutPath: string = path.join(
|
||||
__dirname,
|
||||
'scripts',
|
||||
'stdoutoutput.js'
|
||||
)
|
||||
|
||||
const nodePath: string = await io.which('node', true)
|
||||
let listenerOut = ''
|
||||
|
||||
const {exitCode: exitCodeOut, stdout} = await exec.getExecOutput(
|
||||
`"${nodePath}"`,
|
||||
[stdOutPath],
|
||||
{
|
||||
...getExecOptions(),
|
||||
listeners: {
|
||||
stdout: data => {
|
||||
listenerOut = data.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
expect(exitCodeOut).toBe(0)
|
||||
expect(stdout).toBe('this is output to stdout')
|
||||
expect(listenerOut).toBe('this is output to stdout')
|
||||
|
||||
let listenerErr = ''
|
||||
const {exitCode: exitCodeErr, stderr} = await exec.getExecOutput(
|
||||
`"${nodePath}"`,
|
||||
[stdErrPath],
|
||||
{
|
||||
...getExecOptions(),
|
||||
listeners: {
|
||||
stderr: data => {
|
||||
listenerErr = data.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
expect(exitCodeErr).toBe(0)
|
||||
expect(stderr).toBe('this is output to stderr')
|
||||
expect(listenerErr).toBe('this is output to stderr')
|
||||
})
|
||||
|
||||
it('correctly outputs for getExecOutput when total size exceeds buffer size', async () => {
|
||||
const stdErrPath: string = path.join(
|
||||
__dirname,
|
||||
'scripts',
|
||||
'stderroutput.js'
|
||||
)
|
||||
const stdOutPath: string = path.join(
|
||||
__dirname,
|
||||
'scripts',
|
||||
'stdoutoutputlarge.js'
|
||||
)
|
||||
|
||||
const nodePath: string = await io.which('node', true)
|
||||
let listenerOut = ''
|
||||
|
||||
const {exitCode: exitCodeOut, stdout} = await exec.getExecOutput(
|
||||
`"${nodePath}"`,
|
||||
[stdOutPath],
|
||||
{
|
||||
...getExecOptions(),
|
||||
listeners: {
|
||||
stdout: data => {
|
||||
listenerOut += data.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
expect(exitCodeOut).toBe(0)
|
||||
expect(Buffer.byteLength(stdout || '', 'utf8')).toBe(2 ** 25)
|
||||
expect(Buffer.byteLength(listenerOut, 'utf8')).toBe(2 ** 25)
|
||||
|
||||
let listenerErr = ''
|
||||
const {exitCode: exitCodeErr, stderr} = await exec.getExecOutput(
|
||||
`"${nodePath}"`,
|
||||
[stdErrPath],
|
||||
{
|
||||
...getExecOptions(),
|
||||
listeners: {
|
||||
stderr: data => {
|
||||
listenerErr = data.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
expect(exitCodeErr).toBe(0)
|
||||
expect(stderr).toBe('this is output to stderr')
|
||||
expect(listenerErr).toBe('this is output to stderr')
|
||||
})
|
||||
|
||||
it('correctly outputs for getExecOutput with multi-byte characters', async () => {
|
||||
const stdOutPath: string = path.join(
|
||||
__dirname,
|
||||
'scripts',
|
||||
'stdoutputspecial.js'
|
||||
)
|
||||
|
||||
const nodePath: string = await io.which('node', true)
|
||||
let numStdOutBufferCalls = 0
|
||||
const {exitCode: exitCodeOut, stdout} = await exec.getExecOutput(
|
||||
`"${nodePath}"`,
|
||||
[stdOutPath],
|
||||
{
|
||||
...getExecOptions(),
|
||||
listeners: {
|
||||
stdout: () => {
|
||||
numStdOutBufferCalls += 1
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
expect(exitCodeOut).toBe(0)
|
||||
//one call for each half of the © character, ensuring it was actually split and not sent together
|
||||
expect(numStdOutBufferCalls).toBe(2)
|
||||
expect(stdout).toBe('©')
|
||||
})
|
||||
|
||||
if (IS_WINDOWS) {
|
||||
it('Exec roots relative tool path using process.cwd (Windows path separator)', async () => {
|
||||
let exitCode: number
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue