27 lines
1.2 KiB
JavaScript
27 lines
1.2 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { EventEmitter } from 'node:events';
|
|
import policyModule from '../src/main/process-error-policy.cjs';
|
|
|
|
const { installOutputPipeGuards, isBrokenPipeError } = policyModule;
|
|
|
|
test('broken output pipes are recognized without treating unrelated failures as EPIPE', () => {
|
|
assert.equal(isBrokenPipeError(Object.assign(new Error('closed'), { code: 'EPIPE' })), true);
|
|
assert.equal(isBrokenPipeError(Object.assign(new Error('denied'), { code: 'EACCES' })), false);
|
|
assert.equal(isBrokenPipeError(null), false);
|
|
});
|
|
|
|
test('output pipe guard absorbs EPIPE and can be cleanly removed', () => {
|
|
const stdout = new EventEmitter();
|
|
const stderr = new EventEmitter();
|
|
const observed = [];
|
|
const remove = installOutputPipeGuards({ stdout, stderr, onBrokenPipe: (error) => observed.push(error.code) });
|
|
|
|
stdout.emit('error', Object.assign(new Error('closed'), { code: 'EPIPE' }));
|
|
stderr.emit('error', Object.assign(new Error('closed'), { code: 'EPIPE' }));
|
|
assert.deepEqual(observed, ['EPIPE', 'EPIPE']);
|
|
remove();
|
|
assert.equal(stdout.listenerCount('error'), 0);
|
|
assert.equal(stderr.listenerCount('error'), 0);
|
|
});
|