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(); | ||
|  |     }); | ||
|  | }; |