diff --git a/package.json b/package.json index b6c495f..78db5cf 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "testing dns", "main": "dns.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "node test/parser.js && node test/packer.js" }, "repository": { "type": "git", diff --git a/test/packer.js b/test/packer.js new file mode 100644 index 0000000..2c742c1 --- /dev/null +++ b/test/packer.js @@ -0,0 +1,6 @@ +;(function () { + 'use strict'; + + throw new Error("packer tests not written"); +}()); + diff --git a/test/parser.js b/test/parser.js new file mode 100644 index 0000000..768550e --- /dev/null +++ b/test/parser.js @@ -0,0 +1,71 @@ +;(function () { + //'use strict'; + + require('./convert-fixtures-to-json.js'); + + var assert = require('assert'); + var fs = require('fs'); + var path = require('path'); + var dnsjs = require('../').DNSPacket; + var expected; // shim + + var dirname = path.join(__dirname, 'fixtures'); + + function deepLike(expected, actual, prevKey) { + prevKey = prevKey || ''; + + return Object.keys(expected).every(function (key) { + var val = expected[key]; + + if (val && 'object' === typeof val && !Array.isArray(val)) { + if ('undefined' === typeof actual[key]) { + throw new Error("[" + prevKey + key + "] is missing from actual, but seen in expected"); + } + return deepLike(expected[key], actual[key], prevKey + '.'); + } + + if (Array.isArray(val)) { + // assumes that arrays do not contain non-primitive values (no nested objects or arrays) + return assert.deepEqual(val, actual[key]); + } + + if (val !== actual[key]) { + // value should always be a primitive by now (we do not expect functions) + throw new Error("[" + prevKey + key + "] actual is not equal to expected: " + expected[key] + ' : ' + actual[key]); + } + + return true; + }); + } + + fs.readdirSync(dirname).forEach(function (name) { + if (!/\.bin$/.test(name)) { + return; + } + + var filename = path.join(dirname, name); + + var expected = require(path.join(dirname, name.replace(/\.bin$/, '.json'))); + fs.readFile(filename, null, function (err, nb) { + console.log('Testing ' + filename); + + var ab = nb.buffer; + var result; + + try { + result = dnsjs.parse(ab); + } catch(e) { + console.log(ab); + console.error('[Error] ' + e.message); + console.error(''); + //console.error(e.stack); + return; + } + + // TODO deepHas + // compare two objects and make sure that the second has all of what the first has (but perhaps more) + + deepLike(expected, result); + }); + }); +}());