michael@0: importScripts("resource://gre/modules/workers/require.js"); michael@0: importScripts("resource://gre/modules/osfile.jsm"); michael@0: michael@0: michael@0: function do_print(x) { michael@0: //self.postMessage({kind: "do_print", args: [x]}); michael@0: dump("TEST-INFO: " + x + "\n"); michael@0: } michael@0: michael@0: function do_check_true(x) { michael@0: self.postMessage({kind: "do_check_true", args: [!!x]}); michael@0: if (x) { michael@0: dump("TEST-PASS: " + x + "\n"); michael@0: } else { michael@0: throw new Error("do_check_true failed"); michael@0: } michael@0: } michael@0: michael@0: function do_check_eq(a, b) { michael@0: let result = a == b; michael@0: self.postMessage({kind: "do_check_true", args: [result]}); michael@0: if (!result) { michael@0: throw new Error("do_check_eq failed " + a + " != " + b); michael@0: } michael@0: } michael@0: michael@0: function do_test_complete() { michael@0: self.postMessage({kind: "do_test_complete", args:[]}); michael@0: } michael@0: michael@0: self.onmessage = function() { michael@0: try { michael@0: run_test(); michael@0: } catch (ex) { michael@0: let {message, moduleStack, moduleName, lineNumber} = ex; michael@0: let error = new Error(message, moduleName, lineNumber); michael@0: error.stack = moduleStack; michael@0: dump("Uncaught error: " + error + "\n"); michael@0: dump("Full stack: " + moduleStack + "\n"); michael@0: throw error; michael@0: } michael@0: }; michael@0: michael@0: let Lz4; michael@0: let Internals; michael@0: function test_import() { michael@0: Lz4 = require("resource://gre/modules/workers/lz4.js"); michael@0: Internals = require("resource://gre/modules/workers/lz4_internal.js"); michael@0: } michael@0: michael@0: function test_bound() { michael@0: for (let k of ["compress", "decompress", "maxCompressedSize"]) { michael@0: try { michael@0: do_print("Checking the existence of " + k + "\n"); michael@0: do_check_true(!!Internals[k]); michael@0: do_print(k + " exists"); michael@0: } catch (ex) { michael@0: // Ignore errors michael@0: do_print(k + " doesn't exist!"); michael@0: } michael@0: } michael@0: } michael@0: michael@0: function test_reference_file() { michael@0: do_print("Decompress reference file"); michael@0: let path = OS.Path.join("data", "compression.lz"); michael@0: let data = OS.File.read(path); michael@0: let decompressed = Lz4.decompressFileContent(data); michael@0: let text = (new TextDecoder()).decode(decompressed); michael@0: do_check_eq(text, "Hello, lz4"); michael@0: } michael@0: michael@0: function compare_arrays(a, b) { michael@0: return Array.prototype.join.call(a) == Array.prototype.join.call(a); michael@0: } michael@0: michael@0: function run_rawcompression(name, array) { michael@0: do_print("Raw compression test " + name); michael@0: let length = array.byteLength; michael@0: let compressedArray = new Uint8Array(Internals.maxCompressedSize(length)); michael@0: let compressedBytes = Internals.compress(array, length, compressedArray); michael@0: compressedArray = new Uint8Array(compressedArray.buffer, 0, compressedBytes); michael@0: do_print("Raw compressed: " + length + " into " + compressedBytes); michael@0: michael@0: let decompressedArray = new Uint8Array(length); michael@0: let decompressedBytes = new ctypes.size_t(); michael@0: let success = Internals.decompress(compressedArray, compressedBytes, michael@0: decompressedArray, length, michael@0: decompressedBytes.address()); michael@0: do_print("Raw decompression success? " + success); michael@0: do_print("Raw decompression size: " + decompressedBytes.value); michael@0: do_check_true(compare_arrays(array, decompressedArray)); michael@0: } michael@0: michael@0: function run_filecompression(name, array) { michael@0: do_print("File compression test " + name); michael@0: let compressed = Lz4.compressFileContent(array); michael@0: do_print("Compressed " + array.byteLength + " bytes into " + compressed.byteLength); michael@0: michael@0: let decompressed = Lz4.decompressFileContent(compressed); michael@0: do_print("Decompressed " + compressed.byteLength + " bytes into " + decompressed.byteLength); michael@0: do_check_true(compare_arrays(array, decompressed)); michael@0: } michael@0: michael@0: function run_faileddecompression(name, array) { michael@0: do_print("invalid decompression test " + name); michael@0: michael@0: // Ensure that raw decompression doesn't segfault michael@0: let length = 1 << 14; michael@0: let decompressedArray = new Uint8Array(length); michael@0: let decompressedBytes = new ctypes.size_t(); michael@0: Internals.decompress(array, array.byteLength, michael@0: decompressedArray, length, michael@0: decompressedBytes.address()); michael@0: michael@0: // File decompression should fail with an acceptable exception michael@0: let exn = null; michael@0: try { michael@0: Lz4.decompressFileContent(array); michael@0: } catch (ex) { michael@0: exn = ex; michael@0: } michael@0: do_check_true(exn); michael@0: if (array.byteLength < 10) { michael@0: do_check_true(exn.becauseLZNoHeader); michael@0: } else { michael@0: do_check_true(exn.becauseLZWrongMagicNumber); michael@0: } michael@0: } michael@0: michael@0: function run_test() { michael@0: test_import(); michael@0: test_bound(); michael@0: test_reference_file(); michael@0: for (let length of [0, 1, 1024]) { michael@0: let array = new Uint8Array(length); michael@0: for (let i = 0; i < length; ++i) { michael@0: array[i] = i % 256; michael@0: } michael@0: let name = length + " bytes"; michael@0: run_rawcompression(name, array); michael@0: run_filecompression(name, array); michael@0: run_faileddecompression(name, array); michael@0: } michael@0: do_test_complete(); michael@0: }