UNPKG

koffi

Version:

Fast and simple C FFI (foreign function interface) for Node.js

161 lines (134 loc) 5.61 kB
'use strict'; const majorNodeVersion = process.versions.node.split('.')[0]; if (typeof global.gc !== 'function') { // Construct the correct (version-dependent) command-line args. const args = ['--expose-gc']; const majorV8Version = process.versions.v8.split('.')[0]; if (majorV8Version < 9) { args.push('--no-concurrent-array-buffer-freeing'); } if (majorNodeVersion >= 14) { args.push('--no-concurrent-array-buffer-sweeping'); } args.push(__filename); const child = require('./napi_child').spawnSync(process.argv[0], args, { stdio: 'inherit' }); if (child.signal) { console.error(`Tests aborted with ${child.signal}`); process.exitCode = 1; } else { process.exitCode = child.status; } process.exit(process.exitCode); } const testModules = []; const fs = require('fs'); const path = require('path'); let filterCondition = process.env.npm_config_filter || ''; let filterConditionFiles = []; if (filterCondition !== '') { filterCondition = require('../unit-test/matchModules').matchWildCards(process.env.npm_config_filter); filterConditionFiles = filterCondition.split(' ').length > 0 ? filterCondition.split(' ') : [filterCondition]; } const filterConditionsProvided = filterConditionFiles.length > 0; function checkFilterCondition (fileName, parsedFilepath) { let result = false; if (!filterConditionsProvided) return true; if (filterConditionFiles.includes(parsedFilepath)) result = true; if (filterConditionFiles.includes(fileName)) result = true; return result; } // TODO(RaisinTen): Update this when the test filenames // are changed into test_*.js. function loadTestModules (currentDirectory = __dirname, pre = '') { fs.readdirSync(currentDirectory).forEach((file) => { if (currentDirectory === __dirname && ( file === 'binding.cc' || file === 'binding.gyp' || file === 'build' || file === 'common' || file === 'child_processes' || file === 'napi_child.js' || file === 'testUtil.js' || file === 'thunking_manual.cc' || file === 'thunking_manual.js' || file === 'index.js' || file[0] === '.')) { return; } const absoluteFilepath = path.join(currentDirectory, file); const parsedFilepath = path.parse(file); const parsedPath = path.parse(currentDirectory); if (fs.statSync(absoluteFilepath).isDirectory()) { if (fs.existsSync(absoluteFilepath + '/index.js')) { if (checkFilterCondition(parsedFilepath.name, parsedPath.base)) { testModules.push(pre + file); } } else { loadTestModules(absoluteFilepath, pre + file + '/'); } } else { if (parsedFilepath.ext === '.js' && checkFilterCondition(parsedFilepath.name, parsedPath.base)) { testModules.push(pre + parsedFilepath.name); } } }); } loadTestModules(); let napiVersion = Number(process.versions.napi); if (process.env.NAPI_VERSION) { // we need this so that we don't try run tests that rely // on methods that are not available in the NAPI_VERSION // specified napiVersion = process.env.NAPI_VERSION; } console.log('napiVersion:' + napiVersion); if (napiVersion < 3) { testModules.splice(testModules.indexOf('env_cleanup'), 1); testModules.splice(testModules.indexOf('callbackscope'), 1); testModules.splice(testModules.indexOf('version_management'), 1); } if (napiVersion < 4 && !filterConditionsProvided) { testModules.splice(testModules.indexOf('asyncprogressqueueworker'), 1); testModules.splice(testModules.indexOf('asyncprogressworker'), 1); testModules.splice(testModules.indexOf('threadsafe_function/threadsafe_function_ctx'), 1); testModules.splice(testModules.indexOf('threadsafe_function/threadsafe_function_existing_tsfn'), 1); testModules.splice(testModules.indexOf('threadsafe_function/threadsafe_function_ptr'), 1); testModules.splice(testModules.indexOf('threadsafe_function/threadsafe_function_sum'), 1); testModules.splice(testModules.indexOf('threadsafe_function/threadsafe_function_unref'), 1); testModules.splice(testModules.indexOf('threadsafe_function/threadsafe_function'), 1); } if (napiVersion < 5 && !filterConditionsProvided) { testModules.splice(testModules.indexOf('date'), 1); } if (napiVersion < 6 && !filterConditionsProvided) { testModules.splice(testModules.indexOf('addon'), 1); testModules.splice(testModules.indexOf('addon_data'), 1); testModules.splice(testModules.indexOf('bigint'), 1); testModules.splice(testModules.indexOf('typedarray-bigint'), 1); } if (majorNodeVersion < 12 && !filterConditionsProvided) { testModules.splice(testModules.indexOf('objectwrap_worker_thread'), 1); testModules.splice(testModules.indexOf('error_terminating_environment'), 1); } if (napiVersion < 8 && !filterConditionsProvided) { testModules.splice(testModules.indexOf('object/object_freeze_seal'), 1); testModules.splice(testModules.indexOf('type_taggable'), 1); } if (napiVersion < 9 && !filterConditionsProvided) { testModules.splice(testModules.indexOf('env_misc'), 1); } (async function () { console.log(`Testing with Node-API Version '${napiVersion}'.`); if (filterConditionsProvided) { console.log('Starting test suite\n', testModules); } else { console.log('Starting test suite\n'); } // Requiring each module runs tests in the module. for (const name of testModules) { console.log(`Running test '${name}'`); await require('./' + name); } console.log('\nAll tests passed!'); })().catch((error) => { console.log(error); process.exit(1); });