Skip to content

Commit

Permalink
test: added test/processExecSync.js for when execFileSync is not avai…
Browse files Browse the repository at this point in the history
…lable.

PR-URL: #1492
Reviewed-By: Jeremiah Senkpiel <[email protected]>
Reviewed-By: Matheus Marchini <[email protected]>
Reviewed-By: Jon Moss <[email protected]>
Reviewed-By: Rod Vagg <[email protected]>
  • Loading branch information
Rohithzr authored and rvagg committed Aug 9, 2018
1 parent 969447c commit 60e4213
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 1 deletion.
141 changes: 141 additions & 0 deletions test/processExecSync.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
var fs = require('graceful-fs')
var child_process = require('child_process')
var exec = child_process.exec

if (!String.prototype.startsWith) {
String.prototype.startsWith = function(search, pos) {
return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
};
}

function processExecSync(file, args, options) {
var child, error, timeout, tmpdir, command, quote;
command = makeCommand(file, args);

/*
this function emulates child_process.execSync for legacy node <= 0.10.x
derived from https://github.com/gvarsanyi/sync-exec/blob/master/js/sync-exec.js
*/

options = options || {};
// init timeout
timeout = Date.now() + options.timeout;
// init tmpdir
var os_temp_base = "/tmp";
var os = determine_os();
os_temp_base = "/tmp"

if(process.env.TMP){
os_temp_base = process.env.TMP;
}

if(os_temp_base[os_temp_base.length - 1] !== "/"){
os_temp_base += "/";
}

tmpdir = os_temp_base+'processExecSync.' + Date.now() + Math.random();
fs.mkdirSync(tmpdir);

// init command
if(os === "linux"){
command = '(' + command + ' > ' + tmpdir + '/stdout 2> ' + tmpdir +
'/stderr); echo $? > ' + tmpdir + '/status';
}else{
command = '(' + command + ' > ' + tmpdir + '/stdout 2> ' + tmpdir +
'/stderr) | echo %errorlevel% > ' + tmpdir + '/status | exit';
}

// init child
child = exec(command, options, function () {
return;
});

var maxTry = 100000; // increases the test time by 6 seconds on win-2016-node-0.10
var tryCount = 0;
while (tryCount < maxTry) {
try {
var x = fs.readFileSync(tmpdir + '/status');
if(x.toString() === "0"){
break;
}
} catch (ignore) {
}
tryCount++;
if (Date.now() > timeout) {
error = child;
break;
}
}

['stdout', 'stderr', 'status'].forEach(function (file) {
child[file] = fs.readFileSync(tmpdir + '/' + file, options.encoding);
setTimeout(unlinkFile, 500, tmpdir + '/' + file);
});

child.status = Number(child.status);
if (child.status !== 0) {
error = child;
}

try {
fs.rmdirSync(tmpdir);
} catch (ignore) {
}
if (error) {
throw error;
}
return child.stdout;
}

module.exports = processExecSync;

function makeCommand(file, args){
var command, quote;
command = file
if(args.length > 0){
for(var i in args){
command = command + " ";
if(args[i][0] === "-"){
command = command + args[i];
}else{
if(!quote){
command = command + "\"";
quote = true;
}
command = command + args[i];
if(quote){
if(args.length === (parseInt(i) + 1)){
command = command + "\"";
}
}
}
}
}
return command;
}

function determine_os(){
var os = "";
var tmpVar = "";
if(process.env.OSTYPE){
tmpVar = process.env.OSTYPE;
}else if(process.env.OS){
tmpVar = process.env.OS;
}else{
//default is linux
tmpVar = "linux";
}

if(tmpVar.startsWith("linux")){
os = "linux"
}
if(tmpVar.startsWith("win")){
os = "win"
}

return os;
}

function unlinkFile(file){
fs.unlinkSync(file);
}
2 changes: 1 addition & 1 deletion test/test-addon.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ var fs = require('graceful-fs')
var child_process = require('child_process')
var addonPath = path.resolve(__dirname, 'node_modules', 'hello_world')
var nodeGyp = path.resolve(__dirname, '..', 'bin', 'node-gyp.js')
var execFileSync = child_process.execFileSync
var execFileSync = child_process.execFileSync || require('./processExecSync')
var execFile = child_process.execFile

function runHello() {
Expand Down

0 comments on commit 60e4213

Please sign in to comment.