michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: "use strict"; michael@0: michael@0: Cu.import("resource://services-common/utils.js"); michael@0: michael@0: // A wise line of Greek verse, and the utf-8 byte encoding. michael@0: // N.b., Greek begins at utf-8 ce 91 michael@0: const TEST_STR = "πόλλ' οἶδ' ἀλώπηξ, ἀλλ' ἐχῖνος ἓν μέγα"; michael@0: const TEST_HEX = h("cf 80 cf 8c ce bb ce bb 27 20 ce bf e1 bc b6 ce"+ michael@0: "b4 27 20 e1 bc 80 ce bb cf 8e cf 80 ce b7 ce be"+ michael@0: "2c 20 e1 bc 80 ce bb ce bb 27 20 e1 bc 90 cf 87"+ michael@0: "e1 bf 96 ce bd ce bf cf 82 20 e1 bc 93 ce bd 20"+ michael@0: "ce bc ce ad ce b3 ce b1"); michael@0: // Integer byte values for the above michael@0: const TEST_BYTES = [207,128,207,140,206,187,206,187, michael@0: 39, 32,206,191,225,188,182,206, michael@0: 180, 39, 32,225,188,128,206,187, michael@0: 207,142,207,128,206,183,206,190, michael@0: 44, 32,225,188,128,206,187,206, michael@0: 187, 39, 32,225,188,144,207,135, michael@0: 225,191,150,206,189,206,191,207, michael@0: 130, 32,225,188,147,206,189, 32, michael@0: 206,188,206,173,206,179,206,177]; michael@0: michael@0: function run_test() { michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_test(function test_compress_string() { michael@0: const INPUT = "hello"; michael@0: michael@0: let result = CommonUtils.convertString(INPUT, "uncompressed", "deflate"); michael@0: do_check_eq(result.length, 13); michael@0: michael@0: let result2 = CommonUtils.convertString(INPUT, "uncompressed", "deflate"); michael@0: do_check_eq(result, result2); michael@0: michael@0: let result3 = CommonUtils.convertString(result, "deflate", "uncompressed"); michael@0: do_check_eq(result3, INPUT); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_compress_utf8() { michael@0: const INPUT = "Árvíztűrő tükörfúrógép いろはにほへとちりぬるを Pijamalı hasta, yağız şoföre çabucak güvendi."; michael@0: let inputUTF8 = CommonUtils.encodeUTF8(INPUT); michael@0: michael@0: let compressed = CommonUtils.convertString(inputUTF8, "uncompressed", "deflate"); michael@0: let uncompressed = CommonUtils.convertString(compressed, "deflate", "uncompressed"); michael@0: michael@0: do_check_eq(uncompressed, inputUTF8); michael@0: michael@0: let outputUTF8 = CommonUtils.decodeUTF8(uncompressed); michael@0: do_check_eq(outputUTF8, INPUT); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_bad_argument() { michael@0: let failed = false; michael@0: try { michael@0: CommonUtils.convertString(null, "uncompressed", "deflate"); michael@0: } catch (ex) { michael@0: failed = true; michael@0: do_check_true(ex.message.startsWith("Input string must be defined")); michael@0: } finally { michael@0: do_check_true(failed); michael@0: } michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_task(function test_stringAsHex() { michael@0: do_check_eq(TEST_HEX, CommonUtils.stringAsHex(TEST_STR)); michael@0: }); michael@0: michael@0: add_task(function test_hexAsString() { michael@0: do_check_eq(TEST_STR, CommonUtils.hexAsString(TEST_HEX)); michael@0: }); michael@0: michael@0: add_task(function test_hexToBytes() { michael@0: let bytes = CommonUtils.hexToBytes(TEST_HEX); michael@0: do_check_eq(TEST_BYTES.length, bytes.length); michael@0: // Ensure that the decimal values of each byte are correct michael@0: do_check_true(arraysEqual(TEST_BYTES, michael@0: CommonUtils.stringToByteArray(bytes))); michael@0: }); michael@0: michael@0: add_task(function test_bytesToHex() { michael@0: // Create a list of our character bytes from the reference int values michael@0: let bytes = CommonUtils.byteArrayToString(TEST_BYTES); michael@0: do_check_eq(TEST_HEX, CommonUtils.bytesAsHex(bytes)); michael@0: }); michael@0: michael@0: add_task(function test_stringToBytes() { michael@0: do_check_true(arraysEqual(TEST_BYTES, michael@0: CommonUtils.stringToByteArray(CommonUtils.stringToBytes(TEST_STR)))); michael@0: }); michael@0: michael@0: add_task(function test_stringRoundTrip() { michael@0: do_check_eq(TEST_STR, michael@0: CommonUtils.hexAsString(CommonUtils.stringAsHex(TEST_STR))); michael@0: }); michael@0: michael@0: add_task(function test_hexRoundTrip() { michael@0: do_check_eq(TEST_HEX, michael@0: CommonUtils.stringAsHex(CommonUtils.hexAsString(TEST_HEX))); michael@0: }); michael@0: michael@0: add_task(function test_byteArrayRoundTrip() { michael@0: do_check_true(arraysEqual(TEST_BYTES, michael@0: CommonUtils.stringToByteArray(CommonUtils.byteArrayToString(TEST_BYTES)))); michael@0: }); michael@0: michael@0: // turn formatted test vectors into normal hex strings michael@0: function h(hexStr) { michael@0: return hexStr.replace(/\s+/g, ""); michael@0: } michael@0: michael@0: function arraysEqual(a1, a2) { michael@0: if (a1.length !== a2.length) { michael@0: return false; michael@0: } michael@0: for (let i = 0; i < a1.length; i++) { michael@0: if (a1[i] !== a2[i]) { michael@0: return false; michael@0: } michael@0: } michael@0: return true; michael@0: }