From 1e07b424b348e0830f75379409f91e4f2a1801fd Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Wed, 2 Oct 2024 13:31:46 -0700 Subject: [PATCH] [test] Re-instate ability to delay reference image collection. NFC In #22665 I removed the manually_trigger_reftest. However this resulted in racey behaviour in some tests. It turns out that running `doReftest` during `postRun` was working, but only because `doReftest` itself was doing async work, thus delaying the actual capture of the canvas bits. This change re-instates the behaviour but without the need to test setting in python. --- test/browser/test_sdl2_image_prepare.c | 3 +++ test/browser/test_sdl2_image_prepare_data.c | 3 +++ test/browser/test_sdl_image_must_prepare.c | 3 +++ test/browser/test_sdl_image_prepare.c | 3 +++ test/browser/test_sdl_image_prepare_data.c | 2 ++ test/common.py | 17 ++++++++++++++++- 6 files changed, 30 insertions(+), 1 deletion(-) diff --git a/test/browser/test_sdl2_image_prepare.c b/test/browser/test_sdl2_image_prepare.c index 045bc8994bc87..065d3ebed3144 100644 --- a/test/browser/test_sdl2_image_prepare.c +++ b/test/browser/test_sdl2_image_prepare.c @@ -40,6 +40,8 @@ void ready(const char *f) { testImage("screenshot.jpg"); // relative path SDL_RenderPresent(renderer); + + EM_ASM(reftestUnblock()); } int main() { @@ -56,6 +58,7 @@ int main() { assert(emscripten_run_preload_plugins("screenshot.jpg", ready, NULL) == 0); + EM_ASM(reftestBlock()); return 0; } diff --git a/test/browser/test_sdl2_image_prepare_data.c b/test/browser/test_sdl2_image_prepare_data.c index e6919f4888956..7664be3f40e7a 100644 --- a/test/browser/test_sdl2_image_prepare_data.c +++ b/test/browser/test_sdl2_image_prepare_data.c @@ -55,6 +55,8 @@ void ready(void *arg, const char *fileName) { free((void*)seenName); // As the API docs say, we are responsible for freeing the 'fake' names we are given SDL_RenderPresent(renderer); + + EM_ASM(reftestUnblock()); } } @@ -75,6 +77,7 @@ int main() { emscripten_run_preload_plugins_data(buffer, SIZE, "jpg", (void*)25, ready, NULL); emscripten_run_preload_plugins_data(buffer, SIZE, "jpg", (void*)33, ready, NULL); // twice to see different filenames + EM_ASM(reftestBlock()); return 0; } diff --git a/test/browser/test_sdl_image_must_prepare.c b/test/browser/test_sdl_image_must_prepare.c index 2105b82752700..f55a0da252e10 100644 --- a/test/browser/test_sdl_image_must_prepare.c +++ b/test/browser/test_sdl_image_must_prepare.c @@ -36,6 +36,8 @@ void ready(const char *f) { testImage("screenshot.jpg", 1); SDL_Flip(screen); + + EM_ASM(reftestUnblock()); } int main() { @@ -48,6 +50,7 @@ int main() { assert(emscripten_run_preload_plugins("screenshot.jpg", ready, NULL) == 0); + EM_ASM(reftestBlock()); return 0; } diff --git a/test/browser/test_sdl_image_prepare.c b/test/browser/test_sdl_image_prepare.c index 26d209a776edf..fd70ed4e6b1d5 100644 --- a/test/browser/test_sdl_image_prepare.c +++ b/test/browser/test_sdl_image_prepare.c @@ -37,6 +37,8 @@ void ready(const char *f) { testImage("screenshot.jpg"); // relative path SDL_Flip(screen); + + EM_ASM(reftestUnblock()); } int main() { @@ -51,6 +53,7 @@ int main() { assert(emscripten_run_preload_plugins("screenshot.jpg", ready, NULL) == 0); + EM_ASM(reftestBlock()); return 0; } diff --git a/test/browser/test_sdl_image_prepare_data.c b/test/browser/test_sdl_image_prepare_data.c index 4caa9e56d1e7a..bde1a21c62486 100644 --- a/test/browser/test_sdl_image_prepare_data.c +++ b/test/browser/test_sdl_image_prepare_data.c @@ -55,6 +55,7 @@ void ready(void *arg, const char *fileName) { free((void*)seenName); // As the API docs say, we are responsible for freeing the 'fake' names we are given SDL_Flip(screen); + EM_ASM(reftestUnblock()); } } @@ -73,6 +74,7 @@ int main() { emscripten_run_preload_plugins_data(buffer, SIZE, "jpg", (void*)25, ready, NULL); emscripten_run_preload_plugins_data(buffer, SIZE, "jpg", (void*)33, ready, NULL); // twice to see different filenames + EM_ASM(reftestBlock()); return 0; } diff --git a/test/common.py b/test/common.py index ae3ad7ede255c..4ff48516b22b8 100644 --- a/test/common.py +++ b/test/common.py @@ -2209,7 +2209,21 @@ def make_reftest(self, expected): # pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB infile outfile shutil.copy(expected, 'expected.png') create_file('reftest.js', ''' + // We have some tests that don't perform rendering during `main` so + // the normal process of performing `doReftest` in `postRun` doesn't + // work. These tests can delay the call to `doReftest` by calling + // `reftestBlock` and then calling `reftestUnblock` once they have + // done their rendering. + var reftestBlocked = false; + function reftestBlock() { + reftestBlocked = true; + } + function reftestUnblock() { + reftestBlocked = false; + doReftest(); + } function doReftest() { + if (reftestBlocked) return; if (doReftest.done) return; doReftest.done = true; console.log('doReftest'); @@ -2330,9 +2344,10 @@ def reftest(self, filename, reference, reference_slack=0, *args, **kwargs): expected = [str(i) for i in range(0, reference_slack + 1)] self.make_reftest(reference) if self.proxied: - print("XXXX") assert 'post_build' not in kwargs kwargs['post_build'] = self.post_manual_reftest + create_file('fakereftest.js', 'var reftestUnblock = () => {}; var reftestBlock = () => {};') + kwargs['args'] += ['--pre-js', 'fakereftest.js'] else: kwargs.setdefault('args', []) kwargs['args'] += ['--pre-js', 'reftest.js', '-sGL_TESTING']