n-api: refactor a previous commit
This is a refactoring of https://github.com/nodejs/node/issues/27628 following https://github.com/nodejs/node/pull/28505. This change factors out functions `add_last_status()` and `add_returned_status()` so they may be reused in the tests for passing information about the last error status and/or a returned `napi_status` to JavaScript. PR-URL: https://github.com/nodejs/node/pull/28848 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Gabriel Schulhof <gabriel.schulhof@intel.com>
This commit is contained in:
parent
70bb570bfb
commit
db1c4a7592
51
test/js-native-api/common.c
Normal file
51
test/js-native-api/common.c
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include <js_native_api.h>
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void add_returned_status(napi_env env,
|
||||||
|
const char* key,
|
||||||
|
napi_value object,
|
||||||
|
char* expected_message,
|
||||||
|
napi_status expected_status,
|
||||||
|
napi_status actual_status) {
|
||||||
|
|
||||||
|
char napi_message_string[100] = "";
|
||||||
|
napi_value prop_value;
|
||||||
|
|
||||||
|
if (actual_status != expected_status) {
|
||||||
|
snprintf(napi_message_string, sizeof(napi_message_string), "Invalid status [%d]", actual_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
NAPI_CALL_RETURN_VOID(env,
|
||||||
|
napi_create_string_utf8(
|
||||||
|
env,
|
||||||
|
(actual_status == expected_status ?
|
||||||
|
expected_message :
|
||||||
|
napi_message_string),
|
||||||
|
NAPI_AUTO_LENGTH,
|
||||||
|
&prop_value));
|
||||||
|
NAPI_CALL_RETURN_VOID(env,
|
||||||
|
napi_set_named_property(env,
|
||||||
|
object,
|
||||||
|
key,
|
||||||
|
prop_value));
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_last_status(napi_env env, const char* key, napi_value return_value) {
|
||||||
|
napi_value prop_value;
|
||||||
|
const napi_extended_error_info* p_last_error;
|
||||||
|
NAPI_CALL_RETURN_VOID(env, napi_get_last_error_info(env, &p_last_error));
|
||||||
|
|
||||||
|
NAPI_CALL_RETURN_VOID(env,
|
||||||
|
napi_create_string_utf8(env,
|
||||||
|
(p_last_error->error_message == NULL ?
|
||||||
|
"napi_ok" :
|
||||||
|
p_last_error->error_message),
|
||||||
|
NAPI_AUTO_LENGTH,
|
||||||
|
&prop_value));
|
||||||
|
NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env,
|
||||||
|
return_value,
|
||||||
|
key,
|
||||||
|
prop_value));
|
||||||
|
}
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <js_native_api.h>
|
||||||
|
|
||||||
// Empty value so that macros here are able to return NULL or void
|
// Empty value so that macros here are able to return NULL or void
|
||||||
#define NAPI_RETVAL_NOTHING // Intentionally blank #define
|
#define NAPI_RETVAL_NOTHING // Intentionally blank #define
|
||||||
|
|
||||||
@ -58,3 +60,12 @@
|
|||||||
|
|
||||||
#define DECLARE_NAPI_GETTER(name, func) \
|
#define DECLARE_NAPI_GETTER(name, func) \
|
||||||
{ (name), NULL, NULL, (func), NULL, NULL, napi_default, NULL }
|
{ (name), NULL, NULL, (func), NULL, NULL, napi_default, NULL }
|
||||||
|
|
||||||
|
void add_returned_status(napi_env env,
|
||||||
|
const char* key,
|
||||||
|
napi_value object,
|
||||||
|
char* expected_message,
|
||||||
|
napi_status expected_status,
|
||||||
|
napi_status actual_status);
|
||||||
|
|
||||||
|
void add_last_status(napi_env env, const char* key, napi_value return_value);
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
{
|
{
|
||||||
"target_name": "test_constructor",
|
"target_name": "test_constructor",
|
||||||
"sources": [
|
"sources": [
|
||||||
|
"../common.c",
|
||||||
"../entry_point.c",
|
"../entry_point.c",
|
||||||
"test_constructor.c"
|
"test_constructor.c"
|
||||||
]
|
]
|
||||||
|
@ -1,35 +1,13 @@
|
|||||||
#include <js_native_api.h>
|
#include <js_native_api.h>
|
||||||
#include "../common.h"
|
#include "../common.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
static double value_ = 1;
|
static double value_ = 1;
|
||||||
static double static_value_ = 10;
|
static double static_value_ = 10;
|
||||||
|
|
||||||
static void
|
|
||||||
add_named_status(napi_env env, const char* key, napi_value return_value) {
|
|
||||||
napi_value prop_value;
|
|
||||||
const napi_extended_error_info* p_last_error;
|
|
||||||
NAPI_CALL_RETURN_VOID(env, napi_get_last_error_info(env, &p_last_error));
|
|
||||||
|
|
||||||
NAPI_CALL_RETURN_VOID(env,
|
|
||||||
napi_create_string_utf8(env,
|
|
||||||
(p_last_error->error_message == NULL ?
|
|
||||||
"napi_ok" :
|
|
||||||
p_last_error->error_message),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_value));
|
|
||||||
NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env,
|
|
||||||
return_value,
|
|
||||||
key,
|
|
||||||
prop_value));
|
|
||||||
}
|
|
||||||
|
|
||||||
static napi_value TestDefineClass(napi_env env,
|
static napi_value TestDefineClass(napi_env env,
|
||||||
napi_callback_info info) {
|
napi_callback_info info) {
|
||||||
napi_status status;
|
napi_status status;
|
||||||
napi_value result, return_value, prop_value;
|
napi_value result, return_value;
|
||||||
char p_napi_message[100] = "";
|
|
||||||
|
|
||||||
napi_property_descriptor property_descriptor = {
|
napi_property_descriptor property_descriptor = {
|
||||||
"TestDefineClass",
|
"TestDefineClass",
|
||||||
@ -52,20 +30,12 @@ static napi_value TestDefineClass(napi_env env,
|
|||||||
&property_descriptor,
|
&property_descriptor,
|
||||||
&result);
|
&result);
|
||||||
|
|
||||||
if (status == napi_invalid_arg) {
|
add_returned_status(env,
|
||||||
snprintf(p_napi_message, 99, "Invalid argument");
|
"envIsNull",
|
||||||
} else {
|
return_value,
|
||||||
snprintf(p_napi_message, 99, "Invalid status [%d]", status);
|
"Invalid argument",
|
||||||
}
|
napi_invalid_arg,
|
||||||
|
status);
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
|
||||||
p_napi_message,
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_value));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
return_value,
|
|
||||||
"envIsNull",
|
|
||||||
prop_value));
|
|
||||||
|
|
||||||
napi_define_class(env,
|
napi_define_class(env,
|
||||||
NULL,
|
NULL,
|
||||||
@ -76,7 +46,7 @@ static napi_value TestDefineClass(napi_env env,
|
|||||||
&property_descriptor,
|
&property_descriptor,
|
||||||
&result);
|
&result);
|
||||||
|
|
||||||
add_named_status(env, "nameIsNull", return_value);
|
add_last_status(env, "nameIsNull", return_value);
|
||||||
|
|
||||||
napi_define_class(env,
|
napi_define_class(env,
|
||||||
"TrackedFunction",
|
"TrackedFunction",
|
||||||
@ -87,7 +57,7 @@ static napi_value TestDefineClass(napi_env env,
|
|||||||
&property_descriptor,
|
&property_descriptor,
|
||||||
&result);
|
&result);
|
||||||
|
|
||||||
add_named_status(env, "cbIsNull", return_value);
|
add_last_status(env, "cbIsNull", return_value);
|
||||||
|
|
||||||
napi_define_class(env,
|
napi_define_class(env,
|
||||||
"TrackedFunction",
|
"TrackedFunction",
|
||||||
@ -98,7 +68,7 @@ static napi_value TestDefineClass(napi_env env,
|
|||||||
&property_descriptor,
|
&property_descriptor,
|
||||||
&result);
|
&result);
|
||||||
|
|
||||||
add_named_status(env, "cbDataIsNull", return_value);
|
add_last_status(env, "cbDataIsNull", return_value);
|
||||||
|
|
||||||
napi_define_class(env,
|
napi_define_class(env,
|
||||||
"TrackedFunction",
|
"TrackedFunction",
|
||||||
@ -109,7 +79,7 @@ static napi_value TestDefineClass(napi_env env,
|
|||||||
NULL,
|
NULL,
|
||||||
&result);
|
&result);
|
||||||
|
|
||||||
add_named_status(env, "propertiesIsNull", return_value);
|
add_last_status(env, "propertiesIsNull", return_value);
|
||||||
|
|
||||||
|
|
||||||
napi_define_class(env,
|
napi_define_class(env,
|
||||||
@ -121,7 +91,7 @@ static napi_value TestDefineClass(napi_env env,
|
|||||||
&property_descriptor,
|
&property_descriptor,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
add_named_status(env, "resultIsNull", return_value);
|
add_last_status(env, "resultIsNull", return_value);
|
||||||
|
|
||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
{
|
{
|
||||||
"target_name": "test_object",
|
"target_name": "test_object",
|
||||||
"sources": [
|
"sources": [
|
||||||
|
"../common.c",
|
||||||
"../entry_point.c",
|
"../entry_point.c",
|
||||||
"test_object.c"
|
"test_object.c"
|
||||||
]
|
]
|
||||||
|
@ -229,26 +229,26 @@ assert.strictEqual(newObject.test_string, 'test string');
|
|||||||
// Verify that passing NULL to napi_set_property() results in the correct
|
// Verify that passing NULL to napi_set_property() results in the correct
|
||||||
// error.
|
// error.
|
||||||
assert.deepStrictEqual(test_object.TestSetProperty(), {
|
assert.deepStrictEqual(test_object.TestSetProperty(), {
|
||||||
envIsNull: 'pass',
|
envIsNull: 'Invalid argument',
|
||||||
objectIsNull: 'pass',
|
objectIsNull: 'Invalid argument',
|
||||||
keyIsNull: 'pass',
|
keyIsNull: 'Invalid argument',
|
||||||
valueIsNull: 'pass'
|
valueIsNull: 'Invalid argument'
|
||||||
});
|
});
|
||||||
|
|
||||||
// Verify that passing NULL to napi_has_property() results in the correct
|
// Verify that passing NULL to napi_has_property() results in the correct
|
||||||
// error.
|
// error.
|
||||||
assert.deepStrictEqual(test_object.TestHasProperty(), {
|
assert.deepStrictEqual(test_object.TestHasProperty(), {
|
||||||
envIsNull: 'pass',
|
envIsNull: 'Invalid argument',
|
||||||
objectIsNull: 'pass',
|
objectIsNull: 'Invalid argument',
|
||||||
keyIsNull: 'pass',
|
keyIsNull: 'Invalid argument',
|
||||||
resultIsNull: 'pass'
|
resultIsNull: 'Invalid argument'
|
||||||
});
|
});
|
||||||
|
|
||||||
// Verify that passing NULL to napi_get_property() results in the correct
|
// Verify that passing NULL to napi_get_property() results in the correct
|
||||||
// error.
|
// error.
|
||||||
assert.deepStrictEqual(test_object.TestGetProperty(), {
|
assert.deepStrictEqual(test_object.TestGetProperty(), {
|
||||||
envIsNull: 'pass',
|
envIsNull: 'Invalid argument',
|
||||||
objectIsNull: 'pass',
|
objectIsNull: 'Invalid argument',
|
||||||
keyIsNull: 'pass',
|
keyIsNull: 'Invalid argument',
|
||||||
resultIsNull: 'pass'
|
resultIsNull: 'Invalid argument'
|
||||||
});
|
});
|
||||||
|
@ -341,8 +341,8 @@ static napi_value Unwrap(napi_env env, napi_callback_info info) {
|
|||||||
|
|
||||||
static napi_value TestSetProperty(napi_env env,
|
static napi_value TestSetProperty(napi_env env,
|
||||||
napi_callback_info info) {
|
napi_callback_info info) {
|
||||||
napi_status ret[4];
|
napi_status status;
|
||||||
napi_value object, key, value, prop_value;
|
napi_value object, key, value;
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_object(env, &object));
|
NAPI_CALL(env, napi_create_object(env, &object));
|
||||||
|
|
||||||
@ -350,122 +350,68 @@ static napi_value TestSetProperty(napi_env env,
|
|||||||
|
|
||||||
NAPI_CALL(env, napi_create_object(env, &value));
|
NAPI_CALL(env, napi_create_object(env, &value));
|
||||||
|
|
||||||
ret[0] = napi_set_property(NULL, object, key, value);
|
status = napi_set_property(NULL, object, key, value);
|
||||||
|
|
||||||
ret[1] = napi_set_property(env, NULL, key, value);
|
add_returned_status(env,
|
||||||
|
"envIsNull",
|
||||||
|
object,
|
||||||
|
"Invalid argument",
|
||||||
|
napi_invalid_arg,
|
||||||
|
status);
|
||||||
|
|
||||||
ret[2] = napi_set_property(env, object, NULL, value);
|
napi_set_property(env, NULL, key, value);
|
||||||
|
|
||||||
ret[3] = napi_set_property(env, object, key, NULL);
|
add_last_status(env, "objectIsNull", object);
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
napi_set_property(env, object, NULL, value);
|
||||||
(ret[0] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_value));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"envIsNull",
|
|
||||||
prop_value));
|
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
add_last_status(env, "keyIsNull", object);
|
||||||
(ret[1] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_value));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"objectIsNull",
|
|
||||||
prop_value));
|
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
napi_set_property(env, object, key, NULL);
|
||||||
(ret[2] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_value));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"keyIsNull",
|
|
||||||
prop_value));
|
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
add_last_status(env, "valueIsNull", object);
|
||||||
(ret[3] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_value));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"valueIsNull",
|
|
||||||
prop_value));
|
|
||||||
|
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
static napi_value TestHasProperty(napi_env env,
|
static napi_value TestHasProperty(napi_env env,
|
||||||
napi_callback_info info) {
|
napi_callback_info info) {
|
||||||
napi_status ret[4];
|
napi_status status;
|
||||||
napi_value object, key, prop_result;
|
napi_value object, key;
|
||||||
bool result;
|
bool result;
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_object(env, &object));
|
NAPI_CALL(env, napi_create_object(env, &object));
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env, "", NAPI_AUTO_LENGTH, &key));
|
NAPI_CALL(env, napi_create_string_utf8(env, "", NAPI_AUTO_LENGTH, &key));
|
||||||
|
|
||||||
ret[0] = napi_has_property(NULL, object, key, &result);
|
status = napi_has_property(NULL, object, key, &result);
|
||||||
|
|
||||||
ret[1] = napi_has_property(env, NULL, key, &result);
|
add_returned_status(env,
|
||||||
|
"envIsNull",
|
||||||
|
object,
|
||||||
|
"Invalid argument",
|
||||||
|
napi_invalid_arg,
|
||||||
|
status);
|
||||||
|
|
||||||
ret[2] = napi_has_property(env, object, NULL, &result);
|
napi_has_property(env, NULL, key, &result);
|
||||||
|
|
||||||
ret[3] = napi_has_property(env, object, key, NULL);
|
add_last_status(env, "objectIsNull", object);
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
napi_has_property(env, object, NULL, &result);
|
||||||
(ret[0] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_result));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"envIsNull",
|
|
||||||
prop_result));
|
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
add_last_status(env, "keyIsNull", object);
|
||||||
(ret[1] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_result));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"objectIsNull",
|
|
||||||
prop_result));
|
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
napi_has_property(env, object, key, NULL);
|
||||||
(ret[2] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_result));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"keyIsNull",
|
|
||||||
prop_result));
|
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
add_last_status(env, "resultIsNull", object);
|
||||||
(ret[3] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_result));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"resultIsNull",
|
|
||||||
prop_result));
|
|
||||||
|
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
static napi_value TestGetProperty(napi_env env,
|
static napi_value TestGetProperty(napi_env env,
|
||||||
napi_callback_info info) {
|
napi_callback_info info) {
|
||||||
napi_status ret[4];
|
napi_status status;
|
||||||
napi_value object, key, result, prop_result;
|
napi_value object, key, result;
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_object(env, &object));
|
NAPI_CALL(env, napi_create_object(env, &object));
|
||||||
|
|
||||||
@ -473,53 +419,26 @@ static napi_value TestGetProperty(napi_env env,
|
|||||||
|
|
||||||
NAPI_CALL(env, napi_create_object(env, &result));
|
NAPI_CALL(env, napi_create_object(env, &result));
|
||||||
|
|
||||||
ret[0] = napi_get_property(NULL, object, key, &result);
|
status = napi_get_property(NULL, object, key, &result);
|
||||||
|
|
||||||
ret[1] = napi_get_property(env, NULL, key, &result);
|
add_returned_status(env,
|
||||||
|
"envIsNull",
|
||||||
|
object,
|
||||||
|
"Invalid argument",
|
||||||
|
napi_invalid_arg,
|
||||||
|
status);
|
||||||
|
|
||||||
ret[2] = napi_get_property(env, object, NULL, &result);
|
napi_get_property(env, NULL, key, &result);
|
||||||
|
|
||||||
ret[3] = napi_get_property(env, object, key, NULL);
|
add_last_status(env, "objectIsNull", object);
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
napi_get_property(env, object, NULL, &result);
|
||||||
(ret[0] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_result));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"envIsNull",
|
|
||||||
prop_result));
|
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
add_last_status(env, "keyIsNull", object);
|
||||||
(ret[1] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_result));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"objectIsNull",
|
|
||||||
prop_result));
|
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
napi_get_property(env, object, key, NULL);
|
||||||
(ret[2] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_result));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"keyIsNull",
|
|
||||||
prop_result));
|
|
||||||
|
|
||||||
NAPI_CALL(env, napi_create_string_utf8(env,
|
add_last_status(env, "resultIsNull", object);
|
||||||
(ret[3] == napi_invalid_arg ?
|
|
||||||
"pass" : "fail"),
|
|
||||||
NAPI_AUTO_LENGTH,
|
|
||||||
&prop_result));
|
|
||||||
NAPI_CALL(env, napi_set_named_property(env,
|
|
||||||
object,
|
|
||||||
"resultIsNull",
|
|
||||||
prop_result));
|
|
||||||
|
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user