Permalink
Browse files

events: make sure console functions exist

If there's no global console cached, initialize it.

Fixes: #4467
PR-URL: #4479
Reviewed-By: Roman Reiss <me@silverwind.io>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information...
Dave authored and evanlucas committed Dec 30, 2015
1 parent 056b078 commit a8330f73ab1437dfdc13e40bb02b0144c2ea7933
Showing with 50 additions and 1 deletion.
  1. +14 −1 lib/events.js
  2. +36 −0 test/parallel/test-global-console-exists.js
View
@@ -18,7 +18,20 @@ EventEmitter.prototype._maxListeners = undefined;
// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
-EventEmitter.defaultMaxListeners = 10;
+var defaultMaxListeners = 10;
+
+Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
+ enumerable: true,
+ get: function() {
+ return defaultMaxListeners;
+ },
+ set: function(arg) {
+ // force global console to be compiled.
+ // see https://github.com/nodejs/node/issues/4467
+ console;
+ defaultMaxListeners = arg;
+ }
+});
EventEmitter.init = function() {
this.domain = null;
@@ -0,0 +1,36 @@
+/* eslint-disable required-modules */
+// ordinarily test files must require('common') but that action causes
+// the global console to be compiled, defeating the purpose of this test
+
+'use strict';
+
+const assert = require('assert');
+const EventEmitter = require('events');
+const leak_warning = /EventEmitter memory leak detected\. 2 hello listeners/;
+
+var write_calls = 0;
+process.stderr.write = function(data) {
+ if (write_calls === 0)
+ assert.ok(data.match(leak_warning));
+ else if (write_calls === 1)
+ assert.ok(data.match(/Trace/));
+ else
+ assert.ok(false, 'stderr.write should be called only twice');
+
+ write_calls++;
+};
+
+const old_default = EventEmitter.defaultMaxListeners;
+EventEmitter.defaultMaxListeners = 1;
+
+const e = new EventEmitter();
+e.on('hello', function() {});
+e.on('hello', function() {});
+
+// TODO: figure out how to validate console. Currently,
+// there is no obvious way of validating that console
+// exists here exactly when it should.
+
+assert.equal(write_calls, 2);
+
+EventEmitter.defaultMaxListeners = old_default;

0 comments on commit a8330f7

Please sign in to comment.