| // Copyright 2022 The IREE Authors |
| // |
| // Licensed under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| var Module = { |
| // We can't interact with the DOM from a worker, so each line of output has |
| // to be routed back to the main/UI thread. We could buffer these to avoid |
| // all the interrupts, but any performance critical code shouldn't be logging |
| // anyways, and unbuffered output is easier to debug with. |
| print: function(text) { |
| postMessage({ |
| 'messageType': 'print', |
| 'payload': text, |
| }); |
| }, |
| printErr: function(text) { |
| postMessage({ |
| 'messageType': 'printErr', |
| 'payload': text, |
| }); |
| }, |
| onRuntimeInitialized: function() { |
| // TODO(scotttodd): record test time start? |
| }, |
| quit: function(status, error) { |
| // Report errors from Emscripten (not our test/application code) directly. |
| // Useful for debugging the test runner itself. |
| if (!(error instanceof ExitStatus)) console.error(error); |
| |
| postMessage({ |
| 'messageType': 'testResult', |
| 'payload': status, |
| }); |
| }, |
| }; |
| |
| function runTest(parameters) { |
| const {name, sourceFile, workingDirectory, requiredFiles, args} = parameters; |
| |
| Module['arguments'] = args; |
| |
| // Set up the 'locateFile' and 'preInit' functions to handle loading the |
| // different types of files needed by our tests. |
| // |
| // 'locateFile' is used by Emscripten when loading other JS and Wasm files, |
| // so we should search relative to the test source file. On the other hand, |
| // C/C++ code attempting to read files from disk (e.g. with `fopen()`) does |
| // _not_ use locateFile, but rather interfaces with Emscripten's File System |
| // API. |
| // |
| // Consider this example: |
| // workingDirectory = tests/e2e/ |
| // sourceFile = tools/iree-check-module.js |
| // requiredFiles = [check_sqrt.mlir_module.vmfb] |
| // * Emscripten will need to load `iree-check-module.wasm`, so locateFile |
| // should point to /tools/. |
| // * The test wants to read `check_sqrt.mlir_module.vmfb` from the working |
| // directory, so we should load `tests/e2e/check_sqrt.mlir_module.vmfb` |
| // into Emscripten's file system. There are multiple ways to do that, but |
| // calling createLazyFile in preInit seems simplest. |
| Module['locateFile'] = function(path, prefix) { |
| // https://emscripten.org/docs/api_reference/module.html#Module.locateFile |
| // `path/to/source_file.js` -> `path/to/` |
| const sourcePath = sourceFile.substring(0, sourceFile.lastIndexOf('/')); |
| return '/' + sourcePath + '/' + path; |
| }; |
| Module['preInit'] = function() { |
| requiredFiles.forEach((file) => { |
| // https://emscripten.org/docs/api_reference/Filesystem-API.html |
| FS.createLazyFile( |
| '/', file, '/' + workingDirectory + '/' + file, /*canRead=*/ true, |
| /*canWrite=*/ false); |
| }); |
| }; |
| |
| // TODO(scotttodd): allow-list of script URLs? Restrict to same domain? |
| importScripts('/' + sourceFile); |
| } |
| |
| self.onmessage = function(messageEvent) { |
| const {messageType, payload} = messageEvent.data; |
| |
| if (messageType == 'runTest') { |
| runTest(payload); |
| } |
| }; |