diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /comm/mailnews/mime/jsmime/test/unit/test_structured_headers.js | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'comm/mailnews/mime/jsmime/test/unit/test_structured_headers.js')
-rw-r--r-- | comm/mailnews/mime/jsmime/test/unit/test_structured_headers.js | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/comm/mailnews/mime/jsmime/test/unit/test_structured_headers.js b/comm/mailnews/mime/jsmime/test/unit/test_structured_headers.js new file mode 100644 index 0000000000..8e8e1bb6a6 --- /dev/null +++ b/comm/mailnews/mime/jsmime/test/unit/test_structured_headers.js @@ -0,0 +1,254 @@ +"use strict"; +define(function (require) { + var assert = require("assert"); + var headerparser = require("jsmime").headerparser; + + function smartDeepEqual(actual, expected) { + assert.deepEqual(actual, expected); + if (actual instanceof Map && expected instanceof Map) { + assert.deepEqual( + Array.from(actual.entries()), + Array.from(expected.entries()) + ); + } + } + + function arrayTest(data, fn) { + fn.toString = function () { + let text = Function.prototype.toString.call(this); + text = text.replace(/data\[([0-9]*)\]/g, function (m, p) { + return JSON.stringify(data[p]); + }); + return text; + }; + return test(data[0], fn); + } + + function testHeader(header, tests) { + suite(header, function () { + tests.forEach(function (data) { + arrayTest(data, function () { + smartDeepEqual( + headerparser.parseStructuredHeader(header, data[0]), + data[1] + ); + }); + }); + }); + } + + function makeCT(media, sub, params) { + var object = new Map(); + object.mediatype = media; + object.subtype = sub; + object.type = media + "/" + sub; + for (let k in params) { + object.set(k, params[k]); + } + return object; + } + suite("Structured headers", function () { + // Ad-hoc header tests + testHeader("Content-Type", [ + ["text/plain", makeCT("text", "plain", {})], + ["text/html", makeCT("text", "html", {})], + [ + 'text/plain; charset="UTF-8"', + makeCT("text", "plain", { charset: "UTF-8" }), + ], + ["text/", makeCT("text", "", {})], + ["text", makeCT("text", "plain", {})], + ["image/", makeCT("image", "", {})], + ["image", makeCT("text", "plain", {})], + ["hacker/x-mailnews", makeCT("hacker", "x-mailnews", {})], + ["hacker/x-mailnews;", makeCT("hacker", "x-mailnews", {})], + ["HACKER/X-MAILNEWS", makeCT("hacker", "x-mailnews", {})], + [ + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + makeCT( + "application", + "vnd.openxmlformats-officedocument.spreadsheetml.sheet", + {} + ), + ], + [ + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;\r" + + '\n name="Presentation.pptx"', + makeCT( + "application", + "vnd.openxmlformats-officedocument.spreadsheetml.sheet", + { name: "Presentation.pptx" } + ), + ], + ["", makeCT("text", "plain", {})], + [" ", makeCT("text", "plain", {})], + ["text/plain; c", makeCT("text", "plain", {})], + ["text/plain; charset=", makeCT("text", "plain", { charset: "" })], + ['text/plain; charset="', makeCT("text", "plain", { charset: "" })], + ["text\\/enriched", makeCT("text\\", "enriched", {})], + ['multipart/mixed ";" wtf=stupid', makeCT("multipart", "mixed", {})], + [ + "multipart/mixed; wtf=stupid", + makeCT("multipart", "mixed", { wtf: "stupid" }), + ], + [ + "text/plain; CHARSET=Big5", + makeCT("text", "plain", { charset: "Big5" }), + ], + [ + 'text/html; CHARSET="Big5"', + makeCT("text", "html", { charset: "Big5" }), + ], + ['text/html; CHARSET="Big5', makeCT("text", "html", { charset: "Big5" })], + [["text/html", "multipart/mixed"], makeCT("text", "html", {})], + ]); + testHeader("Content-Transfer-Encoding", [ + ["", ""], + ["8bit", "8bit"], + ["8BIT", "8bit"], + ["QuOtEd-PrInTaBlE", "quoted-printable"], + ["Base64", "base64"], + ["7bit", "7bit"], + [["7bit", "8bit"], "7bit"], + ["x-uuencode", "x-uuencode"], + ]); + + // Non-ad-hoc header tests + let addressing_headers = [ + "From", + "To", + "Cc", + "Bcc", + "Sender", + "Reply-To", + "Resent-Bcc", + "Resent-To", + "Resent-From", + "Resent-Cc", + "Resent-Sender", + "Approved", + "Disposition-Notification-To", + "Delivered-To", + "Return-Receipt-To", + "Resent-Reply-To", + "Mail-Reply-To", + "Mail-Followup-To", + ]; + let address_tests = [ + ["", []], + ["a@example.invalid", [{ name: "", email: "a@example.invalid" }]], + [ + "John Doe <a@example.invalid>", + [{ name: "John Doe", email: "a@example.invalid" }], + ], + [ + "John Doe <A@EXAMPLE.INVALID>", + [{ name: "John Doe", email: "A@EXAMPLE.INVALID" }], + ], + [ + "=?UTF-8?B?5bGx55Sw5aSq6YOO?= <a@example.invalid>", + [{ name: "\u5c71\u7530\u592a\u90ce", email: "a@example.invalid" }], + ], + [ + "undisclosed-recipients:;", + [{ name: "undisclosed-recipients", group: [] }], + ], + [ + "world: a@example.invalid, b@example.invalid;", + [ + { + name: "world", + group: [ + { name: "", email: "a@example.invalid" }, + { name: "", email: "b@example.invalid" }, + ], + }, + ], + ], + // TODO when we support IDN: + // This should be \u4f8b.invalid instead (Japanese kanji for "example") + [ + "\u5c71\u7530\u592a\u90ce <a@xn--fsq.invalid>", + [{ name: "\u5c71\u7530\u592a\u90ce", email: "a@xn--fsq.invalid" }], + ], + [ + "\u5c71\u7530\u592a\u90ce <a@\u4f8b.invalid>", + [{ name: "\u5c71\u7530\u592a\u90ce", email: "a@\u4f8b.invalid" }], + ], + [ + "\u30b1\u30c4\u30a1\u30eb\u30b3\u30a2\u30c8\u30eb@\u4f8b.invalid", + [ + { + name: "", + email: + "\u30b1\u30c4\u30a1\u30eb\u30b3\u30a2\u30c8\u30eb@\u4f8b.invalid", + }, + ], + ], + [ + ["a@example.invalid", "b@example.invalid"], + [ + { name: "", email: "a@example.invalid" }, + { name: "", email: "b@example.invalid" }, + ], + ], + ]; + addressing_headers.forEach(function (header) { + testHeader(header, address_tests); + }); + + let date_headers = [ + "Date", + "Expires", + "Injection-Date", + "NNTP-Posting-Date", + "Resent-Date", + ]; + let date_tests = [ + ["Thu, 06 Sep 2012 08:08:21 -0700", new Date("2012-09-06T08:08:21-0700")], + ["This is so not a date", new Date(NaN)], + ]; + date_headers.forEach(function (header) { + testHeader(header, date_tests); + }); + + let multiple_unstructured_headers = ["In-Reply-To", "References"]; + let multiple_unstructured_tests = [ + ["<asdasdasd@asdasdasd.com>", "<asdasdasd@asdasdasd.com>"], + ["<asd@asd.com> <asdf@asdf.com>", "<asd@asd.com> <asdf@asdf.com>"], + + // This test is needed for clients sending non-compliant headers, see bug 1154521 + [ + "<asd@asd.com>,<asdf@asdf.com>,<asdfg@asdfg.com>", + "<asd@asd.com> <asdf@asdf.com> <asdfg@asdfg.com>", + ], + // Test for bug 1197686 + [ + "<asd@asd.com><asdf@asdf.com><asdfg@asdfg.com>", + "<asd@asd.com> <asdf@asdf.com> <asdfg@asdfg.com>", + ], + ]; + multiple_unstructured_headers.forEach(function (header) { + testHeader(header, multiple_unstructured_tests); + }); + + let unstructured_headers = [ + "Comments", + "Content-Description", + "Keywords", + "Subject", + ]; + let unstructured_tests = [ + ["", ""], + ["This is a subject", "This is a subject"], + [["Subject 1", "Subject 2"], "Subject 1"], + [ + "=?UTF-8?B?56eB44Gv5Lu25ZCN5Y2I5YmN?=", + "\u79c1\u306f\u4ef6\u540d\u5348\u524d", + ], + ]; + unstructured_headers.forEach(function (header) { + testHeader(header, unstructured_tests); + }); + }); +}); |