summaryrefslogtreecommitdiff
path: root/node_modules/winston/test/helpers.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/winston/test/helpers.js')
-rw-r--r--node_modules/winston/test/helpers.js256
1 files changed, 256 insertions, 0 deletions
diff --git a/node_modules/winston/test/helpers.js b/node_modules/winston/test/helpers.js
new file mode 100644
index 0000000..8575fb6
--- /dev/null
+++ b/node_modules/winston/test/helpers.js
@@ -0,0 +1,256 @@
+/*
+ * helpers.js: Test helpers for winston
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENSE
+ *
+ */
+
+var assert = require('assert'),
+ fs = require('fs'),
+ path = require('path'),
+ spawn = require('child_process').spawn,
+ util = require('util'),
+ vows = require('vows'),
+ winston = require('../lib/winston');
+
+var helpers = exports;
+
+helpers.size = function (obj) {
+ var size = 0, key;
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ size++;
+ }
+ }
+
+ return size;
+};
+
+helpers.tryUnlink = function (file) {
+ try { fs.unlinkSync(file) }
+ catch (ex) { }
+};
+
+helpers.assertDateInfo = function (info) {
+ assert.isNumber(Date.parse(info));
+};
+
+helpers.assertProcessInfo = function (info) {
+ assert.isNumber(info.pid);
+ assert.isNumber(info.uid);
+ assert.isNumber(info.gid);
+ assert.isString(info.cwd);
+ assert.isString(info.execPath);
+ assert.isString(info.version);
+ assert.isArray(info.argv);
+ assert.isObject(info.memoryUsage);
+};
+
+helpers.assertOsInfo = function (info) {
+ assert.isArray(info.loadavg);
+ assert.isNumber(info.uptime);
+};
+
+helpers.assertTrace = function (trace) {
+ trace.forEach(function (site) {
+ assert.isTrue(!site.column || typeof site.column === 'number');
+ assert.isTrue(!site.line || typeof site.line === 'number');
+ assert.isTrue(!site.file || typeof site.file === 'string');
+ assert.isTrue(!site.method || typeof site.method === 'string');
+ assert.isTrue(!site.function || typeof site.function === 'string');
+ assert.isTrue(typeof site.native === 'boolean');
+ });
+};
+
+helpers.assertLogger = function (logger, level) {
+ assert.instanceOf(logger, winston.Logger);
+ assert.isFunction(logger.log);
+ assert.isFunction(logger.add);
+ assert.isFunction(logger.remove);
+ assert.equal(logger.level, level || "info");
+ Object.keys(logger.levels).forEach(function (method) {
+ assert.isFunction(logger[method]);
+ });
+};
+
+helpers.assertConsole = function (transport) {
+ assert.instanceOf(transport, winston.transports.Console);
+ assert.isFunction(transport.log);
+};
+
+helpers.assertMemory = function (transport) {
+ assert.instanceOf(transport, winston.transports.Memory);
+ assert.isFunction(transport.log);
+};
+
+helpers.assertFile = function (transport) {
+ assert.instanceOf(transport, winston.transports.File);
+ assert.isFunction(transport.log);
+};
+
+helpers.assertCouchdb = function (transport) {
+ assert.instanceOf(transport, winston.transports.Couchdb);
+ assert.isFunction(transport.log);
+};
+
+helpers.assertHandleExceptions = function (options) {
+ return {
+ topic: function () {
+ var that = this,
+ child = spawn('node', [options.script]);
+
+ helpers.tryUnlink(options.logfile);
+ child.on('exit', function () {
+ fs.readFile(options.logfile, that.callback);
+ });
+ },
+ "should save the error information to the specified file": function (err, data) {
+ assert.isTrue(!err);
+ data = JSON.parse(data);
+
+ assert.isObject(data);
+ helpers.assertProcessInfo(data.process);
+ helpers.assertOsInfo(data.os);
+ helpers.assertTrace(data.trace);
+ if (options.message) {
+ assert.equal('uncaughtException: ' + options.message, data.message);
+ }
+ }
+ };
+};
+
+helpers.assertFailedTransport = function (transport) {
+ return {
+ topic: function () {
+ var self = this;
+ transport.on('error', function(emitErr){
+ transport.log('error', 'test message 2', {}, function(logErr, logged){
+ self.callback(emitErr, logErr);
+ });
+ });
+ transport.log('error', 'test message');
+ },
+ "should emit an error": function (emitErr, logErr) {
+ assert.instanceOf(emitErr, Error);
+ assert.equal(emitErr.code, 'ENOENT');
+ },
+ "should enter noop failed state": function (emitErr, logErr) {
+ assert.instanceOf(logErr, Error);
+ assert.equal(transport._failures, transport.maxRetries);
+ }
+ };
+};
+
+helpers.testNpmLevels = function (transport, assertMsg, assertFn) {
+ return helpers.testLevels(winston.config.npm.levels, transport, assertMsg, assertFn);
+};
+
+helpers.testSyslogLevels = function (transport, assertMsg, assertFn) {
+ return helpers.testLevels(winston.config.syslog.levels, transport, assertMsg, assertFn);
+};
+
+helpers.testLevels = function (levels, transport, assertMsg, assertFn) {
+ var tests = {};
+
+ Object.keys(levels).forEach(function (level) {
+ var test = {
+ topic: function () {
+ transport.log(level, 'test message', {}, this.callback.bind(this, null));
+ }
+ };
+
+ test[assertMsg] = assertFn;
+ tests['with the ' + level + ' level'] = test;
+ });
+
+ var metadatatest = {
+ topic: function () {
+ transport.log('info', 'test message', { metadata: true }, this.callback.bind(this, null));
+ }
+ };
+
+ metadatatest[assertMsg] = assertFn;
+ tests['when passed metadata'] = metadatatest;
+
+ var primmetadatatest = {
+ topic: function () {
+ transport.log('info', 'test message', 'metadata', this.callback.bind(this, null));
+ }
+ };
+
+ primmetadatatest[assertMsg] = assertFn;
+ tests['when passed primitive metadata'] = primmetadatatest;
+
+ var circmetadata = { };
+ circmetadata['metadata'] = circmetadata;
+
+ var circmetadatatest = {
+ topic: function () {
+ transport.log('info', 'test message', circmetadata, this.callback.bind(this, null));
+ }
+ };
+
+ circmetadatatest[assertMsg] = assertFn;
+ tests['when passed circular metadata'] = circmetadatatest;
+
+ return tests;
+};
+
+helpers.assertOptionsThrow = function (options, errMsg) {
+ return function () {
+ assert.throws(
+ function () {
+ try {
+ new (winston.transports.Console)(options);
+ } catch (err) {
+ throw(err);
+ }
+ },
+ new RegExp('^' + errMsg.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$')
+ );
+ }
+};
+
+helpers.assertStderrLevels = function (transport, stderrLevels) {
+ return function () {
+ assert.equal(
+ JSON.stringify(Object.keys(transport.stderrLevels).sort()),
+ JSON.stringify(stderrLevels.sort())
+ );
+ }
+};
+
+helpers.testLoggingToStreams = function (levels, transport, stderrLevels, stdMocks) {
+ return {
+ topic: function () {
+ stdMocks.use();
+ transport.showLevel = true;
+ Object.keys(levels).forEach(function (level) {
+ transport.log(
+ level,
+ level + ' should go to ' + (stderrLevels.indexOf(level) > -1 ? 'stderr' : 'stdout'),
+ {},
+ function () {}
+ );
+ });
+ var output = stdMocks.flush();
+ stdMocks.restore();
+ this.callback(null, output, levels);
+ },
+ "output should go to the appropriate streams": function (ign, output, levels) {
+ var outCount = 0,
+ errCount = 0;
+ Object.keys(levels).forEach(function (level) {
+ var line;
+ if (stderrLevels.indexOf(level) > -1) {
+ line = output.stderr[errCount++];
+ assert.equal(line, level + ': ' + level + ' should go to stderr\n');
+ } else {
+ line = output.stdout[outCount++];
+ assert.equal(line, level + ': ' + level + ' should go to stdout\n');
+ }
+ });
+ }
+ }
+};