diff options
Diffstat (limited to 'dom/crypto/test/test-array.js')
-rw-r--r-- | dom/crypto/test/test-array.js | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/dom/crypto/test/test-array.js b/dom/crypto/test/test-array.js new file mode 100644 index 000000000..1297f8eb8 --- /dev/null +++ b/dom/crypto/test/test-array.js @@ -0,0 +1,242 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var MOCHITEST = false; + +function Test(name, test) { + this.name = name; + this.startTime = null; + this.endTime = null; + this.result = null; + this.row = null; + + this.run = function() { + // Note the start time + this.startTime = new Date(); + // Run the test + try { + test.call(this); + } catch (e) { + console.log(e); + console.log(e.stack); + this.complete(false); + } + }; + + this.memcmp_complete = function(x, y) { + var passfail = util.memcmp(x, y); + if (!passfail) { + console.log("expected: " + util.abv2hex(x)); + console.log(" got: " + util.abv2hex(y)); + } + this.complete(passfail); + }; + + this.complete = function(result) { + if (MOCHITEST) { ok(result, this.name); } + + // Note the end time + this.endTime = new Date(); + // Set result + this.result = result; + // Re-draw the row + this.draw(); + this.next(); + }; + + this.next = function() { + if (this.oncomplete) { + this.oncomplete(); + } + }; + + this.setRow = function(id) { + this.row = document.getElementById(id).getElementsByTagName("td"); + }; + + this.draw = function() { + if (!this.row) return; + + // Print the name of the test + if (this.name) { + this.row[0].innerHTML = this.name; + var that = this; + this.row[0].onclick = function() { that.run(); } + } else { + this.row[0] = ""; + } + + // Print the result of the test + if (this.result == true) { + this.row[1].className = "pass"; + this.row[1].innerHTML = "PASS"; + } else if (this.result == false) { + this.row[1].className = "fail"; + this.row[1].innerHTML = "FAIL"; + } else { + //this.row[1].innerHTML = ""; + this.row[1].innerHTML = this.result; + } + + // Print the elapsed time, if known + if (this.startTime && this.endTime) { + this.row[2].innerHTML = (this.endTime - this.startTime) + " ms"; + } else { + this.row[2].innerHTML = ""; + } + }; +} + +function WorkerTest(worker, name, test) { + this.name = `${name} (Worker)`; + this.startTime = null; + this.endTime = null; + this.result = null; + this.row = null; + + this.run = function() { + // Note the start time + this.startTime = new Date(); + + // Send the test code to the worker. + worker.postMessage(test.toSource()); + + // We expect only boolean responses from the worker script. + worker.onmessage = e => this.complete(e.data); + worker.onerror = e => this.complete(false); + }; + + var base = new Test(name, test); + + // Inherit what we need from the |Test| class. We can't simply use its + // prototype as Test is just a function that can be used like a constructor. + for (var method of ["draw", "setRow", "next", "complete"]) { + this[method] = base[method].bind(this); + } +} + +var TestArray = { + tests: [], + table: null, + passSpan: null, + failSpan: null, + pendingSpan: null, + pass: 0, + fail: 0, + pending: 0, + currTest: 0, + worker: new Worker("test-worker.js"), + + addTest: function(name, testFn) { + // Give it a reference to the array + var test = new Test(name, testFn); + test.ta = this; + + // Add test to tests + this.tests.push(test); + + // Run the test in a worker too. + this.tests.push(new WorkerTest(this.worker, name, testFn)); + }, + + updateSummary: function() { + this.pass = this.fail = this.pending = 0; + for (var i=0; i<this.tests.length; ++i) { + if (this.tests[i].result == true) this.pass++; + if (this.tests[i].result == false) this.fail++; + if (this.tests[i].result == null) this.pending++; + } + this.passSpan.innerHTML = this.pass; + this.failSpan.innerHTML = this.fail; + this.pendingSpan.innerHTML = this.pending; + }, + + load: function() { + // Grab reference to table and summary numbers + this.table = document.getElementById("results"); + this.passSpan = document.getElementById("passN"); + this.failSpan = document.getElementById("failN"); + this.pendingSpan = document.getElementById("pendingN"); + + // Populate everything initially + this.updateSummary(); + for (var i=0; i<this.tests.length; ++i) { + var tr = document.createElement("tr"); + tr.id = "test" + i; + tr.appendChild(document.createElement("td")); + tr.appendChild(document.createElement("td")); + tr.appendChild(document.createElement("td")); + this.table.appendChild(tr); + this.tests[i].setRow(tr.id); + this.tests[i].draw(); + } + }, + + run: function() { + this.currTest = 0; + this.runNextTest(); + }, + + runNextTest: function() { + this.updateSummary(); + var i = this.currTest++; + if (i >= this.tests.length) { + if (MOCHITEST) { SimpleTest.finish(); } + return; + } + + var self = this; + this.tests[i].oncomplete = function() { + self.runNextTest(); + } + this.tests[i].run(); + } +} + +if (window.addEventListener) { + window.addEventListener("load", function() { TestArray.load(); } ); +} else { + window.attachEvent("onload", function() { TestArray.load(); } ); +} + +function start() { + TestArray.run(); +} + +MOCHITEST = ("SimpleTest" in window); +if (MOCHITEST) { + SimpleTest.waitForExplicitFinish(); + SimpleTest.requestLongerTimeout(2); + window.addEventListener("load", function() { + SimpleTest.waitForFocus(start); + }); +} + +function error(test) { + return function(x) { + console.log("ERROR :: " + x); + test.complete(false); + throw x; + } +} + +function complete(test, valid) { + return function(x) { + console.log("COMPLETE") + console.log(x); + if (valid) { + test.complete(valid(x)); + } else { + test.complete(true); + } + } +} + +function memcmp_complete(test, value) { + return function(x) { + console.log("COMPLETE") + console.log(x); + test.memcmp_complete(value, x); + } +} |