-
Notifications
You must be signed in to change notification settings - Fork 31
Run Emscripten tests in a browser #569
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Run Emscripten tests in a browser #569
Conversation
7abb47a
to
03d41d5
Compare
Running the tests makes use of emrun which comes with Emscripten. The documentation for emrun can be found here https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html |
5dd5f18
to
9b51c8c
Compare
cd ./unittests/CppInterOp/ | ||
# Install browsers, and run Emscripten tests in them | ||
os="${{ matrix.os }}" | ||
if [[ "${os}" == "macos"* ]]; then |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The reason we install a fresh install of Firefox and Chome is to follow what is done in the Emscripten repo (for example here with Firefox https://github.com/emscripten-core/emscripten/blob/38e16464cffc8f886364fe4919a712131a4c9456/.circleci/config.yml#L363 ). It has the added advantage by not using the users installed versions of these browsers (if they have them installed), that there are no add ons, etc that could be causing issues with the tests running. I have made the instructions, such that a developer without admin privileges on there machine can install them.
|
||
# Run tests in browsers | ||
echo "Running CppInterOpTests in Firefox" | ||
emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
emrun allows us to run the created html file
--kill_exit
makes it so that when emrun finishes, that the headless browser we create is killed along with it
--timeout 60
is such that emrun is killed after 60 seconds if still running. emrun should have finished long before then, so if it is still running, something went wrong (such as a test which crashed the html file). This will cause the ci to fail, as a non 0 value of will be returned.
echo "Running DynamicLibraryManagerTests in Firefox" | ||
emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html | ||
echo "Running CppInterOpTests in Google Chrome" | ||
emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the case of Chrome we have the extra --no-sandbox
flag, as on Ubuntu Chrome will refuse to run otherwise, as it expects to have been installed with admin privileges. This flag allows it to run in userspace.
@@ -50,6 +51,7 @@ if(EMSCRIPTEN) | |||
PUBLIC "SHELL: -s STACK_SIZE=32mb" | |||
PUBLIC "SHELL: -s INITIAL_MEMORY=128mb" | |||
PUBLIC "SHELL: --preload-file ${SYSROOT_PATH}/include@/include" | |||
PUBLIC "SHELL: --emrun" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rebuild your Emscripten application and add the --emrun [linker flag](https://emscripten.org/docs/tools_reference/emcc.html#emcc-emrun).
This flag injects code into the generated [Module object](https://emscripten.org/docs/api_reference/module.html#module) to enable capture of stdout, stderr and exit().
Note
If you skip this step, you can still run any .html file with emrun, but the capture will not work.
The above is taken from emruns documentation https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html
@@ -1,4 +1,5 @@ | |||
if (EMSCRIPTEN) | |||
set(CMAKE_EXECUTABLE_SUFFIX ".html") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So that we create a html file, as well as the javascript file.
@@ -34,7 +34,11 @@ if(WIN32) | |||
else() | |||
target_link_libraries(${name} PRIVATE ${ARG_LIBRARIES} ${gtest_libs} ${link_pthreads_lib}) | |||
endif() | |||
if(EMSCRIPTEN) | |||
add_test(NAME cppinterop-${name} COMMAND $ENV{EMSDK_NODE} ${name}.js) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Without this cmake will try and get node to run the html file. This guarantees that it runs the js file, and uses emsdks node.
Description
Please include a summary of changes, motivation and context for this PR.
This PR adds the ability to run the Emscripten tests in a browser. This partially contributes to the goal of #500 , which is to run a c++ tutorial html file utilising CppInterOp, as part of automated testing.
Fixes # (issue)
Type of change
Please tick all options which are relevant.
Testing
Please describe the test(s) that you added and ran to verify your changes.
Checklist