]> git.kaiwu.me - njs.git/commitdiff
Tests: added promise support for unit tests subrequest method.
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 3 Dec 2021 13:55:12 +0000 (13:55 +0000)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 3 Dec 2021 13:55:12 +0000 (13:55 +0000)
src/test/njs_externals_test.c
src/test/njs_externals_test.h
src/test/njs_unit_test.c

index 3285b16e239cc0adc5de2e774ce1f5c0aa262bf0..74cede078680948946179cfc837589056df2ee7c 100644 (file)
@@ -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;
 }
index 80778dfbc39b5783c3c8e5bf6140ec5273403dba..305ea706d3d74063d880094f526b2ec85b19e005 100644 (file)
@@ -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;
 
index 438a0fc3fb1f534f0348970b3b675993b7fe3655..45db986a13ba71cdd1a97633c7907a2830f376ca 100644 (file)
@@ -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};"
               "})();"