diff --git a/test/browser/test_async_returnvalue.c b/test/test_async_returnvalue.c similarity index 75% rename from test/browser/test_async_returnvalue.c rename to test/test_async_returnvalue.c index dd2297f91c1f0..bc321b8d2c215 100644 --- a/test/browser/test_async_returnvalue.c +++ b/test/test_async_returnvalue.c @@ -29,14 +29,16 @@ int sync_tunnel_bool(bool); int main() { #ifdef BAD EM_ASM({ - globalThis.disableErrorReporting = true; - window.onerror = async (e) => { - var success = e.toString().indexOf("import sync_tunnel was not in ASYNCIFY_IMPORTS, but changed the state") > 0; - if (success) { - console.log("reporting success"); - maybeReportResultToServer(0); - } - }; + if (globalThis.window) { + globalThis.disableErrorReporting = true; + window.onerror = async (e) => { + var success = e.toString().indexOf("import sync_tunnel was not in ASYNCIFY_IMPORTS, but changed the state") > 0; + if (success) { + console.log("reporting success"); + maybeReportResultToServer(0); + } + }; + } }); #endif int x; @@ -63,10 +65,13 @@ int main() { // We should not get here. printf("We should not get here\n"); assert(false); + return 1; #else // Success! + printf("done\n"); +#ifdef REPORT_RESULT REPORT_RESULT(0); #endif - return 0; +#endif } diff --git a/test/browser/test_async_returnvalue.js b/test/test_async_returnvalue.js similarity index 100% rename from test/browser/test_async_returnvalue.js rename to test/test_async_returnvalue.js diff --git a/test/test_browser.py b/test/test_browser.py index 51cc37e8708cc..5c30de4aee421 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -3299,7 +3299,7 @@ def test_async_iostream(self): def test_async_returnvalue(self, args): if '@' in str(args): create_file('filey.txt', 'sync_tunnel\nsync_tunnel_bool\n') - self.btest('test_async_returnvalue.c', '0', cflags=['-sASSERTIONS', '-sASYNCIFY', '-sASYNCIFY_IGNORE_INDIRECT', '--js-library', test_file('browser/test_async_returnvalue.js')] + args) + self.btest('test_async_returnvalue.c', '0', cflags=['-sASSERTIONS', '-sASYNCIFY', '-sASYNCIFY_IGNORE_INDIRECT', '--js-library', test_file('test_async_returnvalue.js')] + args) @no_safari('TODO: Never reports a result, so times out') # Fails in Safari 17.6 (17618.3.11.11.7, 17618), Safari 26.0.1 (21622.1.22.11.15) def test_async_bad_list(self): diff --git a/test/test_other.py b/test/test_other.py index 9ce6ccd84783e..64fcdd9bc69a7 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -10310,6 +10310,30 @@ def test(args, expected): test(['-sASSERTIONS=1'], 'Aborted(RuntimeError: unreachable). "unreachable" may be due to ASYNCIFY_STACK_SIZE not being large enough (try increasing it)') + # Test an async return value. The value goes through a custom JS library + # method that uses asyncify, and therefore it needs to be declared in + # ASYNCIFY_IMPORTS. + # To make the test more precise we also use ASYNCIFY_IGNORE_INDIRECT here. + @parameterized({ + '': (['-sASYNCIFY_IMPORTS=sync_tunnel,sync_tunnel_bool'],), # noqa + 'pattern_imports': (['-sASYNCIFY_IMPORTS=[sync_tun*]'],), # noqa + 'response': (['-sASYNCIFY_IMPORTS=@filey.txt'],), # noqa + 'nothing': (['-DBAD'],), # noqa + 'empty_list': (['-DBAD', '-sASYNCIFY_IMPORTS=[]'],), # noqa + 'em_js_bad': (['-DBAD', '-DUSE_EM_JS'],), # noqa + }) + def test_async_returnvalue(self, args): + if '-DBAD' in args: + returncode = NON_ZERO + expected = 'import sync_tunnel was not in ASYNCIFY_IMPORTS, but changed the state' + else: + returncode = 0 + expected = 'done\n' + if '@' in str(args): + create_file('filey.txt', 'sync_tunnel\nsync_tunnel_bool\n') + cflags = ['-sASSERTIONS', '-sASYNCIFY', '-sASYNCIFY_IGNORE_INDIRECT', '--js-library', test_file('test_async_returnvalue.js')] + self.do_runf('test_async_returnvalue.c', expected, assert_returncode=returncode, cflags=cflags + args) + # Sockets and networking def test_inet(self):