Unit test for a race condition in Device.js / disconnect() #78
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This Pull Request is a proposal for a unit test exhibiting the behavior described in #73.
To implement this unit test, I had to replace in the actual code the call to
removeListenerswith a call toremoveAllListeners.In the unit tests, the EventEmitter implementation from nodejs is used as-is (no mock). But the
removeListenersmethod is not part of that implementation. OnlyremoveAllListenersis is officially part of the EventEmitter class (documentation).With the following patch, the unit test is passing.
/** * Connect to remote device */ async connect () { const cb = (propertiesChanged) => { if ('Connected' in propertiesChanged) { const { value } = propertiesChanged.Connected if (value) { this.emit('connect', { connected: true }) } else { this.emit('disconnect', { connected: false }) + this.helper.removeAllListeners() } } } this.helper.on('PropertiesChanged', cb) await this.helper.callMethod('Connect') } /** * Disconnect remote device */ async disconnect () { await this.helper.callMethod('Disconnect') - this.helper.removeAllListeners() }