CB-10940 Can't add Android platform from path
authordaserge <v-seshak@microsoft.com>
Mon, 28 Mar 2016 14:06:45 +0000 (17:06 +0300)
committerVladimir Kotikov <v-vlkoti@microsoft.com>
Tue, 29 Mar 2016 09:25:36 +0000 (12:25 +0300)
Added corresponding tests for events.forwardEventsTo

 This closes #418

spec/events.spec.js [new file with mode: 0644]
src/events.js

diff --git a/spec/events.spec.js b/spec/events.spec.js
new file mode 100644 (file)
index 0000000..a9e7f43
--- /dev/null
@@ -0,0 +1,48 @@
+/**
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+var events = require('../src/events');
+
+describe('forwardEventsTo method', function () {
+    afterEach(function() {
+        events.forwardEventsTo(null);
+    });
+    it('should not go to infinite loop when trying to forward to self', function () {
+        expect(function() {
+            events.forwardEventsTo(events);
+            events.emit('log', 'test message');
+        }).not.toThrow();
+    });
+    it('should reset forwarding after trying to forward to self', function () {
+        var EventEmitter = require('events').EventEmitter;
+        var anotherEventEmitter = new EventEmitter();
+        var logSpy = jasmine.createSpy('logSpy');
+        anotherEventEmitter.on('log', logSpy);
+
+        events.forwardEventsTo(anotherEventEmitter);
+        events.emit('log', 'test message #1');
+        expect(logSpy).toHaveBeenCalled();
+
+        logSpy.reset();
+
+        events.forwardEventsTo(events);
+        events.emit('log', 'test message #2');
+        expect(logSpy).not.toHaveBeenCalled();
+    });
+});
index 868d363..8751976 100644 (file)
@@ -42,7 +42,14 @@ module.exports.forwardEventsTo = function (eventEmitter) {
     if (!(eventEmitter instanceof EventEmitter))
         throw new Error('Cordova events could be redirected to another EventEmitter instance only');
 
-    EVENTS_RECEIVER = eventEmitter;
+    // CB-10940 Skipping forwarding to self to avoid infinite recursion.
+    // This is the case when the modules are npm-linked.
+    if (this !== eventEmitter) {
+        EVENTS_RECEIVER = eventEmitter;
+    } else {
+        // Reset forwarding if we are subscribing to self
+        EVENTS_RECEIVER = undefined;
+    }
 };
 
 var emit = INSTANCE.emit;