[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