diff --git a/.eslintrc b/.eslintrc index 86e39c3..6befad2 100644 --- a/.eslintrc +++ b/.eslintrc @@ -16,5 +16,6 @@ eqeqeq: [2, allow-null] no-underscore-dangle: 0 no-use-before-define: 0 + no-return-assign: 0 comma-style: [2, first] indent: [2, 2] diff --git a/package.json b/package.json index f553975..2212e0c 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "author": "David Keijser ", "license": "MIT", "scripts": { - "lint": "eslint lib test", + "lint": "eslint lib test && coffeelint test", "test": "mocha --require test/bootstrap.js --compilers coffee:coffee-script/register --recursive test/unit", "bench": "coffee -c test/benchmark.coffee ; matcha test/benchmark.js", "coverage": "istanbul cover _mocha --report lcovonly -- --require test/bootstrap.js --compilers coffee:coffee-script/register --recursive test/unit", @@ -21,6 +21,7 @@ "billom": "^1.0.2", "chai": "^2.1.2", "coffee-script": "^1.7.1", + "coffeelint": "^1.9.4", "coveralls": "^2.11.1", "eslint": "^0.17.1", "istanbul": "^0.3.5", diff --git a/test/benchmark.coffee b/test/benchmark.coffee index 882bad2..990a604 100644 --- a/test/benchmark.coffee +++ b/test/benchmark.coffee @@ -1,23 +1,23 @@ suite 'rapidus.format', -> - {createFormatter} = require '../lib/sinks' + {createFormatter} = require '../lib/sinks' - record = - foo: 'foo-text' - bar: 'bar-text' - level: -> 'WARNING' + record = + foo: 'foo-text' + bar: 'bar-text' + level: -> 'WARNING' - set 'iterations', 100000 + set 'iterations', 100000 - simple = createFormatter ':foo' - complex = createFormatter '[:foo] :bar :level' - big = createFormatter '-:foo-:bar-:foo-:foo-:bar-:foo-:bar-:foo-:bar' + simple = createFormatter ':foo' + complex = createFormatter '[:foo] :bar :level' + big = createFormatter '-:foo-:bar-:foo-:foo-:bar-:foo-:bar-:foo-:bar' - bench 'simple attribute', -> - simple record + bench 'simple attribute', -> + simple record - bench 'complex format string', -> - complex record + bench 'complex format string', -> + complex record - bench 'big format string', -> - big record + bench 'big format string', -> + big record diff --git a/test/unit/test.default.coffee b/test/unit/test.default.coffee index af53751..40abb90 100644 --- a/test/unit/test.default.coffee +++ b/test/unit/test.default.coffee @@ -2,65 +2,65 @@ net = require 'net' sinon = require 'sinon' describe "default logger hierarchy", -> - {Record, Sink} = logging = require '../../lib' - root = logging.getLogger() - hier = root.hier + {Record, Sink} = logging = require '../../lib' + root = logging.getLogger() + hier = root.hier - afterEach -> - hier.processors = [] - hier.proxy = null - process.env.LOGGING_PROXY = '' + afterEach -> + hier.processors = [] + hier.proxy = null + process.env.LOGGING_PROXY = '' - describe "getLogger", -> - it "creates a logger", -> - log = logging.getLogger 'foo' - assert.equal log.name, 'foo' - assert.strictEqual log.parent, root + describe "getLogger", -> + it "creates a logger", -> + log = logging.getLogger 'foo' + assert.equal log.name, 'foo' + assert.strictEqual log.parent, root - describe "addDefaultProcessor", -> - it "adds a processor to the default hierarchy", -> - proc = sinon.stub() + describe "addDefaultProcessor", -> + it "adds a processor to the default hierarchy", -> + proc = sinon.stub() - logging.addDefaultProcessor proc - log = logging.getLogger 'bar' - log.info 'test' - assert.calledOnce proc - assert.calledWith proc, sinon.match.instanceOf Record + logging.addDefaultProcessor proc + log = logging.getLogger 'bar' + log.info 'test' + assert.calledOnce proc + assert.calledWith proc, sinon.match.instanceOf Record - describe "enableProxy", -> - server = net.createServer() + describe "enableProxy", -> + server = net.createServer() - before (done) -> - server.listen done + before (done) -> + server.listen done - after (done) -> - server.close done + after (done) -> + server.close done - it "attaches a proxy client to the default hierarchy", -> - logging.enableProxy - port: server.address().port - assert.property hier, 'proxy' - assert.isFunction hier.proxy.on - hier.proxy.end() + it "attaches a proxy client to the default hierarchy", -> + logging.enableProxy + port: server.address().port + assert.property hier, 'proxy' + assert.isFunction hier.proxy.on + hier.proxy.end() - describe "createProxy", -> - it "creates a proxy server for the default hierarchy", -> - proxy = logging.createProxy() - assert.isFunction proxy.on + describe "createProxy", -> + it "creates a proxy server for the default hierarchy", -> + proxy = logging.createProxy() + assert.isFunction proxy.on - describe "createHierarchy", -> - it "creates a new hierarchy", -> - hier = logging.createHierarchy() - assert.instanceOf hier, logging.Hierarchy + describe "createHierarchy", -> + it "creates a new hierarchy", -> + hier = logging.createHierarchy() + assert.instanceOf hier, logging.Hierarchy - describe "resetSinks", -> - it "resets the sinks of the default hierarchy", -> - sink = new Sink - sink.reset = sinon.stub() + describe "resetSinks", -> + it "resets the sinks of the default hierarchy", -> + sink = new Sink + sink.reset = sinon.stub() - logging.getLogger 'foo' - .addSink sink + logging.getLogger 'foo' + .addSink sink - logging.resetSinks() + logging.resetSinks() - assert.calledOnce sink.reset + assert.calledOnce sink.reset diff --git a/test/unit/test.format.coffee b/test/unit/test.format.coffee index 3b8b032..9778a86 100644 --- a/test/unit/test.format.coffee +++ b/test/unit/test.format.coffee @@ -2,33 +2,33 @@ {Sink, createFormatter} = require '../../lib/sinks' describe "createFormatter", -> - record = new Record 'access', 10, new Date, "%s - %s", ['foo', 10] - record.headers = - 'content-length': '500', - 'content-type': 'application/json' + record = new Record 'access', 10, new Date, "%s - %s", ['foo', 10] + record.headers = + 'content-length': '500', + 'content-type': 'application/json' - it "creates a format function", -> - frmt = createFormatter ':message' - assert.isFunction frmt + it "creates a format function", -> + frmt = createFormatter ':message' + assert.isFunction frmt - it "resolves simple attributes", -> - frmt = createFormatter ':level:name' - str = frmt record - assert.equal str, '10access' + it "resolves simple attributes", -> + frmt = createFormatter ':level:name' + str = frmt record + assert.equal str, '10access' - it "calls attributes that are resolved to functions", -> - frmt = createFormatter ':levelName :message' - str = frmt record - assert.equal str, 'DEBUG foo - 10' + it "calls attributes that are resolved to functions", -> + frmt = createFormatter ':levelName :message' + str = frmt record + assert.equal str, 'DEBUG foo - 10' - it "formats undefined as a dash", -> - frmt = createFormatter ':levelName :badvariable' - str = frmt record - assert.equal str, 'DEBUG -' + it "formats undefined as a dash", -> + frmt = createFormatter ':levelName :badvariable' + str = frmt record + assert.equal str, 'DEBUG -' describe "defaultFormatter", -> - record = new Record 'access', 10, new Date, "%s - %s", ['foo', 10] - sink = new Sink - str = sink.format record - # Starts with a timestamp but that's ignored by the assert - assert.match str, /.* - DEBUG - foo - 10/ + record = new Record 'access', 10, new Date, "%s - %s", ['foo', 10] + sink = new Sink + str = sink.format record + # Starts with a timestamp but that's ignored by the assert + assert.match str, /.* - DEBUG - foo - 10/ diff --git a/test/unit/test.hierarchy.coffee b/test/unit/test.hierarchy.coffee index ad1af90..71d0102 100644 --- a/test/unit/test.hierarchy.coffee +++ b/test/unit/test.hierarchy.coffee @@ -2,80 +2,80 @@ sinon = require 'sinon' describe "Hierarchy", -> - hier = null - root = new Logger null, 'root' + hier = null + root = new Logger null, 'root' - beforeEach -> - hier = new Hierarchy root - root.hier = hier + beforeEach -> + hier = new Hierarchy root + root.hier = hier - it "gives access to the root logger", -> - log = hier.getLogger() - assert.strictEqual log, root + it "gives access to the root logger", -> + log = hier.getLogger() + assert.strictEqual log, root - it "creates a logger", -> - log = hier.getLogger 'foo' - assert.equal log.name, 'foo' - assert.strictEqual log.parent, root + it "creates a logger", -> + log = hier.getLogger 'foo' + assert.equal log.name, 'foo' + assert.strictEqual log.parent, root - it "adds default processors to logger", -> - proc = sinon.stub() + it "adds default processors to logger", -> + proc = sinon.stub() - hier.addDefaultProcessor proc + hier.addDefaultProcessor proc - log = hier.getLogger 'foo' - log.info 'test' - assert.calledOnce proc - assert.calledWith proc, sinon.match.instanceOf Record + log = hier.getLogger 'foo' + log.info 'test' + assert.calledOnce proc + assert.calledWith proc, sinon.match.instanceOf Record - it "returns the same logger when called twice", -> - frst = hier.getLogger 'foo' - scnd = hier.getLogger 'foo' - assert.strictEqual frst, scnd + it "returns the same logger when called twice", -> + frst = hier.getLogger 'foo' + scnd = hier.getLogger 'foo' + assert.strictEqual frst, scnd - it "configures parent of sublogger", -> - parent = hier.getLogger 'foo' - log = hier.getLogger 'foo.bar' - assert.equal log.name, 'foo.bar' - assert.strictEqual log.parent, parent + it "configures parent of sublogger", -> + parent = hier.getLogger 'foo' + log = hier.getLogger 'foo.bar' + assert.equal log.name, 'foo.bar' + assert.strictEqual log.parent, parent - it "patches existing loggers when replacing placeholder", -> - suba = hier.getLogger 'foo.bar' - subb = hier.getLogger 'foo.baz' - log = hier.getLogger 'foo' + it "patches existing loggers when replacing placeholder", -> + suba = hier.getLogger 'foo.bar' + subb = hier.getLogger 'foo.baz' + log = hier.getLogger 'foo' - assert.strictEqual suba.parent, log - assert.strictEqual subb.parent, log + assert.strictEqual suba.parent, log + assert.strictEqual subb.parent, log - it "resets the sinks of all attached loggers", -> - suba = hier.getLogger 'foo.bar' - subb = hier.getLogger 'foo.baz' + it "resets the sinks of all attached loggers", -> + suba = hier.getLogger 'foo.bar' + subb = hier.getLogger 'foo.baz' - sinka = new Sink - sinka.reset = sinon.stub() + sinka = new Sink + sinka.reset = sinon.stub() - sinkb = new Sink - sinkb.reset = sinon.stub() + sinkb = new Sink + sinkb.reset = sinon.stub() - suba.addSink sinka - suba.addSink sinkb - suba.addSink {} + suba.addSink sinka + suba.addSink sinkb + suba.addSink {} - hier.resetSinks() + hier.resetSinks() - assert.calledOnce sinka.reset - assert.calledOnce sinkb.reset + assert.calledOnce sinka.reset + assert.calledOnce sinkb.reset - it "resets a reused sink once", -> - suba = hier.getLogger 'foo' - subb = hier.getLogger 'bar' + it "resets a reused sink once", -> + suba = hier.getLogger 'foo' + subb = hier.getLogger 'bar' - sinka = new Sink - sinka.reset = sinon.stub() + sinka = new Sink + sinka.reset = sinon.stub() - suba.addSink sinka - subb.addSink sinka + suba.addSink sinka + subb.addSink sinka - hier.resetSinks() + hier.resetSinks() - assert.calledOnce sinka.reset + assert.calledOnce sinka.reset diff --git a/test/unit/test.logger.coffee b/test/unit/test.logger.coffee index 5f75303..f785700 100644 --- a/test/unit/test.logger.coffee +++ b/test/unit/test.logger.coffee @@ -1,207 +1,208 @@ sinon = require 'sinon' describe "Logger", -> - {Logger, Record, Sink} = require '../../lib' - hier = {} - - it "accepts level as symbolic name", -> - log = new Logger hier, 'foo', 'error' - assert.equal log.getEffectiveLevel(), 40 - - describe "getEffectiveLevel", -> - it "returns the level of the logger when set", -> - log = new Logger hier, 'foo', 10 - assert.equal log.getEffectiveLevel(), 10 - - it "returns 0 when no level is set", -> - log = new Logger hier, 'foo' - assert.equal log.getEffectiveLevel(), 0 - - it "checks parent until level is found", -> - loga = new Logger hier, 'root', 20 - logb = new Logger hier, 'foo', 10 - logc = new Logger hier, 'bar' - logd = new Logger hier, 'baz' - logc.parent = logb - logb.parent = loga - logd.parent = logc - assert.equal logd.getEffectiveLevel(), 10 - - describe "isEnabledFor", -> - it "checks if level is below the treshdold", -> - log = new Logger hier, 'foo', 10 - assert.isTrue log.isEnabledFor 10 - assert.isFalse log.isEnabledFor 9 - - it "uses the effective level", -> - parent = new Logger hier, 'foo', 20 - log = new Logger hier, 'bar' - log.parent = parent - assert.isTrue log.isEnabledFor 20 - assert.isFalse log.isEnabledFor 19 - - describe "setLevel", -> - it "sets the level from symbolic name", -> - log = new Logger hier, 'foo', 10 - log.setLevel 'info' - assert.equal log.getEffectiveLevel(), 20 - - it "sets the level to a number", -> - log = new Logger hier, 'foo', 10 - log.setLevel 30 - assert.equal log.getEffectiveLevel(), 30 - - describe "createRecord", -> - it "creates an instance of record", -> - log = new Logger hier, 'foo', 10 - record = log.createRecord 20, "message", ["arg1", "arg2"] - assert.instanceOf record, Record - - it "calls all the attached processors", -> - log = new Logger hier, 'foo', 10 - log.addProcessor (record) -> - record.procone = true - log.addProcessor (record) -> - record.proctwo = true - record = log.createRecord 20, "message", ["arg1", "arg2"] - assert.propertyVal record, 'procone', true - assert.propertyVal record, 'proctwo', true - - describe "importRecord", -> - it "creates a record instance from a JSON representation", -> - log = new Logger hier, 'foo', 10 - extrecord = - name: 'foo' - level: 10 - timestamp: '1401995732345' - msg: 'zoidberg' - args: null - - record = log.importRecord extrecord - assert.instanceOf record, Record - assert.instanceOf record.timestamp, Date - - it "carries additional attributes to instance", -> - log = new Logger hier, 'foo', 10 - extrecord = - name: 'foo' - level: 10 - timestamp: '1401995732345' - msg: 'zoidberg' - txid: 'asdaf' - args: null - record = log.importRecord extrecord - assert.propertyVal record, 'txid', 'asdaf' - - describe "addSink", -> - it "wraps function in Sink instance", -> - log = new Logger hier, 'foo' - log.addSink (record) -> - something - assert.instanceOf log.sinks[0], Sink - - it "appends sink instances as is", -> - log = new Logger hier, 'foo' - sink = new Sink - log.addSink sink - assert.instanceOf log.sinks[0], Sink - assert.strictEqual log.sinks[0], sink - - describe "log", -> - it "calls sinks with record created from input", -> - log = new Logger hier, 'foo' - sink = sinon.stub() - log.addSink sink - log.log 10, "foo" - assert.calledOnce sink - assert.calledWith sink, sinon.match.instanceOf Record - - it "does not call any sinks when level is below logger threshold", -> - log = new Logger hier, 'foo', 20 - sink = sinon.stub() - log.addSink sink - log.log 10, 'foo' - assert.equal sink.called, 0 - - it "does not call sink when level is below sink threshold", -> - log = new Logger hier, 'foo', 20 - sink = sinon.stub() - log.addSink new Sink sink, null, 30 - log.addSink new Sink sink, null, 20 - log.log 20, 'foo' - assert.calledOnce sink - - it "converts the symbolic names of log levels", -> - log = new Logger hier, 'foo' - sink = sinon.stub() - log.addSink sink - log.log 'WARNING', 'foo' - assert.calledOnce sink - assert.equal sink.args[0][0].level, 30 - - it "sends record to proxy", -> - proxyHier = - proxy: - sendRecord: sinon.stub() - - log = new Logger proxyHier, 'foo' - log.log 20, 'foo' - - assert.calledOnce proxyHier.proxy.sendRecord - assert.calledWith proxyHier.proxy.sendRecord, sinon.match.instanceOf Record - - it "does not send record to proxy when below threshold", -> - proxyHier = - proxy: - sendRecord: sinon.stub() - - log = new Logger proxyHier, 'foo', 30 - log.log 20, 'foo' - - assert.equal proxyHier.proxy.sendRecord.called, 0 - - it "calls sink further up the hierarchy", -> - log = new Logger hier, 'foo.bar', 20 - log.parent = new Logger hier, 'foo', 20 - psink = sinon.stub() - log.parent.addSink psink - sink = sinon.stub() - log.addSink sink - - log.log 'WARNING', 'foo' - - assert.calledOnce psink - assert.calledOnce sink - assert.equal sink.args[0][0].level, 30 - - it "does not propagate records further when `propagate` is false", -> - log = new Logger hier, 'foo.bar', 20 - log.parent = new Logger hier, 'foo', 20 - log.propagate = false - psink = sinon.stub() - log.parent.addSink psink - sink = sinon.stub() - log.addSink sink - - log.log 'WARNING', 'foo' - - assert.calledOnce sink - assert.equal psink.callCount, 0, "call count of parent" - - describe "debug", -> - it "create log message at debug level", -> - log = new Logger hier, 'foo' - sink = sinon.stub() - log.addSink sink - log.debug 'foo' - assert.calledOnce sink - assert.equal sink.args[0][0].level, 10 - - describe "trace", -> - it "create log message at trace level", -> - log = new Logger hier, 'foo' - sink = sinon.stub() - log.addSink sink - log.trace 'foo' - assert.calledOnce sink - assert.equal sink.args[0][0].level, 5 + {Logger, Record, Sink} = require '../../lib' + hier = {} + + it "accepts level as symbolic name", -> + log = new Logger hier, 'foo', 'error' + assert.equal log.getEffectiveLevel(), 40 + + describe "getEffectiveLevel", -> + it "returns the level of the logger when set", -> + log = new Logger hier, 'foo', 10 + assert.equal log.getEffectiveLevel(), 10 + + it "returns 0 when no level is set", -> + log = new Logger hier, 'foo' + assert.equal log.getEffectiveLevel(), 0 + + it "checks parent until level is found", -> + loga = new Logger hier, 'root', 20 + logb = new Logger hier, 'foo', 10 + logc = new Logger hier, 'bar' + logd = new Logger hier, 'baz' + logc.parent = logb + logb.parent = loga + logd.parent = logc + assert.equal logd.getEffectiveLevel(), 10 + + describe "isEnabledFor", -> + it "checks if level is below the treshdold", -> + log = new Logger hier, 'foo', 10 + assert.isTrue log.isEnabledFor 10 + assert.isFalse log.isEnabledFor 9 + + it "uses the effective level", -> + parent = new Logger hier, 'foo', 20 + log = new Logger hier, 'bar' + log.parent = parent + assert.isTrue log.isEnabledFor 20 + assert.isFalse log.isEnabledFor 19 + + describe "setLevel", -> + it "sets the level from symbolic name", -> + log = new Logger hier, 'foo', 10 + log.setLevel 'info' + assert.equal log.getEffectiveLevel(), 20 + + it "sets the level to a number", -> + log = new Logger hier, 'foo', 10 + log.setLevel 30 + assert.equal log.getEffectiveLevel(), 30 + + describe "createRecord", -> + it "creates an instance of record", -> + log = new Logger hier, 'foo', 10 + record = log.createRecord 20, "message", ["arg1", "arg2"] + assert.instanceOf record, Record + + it "calls all the attached processors", -> + log = new Logger hier, 'foo', 10 + log.addProcessor (record) -> + record.procone = true + log.addProcessor (record) -> + record.proctwo = true + record = log.createRecord 20, "message", ["arg1", "arg2"] + assert.propertyVal record, 'procone', true + assert.propertyVal record, 'proctwo', true + + describe "importRecord", -> + it "creates a record instance from a JSON representation", -> + log = new Logger hier, 'foo', 10 + extrecord = + name: 'foo' + level: 10 + timestamp: '1401995732345' + msg: 'zoidberg' + args: null + + record = log.importRecord extrecord + assert.instanceOf record, Record + assert.instanceOf record.timestamp, Date + + it "carries additional attributes to instance", -> + log = new Logger hier, 'foo', 10 + extrecord = + name: 'foo' + level: 10 + timestamp: '1401995732345' + msg: 'zoidberg' + txid: 'asdaf' + args: null + record = log.importRecord extrecord + assert.propertyVal record, 'txid', 'asdaf' + + describe "addSink", -> + it "wraps function in Sink instance", -> + log = new Logger hier, 'foo' + log.addSink (record) -> + something + assert.instanceOf log.sinks[0], Sink + + it "appends sink instances as is", -> + log = new Logger hier, 'foo' + sink = new Sink + log.addSink sink + assert.instanceOf log.sinks[0], Sink + assert.strictEqual log.sinks[0], sink + + describe "log", -> + it "calls sinks with record created from input", -> + log = new Logger hier, 'foo' + sink = sinon.stub() + log.addSink sink + log.log 10, "foo" + assert.calledOnce sink + assert.calledWith sink, sinon.match.instanceOf Record + + it "does not call any sinks when level is below logger threshold", -> + log = new Logger hier, 'foo', 20 + sink = sinon.stub() + log.addSink sink + log.log 10, 'foo' + assert.equal sink.called, 0 + + it "does not call sink when level is below sink threshold", -> + log = new Logger hier, 'foo', 20 + sink = sinon.stub() + log.addSink new Sink sink, null, 30 + log.addSink new Sink sink, null, 20 + log.log 20, 'foo' + assert.calledOnce sink + + it "converts the symbolic names of log levels", -> + log = new Logger hier, 'foo' + sink = sinon.stub() + log.addSink sink + log.log 'WARNING', 'foo' + assert.calledOnce sink + assert.equal sink.args[0][0].level, 30 + + it "sends record to proxy", -> + proxyHier = + proxy: + sendRecord: sinon.stub() + + log = new Logger proxyHier, 'foo' + log.log 20, 'foo' + + assert.calledOnce proxyHier.proxy.sendRecord + assert.calledWith proxyHier.proxy.sendRecord, + sinon.match.instanceOf Record + + it "does not send record to proxy when below threshold", -> + proxyHier = + proxy: + sendRecord: sinon.stub() + + log = new Logger proxyHier, 'foo', 30 + log.log 20, 'foo' + + assert.equal proxyHier.proxy.sendRecord.called, 0 + + it "calls sink further up the hierarchy", -> + log = new Logger hier, 'foo.bar', 20 + log.parent = new Logger hier, 'foo', 20 + psink = sinon.stub() + log.parent.addSink psink + sink = sinon.stub() + log.addSink sink + + log.log 'WARNING', 'foo' + + assert.calledOnce psink + assert.calledOnce sink + assert.equal sink.args[0][0].level, 30 + + it "does not propagate records further when `propagate` is false", -> + log = new Logger hier, 'foo.bar', 20 + log.parent = new Logger hier, 'foo', 20 + log.propagate = false + psink = sinon.stub() + log.parent.addSink psink + sink = sinon.stub() + log.addSink sink + + log.log 'WARNING', 'foo' + + assert.calledOnce sink + assert.equal psink.callCount, 0, "call count of parent" + + describe "debug", -> + it "create log message at debug level", -> + log = new Logger hier, 'foo' + sink = sinon.stub() + log.addSink sink + log.debug 'foo' + assert.calledOnce sink + assert.equal sink.args[0][0].level, 10 + + describe "trace", -> + it "create log message at trace level", -> + log = new Logger hier, 'foo' + sink = sinon.stub() + log.addSink sink + log.trace 'foo' + assert.calledOnce sink + assert.equal sink.args[0][0].level, 5 diff --git a/test/unit/test.proxy.coffee b/test/unit/test.proxy.coffee index dbb55b2..43526ee 100644 --- a/test/unit/test.proxy.coffee +++ b/test/unit/test.proxy.coffee @@ -3,110 +3,111 @@ net = require 'net' sinon = require 'sinon' testServer = -> - expect = [] - server = net.createServer() + expect = [] + server = net.createServer() - server.after = (after) -> - if this._doneCallback - throw new Error "done callback already set" - this._doneCallback = after + server.after = (after) -> + if @_doneCallback + throw new Error "done callback already set" + @_doneCallback = after - server.done = (err) -> - this._doneCallback err - this._doneCallback = null + server.done = (err) -> + @_doneCallback err + @_doneCallback = null - server.expect = (verify) -> - expect.push(verify) + server.expect = (verify) -> + expect.push(verify) - server.on 'connection', (sock) -> - sock.on 'data', (chunk) -> - verify = expect.shift() + server.on 'connection', (sock) -> + sock.on 'data', (chunk) -> + verify = expect.shift() - try - verify chunk - catch err - server.done(err) + try + verify chunk + catch err + server.done(err) - if expect.length == 0 - server.done() + if expect.length == 0 + server.done() - server + server send = (server, data) -> - sock = new net.Socket + sock = new net.Socket - server.emit 'connection', sock - sock.emit 'data', data - sock.emit 'end' + server.emit 'connection', sock + sock.emit 'data', data + sock.emit 'end' describe "proxy", -> - proxy = require '../../lib/proxy' - - describe "isAvailable", -> - it "is true if a proxy path is in the environment", -> - process.env['LOGGING_PROXY'] = '/tmp/blah' - assert.isTrue proxy.isAvailable() - - it "is false if no proxy path is in the environment", -> - delete process.env['LOGGING_PROXY'] - assert.isFalse proxy.isAvailable() - - describe "client", -> - server = testServer() - - before (done) -> - server.listen done - - after (done) -> - server.close done - - it "sends record over socket", (done) -> - port = server.address().port - record = new Record 'name', 10, Date.now(), "%s - %s", ['foo', 10] - - server.after done - server.expect (chunk) -> - json = JSON.parse chunk.toString() - assert.propertyVal json, 'name', 'name' - assert.propertyVal json, 'msg', 'foo - 10' - - client = proxy.client {port: port} - client.sendRecord(record) - client.end() - - it "formats fancy objects before sending", (done) -> - port = server.address().port - record = new Record 'name', 10, Date.now(), "%s - %s", ['foo', new Error("OMG")] - - server.after done - server.expect (chunk) -> - json = JSON.parse chunk.toString() - assert.propertyVal json, 'msg', 'foo - Error: OMG' - - client = proxy.client {port: port} - client.sendRecord(record) - client.end() - - describe "server", -> - hier = {} - logger = {} - record = {__x: 777} - - beforeEach -> - hier.getLogger = sinon.stub().returns(logger) - logger.importRecord = sinon.stub().returns(record) - logger.dispatch = sinon.stub() - - server = proxy.server hier - - it "dispatches record received", -> - send server, JSON.stringify({name: 'test'}) + '\n' - - assert.calledOnce hier.getLogger - assert.calledWith hier.getLogger, 'test' - assert.calledOnce logger.importRecord - assert.calledWith logger.importRecord, {name: 'test'} - assert.calledOnce logger.dispatch - assert.calledWith logger.dispatch, record + proxy = require '../../lib/proxy' + + describe "isAvailable", -> + it "is true if a proxy path is in the environment", -> + process.env['LOGGING_PROXY'] = '/tmp/blah' + assert.isTrue proxy.isAvailable() + + it "is false if no proxy path is in the environment", -> + delete process.env['LOGGING_PROXY'] + assert.isFalse proxy.isAvailable() + + describe "client", -> + server = testServer() + + before (done) -> + server.listen done + + after (done) -> + server.close done + + it "sends record over socket", (done) -> + port = server.address().port + record = new Record 'name', 10, Date.now(), "%s - %s", ['foo', 10] + + server.after done + server.expect (chunk) -> + json = JSON.parse chunk.toString() + assert.propertyVal json, 'name', 'name' + assert.propertyVal json, 'msg', 'foo - 10' + + client = proxy.client {port: port} + client.sendRecord(record) + client.end() + + it "formats fancy objects before sending", (done) -> + port = server.address().port + record = new Record 'name', 10, Date.now(), "%s - %s", + ['foo', new Error("OMG")] + + server.after done + server.expect (chunk) -> + json = JSON.parse chunk.toString() + assert.propertyVal json, 'msg', 'foo - Error: OMG' + + client = proxy.client {port: port} + client.sendRecord(record) + client.end() + + describe "server", -> + hier = {} + logger = {} + record = {__x: 777} + + beforeEach -> + hier.getLogger = sinon.stub().returns(logger) + logger.importRecord = sinon.stub().returns(record) + logger.dispatch = sinon.stub() + + server = proxy.server hier + + it "dispatches record received", -> + send server, JSON.stringify({name: 'test'}) + '\n' + + assert.calledOnce hier.getLogger + assert.calledWith hier.getLogger, 'test' + assert.calledOnce logger.importRecord + assert.calledWith logger.importRecord, {name: 'test'} + assert.calledOnce logger.dispatch + assert.calledWith logger.dispatch, record diff --git a/test/unit/test.record.coffee b/test/unit/test.record.coffee index 81e6e90..c4964fa 100644 --- a/test/unit/test.record.coffee +++ b/test/unit/test.record.coffee @@ -1,56 +1,56 @@ sinon = require 'sinon' describe 'Record', -> - {Record} = require '../../lib' - - it "sets the expected attributes", -> - record = new Record 'name', 'level', 'timestamp', 'msg', 'args' - assert.equal record.name, 'name' - assert.equal record.level, 'level' - assert.equal record.timestamp, 'timestamp' - assert.equal record.msg, 'msg' - assert.equal record.args, 'args' - - describe "getLevelName", -> - it "returns the symbolic name of the level", -> - record = new Record 'name', 10, new Date, "test", [] - assert.equal record.getLevelName(), 'DEBUG' - - record = new Record 'name', 40, new Date, "test", [] - assert.equal record.getLevelName(), 'ERROR' - - describe "getMessage", -> - it "formats message by combining with args", -> - record = new Record 'name', 10, new Date, "%s - %s", ['foo', 10] - message = record.getMessage() - assert.equal message, "foo - 10" - - it "uses the stack of error objects", -> - err = new Error 'test' - - record = new Record 'name', 10, new Date, "error", [err] - message = record.getMessage() - assert.match message, /^error Error: test/ - - it "caches the formatted message and unsets the original args", -> - record = new Record 'name', 10, new Date, "%s - %s", ['foo', 10] - x = record.getMessage() - assert.equal record.args, null - y = record.getMessage() - assert.equal x, y - - describe "getTime", -> - date = new Date 'Thu Aug 21 2014 10:38:27' - - it "returns a formatted time string", -> - record = new Record 'name', 10, date, "%s - %s", ['foo', 10] - time = record.getTime() - assert.equal time, '10:38:27.000' - - describe "getDate", -> - date = new Date 'Thu Aug 21 2014 10:38:27' - - it "returns a formatted date string", -> - record = new Record 'name', 10, date, "%s - %s", ['foo', 10] - time = record.getDate() - assert.equal time, '2014-08-21' + {Record} = require '../../lib' + + it "sets the expected attributes", -> + record = new Record 'name', 'level', 'timestamp', 'msg', 'args' + assert.equal record.name, 'name' + assert.equal record.level, 'level' + assert.equal record.timestamp, 'timestamp' + assert.equal record.msg, 'msg' + assert.equal record.args, 'args' + + describe "getLevelName", -> + it "returns the symbolic name of the level", -> + record = new Record 'name', 10, new Date, "test", [] + assert.equal record.getLevelName(), 'DEBUG' + + record = new Record 'name', 40, new Date, "test", [] + assert.equal record.getLevelName(), 'ERROR' + + describe "getMessage", -> + it "formats message by combining with args", -> + record = new Record 'name', 10, new Date, "%s - %s", ['foo', 10] + message = record.getMessage() + assert.equal message, "foo - 10" + + it "uses the stack of error objects", -> + err = new Error 'test' + + record = new Record 'name', 10, new Date, "error", [err] + message = record.getMessage() + assert.match message, /^error Error: test/ + + it "caches the formatted message and unsets the original args", -> + record = new Record 'name', 10, new Date, "%s - %s", ['foo', 10] + x = record.getMessage() + assert.equal record.args, null + y = record.getMessage() + assert.equal x, y + + describe "getTime", -> + date = new Date 'Thu Aug 21 2014 10:38:27' + + it "returns a formatted time string", -> + record = new Record 'name', 10, date, "%s - %s", ['foo', 10] + time = record.getTime() + assert.equal time, '10:38:27.000' + + describe "getDate", -> + date = new Date 'Thu Aug 21 2014 10:38:27' + + it "returns a formatted date string", -> + record = new Record 'name', 10, date, "%s - %s", ['foo', 10] + time = record.getDate() + assert.equal time, '2014-08-21' diff --git a/test/unit/test.sinks.coffee b/test/unit/test.sinks.coffee index 31e2153..52596a9 100644 --- a/test/unit/test.sinks.coffee +++ b/test/unit/test.sinks.coffee @@ -1,56 +1,56 @@ sinks = require '../../lib/sinks' describe "Sink", -> - {Sink} = sinks + {Sink} = sinks - it "accepts level as symbolic name", -> - sink = new Sink null, null, 'ERROR' + it "accepts level as symbolic name", -> + sink = new Sink null, null, 'ERROR' - assert.equal sink.level, 40 + assert.equal sink.level, 40 - describe "setLevel", -> - it "updates the level of the sink", -> - sink = new Sink null, null, 'ERROR' - sink.setLevel 20 - assert.equal sink.level, 20 + describe "setLevel", -> + it "updates the level of the sink", -> + sink = new Sink null, null, 'ERROR' + sink.setLevel 20 + assert.equal sink.level, 20 - it "updates the level of the sink from symbolic name", -> - sink = new Sink null, null, 30 - sink.setLevel 'DEBUG' - assert.equal sink.level, 10 + it "updates the level of the sink from symbolic name", -> + sink = new Sink null, null, 30 + sink.setLevel 'DEBUG' + assert.equal sink.level, 10 describe "console", -> - it "returns a `Sink` instance", -> - sink = sinks.console() - assert.instanceOf sink, sinks.Sink + it "returns a `Sink` instance", -> + sink = sinks.console() + assert.instanceOf sink, sinks.Sink - it "attaches given formatter to sink", -> - sentinel = -> - sink = sinks.console - format: sentinel - assert.strictEqual sink.format, sentinel + it "attaches given formatter to sink", -> + sentinel = -> + sink = sinks.console + format: sentinel + assert.strictEqual sink.format, sentinel - it "sets level on sink", -> - sink = sinks.console - level: 20 - assert.strictEqual sink.level, 20 + it "sets level on sink", -> + sink = sinks.console + level: 20 + assert.strictEqual sink.level, 20 describe "file", -> - it "returns a `Sink` instance", -> - sink = sinks.file - path: '/dev/null' - assert.instanceOf sink, sinks.Sink - - it "attaches given formatter to sink", -> - sentinel = -> - sink = sinks.file - path: '/dev/null' - format: sentinel - assert.strictEqual sink.format, sentinel - - it "sets level on sink", -> - sink = sinks.file - path: '/dev/null' - level: 20 - assert.strictEqual sink.level, 20 + it "returns a `Sink` instance", -> + sink = sinks.file + path: '/dev/null' + assert.instanceOf sink, sinks.Sink + + it "attaches given formatter to sink", -> + sentinel = -> + sink = sinks.file + path: '/dev/null' + format: sentinel + assert.strictEqual sink.format, sentinel + + it "sets level on sink", -> + sink = sinks.file + path: '/dev/null' + level: 20 + assert.strictEqual sink.level, 20