summaryrefslogtreecommitdiffstats
path: root/comm/chat/protocols/irc/test/test_sendBufferedCommand.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/chat/protocols/irc/test/test_sendBufferedCommand.js')
-rw-r--r--comm/chat/protocols/irc/test/test_sendBufferedCommand.js199
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);
+ }
+ });
+ }
+}