[njs] Tests: added promise support for unit tests subrequest method.
Dmitry Volyntsev
xeioex at nginx.com
Fri Dec 3 13:57:19 UTC 2021
details: https://hg.nginx.org/njs/rev/cd87a113829d
branches:
changeset: 1757:cd87a113829d
user: Dmitry Volyntsev <xeioex at nginx.com>
date: Fri Dec 03 13:55:12 2021 +0000
description:
Tests: added promise support for unit tests subrequest method.
diffstat:
src/test/njs_externals_test.c | 46 +++++++++++++++++++++++++++++++++---------
src/test/njs_externals_test.h | 1 +
src/test/njs_unit_test.c | 17 ++++++++++++---
3 files changed, 50 insertions(+), 14 deletions(-)
diffs (134 lines):
diff -r b27244641dbf -r cd87a113829d src/test/njs_externals_test.c
--- a/src/test/njs_externals_test.c Fri Dec 03 13:55:11 2021 +0000
+++ b/src/test/njs_externals_test.c Fri Dec 03 13:55:12 2021 +0000
@@ -378,9 +378,27 @@ njs_unit_test_r_method(njs_vm_t *vm, njs
static njs_int_t
+njs_unit_test_promise_trampoline(njs_vm_t *vm, njs_value_t *args,
+ njs_uint_t nargs, njs_index_t unused)
+{
+ njs_function_t *callback;
+
+ callback = njs_value_function(njs_argument(args, 1));
+
+ if (callback != NULL) {
+ return njs_vm_call(vm, callback, njs_argument(args, 2), 1);
+ }
+
+ return NJS_OK;
+}
+
+
+static njs_int_t
njs_unit_test_r_subrequest(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
{
+ njs_int_t ret;
+ njs_value_t retval, *argument, *select;
njs_vm_event_t vm_event;
njs_function_t *callback;
njs_external_ev_t *ev;
@@ -393,9 +411,19 @@ njs_unit_test_r_subrequest(njs_vm_t *vm,
return NJS_ERROR;
}
- callback = njs_value_function(njs_arg(args, nargs, 1));
+ ev = njs_mp_alloc(vm->mem_pool, sizeof(njs_external_ev_t));
+ if (ev == NULL) {
+ njs_memory_error(vm);
+ return NJS_ERROR;
+ }
+
+ ret = njs_vm_promise_create(vm, &retval, &ev->callbacks[0]);
+ if (ret != NJS_OK) {
+ return NJS_ERROR;
+ }
+
+ callback = njs_vm_function_alloc(vm, njs_unit_test_promise_trampoline);
if (callback == NULL) {
- njs_type_error(vm, "argument is not callable");
return NJS_ERROR;
}
@@ -405,22 +433,20 @@ njs_unit_test_r_subrequest(njs_vm_t *vm,
return NJS_ERROR;
}
- ev = njs_mp_alloc(vm->mem_pool, sizeof(njs_external_ev_t));
- if (ev == NULL) {
- njs_memory_error(vm);
- return NJS_ERROR;
- }
+ argument = njs_arg(args, nargs, 1);
+ select = njs_arg(args, nargs, 2);
ev->vm_event = vm_event;
ev->data = r;
- ev->nargs = 1;
- njs_value_assign(&ev->args[0], njs_argument(args, 0));
+ ev->nargs = 2;
+ njs_value_assign(&ev->args[0], &ev->callbacks[!!njs_bool(select)]);
+ njs_value_assign(&ev->args[1], argument);
env = vm->external;
njs_queue_insert_tail(&env->events, &ev->link);
- njs_set_undefined(&vm->retval);
+ njs_vm_retval_set(vm, njs_value_arg(&retval));
return NJS_OK;
}
diff -r b27244641dbf -r cd87a113829d src/test/njs_externals_test.h
--- a/src/test/njs_externals_test.h Fri Dec 03 13:55:11 2021 +0000
+++ b/src/test/njs_externals_test.h Fri Dec 03 13:55:12 2021 +0000
@@ -19,6 +19,7 @@ typedef struct {
void *data;
njs_uint_t nargs;
njs_value_t args[3];
+ njs_value_t callbacks[2];
njs_queue_link_t link;
} njs_external_ev_t;
diff -r b27244641dbf -r cd87a113829d src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c Fri Dec 03 13:55:11 2021 +0000
+++ b/src/test/njs_unit_test.c Fri Dec 03 13:55:12 2021 +0000
@@ -21015,8 +21015,15 @@ static njs_unit_test_t njs_externals_te
{ njs_str("let obj = { a: 1, b: 2};"
"function cb(r) { r.retval(obj.a); }"
- "$r.subrequest(reply => cb(reply))"),
- njs_str("1") },
+ "$r.subrequest($r)"
+ ".then(reply => cb(reply))"),
+ njs_str("1") },
+
+ { njs_str("let obj = { a: 1, b: 2};"
+ "function cb(r, select) { r.retval(obj[select]); }"
+ "$r.subrequest('b')"
+ ".then(select => cb($r, select))"),
+ njs_str("2") },
};
@@ -21025,7 +21032,8 @@ static njs_unit_test_t njs_async_handle
{ njs_str("globalThis.main = (function() {"
" function cb(r) { r.retval(1); }"
" function handler(r) {"
- " r.subrequest(reply => cb(reply));"
+ " r.subrequest(r)"
+ " .then(reply => cb(reply))"
" };"
" return {handler};"
"})();"
@@ -21036,7 +21044,8 @@ static njs_unit_test_t njs_async_handle
" let obj = { a: 1, b: 2};"
" function cb(r) { r.retval(obj.a); }"
" function handler(r) {"
- " r.subrequest(reply => cb(reply));"
+ " r.subrequest(r)"
+ " .then(reply => cb(reply))"
" };"
" return {handler};"
"})();"
More information about the nginx-devel
mailing list