summaryrefslogtreecommitdiff
path: root/intl/uconv/tests/unit/test_utf8_illegals.js
diff options
context:
space:
mode:
Diffstat (limited to 'intl/uconv/tests/unit/test_utf8_illegals.js')
-rw-r--r--intl/uconv/tests/unit/test_utf8_illegals.js135
1 files changed, 135 insertions, 0 deletions
diff --git a/intl/uconv/tests/unit/test_utf8_illegals.js b/intl/uconv/tests/unit/test_utf8_illegals.js
new file mode 100644
index 0000000000..9c9c19586f
--- /dev/null
+++ b/intl/uconv/tests/unit/test_utf8_illegals.js
@@ -0,0 +1,135 @@
+// Tests illegal UTF-8 sequences
+
+var Cc = Components.Constructor;
+var Ci = Components.interfaces;
+var Cu = Components.utils;
+
+Cu.import("resource://gre/modules/NetUtil.jsm");
+
+const tests = [
+{ inStrings: ["%80", // Illegal or incomplete sequences
+ "%8f",
+ "%90",
+ "%9f",
+ "%a0",
+ "%bf",
+ "%c0",
+ "%c1",
+ "%c2",
+ "%df",
+ "%e0",
+ "%e0%a0",
+ "%e0%bf",
+ "%ed%80",
+ "%ed%9f",
+ "%ef",
+ "%ef%bf",
+ "%f0",
+ "%f0%90",
+ "%f0%90%80",
+ "%f0%90%bf",
+ "%f0%bf",
+ "%f0%bf%80",
+ "%f0%bf%bf",
+ "%f4",
+ "%f4%80",
+ "%f4%80%80",
+ "%f4%80%bf",
+ "%f4%8f",
+ "%f4%8f%80",
+ "%f4%8f%bf",
+ "%f5",
+ "%f7",
+ "%f8",
+ "%fb",
+ "%fc",
+ "%fd"],
+ expected: "ABC\ufffdXYZ" },
+
+{ inStrings: ["%c0%af", // Illegal bytes in 2-octet
+ "%c1%af"], // sequences
+ expected: "ABC\ufffd\ufffdXYZ" },
+
+{ inStrings: ["%e0%80%80", // Illegal bytes in 3-octet
+ "%e0%80%af", // sequences
+ "%e0%9f%bf",
+ // long surrogates
+ "%ed%a0%80", // D800
+ "%ed%ad%bf", // DB7F
+ "%ed%ae%80", // DB80
+ "%ed%af%bf", // DBFF
+ "%ed%b0%80", // DC00
+ "%ed%be%80", // DF80
+ "%ed%bf%bf"], // DFFF
+ expected: "ABC\ufffd\ufffd\ufffdXYZ" },
+
+{ inStrings: ["%f0%80%80%80", // Illegal bytes in 4-octet
+ "%f0%80%80%af", // sequences
+ "%f0%8f%bf%bf",
+ "%f4%90%80%80",
+ "%f4%bf%bf%bf",
+ "%f5%80%80%80",
+ "%f7%bf%bf%bf"],
+ expected: "ABC\ufffd\ufffd\ufffd\ufffdXYZ" },
+
+{ inStrings: ["%f8%80%80%80%80", // Illegal bytes in 5-octet
+ "%f8%80%80%80%af", // sequences
+ "%fb%bf%bf%bf%bf"],
+ expected: "ABC\ufffd\ufffd\ufffd\ufffd\ufffdXYZ" },
+
+ // Surrogate pairs
+{ inStrings: ["%ed%a0%80%ed%b0%80", // D800 DC00
+ "%ed%a0%80%ed%bf%bf", // D800 DFFF
+ "%ed%ad%bf%ed%b0%80", // DB7F DC00
+ "%ed%ad%bf%ed%bf%bf", // DB7F DFFF
+ "%ed%ae%80%ed%b0%80", // DB80 DC00
+ "%ed%ae%80%ed%bf%bf", // DB80 DFFF
+ "%ed%af%bf%ed%b0%80", // DBFF DC00
+ "%ed%ad%bf%ed%bf%bf", // DBFF DFFF
+ "%fc%80%80%80%80%80", // Illegal bytes in 6-octet
+ "%fc%80%80%80%80%af", // sequences
+ "%fd%bf%bf%bf%bf%bf"],
+ expected: "ABC\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdXYZ" },
+];
+
+
+function testCaseInputStream(inStr, expected)
+{
+ var dataURI = "data:text/plain; charset=UTF-8,ABC" + inStr + "XYZ"
+ dump(inStr + "==>");
+
+ var ConverterInputStream =
+ Cc("@mozilla.org/intl/converter-input-stream;1",
+ "nsIConverterInputStream",
+ "init");
+ var channel = NetUtil.newChannel({uri: dataURI, loadUsingSystemPrincipal: true});
+ var testInputStream = channel.open2();
+ var testConverter = new ConverterInputStream(testInputStream,
+ "UTF-8",
+ 16,
+ 0xFFFD);
+
+ if (!(testConverter instanceof Ci.nsIUnicharLineInputStream))
+ throw "not line input stream";
+
+ var outStr = "";
+ var more;
+ do {
+ // read the line and check for eof
+ var line = {};
+ more = testConverter.readLine(line);
+ outStr += line.value;
+ } while (more);
+
+ dump(outStr + "; expected=" + expected + "\n");
+ do_check_eq(outStr, expected);
+ do_check_eq(outStr.length, expected.length);
+}
+
+function run_test() {
+ for (var t of tests) {
+ for (var inStr of t.inStrings) {
+ testCaseInputStream(inStr, t.expected);
+ }
+ }
+}