From 1bdfbd0a8f8f6f31251dc91552cafecfb89b6e9f Mon Sep 17 00:00:00 2001 From: toyobayashi Date: Sat, 9 Mar 2024 14:30:17 +0800 Subject: [PATCH] test: fix unreliable assumption in js-native-api/test_cannot_run_js --- packages/test/runjs/binding.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/packages/test/runjs/binding.c b/packages/test/runjs/binding.c index ad3afdb0..ee5daf52 100644 --- a/packages/test/runjs/binding.c +++ b/packages/test/runjs/binding.c @@ -11,17 +11,32 @@ void free(void* p); static void Finalize(napi_env env, void* data, void* hint) { napi_value global, set_timeout; napi_ref* ref = data; + + NODE_API_NOGC_ASSERT_RETURN_VOID( + napi_delete_reference(env, *ref) == napi_ok, + "deleting reference in finalizer should succeed"); + NODE_API_NOGC_ASSERT_RETURN_VOID( + napi_get_global(env, &global) == napi_ok, + "getting global reference in finalizer should succeed"); + napi_status result = + napi_get_named_property(env, global, "setTimeout", &set_timeout); + + // The finalizer could be invoked either from check callbacks (as native + // immediates) if the event loop is still running (where napi_ok is returned) + // or during environment shutdown (where napi_cannot_run_js or + // napi_pending_exception is returned). This is not deterministic from + // the point of view of the addon. #ifdef NAPI_EXPERIMENTAL - napi_status expected_status = napi_cannot_run_js; + NODE_API_NOGC_ASSERT_RETURN_VOID( + result == napi_cannot_run_js || result == napi_ok, + "getting named property from global in finalizer should succeed " + "or return napi_cannot_run_js"); #else - napi_status expected_status = napi_pending_exception; + NODE_API_NOGC_ASSERT_RETURN_VOID( + result == napi_pending_exception || result == napi_ok, + "getting named property from global in finalizer should succeed " + "or return napi_pending_exception"); #endif // NAPI_EXPERIMENTAL - - if (napi_delete_reference(env, *ref) != napi_ok) abort(); - if (napi_get_global(env, &global) != napi_ok) abort(); - if (napi_get_named_property(env, global, "setTimeout", &set_timeout) != - expected_status) - abort(); free(ref); }