react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / node_modules / hawk / node_modules / sntp / test / index.js
81154 views// Load modules12var Dns = require('dns');3var Dgram = require('dgram');4var Lab = require('lab');5var Sntp = require('../lib');678// Declare internals910var internals = {};111213// Test shortcuts1415var lab = exports.lab = Lab.script();16var before = lab.before;17var after = lab.after;18var describe = lab.experiment;19var it = lab.test;20var expect = Lab.expect;212223describe('SNTP', function () {2425describe('#time', function () {2627it('returns consistent result over multiple tries', function (done) {2829Sntp.time(function (err, time) {3031expect(err).to.not.exist;32expect(time).to.exist;33var t1 = time.t;3435Sntp.time(function (err, time) {3637expect(err).to.not.exist;38expect(time).to.exist;39var t2 = time.t;40expect(Math.abs(t1 - t2)).is.below(200);41done();42});43});44});4546it('resolves reference IP', function (done) {4748Sntp.time({ host: 'ntp.exnet.com', resolveReference: true }, function (err, time) {4950expect(err).to.not.exist;51expect(time).to.exist;52expect(time.referenceHost).to.exist;53done();54});55});5657it('times out on no response', function (done) {5859Sntp.time({ port: 124, timeout: 100 }, function (err, time) {6061expect(err).to.exist;62expect(time).to.not.exist;63expect(err.message).to.equal('Timeout');64done();65});66});6768it('errors on error event', { parallel: false }, function (done) {6970var orig = Dgram.createSocket;71Dgram.createSocket = function (type) {7273Dgram.createSocket = orig;74var socket = Dgram.createSocket(type);75setImmediate(function () { socket.emit('error', new Error('Fake')) });76return socket;77};7879Sntp.time(function (err, time) {8081expect(err).to.exist;82expect(time).to.not.exist;83expect(err.message).to.equal('Fake');84done();85});86});8788it('errors on incorrect sent size', { parallel: false }, function (done) {8990var orig = Dgram.Socket.prototype.send;91Dgram.Socket.prototype.send = function (buf, offset, length, port, address, callback) {9293Dgram.Socket.prototype.send = orig;94return callback(null, 40);95};9697Sntp.time(function (err, time) {9899expect(err).to.exist;100expect(time).to.not.exist;101expect(err.message).to.equal('Could not send entire message');102done();103});104});105106it('times out on invalid host', function (done) {107108Sntp.time({ host: 'error', timeout: 10000 }, function (err, time) {109110expect(err).to.exist;111expect(time).to.not.exist;112expect(err.message).to.contain('getaddrinfo');113done();114});115});116117it('fails on bad response buffer size', function (done) {118119var server = Dgram.createSocket('udp4');120server.on('message', function (message, remote) {121var message = new Buffer(10);122server.send(message, 0, message.length, remote.port, remote.address, function (err, bytes) {123124server.close();125});126});127128server.bind(49123);129130Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {131132expect(err).to.exist;133expect(err.message).to.equal('Invalid server response');134done();135});136});137138var messup = function (bytes) {139140var server = Dgram.createSocket('udp4');141server.on('message', function (message, remote) {142143var message = new Buffer([1440x24, 0x01, 0x00, 0xe3,1450x00, 0x00, 0x00, 0x00,1460x00, 0x00, 0x00, 0x00,1470x41, 0x43, 0x54, 0x53,1480xd4, 0xa8, 0x2d, 0xc7,1490x1c, 0x5d, 0x49, 0x1b,1500xd4, 0xa8, 0x2d, 0xe6,1510x67, 0xef, 0x9d, 0xb2,1520xd4, 0xa8, 0x2d, 0xe6,1530x71, 0xed, 0xb5, 0xfb,1540xd4, 0xa8, 0x2d, 0xe6,1550x71, 0xee, 0x6c, 0xc5156]);157158for (var i = 0, il = bytes.length; i < il; ++i) {159message[bytes[i][0]] = bytes[i][1];160}161162server.send(message, 0, message.length, remote.port, remote.address, function (err, bytes) {163164server.close();165});166});167168server.bind(49123);169};170171it('fails on bad version', function (done) {172173messup([[0, (0 << 6) + (3 << 3) + (4 << 0)]]);174175Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {176177expect(err).to.exist;178expect(time.version).to.equal(3);179expect(err.message).to.equal('Invalid server response');180done();181});182});183184it('fails on bad originateTimestamp', function (done) {185186messup([[24, 0x83], [25, 0xaa], [26, 0x7e], [27, 0x80], [28, 0], [29, 0], [30, 0], [31, 0]]);187188Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {189190expect(err).to.exist;191expect(err.message).to.equal('Invalid server response');192done();193});194});195196it('fails on bad receiveTimestamp', function (done) {197198messup([[32, 0x83], [33, 0xaa], [34, 0x7e], [35, 0x80], [36, 0], [37, 0], [38, 0], [39, 0]]);199200Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {201202expect(err).to.exist;203expect(err.message).to.equal('Invalid server response');204done();205});206});207208it('fails on bad originate timestamp and alarm li', function (done) {209210messup([[0, (3 << 6) + (4 << 3) + (4 << 0)]]);211212Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {213214expect(err).to.exist;215expect(err.message).to.equal('Wrong originate timestamp');216expect(time.leapIndicator).to.equal('alarm');217done();218});219});220221it('returns time with death stratum and last61 li', function (done) {222223messup([[0, (1 << 6) + (4 << 3) + (4 << 0)], [1, 0]]);224225Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {226227expect(time.stratum).to.equal('death');228expect(time.leapIndicator).to.equal('last-minute-61');229done();230});231});232233it('returns time with reserved stratum and last59 li', function (done) {234235messup([[0, (2 << 6) + (4 << 3) + (4 << 0)], [1, 0x1f]]);236237Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {238239expect(time.stratum).to.equal('reserved');240expect(time.leapIndicator).to.equal('last-minute-59');241done();242});243});244245it('fails on bad mode (symmetric-active)', function (done) {246247messup([[0, (0 << 6) + (4 << 3) + (1 << 0)]]);248249Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {250251expect(err).to.exist;252expect(time.mode).to.equal('symmetric-active');253done();254});255});256257it('fails on bad mode (symmetric-passive)', function (done) {258259messup([[0, (0 << 6) + (4 << 3) + (2 << 0)]]);260261Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {262263expect(err).to.exist;264expect(time.mode).to.equal('symmetric-passive');265done();266});267});268269it('fails on bad mode (client)', function (done) {270271messup([[0, (0 << 6) + (4 << 3) + (3 << 0)]]);272273Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {274275expect(err).to.exist;276expect(time.mode).to.equal('client');277done();278});279});280281it('fails on bad mode (broadcast)', function (done) {282283messup([[0, (0 << 6) + (4 << 3) + (5 << 0)]]);284285Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {286287expect(err).to.exist;288expect(time.mode).to.equal('broadcast');289done();290});291});292293it('fails on bad mode (reserved)', function (done) {294295messup([[0, (0 << 6) + (4 << 3) + (6 << 0)]]);296297Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {298299expect(err).to.exist;300expect(time.mode).to.equal('reserved');301done();302});303});304});305306describe('#offset', function () {307308it('gets the current offset', function (done) {309310Sntp.offset(function (err, offset) {311312expect(err).to.not.exist;313expect(offset).to.not.equal(0);314done();315});316});317318it('gets the current offset from cache', function (done) {319320Sntp.offset(function (err, offset) {321322expect(err).to.not.exist;323expect(offset).to.not.equal(0);324var offset1 = offset;325Sntp.offset({}, function (err, offset) {326327expect(err).to.not.exist;328expect(offset).to.equal(offset1);329done();330});331});332});333334it('gets the new offset on different server', function (done) {335336Sntp.offset(function (err, offset) {337338expect(err).to.not.exist;339expect(offset).to.not.equal(0);340var offset1 = offset;341Sntp.offset({ host: 'nist1-sj.ustiming.org' }, function (err, offset) {342343expect(err).to.not.exist;344expect(offset).to.not.equal(offset1);345done();346});347});348});349350it('gets the new offset on different server', function (done) {351352Sntp.offset(function (err, offset) {353354expect(err).to.not.exist;355expect(offset).to.not.equal(0);356var offset1 = offset;357Sntp.offset({ port: 123 }, function (err, offset) {358359expect(err).to.not.exist;360expect(offset).to.not.equal(offset1);361done();362});363});364});365366it('fails getting the current offset on invalid server', function (done) {367368Sntp.offset({ host: 'error' }, function (err, offset) {369370expect(err).to.exist;371expect(offset).to.equal(0);372done();373});374});375});376377describe('#now', function () {378379it('starts auto-sync, gets now, then stops', function (done) {380381Sntp.stop();382383var before = Sntp.now();384expect(before).to.equal(Date.now());385386Sntp.start(function () {387388var now = Sntp.now();389expect(now).to.not.equal(Date.now());390Sntp.stop();391392done();393});394});395396it('starts twice', function (done) {397398Sntp.start(function () {399400Sntp.start(function () {401402var now = Sntp.now();403expect(now).to.not.equal(Date.now());404Sntp.stop();405406done();407});408});409});410411it('starts auto-sync, gets now, waits, gets again after timeout', function (done) {412413Sntp.stop();414415var before = Sntp.now();416expect(before).to.equal(Date.now());417418Sntp.start({ clockSyncRefresh: 100 }, function () {419420var now = Sntp.now();421expect(now).to.not.equal(Date.now());422expect(now).to.equal(Sntp.now());423424setTimeout(function () {425426expect(Sntp.now()).to.not.equal(now);427Sntp.stop();428done();429}, 110);430});431});432});433});434435436437