210 lines
5.9 KiB
JavaScript
210 lines
5.9 KiB
JavaScript
|
/*eslint no-console: 0*/
|
||
|
var debug = require('debug')('mdns-packet:test:helper');
|
||
|
var Code = require('code'); // assertion library
|
||
|
var expect = Code.expect;
|
||
|
|
||
|
var fs = require('fs');
|
||
|
var vm = require('vm');
|
||
|
var util = require('util');
|
||
|
var path = require('path');
|
||
|
|
||
|
var dns = require('../');
|
||
|
|
||
|
|
||
|
|
||
|
exports.createJs = function (obj) {
|
||
|
// var j = JSON.stringify(obj);
|
||
|
// obj = JSON.parse(j);
|
||
|
return util.inspect(obj, {depth: null});
|
||
|
};
|
||
|
|
||
|
exports.writeBin = function (filename, buf) {
|
||
|
var ws = fs.createWriteStream(filename);
|
||
|
ws.write(buf);
|
||
|
ws.end();
|
||
|
};
|
||
|
|
||
|
var writeJs = exports.writeJs = function (filename, obj) {
|
||
|
fs.writeFileSync(filename, exports.createJs(obj));
|
||
|
};
|
||
|
|
||
|
|
||
|
var readBin = exports.readBin = function (filename) {
|
||
|
return fs.readFileSync(filename);
|
||
|
};
|
||
|
|
||
|
exports.prepareJs = function (text) {
|
||
|
//replace <Buffer aa bb> with new Buffer("aabb", "hex")
|
||
|
var matches = text.match(/(<Buffer[ a-f0-9\.]*>)/g);
|
||
|
if (matches) {
|
||
|
debug('matches', matches);
|
||
|
matches.forEach(function (m) {
|
||
|
var bytes = m.match(/ ([a-f0-9]{2})/g);
|
||
|
var str = '';
|
||
|
if (bytes !== null) {
|
||
|
str = bytes.join('');
|
||
|
str = str.replace(/ /g, '');
|
||
|
str = str.replace(/\./g, '');
|
||
|
}
|
||
|
var r = 'new Buffer("' + str + '", "hex")';
|
||
|
text = text.replace(m, r);
|
||
|
});
|
||
|
}
|
||
|
//[Getter]
|
||
|
text = text.replace(/\[Getter\]/g, 'undefined');
|
||
|
return text;
|
||
|
};
|
||
|
|
||
|
var readJs = exports.readJs = function (filename) {
|
||
|
if (!fs.existsSync(filename)) {
|
||
|
return false;
|
||
|
}
|
||
|
var js = exports.prepareJs('foo = ' + fs.readFileSync(filename, 'utf8'));
|
||
|
var sandbox = {
|
||
|
Buffer: Buffer
|
||
|
};
|
||
|
return vm.runInNewContext(js, sandbox, filename);
|
||
|
};
|
||
|
|
||
|
exports.equalJs = function (expected, actual) {
|
||
|
var e = exports.createJs(expected);
|
||
|
var a = exports.createJs(actual);
|
||
|
expect(a, 'Objects are not the same').to.equal(e);
|
||
|
};
|
||
|
|
||
|
exports.equalBuffer = function (expected, actual, start) {
|
||
|
start = start || 0;
|
||
|
for (var i = start; i < expected.length; i++) {
|
||
|
var e = expected.toString('hex', i, i + 1);
|
||
|
var a = actual.toString('hex', i, i + 1);
|
||
|
var msg = util.format('offset %s', i.toString(16));
|
||
|
expect(a, msg).to.equal(e);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var equalDeep = exports.equalDeep = function (expected, actual, objpath) {
|
||
|
|
||
|
var np = objpath || 'root';
|
||
|
function dp (a, b) {
|
||
|
return a + '.' + b;
|
||
|
}
|
||
|
|
||
|
for (var key in expected) {
|
||
|
if (expected.hasOwnProperty(key)) {
|
||
|
debug('looking at key `%s` in `%s`', key, objpath);
|
||
|
if (key === 'payload') {
|
||
|
debug('payload is deprecated!!!');
|
||
|
continue;
|
||
|
}
|
||
|
if (actual instanceof Array) {
|
||
|
expect(actual[key]).to.exist();
|
||
|
}
|
||
|
else {
|
||
|
debug('actual value `%j`. expecting it to include key:`%s`...', actual, key);
|
||
|
expect(actual, objpath).to.include(key);
|
||
|
debug('...it did');
|
||
|
}
|
||
|
var a = actual[key];
|
||
|
var e = expected[key];
|
||
|
var prop;
|
||
|
try {
|
||
|
prop = Object.getOwnPropertyDescriptor(actual, key);
|
||
|
}
|
||
|
catch (err) {
|
||
|
console.error('key:`%s`, actual:`%s` of type `%s` got an error', key, actual, typeof actual, err);
|
||
|
throw err;
|
||
|
}
|
||
|
if (e instanceof Buffer) {
|
||
|
expect(a, 'not matching length of ' + dp(np, key))
|
||
|
.to.have.length(e.length);
|
||
|
|
||
|
expect(a.toString('hex'), 'buffer not same in ' + dp(np, key))
|
||
|
.to.equal(e.toString('hex'));
|
||
|
}
|
||
|
else if (typeof e === 'object') {
|
||
|
debug('expected is an `object` and actual is `%s`', typeof a);
|
||
|
expect(typeof a).not.to.equal('string');
|
||
|
equalDeep(e, a, dp(np, key));
|
||
|
}
|
||
|
else {
|
||
|
debug('it is not a Buffer or object that we are expecting');
|
||
|
if (key !== 'name') {
|
||
|
var atype = typeof a;
|
||
|
if (atype === 'undefined') {
|
||
|
expect(atype, util.format('type of key `%s` as unexpected', key)).to.equal(typeof e);
|
||
|
}
|
||
|
else {
|
||
|
//don't test getters
|
||
|
if (!prop.get) {
|
||
|
expect(a, util.format('%s (%s) is not as expected',
|
||
|
dp(np, key), atype)).to.equal(e);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
expect(a, util.format('wrong length of %s', dp(np, key)))
|
||
|
.to.have.length(e.length);
|
||
|
debug('actual: %s, expected: %s', a, e);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
exports.createWritingTests = function (lab, testFolder) {
|
||
|
//var describe = lab.describe;
|
||
|
var it = lab.it;
|
||
|
|
||
|
var files = fs.readdirSync(testFolder).filter(function (f) { return /\.js$/.test(f); });
|
||
|
files.forEach(function (file) {
|
||
|
it('can write ' + file, function (done) {
|
||
|
var js = readJs(path.join(testFolder, file));
|
||
|
expect(js).to.exist();
|
||
|
var buff = dns.DNSPacket.toBuffer(js);
|
||
|
var binFile = path.join(testFolder, file.replace(/\.js$/, '.bin'));
|
||
|
var bin = readBin(binFile);
|
||
|
var rtrip = dns.DNSPacket.parse(buff);
|
||
|
expect(buff).to.have.length(bin.length);
|
||
|
expect(buff).to.be.deep.equal(bin);
|
||
|
equalDeep(js, rtrip);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
|
||
|
exports.createParsingTests = function (lab, testFolder) {
|
||
|
//var describe = lab.describe;
|
||
|
var files = fs.readdirSync(testFolder).filter(function (f) { return /\.bin$/.test(f); });
|
||
|
files.forEach(function (file) {
|
||
|
exports.createFileParsingTest(lab, path.join(testFolder, file));
|
||
|
});
|
||
|
};
|
||
|
|
||
|
|
||
|
exports.createFileParsingTest = function (lab, binFile, withRoundtrip) {
|
||
|
var it = lab.it;
|
||
|
|
||
|
it('can parse ' + binFile, function (done) {
|
||
|
var bin = readBin(binFile);
|
||
|
var jsfile = binFile.replace(/\.bin$/, '.js');
|
||
|
var js = readJs(jsfile);
|
||
|
var ret = dns.DNSPacket.parse(bin);
|
||
|
debug(binFile, ret);
|
||
|
if (!js) {
|
||
|
writeJs(jsfile, ret);
|
||
|
}
|
||
|
else {
|
||
|
equalDeep(js, ret);
|
||
|
//equalJs(js, ret);
|
||
|
}
|
||
|
// //roundtrip
|
||
|
if (withRoundtrip) {
|
||
|
debug('roundtrip. js to bin');
|
||
|
var newbin = dns.DNSPacket.toBuffer(ret);
|
||
|
expect(newbin).to.deep.equal(bin);
|
||
|
}
|
||
|
done();
|
||
|
});
|
||
|
};
|