'use strict'; const common = require('../common'); const assert = require('assert'); const path = require('path'); const childProcess = require('child_process'); // Refs: https://github.com/nodejs/node/pull/2253 if (common.isSunOS) { common.skip('unreliable on SunOS'); return; } const nodeBinary = process.argv[0]; const preloadOption = function(preloads) { var option = ''; preloads.forEach(function(preload, index) { option += '-r ' + preload + ' '; }); return option; }; const fixture = function(name) { return path.join(common.fixturesDir, name); }; const fixtureA = fixture('printA.js'); const fixtureB = fixture('printB.js'); const fixtureC = fixture('printC.js'); const fixtureD = fixture('define-global.js'); const fixtureThrows = fixture('throws_error4.js'); // test preloading a single module works childProcess.exec(nodeBinary + ' ' + preloadOption([fixtureA]) + ' ' + fixtureB, function(err, stdout, stderr) { if (err) throw err; assert.equal(stdout, 'A\nB\n'); }); // test preloading multiple modules works childProcess.exec(nodeBinary + ' ' + preloadOption([fixtureA, fixtureB]) + ' ' + fixtureC, function(err, stdout, stderr) { if (err) throw err; assert.equal(stdout, 'A\nB\nC\n'); }); // test that preloading a throwing module aborts childProcess.exec(nodeBinary + ' ' + preloadOption([fixtureA, fixtureThrows]) + ' ' + fixtureB, function(err, stdout, stderr) { if (err) { assert.equal(stdout, 'A\n'); } else { throw new Error('Preload should have failed'); } }); // test that preload can be used with --eval childProcess.exec(nodeBinary + ' ' + preloadOption([fixtureA]) + '-e "console.log(\'hello\');"', function(err, stdout, stderr) { if (err) throw err; assert.equal(stdout, 'A\nhello\n'); }); // test that preload can be used with stdin const stdinProc = childProcess.spawn( nodeBinary, ['--require', fixtureA], {stdio: 'pipe'} ); stdinProc.stdin.end('console.log(\'hello\');'); var stdinStdout = ''; stdinProc.stdout.on('data', function(d) { stdinStdout += d; }); stdinProc.on('close', function(code) { assert.equal(code, 0); assert.equal(stdinStdout, 'A\nhello\n'); }); // test that preload can be used with repl const replProc = childProcess.spawn( nodeBinary, ['-i', '--require', fixtureA], {stdio: 'pipe'} ); replProc.stdin.end('.exit\n'); var replStdout = ''; replProc.stdout.on('data', function(d) { replStdout += d; }); replProc.on('close', function(code) { assert.equal(code, 0); const output = [ 'A', '> ' ].join('\n'); assert.equal(replStdout, output); }); // test that preload placement at other points in the cmdline // also test that duplicated preload only gets loaded once childProcess.exec(nodeBinary + ' ' + preloadOption([fixtureA]) + '-e "console.log(\'hello\');" ' + preloadOption([fixtureA, fixtureB]), function(err, stdout, stderr) { if (err) throw err; assert.equal(stdout, 'A\nB\nhello\n'); }); // test that preload works with -i const interactive = childProcess.exec(nodeBinary + ' ' + preloadOption([fixtureD]) + '-i', common.mustCall(function(err, stdout, stderr) { assert.ifError(err); assert.strictEqual(stdout, `> 'test'\n> `); })); interactive.stdin.write('a\n'); interactive.stdin.write('process.exit()\n'); childProcess.exec(nodeBinary + ' ' + '--require ' + fixture('cluster-preload.js') + ' ' + fixture('cluster-preload-test.js'), function(err, stdout, stderr) { if (err) throw err; assert.ok(/worker terminated with code 43/.test(stdout)); }); // https://github.com/nodejs/node/issues/1691 process.chdir(common.fixturesDir); childProcess.exec(nodeBinary + ' ' + '--expose_debug_as=v8debug ' + '--require ' + fixture('cluster-preload.js') + ' ' + 'cluster-preload-test.js', function(err, stdout, stderr) { if (err) throw err; assert.ok(/worker terminated with code 43/.test(stdout)); });