diff options
Diffstat (limited to 'comm/chat/protocols/irc/test/test_sendBufferedCommand.js')
-rw-r--r-- | comm/chat/protocols/irc/test/test_sendBufferedCommand.js | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/comm/chat/protocols/irc/test/test_sendBufferedCommand.js b/comm/chat/protocols/irc/test/test_sendBufferedCommand.js new file mode 100644 index 0000000000..5558979db3 --- /dev/null +++ b/comm/chat/protocols/irc/test/test_sendBufferedCommand.js @@ -0,0 +1,199 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var { IMServices } = ChromeUtils.importESModule( + "resource:///modules/IMServices.sys.mjs" +); +var { ircAccount } = ChromeUtils.importESModule( + "resource:///modules/ircAccount.sys.mjs" +); +var { clearTimeout, setTimeout } = ChromeUtils.importESModule( + "resource://gre/modules/Timer.sys.mjs" +); + +function FakeAccount() { + this._commandBuffers = new Map(); + this.callbacks = []; +} +FakeAccount.prototype = { + __proto__: ircAccount.prototype, + maxMessageLength: 60, + callbacks: [], + sendMessage(aCommand, aParams) { + this.callbacks.shift()(aCommand, aParams); + }, +}; + +var account = new FakeAccount(); + +function run_test() { + test_parameterCollect(); + test_maxLength(); + run_next_test(); +} + +function test_parameterCollect() { + // Individual tests, data consisting of [channel, key] pairs. + let tests = [ + { + data: [["one"], ["one"]], // also tests deduplication + result: "JOIN one", + }, + { + data: [["one", ""]], // explicit empty password string + result: "JOIN one", + }, + { + data: [["one"], ["two"], ["three"]], + result: "JOIN one,two,three", + }, + { + data: [["one"], ["two", "password"], ["three"]], + result: "JOIN two,one,three password", + }, + { + data: [ + ["one"], + ["two", "password"], + ["three"], + ["four", "anotherpassword"], + ], + result: "JOIN two,four,one,three password,anotherpassword", + }, + ]; + + for (let test of tests) { + let timeout; + // Destructure test to local variables so each function + // generated here gets the correct value in its scope. + let { data, result } = test; + account.callbacks.push((aCommand, aParams) => { + let msg = account.buildMessage(aCommand, aParams); + equal(msg, result, "Test buffering of parameters"); + clearTimeout(timeout); + account._lastCommandSendTime = 0; + run_next_test(); + }); + add_test(() => { + // This timeout lets the test fail more quickly if + // some of the callbacks we added don't get called. + // Not strictly speaking necessary. + // eslint-disable-next-line mozilla/no-arbitrary-setTimeout + timeout = setTimeout(() => { + ok(false, "test_parameterCollect failed after timeout."); + run_next_test(); + }, 2000); + for (let [channel, key] of data) { + account.sendBufferedCommand("JOIN", channel, key); + } + }); + } + + // Test this still works when adding commands on different ticks of + // the event loop. + account._lastCommandSendTime = 0; + for (let test of tests) { + let timeout; + let { data, result } = test; + account.callbacks.push((aCommand, aParams) => { + let msg = account.buildMessage(aCommand, aParams); + equal(msg, result, "Test buffering with setTimeout"); + clearTimeout(timeout); + run_next_test(); + }); + add_test(() => { + // This timeout lets the test fail more quickly if + // some of the callbacks we added don't get called. + // Not strictly speaking necessary. + // eslint-disable-next-line mozilla/no-arbitrary-setTimeout + timeout = setTimeout(() => { + ok(false, "test_parameterCollect failed after timeout."); + run_next_test(); + }, 2000); + let delay = 0; + for (let params of data) { + let [channel, key] = params; + delay += 200; + // eslint-disable-next-line mozilla/no-arbitrary-setTimeout + setTimeout(() => { + account.sendBufferedCommand("JOIN", channel, key); + }, delay); + } + }); + } +} + +function test_maxLength() { + let tests = [ + { + data: [ + ["applecustard"], + ["pearpie"], + ["strawberryfield"], + ["blueberrypancake"], + ["mangojuice"], + ["raspberryberet"], + ["pineapplesoup"], + ["limejelly"], + ["lemonsorbet"], + ], + results: [ + "JOIN applecustard,pearpie,strawberryfield,blueberrypancake", + "JOIN mangojuice,raspberryberet,pineapplesoup,limejelly", + "JOIN lemonsorbet", + ], + }, + { + data: [ + ["applecustard"], + ["pearpie"], + ["strawberryfield", "password1"], + ["blueberrypancake"], + ["mangojuice"], + ["raspberryberet"], + ["pineapplesoup"], + ["limejelly", "password2"], + ["lemonsorbet"], + ], + results: [ + "JOIN strawberryfield,applecustard,pearpie password1", + "JOIN blueberrypancake,mangojuice,raspberryberet", + "JOIN limejelly,pineapplesoup,lemonsorbet password2", + ], + }, + ]; + + account._lastCommandSendTime = 0; + for (let test of tests) { + let timeout; + // Destructure test to local variables so each function + // generated here gets the correct value in its scope. + let { data, results } = test; + for (let r of results) { + let result = r; + account.callbacks.push((aCommand, aParams) => { + let msg = account.buildMessage(aCommand, aParams); + equal(msg, result, "Test maximum message length constraint"); + // After all results are checked, run the next test. + if (result == results[results.length - 1]) { + clearTimeout(timeout); + run_next_test(); + } + }); + } + add_test(() => { + // This timeout lets the test fail more quickly if + // some of the callbacks we added don't get called. + // Not strictly speaking necessary. + // eslint-disable-next-line mozilla/no-arbitrary-setTimeout + timeout = setTimeout(() => { + ok(false, "test_maxLength failed after timeout."); + run_next_test(); + }, 2000); + for (let [channel, key] of data) { + account.sendBufferedCommand("JOIN", channel, key); + } + }); + } +} |