blob: 7e90f400a2b6f70ff9658b74de741bea8b795759 [file] [log] [blame]
// 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);
}
};