Comparing version 0.2.2 to 0.2.3
@@ -41,5 +41,12 @@ # Contributing | ||
"time": 5.371, | ||
"times": [ | ||
5.371, | ||
4.269, | ||
4.97, | ||
5.228 | ||
], | ||
"min": 4.269, | ||
"max": 4.96, | ||
"avg": 5.371, | ||
"packageLoss": 0.0 | ||
"stddev": 0.424 | ||
@@ -51,3 +58,3 @@ } | ||
We trust tesed codes. Please run below command for testing before sending | ||
We trust tested codes. Please run below command for testing before sending | ||
a pull request | ||
@@ -59,2 +66,7 @@ | ||
[1]: http://www.jsoneditoronline.org/ | ||
## Running ipv6 test cases | ||
As #67 introduces ipv6 mechanism, fixture file names with `v6` will enable v6. | ||
Please refer to window/de/v6_sample.txt for an example | ||
[1]: https://jsoneditoronline.org |
@@ -1,10 +0,13 @@ | ||
//-------- example ----------------------- | ||
// -------- example ----------------------- | ||
'use strict'; | ||
var ping = require('../index'); | ||
var hosts = ['192.168.1.1', 'google.com', 'yahoo.com']; | ||
hosts.forEach(function(host){ | ||
hosts.forEach(function (host) { | ||
// Running with default config | ||
ping.sys.probe(host, function(isAlive){ | ||
var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead'; | ||
ping.sys.probe(host, function (isAlive) { | ||
var msg = isAlive ? | ||
'host ' + host + ' is alive' : 'host ' + host + ' is dead'; | ||
console.log(msg); | ||
@@ -14,13 +17,15 @@ }); | ||
// Running with custom config | ||
ping.sys.probe(host, function(isAlive){ | ||
var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead'; | ||
ping.sys.probe(host, function (isAlive) { | ||
var msg = isAlive ? | ||
'host ' + host + ' is alive' : 'host ' + host + ' is dead'; | ||
console.log(msg); | ||
}, {extra: ["-i 2"]}); | ||
}, {extra: ['-i', '2']}); | ||
// Running ping with some default argument gone | ||
ping.sys.probe(host, function(isAlive){ | ||
var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead'; | ||
ping.sys.probe(host, function (isAlive) { | ||
var msg = isAlive ? | ||
'host ' + host + ' is alive' : 'host ' + host + ' is dead'; | ||
console.log(msg); | ||
}, {extra: ["-i 2"], timeout: false}); | ||
}, {extra: ['-i', '2'], timeout: false}); | ||
}); | ||
@@ -1,3 +0,5 @@ | ||
var ping = require("../index"); | ||
'use strict'; | ||
var ping = require('../index'); | ||
var hosts = ['192.168.1.1', 'google.com', 'yahoo.com']; | ||
@@ -19,3 +21,3 @@ | ||
timeout: 10, | ||
extra: ["-i", "2"], | ||
extra: ['-i', '2'], | ||
}) | ||
@@ -34,3 +36,3 @@ .then(function (res) { | ||
// Below extra arguments may not work in platforms other than linux | ||
extra: ["-i", "2"], | ||
extra: ['-i', '2'], | ||
}) | ||
@@ -37,0 +39,0 @@ .then(function (res) { |
@@ -23,2 +23,3 @@ 'use strict'; | ||
'aix', | ||
'android', | ||
'linux', | ||
@@ -65,6 +66,7 @@ ]; | ||
* @param {string} platform - Name of the platform | ||
* @return {object} - Argument builder | ||
* @param {bool} v6 - Ping via ipv6 or not | ||
* @return {string} - Executable path for system command ping | ||
* @throw if given platform is not supported | ||
*/ | ||
factory.getExecutablePath = function (platform) { | ||
factory.getExecutablePath = function (platform, v6) { | ||
if (!this.isPlatformSupport(platform)) { | ||
@@ -79,7 +81,7 @@ throw new Error(util.format('Platform |%s| is not support', platform)); | ||
} else if (factory.isLinux(platform)) { | ||
ret = '/bin/ping'; | ||
ret = v6 ? 'ping6' : 'ping'; | ||
} else if (factory.isWindow(platform)) { | ||
ret = process.env.SystemRoot + '/system32/ping.exe'; | ||
} else if (factory.isMacOS(platform)) { | ||
ret = '/sbin/ping'; | ||
ret = v6 ? '/sbin/ping6' : '/sbin/ping'; | ||
} | ||
@@ -86,0 +88,0 @@ |
@@ -15,4 +15,17 @@ 'use strict'; | ||
* @property {boolean} numeric - Map IP address to hostname or not | ||
* @property {number} timeout - Time duration for ping command to exit | ||
* @property {number} timeout - Time to wait for a response, in seconds. | ||
* The option affects only timeout in absence of any responses, | ||
* otherwise ping waits for two RTTs. | ||
* @property {number} deadline - Specify a timeout, in seconds, | ||
* before ping exits regardless of how many packets have been sent or received. | ||
* In this case ping does not stop after count packet are sent, | ||
* it waits either for deadline expire or until count probes are answered | ||
* or for some error notification from network. | ||
* This option is only available on linux and mac. | ||
* @property {number} min_reply - Exit after sending number of ECHO_REQUEST | ||
* @property {boolean} v6 - Use IPv4 (default) or IPv6 | ||
* @property {string} sourceAddr - source address for sending the ping | ||
* @property {number} packetSize - Specifies the number of data bytes to be sent | ||
* Default: Linux / MAC: 56 Bytes, | ||
* Window: 32 Bytes | ||
* @property {string[]} extra - Optional options does not provided | ||
@@ -24,3 +37,7 @@ */ | ||
timeout: 2, | ||
deadline: false, | ||
min_reply: 1, | ||
v6: false, | ||
sourceAddr: '', | ||
packetSize: 56, | ||
extra: [], | ||
@@ -35,3 +52,3 @@ }; | ||
*/ | ||
builder.getResult = function (target, config) { | ||
builder.getCommandArguments = function (target, config) { | ||
var _config = config || {}; | ||
@@ -43,5 +60,6 @@ | ||
// Make every key in config has been setup properly | ||
var keys = ['numeric', 'timeout', 'min_reply', 'extra']; | ||
var keys = ['numeric', 'timeout', 'deadline', 'min_reply', 'v6', | ||
'sourceAddr', 'extra', 'packetSize']; | ||
keys.forEach(function (k) { | ||
// Falsy value will be overrided without below checking | ||
// Falsy value will be overridden without below checking | ||
if (typeof(_config[k]) !== 'boolean') { | ||
@@ -58,3 +76,3 @@ _config[k] = _config[k] || defaultConfig[k]; | ||
ret = ret.concat([ | ||
'-w', | ||
'-W', | ||
util.format('%d', _config.timeout), | ||
@@ -64,2 +82,9 @@ ]); | ||
if (_config.deadline) { | ||
ret = ret.concat([ | ||
'-w', | ||
util.format('%d', _config.deadline), | ||
]); | ||
} | ||
if (_config.min_reply) { | ||
@@ -72,2 +97,16 @@ ret = ret.concat([ | ||
if (_config.sourceAddr) { | ||
ret = ret.concat([ | ||
'-I', | ||
util.format('%s', _config.sourceAddr), | ||
]); | ||
} | ||
if (_config.packetSize) { | ||
ret = ret.concat([ | ||
'-s', | ||
util.format('%d', _config.packetSize), | ||
]); | ||
} | ||
if (_config.extra) { | ||
@@ -82,2 +121,12 @@ ret = ret.concat(_config.extra); | ||
/** | ||
* Compute an option object for child_process.spawn | ||
* @return {object} - Refer to document of child_process.spawn | ||
*/ | ||
builder.getSpawnOptions = function () { | ||
return { | ||
shell: true, | ||
}; | ||
}; | ||
module.exports = builder; |
@@ -15,4 +15,17 @@ 'use strict'; | ||
* @property {boolean} numeric - Map IP address to hostname or not | ||
* @property {number} timeout - Time duration for ping command to exit | ||
* @property {number} timeout - Time to wait for a response, in seconds. | ||
* The option affects only timeout in absence of any responses, | ||
* otherwise ping waits for two RTTs. | ||
* @property {number} deadline - Specify a timeout, in seconds, | ||
* before ping exits regardless of how many packets have been sent or received. | ||
* In this case ping does not stop after count packet are sent, | ||
* it waits either for deadline expire or until count probes are answered | ||
* or for some error notification from network. | ||
* This option is only available on linux and mac. | ||
* @property {number} min_reply - Exit after sending number of ECHO_REQUEST | ||
* @property {boolean} v6 - Use IPv4 (default) or IPv6 | ||
* @property {string} sourceAddr - source address for sending the ping | ||
* @property {number} packetSize - Specifies the number of data bytes to be sent | ||
* Default: Linux / MAC: 56 Bytes, | ||
* Window: 32 Bytes | ||
* @property {string[]} extra - Optional options does not provided | ||
@@ -24,3 +37,7 @@ */ | ||
timeout: 2, | ||
deadline: false, | ||
min_reply: 1, | ||
v6: false, | ||
sourceAddr: '', | ||
packetSize: 56, | ||
extra: [], | ||
@@ -34,4 +51,5 @@ }; | ||
* @return {string[]} - Command line argument according to the configuration | ||
* @throws If there are errors on building arguments with given inputs | ||
*/ | ||
builder.getResult = function (target, config) { | ||
builder.getCommandArguments = function (target, config) { | ||
var _config = config || {}; | ||
@@ -43,5 +61,6 @@ | ||
// Make every key in config has been setup properly | ||
var keys = ['numeric', 'timeout', 'min_reply', 'extra']; | ||
var keys = ['numeric', 'timeout', 'deadline', 'min_reply', 'v6', | ||
'sourceAddr', 'extra', 'packetSize']; | ||
keys.forEach(function (k) { | ||
// Falsy value will be overrided without below checking | ||
// Falsy value will be overridden without below checking | ||
if (typeof(_config[k]) !== 'boolean') { | ||
@@ -57,5 +76,17 @@ _config[k] = _config[k] || defaultConfig[k]; | ||
if (_config.timeout) { | ||
// XXX: There is no timeout option on mac's ping6 | ||
if (config.v6) { | ||
throw new Error('There is no timeout option on ping6'); | ||
} | ||
ret = ret.concat([ | ||
'-W', | ||
util.format('%d', _config.timeout * 1000), | ||
]); | ||
} | ||
if (_config.deadline) { | ||
ret = ret.concat([ | ||
'-t', | ||
util.format('%d', _config.timeout), | ||
util.format('%d', _config.deadline), | ||
]); | ||
@@ -71,2 +102,16 @@ } | ||
if (_config.sourceAddr) { | ||
ret = ret.concat([ | ||
'-S', | ||
util.format('%s', _config.sourceAddr), | ||
]); | ||
} | ||
if (_config.packetSize) { | ||
ret = ret.concat([ | ||
'-s', | ||
util.format('%d', _config.packetSize), | ||
]); | ||
} | ||
if (_config.extra) { | ||
@@ -81,2 +126,11 @@ ret = ret.concat(_config.extra); | ||
/** | ||
* Compute an option object for child_process.spawn | ||
* @return {object} - Refer to document of child_process.spawn | ||
*/ | ||
builder.getSpawnOptions = function () { | ||
return {}; | ||
}; | ||
module.exports = builder; |
@@ -15,4 +15,9 @@ 'use strict'; | ||
* @property {boolean} numeric - Map IP address to hostname or not | ||
* @property {number} timeout - Time duration for ping command to exit | ||
* @property {number} timeout - Timeout in seconds for each ping request | ||
* @property {number} min_reply - Exit after sending number of ECHO_REQUEST | ||
* @property {boolean} v6 - Use IPv4 (default) or IPv6 | ||
* @property {string} sourceAddr - source address for sending the ping | ||
* @property {number} packetSize - Specifies the number of data bytes to be sent | ||
* Default: Linux / MAC: 56 Bytes, | ||
* Window: 32 Bytes | ||
* @property {string[]} extra - Optional options does not provided | ||
@@ -25,2 +30,5 @@ */ | ||
min_reply: 1, | ||
v6: false, | ||
sourceAddr: '', | ||
packetSize: 32, | ||
extra: [], | ||
@@ -35,3 +43,3 @@ }; | ||
*/ | ||
builder.getResult = function (target, config) { | ||
builder.getCommandArguments = function (target, config) { | ||
var _config = config || {}; | ||
@@ -43,3 +51,6 @@ | ||
// Make every key in config has been setup properly | ||
var keys = ['numeric', 'timeout', 'min_reply', 'extra']; | ||
var keys = [ | ||
'numeric', 'timeout', 'min_reply', 'v6', 'sourceAddr', 'extra', | ||
'packetSize', | ||
]; | ||
keys.forEach(function (k) { | ||
@@ -52,2 +63,4 @@ // Falsy value will be overrided without below checking | ||
ret.push(_config.v6 ? '-6' : '-4'); | ||
if (!_config.numeric) { | ||
@@ -67,2 +80,6 @@ ret.push('-a'); | ||
if (_config.deadline) { | ||
throw new Error('There is no deadline option on windows'); | ||
} | ||
if (_config.min_reply) { | ||
@@ -75,2 +92,16 @@ ret = ret.concat([ | ||
if (_config.sourceAddr) { | ||
ret = ret.concat([ | ||
'-S', | ||
util.format('%s', _config.sourceAddr), | ||
]); | ||
} | ||
if (_config.packetSize) { | ||
ret = ret.concat([ | ||
'-l', | ||
util.format('%d', _config.packetSize), | ||
]); | ||
} | ||
if (_config.extra) { | ||
@@ -85,2 +116,10 @@ ret = ret.concat(_config.extra); | ||
/** | ||
* Compute an option object for child_process.spawn | ||
* @return {object} - Refer to document of child_process.spawn | ||
*/ | ||
builder.getSpawnOptions = function () { | ||
return {}; | ||
}; | ||
module.exports = builder; |
@@ -18,2 +18,3 @@ 'use strict'; | ||
* @param {string} avg - Average time for collection records | ||
* @param {number} packetLoss - Packet Losses in percent (number) | ||
* @param {string} stddev - Standard deviation time for collected records | ||
@@ -24,4 +25,6 @@ */ | ||
* @constructor | ||
* | ||
* @param {PingConfig} config - Config object in probe() | ||
*/ | ||
function parser() { | ||
function parser(config) { | ||
// Initial state is 0 | ||
@@ -36,2 +39,3 @@ this._state = 0; | ||
time: 'unknown', | ||
times: [], | ||
min: 'unknown', | ||
@@ -41,2 +45,3 @@ max: 'unknown', | ||
stddev: 'unknown', | ||
packetLoss: 'unknown', | ||
}; | ||
@@ -52,2 +57,5 @@ | ||
this._stripRegex = /[ ]*\r?\n?$/g; | ||
// Ping Config | ||
this._pingConfig = config || {}; | ||
} | ||
@@ -158,2 +166,3 @@ | ||
ret.time = this._response.time = this._times[0]; | ||
ret.times = this._response.times = this._times; | ||
} | ||
@@ -177,3 +186,3 @@ | ||
// Fix min, avg, max, stddev up to 3 decimal points | ||
__.each(['min', 'avg', 'max', 'stddev'], function (key) { | ||
__.each(['min', 'avg', 'max', 'stddev', 'packetLoss'], function (key) { | ||
var v = ret[key]; | ||
@@ -180,0 +189,0 @@ if (__.isNumber(v)) { |
@@ -19,6 +19,10 @@ 'use strict'; | ||
* @param {string} platform - Name of the platform | ||
* @param {PingConfig} [config] - Config object in probe() | ||
* @return {object} - Parser | ||
* @throw if given platform is not supported | ||
*/ | ||
factory.createParser = function (platform) { | ||
factory.createParser = function (platform, config) { | ||
// Avoid function reassignment | ||
var _config = config || {}; | ||
if (!builderFactory.isPlatformSupport(platform)) { | ||
@@ -30,7 +34,7 @@ throw new Error(util.format('Platform |%s| is not support', platform)); | ||
if (builderFactory.isWindow(platform)) { | ||
ret = new WinParser(); | ||
ret = new WinParser(_config); | ||
} else if (builderFactory.isMacOS(platform)) { | ||
ret = new MacParser(); | ||
ret = new MacParser(_config); | ||
} else if (builderFactory.isLinux(platform)) { | ||
ret = new LinuxParser(); | ||
ret = new LinuxParser(_config); | ||
} | ||
@@ -37,0 +41,0 @@ |
@@ -9,5 +9,6 @@ 'use strict'; | ||
* @constructor | ||
* @param {PingConfig} config - Config object in probe() | ||
*/ | ||
function LinuxParser() { | ||
base.call(this); | ||
function LinuxParser(config) { | ||
base.call(this, config); | ||
} | ||
@@ -24,5 +25,13 @@ | ||
var tokens = line.split(' '); | ||
var isProbablyIPv4 = tokens[1].indexOf('(') === -1; | ||
this._response.host = tokens[1]; | ||
this._response.numeric_host = tokens[2].slice(1, -1); | ||
if (isProbablyIPv4) { | ||
this._response.host = tokens[1]; | ||
this._response.numeric_host = tokens[2].slice(1, -1); | ||
} else { | ||
// Normalise into either a 2 or 3 element array | ||
var foundAddresses = tokens.slice(1, -3).join('').match(/([^\s()]+)/g); | ||
this._response.host = foundAddresses.shift(); | ||
this._response.numeric_host = foundAddresses.pop(); | ||
} | ||
@@ -29,0 +38,0 @@ this._changeState(this.STATES.BODY); |
@@ -10,5 +10,6 @@ 'use strict'; | ||
* @constructor | ||
* @param {PingConfig} config - Config object in probe() | ||
*/ | ||
function MacParser() { | ||
base.call(this); | ||
function MacParser(config) { | ||
base.call(this, config); | ||
} | ||
@@ -40,3 +41,3 @@ | ||
if (count >= 3) { | ||
var regExp = /([0-9\.]+)[ ]*ms/; | ||
var regExp = /([0-9.]+)[ ]*ms/; | ||
var match = regExp.exec(line); | ||
@@ -57,6 +58,11 @@ this._times.push(parseFloat(match[1], 10)); | ||
MacParser.prototype._processFooter = function (line) { | ||
var packetLoss = line.match(/ ([\d.]+)%/); | ||
if (packetLoss) { | ||
this._response.packetLoss = parseFloat(packetLoss[1], 10); | ||
} | ||
// XXX: Assume number of keywords '/' more than 3 | ||
var count = (line.match(/[\/]/g) || []).length; | ||
var count = (line.match(/[/]/g) || []).length; | ||
if (count >= 3) { | ||
var regExp = /([0-9\.]+)/g; | ||
var regExp = /([0-9.]+)/g; | ||
// XXX: Assume min avg max stddev | ||
@@ -63,0 +69,0 @@ var m1 = regExp.exec(line); |
@@ -10,5 +10,6 @@ 'use strict'; | ||
* @constructor | ||
* @param {PingConfig} config - Config object in probe() | ||
*/ | ||
function WinParser() { | ||
base.call(this); | ||
function WinParser(config) { | ||
base.call(this, config); | ||
this._ipv4Regex = /^([0-9]{1,3}\.){3}[0-9]{1,3}$/; | ||
@@ -24,10 +25,31 @@ } | ||
WinParser.prototype._processHeader = function (line) { | ||
// XXX: Expect to find [****] when pinging domain like google.com | ||
// Read fixture/win/**/* for the detail | ||
var isPingNumeric = line.indexOf('[') === -1; | ||
// Get host and numeric_host | ||
var tokens = line.split(' '); | ||
this._response.host = tokens[1]; | ||
if (this._ipv4Regex.test(this._response.host)) { | ||
this._response.numeric_host = tokens[1]; | ||
if (isPingNumeric) { | ||
// For those missing [***], get the first token which match IPV4 regex | ||
this._response.host = __.find(tokens, function (t) { | ||
return this._ipv4Regex.test(t); | ||
}, this); | ||
this._response.numeric_host = this._response.host; | ||
} else { | ||
this._response.numeric_host = tokens[2].slice(1, -1); | ||
// For those has [***], anchor with such token | ||
var numericHost = __.find(tokens, function (t) { | ||
return t.indexOf('[') !== -1; | ||
}, this); | ||
var numericHostIndex = tokens.indexOf(numericHost); | ||
var match = /\[(.*)\]/.exec(numericHost); | ||
if (match) { | ||
// Capture IP inside [] only. refs #71 | ||
this._response.numeric_host = match[1]; | ||
} else { | ||
// Otherwise, just mark as NA to indicate an error | ||
this._response.numeric_host = 'NA'; | ||
} | ||
this._response.host = tokens[numericHostIndex - 1]; | ||
} | ||
@@ -39,19 +61,35 @@ | ||
/** | ||
* Process output's body | ||
* Process ipv6 output's body | ||
* @param {string} line - A line from system ping | ||
*/ | ||
WinParser.prototype._processBody = function (line) { | ||
WinParser.prototype._processIPV6Body = function (line) { | ||
var tokens = line.split(' '); | ||
var kvps = __.filter(tokens, function (token) { | ||
// Sometime it shows <1ms | ||
return token.indexOf('=') >= 0 || token.indexOf('<') >= 0; | ||
var dataFields = __.filter(tokens, function (token) { | ||
var isDataField = token.indexOf('=') >= 0 || token.indexOf('<') >= 0; | ||
return isDataField; | ||
}); | ||
// kvps.length >= 3 means target is pingable | ||
if (kvps.length >= 3) { | ||
// refs #65: Support system like french which has an extra space | ||
dataFields = __.map(dataFields, function (dataField) { | ||
var ret = dataField; | ||
var dataFieldIndex = tokens.indexOf(dataField); | ||
var nextIndex = dataFieldIndex + 1; | ||
// Append the missing *ms* | ||
if (nextIndex < tokens.length) { | ||
if (tokens[nextIndex] === 'ms') { | ||
ret += 'ms'; | ||
} | ||
} | ||
return ret; | ||
}); | ||
var expectDataFieldInReplyLine = 1; | ||
if (dataFields.length >= expectDataFieldInReplyLine) { | ||
// XXX: Assume time will alaways get keyword ms for all language | ||
var timeKVP = __.find(kvps, function (kvp) { | ||
return kvp.indexOf('ms') >= 0; | ||
var timeKVP = __.find(dataFields, function (dataField) { | ||
return dataField.search(/(ms|мс)/i) >= 0; | ||
}); | ||
var regExp = /([0-9\.]+)/; | ||
var regExp = /([0-9.]+)/; | ||
var match = regExp.exec(timeKVP); | ||
@@ -61,7 +99,54 @@ | ||
} | ||
}; | ||
// Change state if it see a ':' at the end | ||
if (line.slice(-1) === ':') { | ||
/** | ||
* Process ipv4 output's body | ||
* @param {string} line - A line from system ping | ||
*/ | ||
WinParser.prototype._processIPV4Body = function (line) { | ||
var tokens = line.split(' '); | ||
var byteTimeTTLFields = __.filter(tokens, function (token) { | ||
var isDataField = token.indexOf('=') >= 0 || token.indexOf('<') >= 0; | ||
return isDataField; | ||
}); | ||
var expectDataFieldInReplyLine = 3; | ||
var isReplyLine = byteTimeTTLFields.length >= expectDataFieldInReplyLine; | ||
if (isReplyLine) { | ||
var packetSize = this._pingConfig.packetSize; | ||
var byteField = __.find(byteTimeTTLFields, function (dataField) { | ||
var packetSizeToken = util.format('=%d', packetSize); | ||
var isByteField = dataField.indexOf(packetSizeToken) >= 0; | ||
return isByteField; | ||
}); | ||
// XXX: Assume time field will always be next of byte field | ||
var byteFieldIndex = byteTimeTTLFields.indexOf(byteField); | ||
var timeFieldIndex = byteFieldIndex + 1; | ||
var timeKVP = byteTimeTTLFields[timeFieldIndex]; | ||
var regExp = /([0-9.]+)/; | ||
var match = regExp.exec(timeKVP); | ||
this._times.push(parseFloat(match[1], 10)); | ||
} | ||
}; | ||
/** | ||
* Process output's body | ||
* @param {string} line - A line from system ping | ||
*/ | ||
WinParser.prototype._processBody = function (line) { | ||
var isPingSummaryLineShown = line.slice(-1) === ':'; | ||
if (isPingSummaryLineShown) { | ||
this._changeState(this.STATES.FOOTER); | ||
return; | ||
} | ||
var isIPV6 = this._pingConfig.v6; | ||
if (isIPV6) { | ||
this._processIPV6Body(line); | ||
} else { | ||
this._processIPV4Body(line); | ||
} | ||
}; | ||
@@ -74,6 +159,11 @@ | ||
WinParser.prototype._processFooter = function (line) { | ||
var packetLoss = line.match(/([\d.]+)%/); | ||
if (packetLoss) { | ||
this._response.packetLoss = parseFloat(packetLoss[1], 10); | ||
} | ||
// XXX: Assume there is a keyword ms | ||
if (line.indexOf('ms') >= 0) { | ||
if (line.search(/(ms|мсек)/i) >= 0) { | ||
// XXX: Assume the ordering is Min Max Avg | ||
var regExp = /([0-9\.]+)/g; | ||
var regExp = /([0-9.]+)/g; | ||
var m1 = regExp.exec(line); | ||
@@ -80,0 +170,0 @@ var m2 = regExp.exec(line); |
@@ -43,10 +43,17 @@ 'use strict'; | ||
var platform = os.platform(); | ||
var argumentBuilder = builderFactory.createBuilder(platform); | ||
ping = cp.spawn( | ||
builderFactory.getExecutablePath(platform), | ||
argumentBuilder.getResult(addr, _config) | ||
); | ||
try { | ||
var argumentBuilder = builderFactory.createBuilder(platform); | ||
var pingExecutablePath = builderFactory.getExecutablePath( | ||
platform, _config.v6 | ||
); | ||
var pingArgs = argumentBuilder.getCommandArguments(addr, _config); | ||
var spawnOptions = argumentBuilder.getSpawnOptions(); | ||
ping = cp.spawn(pingExecutablePath, pingArgs, spawnOptions); | ||
} catch (err) { | ||
deferred.reject(err); | ||
return deferred.promise; | ||
} | ||
// Initial parser | ||
var parser = parserFactory.createParser(platform); | ||
var parser = parserFactory.createParser(platform, _config); | ||
@@ -53,0 +60,0 @@ // Register events from system ping |
@@ -25,3 +25,3 @@ { | ||
"description": "a simple wrapper for ping", | ||
"version": "0.2.2", | ||
"version": "0.2.3", | ||
"homepage": "http://github.com/danielzzz/node-ping", | ||
@@ -43,3 +43,3 @@ "license": "MIT", | ||
"chai": "2.3.0", | ||
"eslint": "^3.8.1", | ||
"eslint": "^4.18.2", | ||
"eslint-config-airbnb": "^12.0.0", | ||
@@ -51,6 +51,6 @@ "eslint-config-eslint": "^3.0.0", | ||
"glob": "^7.1.1", | ||
"grunt": "^1.0.1", | ||
"grunt": "^1.0.3", | ||
"grunt-mocha-test": "^0.13.2", | ||
"gruntify-eslint": "^3.1.0", | ||
"mocha": "2.5.3", | ||
"mocha": "^5.2.0", | ||
"sinon": "1.17.6" | ||
@@ -57,0 +57,0 @@ }, |
@@ -1,8 +0,8 @@ | ||
#NODE-PING | ||
# NODE-PING | ||
a ping wrapper for nodejs | ||
@last-modified: 2016-10-21 12:43 | ||
@last-modified: 2020-04-04 | ||
#LICENSE MIT | ||
# LICENSE MIT | ||
@@ -13,15 +13,15 @@ (C) Daniel Zelisko | ||
#DESCRIPTION | ||
# DESCRIPTION | ||
node-ping is a simple wrapper for the system ping utility | ||
#INSTALLATION | ||
# INSTALLATION | ||
npm install ping | ||
#USAGE | ||
# USAGE | ||
Below are examples extracted from `examples` | ||
##Tradition calls | ||
## Tradition calls | ||
@@ -40,3 +40,3 @@ ```js | ||
##Tradition calls with configuration | ||
## Tradition calls with configuration | ||
@@ -47,3 +47,3 @@ ```js | ||
// WARNING: -i 2 may not work in other platform like window | ||
extra: ["-i 2"], | ||
extra: ['-i', '2'], | ||
}; | ||
@@ -59,3 +59,3 @@ | ||
##Promise wrapper | ||
## Promise wrapper | ||
@@ -75,3 +75,3 @@ ```js | ||
##Promise Wrapper with configable ping options | ||
## Promise Wrapper with configurable ping options | ||
@@ -83,3 +83,3 @@ ```js | ||
timeout: 10, | ||
extra: ["-i 2"], | ||
extra: ['-i', '2'], | ||
}).then(function (res) { | ||
@@ -91,2 +91,34 @@ console.log(res); | ||
## Async-Await | ||
```js | ||
var ping = require('ping'); | ||
var hosts = ['192.168.1.1', 'google.com', 'yahoo.com']; | ||
for(let host of hosts){ | ||
let res = await ping.promise.probe(host); | ||
console.log(res); | ||
} | ||
}); | ||
``` | ||
## Async-Await with configurable ping options | ||
```js | ||
var ping = require('ping'); | ||
var hosts = ['192.168.1.1', 'google.com', 'yahoo.com']; | ||
for(let host of hosts){ | ||
// WARNING: -i 2 argument may not work in other platform like window | ||
let res = await ping.promise.probe(host, { | ||
timeout: 10, | ||
extra: ['-i', '2'], | ||
}); | ||
console.log(res); | ||
} | ||
}); | ||
``` | ||
### Support configuration | ||
@@ -101,4 +133,14 @@ | ||
* @property {boolean} numeric - Map IP address to hostname or not | ||
* @property {number} timeout - Time duration for ping command to exit | ||
* @property {number} timeout - Timeout in seconds for each ping request. | ||
* Behaviour varies between platforms. Check platform ping documentation for more information. | ||
* @property {number} deadline - Specify a timeout, in seconds, before ping exits regardless of | ||
how many packets have been sent or received. In this case ping | ||
does not stop after count packet are sent, it waits either for | ||
deadline expire or until count probes are answered or for some | ||
error notification from network. This option is only available on linux and mac. | ||
* @property {number} min_reply - Exit after sending number of ECHO_REQUEST | ||
* @property {boolean} v6 - Ping via ipv6 or not. Default is false | ||
* @property {string} sourceAddr - source address for sending the ping | ||
* @property {number} packetSize - Specifies the number of data bytes to be sent | ||
Default: Linux / MAC: 56 Bytes, Window: 32 Bytes | ||
* @property {string[]} extra - Optional options does not provided | ||
@@ -110,3 +152,3 @@ */ | ||
* For callback based implementaiton: | ||
* For callback based implementation: | ||
@@ -133,5 +175,7 @@ ```js | ||
* @param {number} time - Time (float) in ms for first successful ping response | ||
* @param {Array} times - Array of Time (float) in ms for each ping response | ||
* @param {string} min - Minimum time for collection records | ||
* @param {string} max - Maximum time for collection records | ||
* @param {string} avg - Average time for collection records | ||
* @param {string} packetLoss - Packet Losses in percent (100% -> "100.000") | ||
* @param {string} stddev - Standard deviation time for collected records | ||
@@ -153,2 +197,16 @@ */ | ||
* For LINUX users, since we have enable `shell` option in child_process.spawn, | ||
make sure arguments you are passing in into this library are sanitized. | ||
Otherwise, any input containing shell metacharacters may be used to trigger | ||
arbitrary command | ||
# FAQ | ||
* It does not work with busybox's ping implemetation [#89](https://github.com/danielzzz/node-ping/issues/89) | ||
Try to install package `iputils`. For example, running `apk add iputils` | ||
* For questions regarding to the implementation of `timeout`, and `deadline`, please checkout discussions in | ||
[#101](https://github.com/danielzzz/node-ping/issues/101) | ||
# Contributing | ||
@@ -155,0 +213,0 @@ |
@@ -8,5 +8,12 @@ { | ||
"time": 5.371, | ||
"times": [ | ||
5.371, | ||
4.269, | ||
4.97, | ||
5.228 | ||
], | ||
"min": "4.269", | ||
"max": "5.371", | ||
"avg": "4.960", | ||
"packetLoss": "0.000", | ||
"stddev": "0.424" | ||
@@ -20,7 +27,84 @@ }, | ||
"time": 0.022, | ||
"times": [ | ||
0.022, | ||
0.027, | ||
0.029, | ||
0.03 | ||
], | ||
"min": "0.022", | ||
"max": "0.030", | ||
"avg": "0.027", | ||
"stddev": "0.003" | ||
"stddev": "0.003", | ||
"packetLoss": "0.000" | ||
}, | ||
"linux_en_sample2": { | ||
"host": "10.48.249.8", | ||
"numeric_host": "10.48.249.8", | ||
"alive": true, | ||
"output": "PING 10.48.249.8 (10.48.249.8) 56(84) bytes of data.\n64 bytes from 10.48.249.8: icmp_seq=1 ttl=64 time=2.98 ms\n64 bytes from 10.48.249.8: icmp_seq=2 ttl=64 time=0.890 ms\n64 bytes from 10.48.249.8: icmp_seq=3 ttl=64 time=0.711 ms\n64 bytes from 10.48.249.8: icmp_seq=4 ttl=64 time=0.863 ms\n64 bytes from 10.48.249.8: icmp_seq=5 ttl=64 time=1.20 ms\nping: sendmsg: Network is unreachable\nping: sendmsg: Network is unreachable\nping: sendmsg: Network is unreachable\n64 bytes from 10.48.249.8: icmp_seq=14 ttl=64 time=797 ms\n64 bytes from 10.48.249.8: icmp_seq=15 ttl=64 time=3.86 ms\n64 bytes from 10.48.249.8: icmp_seq=16 ttl=64 time=1.62 ms\n64 bytes from 10.48.249.8: icmp_seq=17 ttl=64 time=0.702 ms\n64 bytes from 10.48.249.8: icmp_seq=18 ttl=64 time=0.783 ms\n64 bytes from 10.48.249.8: icmp_seq=19 ttl=64 time=0.646 ms\n\n--- 10.48.249.8 ping statistics ---\n19 packets transmitted, 11 received, 42% packet loss, time 18195ms\nrtt min/avg/max/mdev = 0.646/73.819/797.744/228.927 ms\n", | ||
"time": 2.98, | ||
"times": [ | ||
2.98, | ||
0.89, | ||
0.711, | ||
0.863, | ||
1.2, | ||
797, | ||
3.86, | ||
1.62, | ||
0.702, | ||
0.783, | ||
0.646 | ||
], | ||
"min": "0.646", | ||
"max": "797.744", | ||
"avg": "73.819", | ||
"packetLoss": "42.000", | ||
"stddev": "228.927" | ||
}, | ||
"linux_en_sample3": { | ||
"host": "10.48.249.150", | ||
"numeric_host": "10.48.249.150", | ||
"alive": false, | ||
"output": "PING 10.48.249.150 (10.48.249.150) 56(84) bytes of data.\nFrom 10.48.249.95 icmp_seq=1 Destination Host Unreachable\nFrom 10.48.249.95 icmp_seq=2 Destination Host Unreachable\nFrom 10.48.249.95 icmp_seq=3 Destination Host Unreachable\n\n--- 10.48.249.150 ping statistics ---\n5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4079ms\n", | ||
"time": "unknown", | ||
"times": [], | ||
"min": "unknown", | ||
"max": "unknown", | ||
"avg": "unknown", | ||
"packetLoss": "100.000", | ||
"stddev": "unknown" | ||
}, | ||
"linux_en_v6_sample1": { | ||
"host": "2606:4700:4700::1111", | ||
"numeric_host": "2606:4700:4700::1111", | ||
"alive": true, | ||
"output": "PING 2606:4700:4700::1111(2606:4700:4700::1111) 56 data bytes\n64 bytes from 2606:4700:4700::1111: icmp_seq=1 ttl=57 time=0.672 ms\n64 bytes from 2606:4700:4700::1111: icmp_seq=2 ttl=57 time=1.00 ms\n\n--- 2606:4700:4700::1111 ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 1000ms\nrtt min/avg/max/mdev = 0.672/0.840/1.009/0.170 ms\n", | ||
"time": 0.672, | ||
"times": [ | ||
0.672, | ||
1.00 | ||
], | ||
"min": "0.672", | ||
"max": "1.009", | ||
"avg": "0.840", | ||
"packetLoss": "0.000", | ||
"stddev": "0.170" | ||
}, | ||
"linux_en_v6_sample2": { | ||
"host": "one.one.one.one", | ||
"numeric_host": "2606:4700:4700::1111", | ||
"alive": true, | ||
"output": "PING one.one.one.one(one.one.one.one (2606:4700:4700::1111)) 56 data bytes\n64 bytes from one.one.one.one (2606:4700:4700::1111): icmp_seq=1 ttl=60 time=1.66 ms\n64 bytes from one.one.one.one (2606:4700:4700::1111): icmp_seq=2 ttl=60 time=1.42 ms\n\n--- one.one.one.one ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 1001ms\nrtt min/avg/max/mdev = 1.429/1.546/1.663/0.117 ms\n", | ||
"time": 1.66, | ||
"times": [ | ||
1.66, | ||
1.42 | ||
], | ||
"min": "1.429", | ||
"max": "1.663", | ||
"avg": "1.546", | ||
"packetLoss": "0.000", | ||
"stddev": "0.117" | ||
}, | ||
"window_en_sample1": { | ||
@@ -32,7 +116,87 @@ "host": "www.some-domain.com", | ||
"time": 564, | ||
"times": [ | ||
564, | ||
555, | ||
554, | ||
548 | ||
], | ||
"min": "548.000", | ||
"max": "564.000", | ||
"avg": "555.000", | ||
"stddev": "5.723", | ||
"packetLoss": "0.000", | ||
"stddev": "5.723" | ||
}, | ||
"window_fr_sample1": { | ||
"host": "127.0.0.1", | ||
"numeric_host": "127.0.0.1", | ||
"alive": true, | ||
"output": "Envoi d’une requete 'Ping' 127.0.0.1 avec 32 octets de donnees :\nReponse de 127.0.0.1 : octets=32 temps<1ms TTL=128\nReponse de 127.0.0.1 : octets=32 temps<1ms TTL=128\nReponse de 127.0.0.1 : octets=32 temps<1ms TTL=128\nReponse de 127.0.0.1 : octets=32 temps<1ms TTL=128\n\nStatistiques Ping pour 127.0.0.1:\nPaquets : envoyes = 4, recus = 4, perdus = 0 (perte 0%),\nDuree approximative des boucles en millisecondes :\nMinimum = 0ms, Maximum = 0ms, Moyenne = 0ms\n", | ||
"time": 1, | ||
"times": [ | ||
1, | ||
1, | ||
1, | ||
1 | ||
], | ||
"min": "0.000", | ||
"max": "0.000", | ||
"avg": "0.000", | ||
"stddev": "1.000", | ||
"packetLoss": "0.000" | ||
}, | ||
"window_fr_sample2": { | ||
"host": "8.8.8.8", | ||
"numeric_host": "8.8.8.8", | ||
"alive": true, | ||
"output": "Envoi d’une requete 'Ping' 8.8.8.8 avec 32 octets de donnees :\nReponse de 8.8.8.8 : octets=32 temps=6 ms TTL=58\nReponse de 8.8.8.8 : octets=32 temps=6 ms TTL=58\nReponse de 8.8.8.8 : octets=32 temps=6 ms TTL=58\nReponse de 8.8.8.8 : octets=32 temps=6 ms TTL=58\n\nStatistiques Ping pour 8.8.8.8:\nPaquets : envoyes = 4, recus = 4, perdus = 0 (perte 0%),\nDuree approximative des boucles en millisecondes :\nMinimum = 6ms, Maximum = 6ms, Moyenne = 6ms\n", | ||
"time": 6, | ||
"times": [ | ||
6, | ||
6, | ||
6, | ||
6 | ||
], | ||
"min": "6.000", | ||
"max": "6.000", | ||
"avg": "6.000", | ||
"stddev": "0.000", | ||
"packetLoss": "0.000" | ||
}, | ||
"window_ja_sample1": { | ||
"host": "google.com", | ||
"numeric_host": "216.58.197.142", | ||
"alive": true, | ||
"output": "google.com [216.58.197.142]に ping を送信しています 32 バイトのデータ:\n216.58.197.142 からの応答: バイト数 =32 時間 =7ms TTL=55\n216.58.197.142 からの応答: バイト数 =32 時間 =5ms TTL=55\n216.58.197.142 からの応答: バイト数 =32 時間 =4ms TTL=55\n216.58.197.142 からの応答: バイト数 =32 時間 =4ms TTL=55\n\n216.58.197.142 の ping 統計:\n パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、\nラウンド トリップの概算時間 (ミリ秒):\n 最小 = 4ms、最大 = 7ms、平均 = 5ms\n", | ||
"time": 7, | ||
"times": [ | ||
7, | ||
5, | ||
4, | ||
4 | ||
], | ||
"min": "4.000", | ||
"max": "7.000", | ||
"avg": "5.000", | ||
"stddev": "1.225", | ||
"packetLoss": "0.000" | ||
}, | ||
"window_ja_sample2": { | ||
"host": "8.8.8.8", | ||
"numeric_host": "8.8.8.8", | ||
"alive": true, | ||
"output": "8.8.8.8 に ping を送信しています 32 バイトのデータ:\n8.8.8.8 からの応答: バイト数 =32 時間 =4ms TTL=58\n8.8.8.8 からの応答: バイト数 =32 時間 =4ms TTL=58\n8.8.8.8 からの応答: バイト数 =32 時間 =5ms TTL=58\n8.8.8.8 からの応答: バイト数 =32 時間 =6ms TTL=58\n\n8.8.8.8 の ping 統計:\n パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、\nラウンド トリップの概算時間 (ミリ秒):\n 最小 = 4ms、最大 = 6ms、平均 = 4ms\n", | ||
"time": 4, | ||
"times": [ | ||
4, | ||
4, | ||
5, | ||
6 | ||
], | ||
"min": "4.000", | ||
"max": "6.000", | ||
"avg": "4.000", | ||
"stddev": "1.118", | ||
"packetLoss": "0.000" | ||
}, | ||
"window_zh_sample1": { | ||
@@ -44,6 +208,13 @@ "host": "google.com", | ||
"time": 2, | ||
"times": [ | ||
2, | ||
2, | ||
3, | ||
3 | ||
], | ||
"min": "2.000", | ||
"max": "3.000", | ||
"avg": "2.000", | ||
"stddev": "0.707" | ||
"stddev": "0.707", | ||
"packetLoss": "0.000" | ||
}, | ||
@@ -56,6 +227,13 @@ "window_zh_sample2": { | ||
"time": 2, | ||
"times": [ | ||
2, | ||
2, | ||
3, | ||
3 | ||
], | ||
"min": "2.000", | ||
"max": "3.000", | ||
"avg": "2.000", | ||
"stddev": "0.707" | ||
"stddev": "0.707", | ||
"packetLoss": "0.000" | ||
}, | ||
@@ -68,7 +246,48 @@ "window_zh_sample3": { | ||
"time": 1, | ||
"times": [ | ||
1, | ||
1, | ||
1, | ||
1 | ||
], | ||
"min": "0.000", | ||
"max": "0.000", | ||
"avg": "0.000", | ||
"stddev": "1.000" | ||
} | ||
} | ||
"stddev": "1.000", | ||
"packetLoss": "0.000" | ||
}, | ||
"window_ru_sample1": { | ||
"host": "8.8.8.8", | ||
"numeric_host": "8.8.8.8", | ||
"alive": true, | ||
"output": "Обмен пакетами с 8.8.8.8 по с 32 байтами данных:\nОтвет от 8.8.8.8: число байт=32 время=37мс TTL=55\nОтвет от 8.8.8.8: число байт=32 время=33мс TTL=55\nОтвет от 8.8.8.8: число байт=32 время=38мс TTL=55\nОтвет от 8.8.8.8: число байт=32 время=34мс TTL=55\n\nСтатистика Ping для 8.8.8.8:\n Пакетов: отправлено = 4, получено = 4, потеряно = 0\n (0% потерь)\nПриблизительное время приема-передачи в мс:\n Минимальное = 33мсек, Максимальное = 38 мсек, Среднее = 35 мсек", | ||
"time": 37, | ||
"times": [ | ||
37, | ||
33, | ||
38, | ||
34 | ||
], | ||
"min": "33.000", | ||
"max": "38.000", | ||
"avg": "35.000", | ||
"stddev": "2.121", | ||
"packetLoss": "0.000" | ||
}, | ||
"window_de_v6_sample": { "host": "google.de", | ||
"alive": true, | ||
"output": "Ping wird ausgeführt für google.de [2a00:1450:4001:810::2003] von 3001:4cb0:0:f282:ddf1:bec9:1e0:bfa9 mit 32 Bytes Daten:\nAntwort von 2a00:1450:4001:810::2003: Zeit=11ms\nAntwort von 2a00:1450:4001:810::2003: Zeit=11ms\nAntwort von 2a00:1450:4001:810::2003: Zeit=18ms\nAntwort von 2a00:1450:4001:810::2003: Zeit=11ms\n\nPing-Statistik für 2a00:1450:4001:810::2003:\n Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0\n (0% Verlust),\nCa. Zeitangaben in Millisek.:\n Minimum = 11ms, Maximum = 18ms, Mittelwert = 12ms\n", | ||
"time": 11, | ||
"times": [ | ||
11, | ||
11, | ||
18, | ||
11 | ||
], | ||
"min": "11.000", | ||
"max": "18.000", | ||
"avg": "12.000", | ||
"packetLoss": "0.000", | ||
"stddev": "3.122", | ||
"numeric_host": "2a00:1450:4001:810::2003" } | ||
} |
@@ -12,2 +12,3 @@ 'use strict'; | ||
'aix', | ||
'android', | ||
'linux', | ||
@@ -59,5 +60,5 @@ ]; | ||
]); | ||
targetDirectory = path.posix.join.apply(path.posix, targetDirectory); | ||
targetDirectory = path.posix.join.apply(path.posix, targetDirectory); | ||
return glob.sync(targetDirectory); | ||
}; |
'use strict'; | ||
/* global describe it before after*/ | ||
@@ -20,2 +21,3 @@ /* eslint no-unused-expressions: 0 */ | ||
var ANSWER = require('./fixture/answer'); | ||
var PLATFORMS = [ | ||
@@ -26,2 +28,3 @@ 'window', | ||
// 'aix', | ||
'android', | ||
'linux', | ||
@@ -33,2 +36,3 @@ ]; | ||
freebsd: ['-c', '2'], | ||
android: ['-c', '2'], | ||
linux: ['-c', '2'], | ||
@@ -123,2 +127,82 @@ }; | ||
describe('ping timeout and deadline options', function () { | ||
describe('on linux platform', function () { | ||
beforeEach(function () { | ||
this.platformStub = sinon.stub(os, 'platform', | ||
function () { return 'linux'; }); | ||
const fixturePath = path.join(__dirname, 'fixture', | ||
'linux', 'en', 'sample1.txt'); | ||
this.spawnStub = sinon.stub(cp, 'spawn', mockOutSpawn(fixturePath)); | ||
}); | ||
afterEach(function () { | ||
this.platformStub.restore(); | ||
this.spawnStub.restore(); | ||
}); | ||
it('are forwarded to the ping binary', function () { | ||
return ping.promise.probe('whatever', { | ||
timeout: 47, | ||
deadline: 83, | ||
}).then(function () { | ||
const spawnArgs = this.spawnStub.getCalls()[0].args; | ||
const pingArgs = spawnArgs[1]; | ||
expect(pingArgs[pingArgs.indexOf('-W') + 1]).to.equal('47'); | ||
expect(pingArgs[pingArgs.indexOf('-w') + 1]).to.equal('83'); | ||
}.bind(this)); | ||
}); | ||
}); | ||
describe('on windows platform', function () { | ||
beforeEach(function () { | ||
this.platformStub = sinon.stub(os, 'platform', | ||
function () { return 'window'; }); | ||
const fixturePath = path.join(__dirname, 'fixture', | ||
'window', 'en', 'sample1.txt'); | ||
this.spawnStub = sinon.stub(cp, 'spawn', mockOutSpawn(fixturePath)); | ||
}); | ||
afterEach(function () { | ||
this.platformStub.restore(); | ||
this.spawnStub.restore(); | ||
}); | ||
it('results in an error as deadline is not supported', function () { | ||
return ping.promise.probe('whatever', { | ||
timeout: 47, | ||
deadline: 83, | ||
}).then(function () { | ||
throw new Error('deadline should result in an error'); | ||
}).catch(function () {}); | ||
}); | ||
}); | ||
describe('on mac platform', function () { | ||
beforeEach(function () { | ||
this.platformStub = sinon.stub(os, 'platform', | ||
function () { return 'freebsd'; }); | ||
const fixturePath = path.join(__dirname, 'fixture', | ||
'macos', 'en', 'sample1.txt'); | ||
this.spawnStub = sinon.stub(cp, 'spawn', mockOutSpawn(fixturePath)); | ||
}); | ||
afterEach(function () { | ||
this.platformStub.restore(); | ||
this.spawnStub.restore(); | ||
}); | ||
it('are forwarded to the ping binary', function () { | ||
return ping.promise.probe('whatever', { | ||
timeout: 47, | ||
deadline: 83, | ||
}).then(function () { | ||
const spawnArgs = this.spawnStub.getCalls()[0].args; | ||
const pingArgs = spawnArgs[1]; | ||
expect(pingArgs[pingArgs.indexOf('-W') + 1]).to.equal('47000'); | ||
expect(pingArgs[pingArgs.indexOf('-t') + 1]).to.equal('83'); | ||
}.bind(this)); | ||
}); | ||
}); | ||
}); | ||
describe('Ping in callback mode', function () { | ||
@@ -142,8 +226,10 @@ var pingExecution = function (fp, args) { | ||
if (args) { | ||
ping.sys.probe('whatever', cb, args); | ||
} else { | ||
ping.sys.probe('whatever', cb); | ||
var _args = args; | ||
if (fp.includes('v6')) { | ||
_args = _args || {}; | ||
_args.v6 = true; | ||
} | ||
ping.sys.probe('whatever', cb, _args); | ||
stub.restore(); | ||
@@ -173,7 +259,8 @@ | ||
var ret = null; | ||
if (args) { | ||
ret = ping.promise.probe('whatever', args); | ||
} else { | ||
ret = ping.promise.probe('whatever'); | ||
var _args = args; | ||
if (fp.includes('v6')) { | ||
_args = _args || {}; | ||
_args.v6 = true; | ||
} | ||
ret = ping.promise.probe('whatever', _args); | ||
@@ -194,1 +281,47 @@ stub.restore(); | ||
}); | ||
describe('Ping ipv6 on MAC OS', function () { | ||
var platform = 'darwin'; | ||
var stubs = []; | ||
before(function () { | ||
stubs.push( | ||
sinon.stub(os, 'platform', function () { return platform; }) | ||
); | ||
}); | ||
after(function () { | ||
stubs.forEach(function (stub) { | ||
stub.restore(); | ||
}); | ||
}); | ||
describe('With timeout setting', function () { | ||
var fixturePaths = loadFixturePath(platform); | ||
fixturePaths.forEach(function (fp) { | ||
it('Should raise an error', function (done) { | ||
var stub = sinon.stub( | ||
cp, | ||
'spawn', | ||
mockOutSpawn(fp) | ||
); | ||
var ret = ping.promise.probe( | ||
'whatever', | ||
{v6: true, timeout: 10} | ||
); | ||
stub.restore(); | ||
ret.then(function () { | ||
done(new Error('It should not be success')); | ||
}).catch(function (err) { | ||
expect(err.message).to.be.a('string'); | ||
expect(err.message).to.include('no timeout option'); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
105909
46
2880
207
3