These are the workers (Worker
, SharedWorker
) tests for the Web workers chapter of the HTML Standard.
See also testharness.js API > Web Workers.
Note that because workers are defined in the HTML Standard, the idlharness.js tests are in /html/dom instead of here.
*.any.js
The easiest and most recommended way to write tests for workers is to create .any.js-style tests.
Official doc: WPT > File Name Flags > Test Features.
testharness.js
-style can be used (and is enforced).fetch_tests_from_worker
in testharness.js
.Converting existing tests into .any.js
-style also has benefits:
If you write testharness.js
-based tests in foo.any.js
and specify types of workers to be tested, the test can run on any of dedicated, shared and service workers.
See examples/general.any.js
for example.
Even for testing specific features in a specific type of workers (e.g. shared worker's onconnect
), .any.js
-style tests can be used.
See examples/onconnect.any.js
for example.
Whether each individual test passed or failed, and its assertion failures (if any) are all reported in the final results.
console.log()
might not appear in the test results and thus might not be useful for printf debugging. For example, in Chromium, this message
.any.js
-style tests use fetch_tests_from_worker
functionality of testharness.js
.
The WPT test server generates necessary glue code (including generated Document HTML and worker top-level scripts). See serve.py for the actual glue code.
Note that .any.js
file is not the worker top-level script, and currently we cannot set response headers to the worker top-level script, e.g. to set Referrer Policy of the workers.
*.worker.js
Similar to .any.js
, you can also write .worker.js
for tests only for dedicated workers. Almost the same as .any.js
, except for the things listed below.
Official doc: WPT > File Name Flags > Test Features.
You have to write two things manually (which is generated in .any.js
tests):
importScripts("/resources/testharness.js");
at the beginning.done();
at the bottom.Note: Even if you write async_test()
or promise_test()
, this global done()
is always needed (this is different from async_test's done()
) for dedicated workers and shared workers. See official doc: testharness.js API > Determining when all tests are complete.
See examples/general.worker.js
for example.
.worker.js
-style tests also use fetch_tests_from_worker
functionality of testharness.js
.
The WPT test server generates glue code in Document HTML-side, but not for worker top-level scripts. This is why you have to manually write importScripts()
etc. See serve.py for the actual glue code.
Unlike *.any.js
cases, the *.worker.js
is the worker top-level script.
fetch_tests_from_worker
If you need more flexibility, writing tests using fetch_tests_from_worker
is the way to go. For example, when
testharness.js
.You have to write the main HTMLs and the worker scripts, but most of the glue code needed for running tests on workers are provided by fetch_tests_from_worker
.
See
examples/fetch_tests_from_worker.html
and examples/fetch_tests_from_worker.js
.If fetch_tests_from_worker
isn't suitable for your specific case (which should be rare but might be still possible), you have to write the whole tests, including the main Document HTML, worker scripts, and message passing code between them.
TODO: Supply the templates for writing this kind of tests.