summaryrefslogtreecommitdiffstats
path: root/toolkit/components/lz4/tests/xpcshell
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/lz4/tests/xpcshell')
-rw-r--r--toolkit/components/lz4/tests/xpcshell/.eslintrc.js7
-rw-r--r--toolkit/components/lz4/tests/xpcshell/data/chrome.manifest1
-rw-r--r--toolkit/components/lz4/tests/xpcshell/data/compression.lzbin0 -> 23 bytes
-rw-r--r--toolkit/components/lz4/tests/xpcshell/data/worker_lz4.js146
-rw-r--r--toolkit/components/lz4/tests/xpcshell/test_lz4.js43
-rw-r--r--toolkit/components/lz4/tests/xpcshell/test_lz4_sync.js41
-rw-r--r--toolkit/components/lz4/tests/xpcshell/xpcshell.ini11
7 files changed, 249 insertions, 0 deletions
diff --git a/toolkit/components/lz4/tests/xpcshell/.eslintrc.js b/toolkit/components/lz4/tests/xpcshell/.eslintrc.js
new file mode 100644
index 000000000..d35787cd2
--- /dev/null
+++ b/toolkit/components/lz4/tests/xpcshell/.eslintrc.js
@@ -0,0 +1,7 @@
+"use strict";
+
+module.exports = {
+ "extends": [
+ "../../../../../testing/xpcshell/xpcshell.eslintrc.js"
+ ]
+};
diff --git a/toolkit/components/lz4/tests/xpcshell/data/chrome.manifest b/toolkit/components/lz4/tests/xpcshell/data/chrome.manifest
new file mode 100644
index 000000000..e2f9a9d8e
--- /dev/null
+++ b/toolkit/components/lz4/tests/xpcshell/data/chrome.manifest
@@ -0,0 +1 @@
+content test_lz4 ./
diff --git a/toolkit/components/lz4/tests/xpcshell/data/compression.lz b/toolkit/components/lz4/tests/xpcshell/data/compression.lz
new file mode 100644
index 000000000..a354edc03
--- /dev/null
+++ b/toolkit/components/lz4/tests/xpcshell/data/compression.lz
Binary files differ
diff --git a/toolkit/components/lz4/tests/xpcshell/data/worker_lz4.js b/toolkit/components/lz4/tests/xpcshell/data/worker_lz4.js
new file mode 100644
index 000000000..47e3ea369
--- /dev/null
+++ b/toolkit/components/lz4/tests/xpcshell/data/worker_lz4.js
@@ -0,0 +1,146 @@
+importScripts("resource://gre/modules/workers/require.js");
+importScripts("resource://gre/modules/osfile.jsm");
+
+
+function do_print(x) {
+ // self.postMessage({kind: "do_print", args: [x]});
+ dump("TEST-INFO: " + x + "\n");
+}
+
+function do_check_true(x) {
+ self.postMessage({kind: "do_check_true", args: [!!x]});
+ if (x) {
+ dump("TEST-PASS: " + x + "\n");
+ } else {
+ throw new Error("do_check_true failed");
+ }
+}
+
+function do_check_eq(a, b) {
+ let result = a == b;
+ self.postMessage({kind: "do_check_true", args: [result]});
+ if (!result) {
+ throw new Error("do_check_eq failed " + a + " != " + b);
+ }
+}
+
+function do_test_complete() {
+ self.postMessage({kind: "do_test_complete", args:[]});
+}
+
+self.onmessage = function() {
+ try {
+ run_test();
+ } catch (ex) {
+ let {message, moduleStack, moduleName, lineNumber} = ex;
+ let error = new Error(message, moduleName, lineNumber);
+ error.stack = moduleStack;
+ dump("Uncaught error: " + error + "\n");
+ dump("Full stack: " + moduleStack + "\n");
+ throw error;
+ }
+};
+
+var Lz4;
+var Internals;
+function test_import() {
+ Lz4 = require("resource://gre/modules/lz4.js");
+ Internals = require("resource://gre/modules/lz4_internal.js");
+}
+
+function test_bound() {
+ for (let k of ["compress", "decompress", "maxCompressedSize"]) {
+ try {
+ do_print("Checking the existence of " + k + "\n");
+ do_check_true(!!Internals[k]);
+ do_print(k + " exists");
+ } catch (ex) {
+ // Ignore errors
+ do_print(k + " doesn't exist!");
+ }
+ }
+}
+
+function test_reference_file() {
+ do_print("Decompress reference file");
+ let path = OS.Path.join("data", "compression.lz");
+ let data = OS.File.read(path);
+ let decompressed = Lz4.decompressFileContent(data);
+ let text = (new TextDecoder()).decode(decompressed);
+ do_check_eq(text, "Hello, lz4");
+}
+
+function compare_arrays(a, b) {
+ return Array.prototype.join.call(a) == Array.prototype.join.call(a);
+}
+
+function run_rawcompression(name, array) {
+ do_print("Raw compression test " + name);
+ let length = array.byteLength;
+ let compressedArray = new Uint8Array(Internals.maxCompressedSize(length));
+ let compressedBytes = Internals.compress(array, length, compressedArray);
+ compressedArray = new Uint8Array(compressedArray.buffer, 0, compressedBytes);
+ do_print("Raw compressed: " + length + " into " + compressedBytes);
+
+ let decompressedArray = new Uint8Array(length);
+ let decompressedBytes = new ctypes.size_t();
+ let success = Internals.decompress(compressedArray, compressedBytes,
+ decompressedArray, length,
+ decompressedBytes.address());
+ do_print("Raw decompression success? " + success);
+ do_print("Raw decompression size: " + decompressedBytes.value);
+ do_check_true(compare_arrays(array, decompressedArray));
+}
+
+function run_filecompression(name, array) {
+ do_print("File compression test " + name);
+ let compressed = Lz4.compressFileContent(array);
+ do_print("Compressed " + array.byteLength + " bytes into " + compressed.byteLength);
+
+ let decompressed = Lz4.decompressFileContent(compressed);
+ do_print("Decompressed " + compressed.byteLength + " bytes into " + decompressed.byteLength);
+ do_check_true(compare_arrays(array, decompressed));
+}
+
+function run_faileddecompression(name, array) {
+ do_print("invalid decompression test " + name);
+
+ // Ensure that raw decompression doesn't segfault
+ let length = 1 << 14;
+ let decompressedArray = new Uint8Array(length);
+ let decompressedBytes = new ctypes.size_t();
+ Internals.decompress(array, array.byteLength,
+ decompressedArray, length,
+ decompressedBytes.address());
+
+ // File decompression should fail with an acceptable exception
+ let exn = null;
+ try {
+ Lz4.decompressFileContent(array);
+ } catch (ex) {
+ exn = ex;
+ }
+ do_check_true(exn);
+ if (array.byteLength < 10) {
+ do_check_true(exn.becauseLZNoHeader);
+ } else {
+ do_check_true(exn.becauseLZWrongMagicNumber);
+ }
+}
+
+function run_test() {
+ test_import();
+ test_bound();
+ test_reference_file();
+ for (let length of [0, 1, 1024]) {
+ let array = new Uint8Array(length);
+ for (let i = 0; i < length; ++i) {
+ array[i] = i % 256;
+ }
+ let name = length + " bytes";
+ run_rawcompression(name, array);
+ run_filecompression(name, array);
+ run_faileddecompression(name, array);
+ }
+ do_test_complete();
+}
diff --git a/toolkit/components/lz4/tests/xpcshell/test_lz4.js b/toolkit/components/lz4/tests/xpcshell/test_lz4.js
new file mode 100644
index 000000000..8a8fc0b21
--- /dev/null
+++ b/toolkit/components/lz4/tests/xpcshell/test_lz4.js
@@ -0,0 +1,43 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+Components.utils.import("resource://gre/modules/Promise.jsm");
+
+var WORKER_SOURCE_URI = "chrome://test_lz4/content/worker_lz4.js";
+do_load_manifest("data/chrome.manifest");
+
+function run_test() {
+ run_next_test();
+}
+
+
+add_task(function() {
+ let worker = new ChromeWorker(WORKER_SOURCE_URI);
+ let deferred = Promise.defer();
+ worker.onmessage = function(event) {
+ let data = event.data;
+ switch (data.kind) {
+ case "do_check_true":
+ try {
+ do_check_true(data.args[0]);
+ } catch (ex) {
+ // Ignore errors
+ }
+ return;
+ case "do_test_complete":
+ deferred.resolve();
+ worker.terminate();
+ break;
+ case "do_print":
+ do_print(data.args[0]);
+ }
+ };
+ worker.onerror = function(event) {
+ let error = new Error(event.message, event.filename, event.lineno);
+ worker.terminate();
+ deferred.reject(error);
+ };
+ worker.postMessage("START");
+ return deferred.promise;
+});
+
diff --git a/toolkit/components/lz4/tests/xpcshell/test_lz4_sync.js b/toolkit/components/lz4/tests/xpcshell/test_lz4_sync.js
new file mode 100644
index 000000000..61605373b
--- /dev/null
+++ b/toolkit/components/lz4/tests/xpcshell/test_lz4_sync.js
@@ -0,0 +1,41 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const Cu = Components.utils;
+Cu.import("resource://gre/modules/lz4.js");
+Cu.import("resource://gre/modules/osfile.jsm");
+
+function run_test() {
+ run_next_test();
+}
+
+function compare_arrays(a, b) {
+ return Array.prototype.join.call(a) == Array.prototype.join.call(a);
+}
+
+add_task(function*() {
+ let path = OS.Path.join("data", "compression.lz");
+ let data = yield OS.File.read(path);
+ let decompressed = Lz4.decompressFileContent(data);
+ let text = (new TextDecoder()).decode(decompressed);
+ do_check_eq(text, "Hello, lz4");
+});
+
+add_task(function*() {
+ for (let length of [0, 1, 1024]) {
+ let array = new Uint8Array(length);
+ for (let i = 0; i < length; ++i) {
+ array[i] = i % 256;
+ }
+
+ let compressed = Lz4.compressFileContent(array);
+ do_print("Compressed " + array.byteLength + " bytes into " +
+ compressed.byteLength);
+
+ let decompressed = Lz4.decompressFileContent(compressed);
+ do_print("Decompressed " + compressed.byteLength + " bytes into " +
+ decompressed.byteLength);
+
+ do_check_true(compare_arrays(array, decompressed));
+ }
+});
diff --git a/toolkit/components/lz4/tests/xpcshell/xpcshell.ini b/toolkit/components/lz4/tests/xpcshell/xpcshell.ini
new file mode 100644
index 000000000..e457f29b2
--- /dev/null
+++ b/toolkit/components/lz4/tests/xpcshell/xpcshell.ini
@@ -0,0 +1,11 @@
+[DEFAULT]
+head =
+tail =
+skip-if = toolkit == 'android'
+support-files =
+ data/worker_lz4.js
+ data/chrome.manifest
+ data/compression.lz
+
+[test_lz4.js]
+[test_lz4_sync.js]