Adds unit test for ripple#1092, fixes unhandled throw when not connected on send due to upgraded ws module

This commit is contained in:
Nicholas Smith
2019-11-17 01:28:19 -05:00
parent 14ec58ef9a
commit fa6a2c5bbb
2 changed files with 35 additions and 7 deletions

View File

@@ -420,13 +420,17 @@ class Connection extends EventEmitter {
this._console.log(message) this._console.log(message)
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this._ws.send(message, undefined, error => { try {
if (error) { this._ws.send(message, undefined, error => {
reject(new DisconnectedError(error.message, error)) if (error) {
} else { reject(new DisconnectedError(error.message, error))
resolve() } else {
} resolve()
}) }
})
} catch (error) {
reject(new DisconnectedError(error.message, error))
}
}) })
} }

View File

@@ -160,6 +160,30 @@ describe('Connection', function() {
}); });
}); });
it('DisconnectedError on initial _onOpen send', async function() {
// _onOpen previously could throw PromiseRejectionHandledWarning: Promise rejection was handled asynchronously
// do not rely on the api.setup hook to test this as it bypasses the case, disconnect api connection first
await this.api.disconnect();
// stub _onOpen to only run logic relevant to test case
this.api.connection._onOpen = () => {
// overload websocket send on open when _ws exists
this.api.connection._ws.send = function(data, options, cb) {
// recent ws throws this error instead of calling back
throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
}
const request = {command: 'subscribe', streams: ['ledger']};
return this.api.connection.request(request);
}
try {
await this.api.connect();
} catch (error) {
assert(error instanceof this.api.errors.DisconnectedError);
assert.strictEqual(error.message, 'WebSocket is not open: readyState 0 (CONNECTING)');
}
});
it('ResponseFormatError', function() { it('ResponseFormatError', function() {
this.api.connection._send = function(message) { this.api.connection._send = function(message) {
const parsed = JSON.parse(message); const parsed = JSON.parse(message);