2021-08-26 21:47:42 +02:00

332 lines
9.8 KiB
JavaScript

'use strict';
/* global describe it before after*/
/* eslint no-unused-expressions: 0 */
var expect = require('chai').expect;
var sinon = require('sinon');
var os = require('os');
var cp = require('child_process');
var q = require('q');
var fs = require('fs');
var path = require('path');
var util = require('util');
var events = require('events');
var loadFixturePath = require('./load-fixture-path');
var ping = require('..');
// Some constants
var ANSWER = require('./fixture/answer');
var PLATFORMS = [
'window',
'darwin',
'freebsd',
// 'aix',
'android',
'linux',
];
var PLATFORM_TO_EXTRA_ARGUMENTS = {
window: ['-n', '2'],
darwin: ['-c', '2'],
freebsd: ['-c', '2'],
android: ['-c', '2'],
linux: ['-c', '2'],
};
var pathToAnswerKey = function (p) {
var basename = path.posix.basename(p, '.txt');
var dirname = path.posix.basename(path.posix.dirname(p));
var osname = path.posix.basename(
path.posix.dirname(path.posix.dirname(p))
);
return [osname, dirname, basename].join('_');
};
var mockOutSpawn = function (fp) {
return function () {
var e = new events.EventEmitter();
e.stdout = e;
var s = fs.createReadStream(fp);
s.on('data', function (line) {
e.emit('data', line);
});
s.on('close', function () {
e.emit('close', 0);
});
return e;
};
};
var createTestCase = function (platform, pingExecution) {
var stubs = [];
describe(util.format('On %s platform', platform), function () {
var fixturePaths = loadFixturePath(platform);
before(function () {
stubs.push(
sinon.stub(os, 'platform').callsFake(function () { return platform; })
);
});
after(function () {
stubs.forEach(function (stub) {
stub.restore();
});
});
describe('runs with default config', function () {
fixturePaths.forEach(function (fp) {
it(
util.format('Using |%s|', pathToAnswerKey(fp)),
function () {
return pingExecution(fp);
}
);
});
});
describe('runs with custom config', function () {
fixturePaths.forEach(function (fp) {
it(
util.format('Using |%s|', pathToAnswerKey(fp)),
function () {
return pingExecution(fp, {
timeout: 10,
extra: PLATFORM_TO_EXTRA_ARGUMENTS[platform],
});
}
);
});
});
describe('runs with custom config with default gone', function () {
fixturePaths.forEach(function (fp) {
it(
util.format('Using |%s|', pathToAnswerKey(fp)),
function () {
return pingExecution(fp, {
timeout: false,
extra: PLATFORM_TO_EXTRA_ARGUMENTS[platform],
});
}
);
});
});
});
};
describe('ping timeout and deadline options', function () {
describe('on linux platform', function () {
beforeEach(function () {
this.platformStub = sinon.stub(os, 'platform').callsFake(function () { return 'linux'; });
const fixturePath = path.join(__dirname, 'fixture',
'linux', 'en', 'sample1.txt');
this.spawnStub = sinon.stub(cp, 'spawn').callsFake(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').callsFake(function () { return 'window'; });
const fixturePath = path.join(__dirname, 'fixture',
'window', 'en', 'sample1.txt');
this.spawnStub = sinon.stub(cp, 'spawn').callsFake(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').callsFake(function () { return 'freebsd'; });
const fixturePath = path.join(__dirname, 'fixture',
'macos', 'en', 'sample1.txt');
this.spawnStub = sinon.stub(cp, 'spawn').callsFake(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 () {
var pingExecution = function (fp, args) {
var deferred = q.defer();
var stub = sinon.stub(cp, 'spawn').callsFake(mockOutSpawn(fp));
var cb = function (isAlive, err) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(isAlive);
}
};
var _args = args;
if (fp.includes('v6')) {
_args = _args || {};
_args.v6 = true;
}
ping.sys.probe('whatever', cb, _args);
stub.restore();
return deferred.promise.then(function (data) {
var answerKey = pathToAnswerKey(fp);
var actualIsAlive = data;
var expectIsAlive = ANSWER[answerKey].alive;
expect(actualIsAlive).to.equal(expectIsAlive);
});
};
PLATFORMS.forEach(function (platform) {
createTestCase(platform, pingExecution);
});
});
describe('Ping in promise mode', function () {
var pingExecution = function (fp, args) {
var stub = sinon.stub(cp, 'spawn').callsFake(mockOutSpawn(fp));
var ret = null;
var _args = args;
if (fp.includes('v6')) {
_args = _args || {};
_args.v6 = true;
}
ret = ping.promise.probe('whatever', _args);
stub.restore();
return ret.then(function (data) {
var answerKey = pathToAnswerKey(fp);
var actualData = data;
var expectData = ANSWER[answerKey];
expect(actualData).to.deep.equal(expectData);
});
};
PLATFORMS.forEach(function (platform) {
createTestCase(platform, pingExecution);
});
});
describe('Ping ipv6 on MAC OS', function () {
var platform = 'darwin';
var stubs = [];
before(function () {
stubs.push(
sinon.stub(os, 'platform').callsFake(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').callsFake(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();
});
});
});
});
});
describe('Ping in promise mode with unknown exception', function () {
var pingExecution = function (fp, args) {
var unknownException = new Error('Unknown error!');
var stub = sinon.stub(cp, 'spawn').throws(unknownException);
var ret = null;
var _args = args;
if (fp.includes('v6')) {
_args = _args || {};
_args.v6 = true;
}
ret = ping.promise.probe('whatever', _args);
stub.restore();
return ret.catch(function (err) {
expect(err.message).to.be.a('string');
expect(err.message).to.include('Unknown error!');
});
};
PLATFORMS.forEach(function (platform) {
createTestCase(platform, pingExecution);
});
});