144 lines
6.1 KiB
JavaScript
144 lines
6.1 KiB
JavaScript
/*
|
|
* This file is intended for vendors to implement
|
|
* code needed to integrate testharness.js tests with their own test systems.
|
|
*
|
|
* Typically such integration will attach callbacks when each test is
|
|
* has run, using add_result_callback(callback(test)), or when the whole test file has
|
|
* completed, using add_completion_callback(callback(tests, harness_status)).
|
|
*
|
|
* For more documentation about the callback functions and the
|
|
* parameters they are called with see testharness.js
|
|
*/
|
|
|
|
// Setup for WebKit JavaScript tests
|
|
if (self.testRunner) {
|
|
testRunner.dumpAsText();
|
|
testRunner.waitUntilDone();
|
|
testRunner.setCanOpenWindows();
|
|
testRunner.grantWebNotificationPermission("http://localhost:8800");
|
|
// Let's restrict calling testharness timeout() to wptserve tests for the moment.
|
|
// That will limit the impact to a small number of tests.
|
|
// The risk is that testharness timeout() might be called to late on slow bots to finish properly.
|
|
if (testRunner.timeout && (location.port == 8800 || location.port == 9443))
|
|
setTimeout(timeout, testRunner.timeout * 0.9);
|
|
|
|
if (location.port == 8800 || location.port == 9443) {
|
|
if (self.internals) {
|
|
// Use 44100 sample rate by default instead of the hardware sample rate so that we get consistent results across machines.
|
|
internals.settings.setDefaultAudioContextSampleRate(44100);
|
|
}
|
|
}
|
|
|
|
if (testRunner.setStatisticsShouldDowngradeReferrer)
|
|
testRunner.setStatisticsShouldDowngradeReferrer(false, function() { });
|
|
}
|
|
|
|
if (self.internals && internals.setICECandidateFiltering)
|
|
internals.setICECandidateFiltering(false);
|
|
|
|
// Function used to convert the test status code into
|
|
// the corresponding string
|
|
function convertResult(resultStatus)
|
|
{
|
|
if(resultStatus == 0)
|
|
return("PASS");
|
|
else if(resultStatus == 1)
|
|
return("FAIL");
|
|
else if(resultStatus == 2)
|
|
return("TIMEOUT");
|
|
else
|
|
return("NOTRUN");
|
|
}
|
|
|
|
if (self.testRunner) {
|
|
/* Disable the default output of testharness.js. The default output formats
|
|
* test results into an HTML table. When that table is dumped as text, no
|
|
* spacing between cells is preserved, and it is therefore not readable. By
|
|
* setting output to false, the HTML table will not be created
|
|
*/
|
|
setup({"output": false, "explicit_timeout": true});
|
|
|
|
/* Using a callback function, test results will be added to the page in a
|
|
* manner that allows dumpAsText to produce readable test results
|
|
*/
|
|
add_completion_callback(function (tests, harness_status) {
|
|
var resultStr = "\n";
|
|
|
|
// Sanitizes the given text for display in test results.
|
|
function sanitize(text) {
|
|
if (!text) {
|
|
return "";
|
|
}
|
|
text = text.replace(/\0/g, "\\0");
|
|
return text.replace(/\r/g, "\\r");
|
|
}
|
|
|
|
if(harness_status.status != 0)
|
|
resultStr += "Harness Error (" + convertResult(harness_status.status) + "), message = " + harness_status.message + "\n\n";
|
|
|
|
// Truncate decimal values from output in webaudio tests to avoid test flakiness due to floating point precision issues.
|
|
const isWebAudioTest = document.URL.indexOf('/webaudio') >= 0;
|
|
|
|
for (var i = 0; i < tests.length; i++) {
|
|
var message = sanitize(tests[i].message);
|
|
if (tests[i].status == 1 && !tests[i].dumpStack) {
|
|
// Remove stack for failed tests for proper string comparison without file paths.
|
|
// For a test to dump the stack set its dumpStack attribute to true.
|
|
var stackIndex = message.indexOf("(stack:");
|
|
if (stackIndex > 0)
|
|
message = message.substr(0, stackIndex);
|
|
}
|
|
|
|
let testName = tests[i].name;
|
|
if (isWebAudioTest) {
|
|
testName = testName.replace(/\[[0-9.,\-e]*[0-9]\.[0-9]{7,}[0-9.,\-e]*\]/, "[expected array]");
|
|
testName = testName.replace(/[0-9]\.[0-9]{7,}/g, (match, offset, string) => {
|
|
return parseFloat(match).toFixed(6);
|
|
});
|
|
testName = testName.replace(/ \(contains [0-9]+ different values\)./, ".");
|
|
testName = testName.replace(/ \(contains 1 different value\)./, ".");
|
|
testName = testName.replace(/: Actual Tail Frame [0-9]+ is greater than or equal to [0-9]+./, ".");
|
|
}
|
|
|
|
resultStr += convertResult(tests[i].status) + " " + sanitize(testName) + " " + message + "\n";
|
|
}
|
|
|
|
var results = document.createElementNS("http://www.w3.org/1999/xhtml", "pre");
|
|
results.innerText = resultStr;
|
|
|
|
var log = document.getElementById("log");
|
|
if (log)
|
|
log.appendChild(results);
|
|
else if (document.body)
|
|
document.body.appendChild(results);
|
|
else {
|
|
var root = document.documentElement;
|
|
var is_html = root
|
|
&& root.namespaceURI == "http://www.w3.org/1999/xhtml"
|
|
&& root.localName == "html";
|
|
var is_svg = document.defaultView
|
|
&& "SVGSVGElement" in document.defaultView
|
|
&& root instanceof document.defaultView.SVGSVGElement;
|
|
|
|
if (is_svg) {
|
|
var foreignObject = document.createElementNS("http://www.w3.org/2000/svg", "foreignObject");
|
|
foreignObject.setAttribute("width", "100%");
|
|
foreignObject.setAttribute("height", "100%");
|
|
root.appendChild(foreignObject);
|
|
foreignObject.appendChild(results);
|
|
} else if (is_html) {
|
|
root.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "body"))
|
|
.appendChild(results);
|
|
} else {
|
|
root.appendChild(results);
|
|
}
|
|
}
|
|
|
|
// Wait for any other completion callbacks, which may eliminate test elements
|
|
// from the page and therefore reduce the output.
|
|
setTimeout(function () {
|
|
testRunner.forceImmediateCompletion();
|
|
}, 0);
|
|
});
|
|
}
|