From: Dmitry Volyntsev Date: Fri, 3 Dec 2021 13:55:12 +0000 (+0000) Subject: Tests: added promise support for unit tests subrequest method. X-Git-Tag: 0.7.1~33 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=057c28dcb9665c7e450715dd652d3395edd982a3;p=njs.git Tests: added promise support for unit tests subrequest method. --- diff --git a/src/test/njs_externals_test.c b/src/test/njs_externals_test.c index 3285b16e..74cede07 100644 --- a/src/test/njs_externals_test.c +++ b/src/test/njs_externals_test.c @@ -377,10 +377,28 @@ njs_unit_test_r_method(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } +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, njs_value_t *args, njs_uint_t nargs, 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, njs_value_t *args, njs_uint_t nargs, 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 --git a/src/test/njs_externals_test.h b/src/test/njs_externals_test.h index 80778dfb..305ea706 100644 --- a/src/test/njs_externals_test.h +++ b/src/test/njs_externals_test.h @@ -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 --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 438a0fc3..45db986a 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -21015,8 +21015,15 @@ static njs_unit_test_t njs_externals_test[] = { njs_str("let obj = { a: 1, b: 2};" "function cb(r) { r.retval(obj.a); }" - "$r.subrequest(reply => cb(reply))"), + "$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_handler_test[] = { 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_handler_test[] = " 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};" "})();"