current commit
261001.2 · ffi: do not abort when a Worker stops in a callback
'use strict';
const common = require('../common');
const assert = require('node:assert');
const { spawnSync } = require('node:child_process');

function spawnAbortingChild(source) {
  const args = ['-e', source];
  if (common.isWindows) {
    return spawnSync(process.execPath, args, { encoding: 'utf8' });
  }

  // Avoid writing core files for these intentional aborts.
  return spawnSync('/bin/sh', [
    '-c', 'ulimit -c 0 && exec "$@"',
    'sh', process.execPath, ...args,
  ], { encoding: 'utf8' });
}

function assertAborts(source, message) {
  const { stderr, status, signal } = spawnAbortingChild(source);
  assert.ok(common.nodeProcessAborted(status, signal),
            `status: ${status}, signal: ${signal}
stderr: ${stderr}`);
  assert.match(stderr, message);
}

function assertCallbackAborts(callbackBody, message) {
  assertAborts(
    `'use strict';
const ffi = require('node:ffi');
const { fixtureSymbols, libraryPath } = require(${JSON.stringify(require.resolve('./ffi-test-common'))});
const { lib, functions } = ffi.dlopen(libraryPath, fixtureSymbols);
const callback = lib.registerCallback(
  { arguments: ['i32'], return: 'i32' },
  () => { ${callbackBody} },
);
functions.call_int_callback(callback, 21);`,
    message,
  );
}

module.exports = {
  assertAborts,
  assertCallbackAborts,
  spawnAbortingChild,
};