summaryrefslogtreecommitdiffstats
path: root/comm/chat/protocols/irc/test/test_ircCAP.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/chat/protocols/irc/test/test_ircCAP.js')
-rw-r--r--comm/chat/protocols/irc/test/test_ircCAP.js236
1 files changed, 236 insertions, 0 deletions
diff --git a/comm/chat/protocols/irc/test/test_ircCAP.js b/comm/chat/protocols/irc/test/test_ircCAP.js
new file mode 100644
index 0000000000..a79a926efc
--- /dev/null
+++ b/comm/chat/protocols/irc/test/test_ircCAP.js
@@ -0,0 +1,236 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+var { capMessage } = ChromeUtils.importESModule(
+ "resource:///modules/ircCAP.sys.mjs"
+);
+
+var testData = [
+ // A normal LS from the server.
+ [
+ ["*", "LS", "multi-prefix sasl userhost-in-names"],
+ [
+ {
+ subcommand: "LS",
+ parameter: "multi-prefix",
+ },
+ {
+ subcommand: "LS",
+ parameter: "sasl",
+ },
+ {
+ subcommand: "LS",
+ parameter: "userhost-in-names",
+ },
+ ],
+ ],
+
+ // LS with both valid and invalid vendor specific capabilities.
+ [
+ [
+ "*",
+ "LS",
+ "sasl server-time znc.in/server-time-iso znc.in/playback palaverapp.com",
+ ],
+ [
+ {
+ subcommand: "LS",
+ parameter: "sasl",
+ },
+ {
+ subcommand: "LS",
+ parameter: "server-time",
+ },
+ // Valid vendor prefixes (of the form <domain name>/<capability>).
+ {
+ subcommand: "LS",
+ parameter: "znc.in/server-time-iso",
+ },
+ {
+ subcommand: "LS",
+ parameter: "znc.in/playback",
+ },
+ // Invalid vendor prefix, but we should treat it as an opaque identifier.
+ {
+ subcommand: "LS",
+ parameter: "palaverapp.com",
+ },
+ ],
+ ],
+
+ // Some implementations include one less parameter.
+ [
+ ["LS", "sasl"],
+ [
+ {
+ subcommand: "LS",
+ parameter: "sasl",
+ },
+ ],
+ ],
+
+ // Modifier tests, ensure the modified is stripped from the capaibility and is
+ // parsed correctly.
+ [
+ ["LS", "-disable =sticky ~ack"],
+ [
+ {
+ subcommand: "LS",
+ parameter: "disable",
+ modifier: "-",
+ disable: true,
+ },
+ {
+ subcommand: "LS",
+ parameter: "sticky",
+ modifier: "=",
+ sticky: true,
+ },
+ {
+ subcommand: "LS",
+ parameter: "ack",
+ modifier: "~",
+ ack: true,
+ },
+ ],
+ ],
+
+ // IRC v3.2 multi-line LS response
+ [
+ ["*", "LS", "*", "sasl"],
+ ["*", "LS", "server-time"],
+ [
+ {
+ subcommand: "LS",
+ parameter: "sasl",
+ },
+ {
+ subcommand: "LS",
+ parameter: "server-time",
+ },
+ ],
+ ],
+
+ // IRC v3.2 multi-line LIST response
+ [
+ ["*", "LIST", "*", "sasl"],
+ ["*", "LIST", "server-time"],
+ [
+ {
+ subcommand: "LIST",
+ parameter: "sasl",
+ },
+ {
+ subcommand: "LIST",
+ parameter: "server-time",
+ },
+ ],
+ ],
+
+ // IRC v3.2 cap value
+ [
+ ["*", "LS", "multi-prefix sasl=EXTERNAL sts=port=6697"],
+ [
+ {
+ subcommand: "LS",
+ parameter: "multi-prefix",
+ },
+ {
+ subcommand: "LS",
+ parameter: "sasl",
+ value: "EXTERNAL",
+ },
+ {
+ subcommand: "LS",
+ parameter: "sts",
+ value: "port=6697",
+ },
+ ],
+ ],
+
+ // cap-notify new cap
+ [
+ ["*", "NEW", "batch"],
+ [
+ {
+ subcommand: "NEW",
+ parameter: "batch",
+ },
+ ],
+ ],
+
+ // cap-notify delete cap
+ [
+ ["*", "DEL", "multi-prefix"],
+ [
+ {
+ subcommand: "DEL",
+ parameter: "multi-prefix",
+ },
+ ],
+ ],
+];
+
+function run_test() {
+ add_test(testCapMessages);
+
+ run_next_test();
+}
+
+/*
+ * Test round tripping parsing and then rebuilding the messages from RFC 2812.
+ */
+function testCapMessages() {
+ for (let data of testData) {
+ // Generate an ircMessage to send into capMessage.
+ let i = 0;
+ let message;
+ let outputs;
+ const account = {
+ _queuedCAPs: [],
+ };
+
+ // Generate an ircMessage to send into capMessage.
+ while (typeof data[i][0] == "string") {
+ message = {
+ params: data[i],
+ };
+
+ // Create the CAP message.
+ outputs = capMessage(message, account);
+ ++i;
+ }
+
+ // The original message should get a cap object added with the subcommand
+ // set.
+ ok(message.cap);
+ equal(message.cap.subcommand, data[i][0].subcommand);
+
+ // We only care about the "cap" part of each return message.
+ outputs = outputs.map(o => o.cap);
+
+ // Ensure the expected output is an array.
+ let expectedCaps = data[i];
+ if (!Array.isArray(expectedCaps)) {
+ expectedCaps = [expectedCaps];
+ }
+
+ // Add defaults to the expected output.
+ for (let expectedCap of expectedCaps) {
+ // By default there's no modifier.
+ if (!("modifier" in expectedCap)) {
+ expectedCap.modifier = undefined;
+ }
+ for (let param of ["disable", "sticky", "ack"]) {
+ if (!(param in expectedCap)) {
+ expectedCap[param] = false;
+ }
+ }
+ }
+
+ // Ensure each item in the arrays are equal.
+ deepEqual(outputs, expectedCaps);
+ }
+
+ run_next_test();
+}