From dee3245535fe1ff37cd9abfe1e6f6430bbbd763c Mon Sep 17 00:00:00 2001 From: Gabriel Schulhof Date: Wed, 19 Apr 2023 20:20:39 -0700 Subject: [PATCH] node-api: test passing NULL to number APIs PR-URL: https://github.com/nodejs/node/pull/47549 Reviewed-By: Michael Dawson Reviewed-By: Chengzhong Wu --- test/js-native-api/test_number/binding.gyp | 4 +- test/js-native-api/test_number/test_null.c | 77 ++++++++++++++++++++ test/js-native-api/test_number/test_null.h | 8 ++ test/js-native-api/test_number/test_null.js | 18 +++++ test/js-native-api/test_number/test_number.c | 3 + 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 test/js-native-api/test_number/test_null.c create mode 100644 test/js-native-api/test_number/test_null.h create mode 100644 test/js-native-api/test_number/test_null.js diff --git a/test/js-native-api/test_number/binding.gyp b/test/js-native-api/test_number/binding.gyp index 8e047bd4708682..fa65304ba54089 100644 --- a/test/js-native-api/test_number/binding.gyp +++ b/test/js-native-api/test_number/binding.gyp @@ -3,8 +3,10 @@ { "target_name": "test_number", "sources": [ + "../common.c", "../entry_point.c", - "test_number.c" + "test_number.c", + "test_null.c", ] } ] diff --git a/test/js-native-api/test_number/test_null.c b/test/js-native-api/test_number/test_null.c new file mode 100644 index 00000000000000..37e8b24028fa45 --- /dev/null +++ b/test/js-native-api/test_number/test_null.c @@ -0,0 +1,77 @@ +#include + +#include "../common.h" + +// Unifies the way the macros declare values. +typedef double double_t; + +#define BINDING_FOR_CREATE(initial_capital, lowercase) \ + static napi_value Create##initial_capital(napi_env env, \ + napi_callback_info info) { \ + napi_value return_value, call_result; \ + lowercase##_t value = 42; \ + NODE_API_CALL(env, napi_create_object(env, &return_value)); \ + add_returned_status(env, \ + "envIsNull", \ + return_value, \ + "Invalid argument", \ + napi_invalid_arg, \ + napi_create_##lowercase(NULL, value, &call_result)); \ + napi_create_##lowercase(env, value, NULL); \ + add_last_status(env, "resultIsNull", return_value); \ + return return_value; \ + } + +#define BINDING_FOR_GET_VALUE(initial_capital, lowercase) \ + static napi_value GetValue##initial_capital(napi_env env, \ + napi_callback_info info) { \ + napi_value return_value, call_result; \ + lowercase##_t value = 42; \ + NODE_API_CALL(env, napi_create_object(env, &return_value)); \ + NODE_API_CALL(env, napi_create_##lowercase(env, value, &call_result)); \ + add_returned_status( \ + env, \ + "envIsNull", \ + return_value, \ + "Invalid argument", \ + napi_invalid_arg, \ + napi_get_value_##lowercase(NULL, call_result, &value)); \ + napi_get_value_##lowercase(env, NULL, &value); \ + add_last_status(env, "valueIsNull", return_value); \ + napi_get_value_##lowercase(env, call_result, NULL); \ + add_last_status(env, "resultIsNull", return_value); \ + return return_value; \ + } + +BINDING_FOR_CREATE(Double, double) +BINDING_FOR_CREATE(Int32, int32) +BINDING_FOR_CREATE(Uint32, uint32) +BINDING_FOR_CREATE(Int64, int64) +BINDING_FOR_GET_VALUE(Double, double) +BINDING_FOR_GET_VALUE(Int32, int32) +BINDING_FOR_GET_VALUE(Uint32, uint32) +BINDING_FOR_GET_VALUE(Int64, int64) + +void init_test_null(napi_env env, napi_value exports) { + const napi_property_descriptor test_null_props[] = { + DECLARE_NODE_API_PROPERTY("createDouble", CreateDouble), + DECLARE_NODE_API_PROPERTY("createInt32", CreateInt32), + DECLARE_NODE_API_PROPERTY("createUint32", CreateUint32), + DECLARE_NODE_API_PROPERTY("createInt64", CreateInt64), + DECLARE_NODE_API_PROPERTY("getValueDouble", GetValueDouble), + DECLARE_NODE_API_PROPERTY("getValueInt32", GetValueInt32), + DECLARE_NODE_API_PROPERTY("getValueUint32", GetValueUint32), + DECLARE_NODE_API_PROPERTY("getValueInt64", GetValueInt64), + }; + napi_value test_null; + + NODE_API_CALL_RETURN_VOID(env, napi_create_object(env, &test_null)); + NODE_API_CALL_RETURN_VOID( + env, + napi_define_properties(env, + test_null, + sizeof(test_null_props) / sizeof(*test_null_props), + test_null_props)); + NODE_API_CALL_RETURN_VOID( + env, napi_set_named_property(env, exports, "testNull", test_null)); +} diff --git a/test/js-native-api/test_number/test_null.h b/test/js-native-api/test_number/test_null.h new file mode 100644 index 00000000000000..d5f6bf01863af7 --- /dev/null +++ b/test/js-native-api/test_number/test_null.h @@ -0,0 +1,8 @@ +#ifndef TEST_JS_NATIVE_API_TEST_NUMBER_TEST_NULL_H_ +#define TEST_JS_NATIVE_API_TEST_NUMBER_TEST_NULL_H_ + +#include + +void init_test_null(napi_env env, napi_value exports); + +#endif // TEST_JS_NATIVE_API_TEST_NUMBER_TEST_NULL_H_ diff --git a/test/js-native-api/test_number/test_null.js b/test/js-native-api/test_number/test_null.js new file mode 100644 index 00000000000000..046369d199a5d4 --- /dev/null +++ b/test/js-native-api/test_number/test_null.js @@ -0,0 +1,18 @@ +'use strict'; +const common = require('../../common'); +const assert = require('assert'); +const { testNull } = require(`./build/${common.buildType}/test_number`); + +const expectedCreateResult = { + envIsNull: 'Invalid argument', + resultIsNull: 'Invalid argument', +}; +const expectedGetValueResult = { + envIsNull: 'Invalid argument', + resultIsNull: 'Invalid argument', + valueIsNull: 'Invalid argument', +}; +[ 'Double', 'Int32', 'Uint32', 'Int64' ].forEach((typeName) => { + assert.deepStrictEqual(testNull['create' + typeName](), expectedCreateResult); + assert.deepStrictEqual(testNull['getValue' + typeName](), expectedGetValueResult); +}); diff --git a/test/js-native-api/test_number/test_number.c b/test/js-native-api/test_number/test_number.c index a5137c1f9f4ef0..c8d4733f580a05 100644 --- a/test/js-native-api/test_number/test_number.c +++ b/test/js-native-api/test_number/test_number.c @@ -1,5 +1,6 @@ #include #include "../common.h" +#include "test_null.h" static napi_value Test(napi_env env, napi_callback_info info) { size_t argc = 1; @@ -101,6 +102,8 @@ napi_value Init(napi_env env, napi_value exports) { NODE_API_CALL(env, napi_define_properties( env, exports, sizeof(descriptors) / sizeof(*descriptors), descriptors)); + init_test_null(env, exports); + return exports; } EXTERN_C_END