[njs] Tests: unit tests are rewritten using public API.
Dmitry Volyntsev
xeioex at nginx.com
Sat May 6 03:11:06 UTC 2023
details: https://hg.nginx.org/njs/rev/40af42ad829b
branches:
changeset: 2107:40af42ad829b
user: Dmitry Volyntsev <xeioex at nginx.com>
date: Fri May 05 20:08:57 2023 -0700
description:
Tests: unit tests are rewritten using public API.
njs_to_int32_test is replaced with ordinary script tests.
diffstat:
src/test/njs_externals_test.c | 9 +-
src/test/njs_externals_test.h | 6 +-
src/test/njs_unit_test.c | 348 +++++++++++++++++++----------------------
3 files changed, 168 insertions(+), 195 deletions(-)
diffs (644 lines):
diff -r 4df790f42ce7 -r 40af42ad829b src/test/njs_externals_test.c
--- a/src/test/njs_externals_test.c Fri May 05 20:08:56 2023 -0700
+++ b/src/test/njs_externals_test.c Fri May 05 20:08:57 2023 -0700
@@ -405,13 +405,13 @@ njs_unit_test_r_subrequest(njs_vm_t *vm,
return NJS_ERROR;
}
- ev = njs_mp_alloc(vm->mem_pool, sizeof(njs_external_ev_t));
+ ev = njs_mp_alloc(njs_vm_memory_pool(vm), sizeof(njs_external_ev_t));
if (ev == NULL) {
njs_memory_error(vm);
return NJS_ERROR;
}
- ret = njs_vm_promise_create(vm, &value, &ev->callbacks[0]);
+ ret = njs_vm_promise_create(vm, &value, njs_value_arg(&ev->callbacks[0]));
if (ret != NJS_OK) {
return NJS_ERROR;
}
@@ -1199,7 +1199,7 @@ njs_int_t
njs_external_env_init(njs_external_env_t *env)
{
if (env != NULL) {
- njs_value_invalid_set(&env->retval);
+ njs_value_invalid_set(njs_value_arg(&env->retval));
njs_queue_init(&env->events);
}
@@ -1229,7 +1229,8 @@ njs_external_process_events(njs_vm_t *vm
ev->link.prev = NULL;
ev->link.next = NULL;
- njs_vm_post_event(vm, ev->vm_event, &ev->args[0], ev->nargs);
+ njs_vm_post_event(vm, ev->vm_event, njs_value_arg(&ev->args[0]),
+ ev->nargs);
}
return NJS_OK;
diff -r 4df790f42ce7 -r 40af42ad829b src/test/njs_externals_test.h
--- a/src/test/njs_externals_test.h Fri May 05 20:08:56 2023 -0700
+++ b/src/test/njs_externals_test.h Fri May 05 20:08:57 2023 -0700
@@ -9,7 +9,7 @@
typedef struct {
- njs_value_t retval;
+ njs_opaque_value_t retval;
njs_queue_t events; /* of njs_external_ev_t */
} njs_external_env_t;
@@ -18,8 +18,8 @@ typedef struct {
njs_vm_event_t vm_event;
void *data;
njs_uint_t nargs;
- njs_value_t args[3];
- njs_value_t callbacks[2];
+ njs_opaque_value_t args[3];
+ njs_opaque_value_t callbacks[2];
njs_queue_link_t link;
} njs_external_ev_t;
diff -r 4df790f42ce7 -r 40af42ad829b src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c Fri May 05 20:08:56 2023 -0700
+++ b/src/test/njs_unit_test.c Fri May 05 20:08:57 2023 -0700
@@ -4,7 +4,14 @@
*/
-#include <njs_main.h>
+#include <njs.h>
+#include <njs_unix.h>
+#include <njs_file.h>
+#include <njs_utils.h>
+#include <njs_queue.h>
+#include <njs_string.h>
+
+#include <time.h>
#ifndef NJS_HAVE_PCRE2
#include <pcre.h>
@@ -1075,6 +1082,38 @@ static njs_unit_test_t njs_test[] =
{ njs_str("var x; x in (x = 1, [1, 2, 3])"),
njs_str("false") },
+ /* ToInt32(). */
+
+ { njs_str("-1.0 | 0"),
+ njs_str("-1") },
+
+ { njs_str("0.0 | 0"),
+ njs_str("0") },
+
+ { njs_str("0.001 | 0"),
+ njs_str("0") },
+
+ { njs_str("1.0 | 0"),
+ njs_str("1") },
+
+ { njs_str("2147483647.0 | 0"),
+ njs_str("2147483647") },
+
+ { njs_str("2147483648.0 | 0"),
+ njs_str("-2147483648") },
+
+ { njs_str("2147483649.0 | 0"),
+ njs_str("-2147483647") },
+
+ { njs_str("-1844674406941458432.0 | 0"),
+ njs_str("-2147483648") },
+
+ { njs_str("4.835703278458518e+24 /* 2**(53+29) + 2**30 */ | 0"),
+ njs_str("1073741824") },
+
+ { njs_str("9.671406556917036e+24 /* 2**(53+30) + 2**31 */ | 0"),
+ njs_str("-2147483648") },
+
/* Exponentiation. */
{ njs_str("2 ** 3 ** 2"),
@@ -23179,7 +23218,7 @@ typedef struct {
typedef struct {
njs_vm_t *vm;
- njs_value_t retval;
+ njs_opaque_value_t retval;
njs_external_env_t *env;
njs_external_env_t env0;
@@ -23257,12 +23296,13 @@ njs_external_retval(njs_external_state_t
{
if (state->env != NULL
&& ret == NJS_OK
- && njs_value_is_valid(&state->env->retval))
+ && njs_value_is_valid(njs_value_arg(&state->env->retval)))
{
- return njs_vm_value_string(state->vm, s, &state->env->retval);
- }
-
- return njs_vm_value_string(state->vm, s, &state->retval);
+ return njs_vm_value_string(state->vm, s,
+ njs_value_arg(&state->env->retval));
+ }
+
+ return njs_vm_value_string(state->vm, s, njs_value_arg(&state->retval));
}
@@ -23273,13 +23313,13 @@ njs_runtime_init(njs_vm_t *vm, njs_opts_
njs_uint_t i;
njs_runtime_t *rt;
- rt = njs_mp_alloc(vm->mem_pool, sizeof(njs_runtime_t));
+ rt = njs_mp_alloc(njs_vm_memory_pool(vm), sizeof(njs_runtime_t));
if (rt == NULL) {
return NULL;
}
rt->size = opts->repeat;
- rt->states = njs_mp_alloc(vm->mem_pool,
+ rt->states = njs_mp_alloc(njs_vm_memory_pool(vm),
sizeof(njs_external_state_t) * rt->size);
if (rt->states == NULL) {
return NULL;
@@ -23340,10 +23380,10 @@ static njs_int_t
njs_process_test(njs_external_state_t *state, njs_opts_t *opts,
njs_unit_test_t *expected)
{
- njs_int_t ret;
- njs_str_t s;
- njs_bool_t success;
- njs_value_t request;
+ njs_int_t ret;
+ njs_str_t s;
+ njs_bool_t success;
+ njs_opaque_value_t request;
static const njs_str_t handler_str = njs_str("main.handler");
static const njs_str_t request_str = njs_str("$r");
@@ -23354,7 +23394,7 @@ njs_process_test(njs_external_state_t *s
case sw_start:
state->state = sw_handler;
- ret = njs_vm_start(state->vm, &state->retval);
+ ret = njs_vm_start(state->vm, njs_value_arg(&state->retval));
if (ret != NJS_OK) {
goto done;
}
@@ -23368,13 +23408,15 @@ njs_process_test(njs_external_state_t *s
state->state = sw_loop;
if (opts->handler) {
- ret = njs_vm_value(state->vm, &request_str, &request);
+ ret = njs_vm_value(state->vm, &request_str,
+ njs_value_arg(&request));
if (ret != NJS_OK) {
njs_stderror("njs_vm_value(\"%V\") failed\n", &request_str);
return NJS_ERROR;
}
- ret = njs_external_call(state->vm, &handler_str, &request, 1);
+ ret = njs_external_call(state->vm, &handler_str,
+ njs_value_arg(&request), 1);
if (ret == NJS_ERROR) {
goto done;
}
@@ -23582,15 +23624,15 @@ static njs_int_t
njs_interactive_test(njs_unit_test_t tests[], size_t num, njs_str_t *name,
njs_opts_t *opts, njs_stat_t *stat)
{
- u_char *start, *last, *end;
- njs_vm_t *vm;
- njs_int_t ret;
- njs_str_t s;
- njs_uint_t i;
- njs_stat_t prev;
- njs_bool_t success;
- njs_value_t retval;
- njs_vm_opt_t options;
+ u_char *start, *last, *end;
+ njs_vm_t *vm;
+ njs_int_t ret;
+ njs_str_t s;
+ njs_uint_t i;
+ njs_stat_t prev;
+ njs_bool_t success;
+ njs_vm_opt_t options;
+ njs_opaque_value_t retval;
vm = NULL;
@@ -23651,11 +23693,11 @@ njs_interactive_test(njs_unit_test_t tes
njs_disassembler(vm);
}
- ret = njs_vm_start(vm, &retval);
+ ret = njs_vm_start(vm, njs_value_arg(&retval));
}
}
- if (njs_vm_value_dump(vm, &s, &retval, 0, 1) != NJS_OK) {
+ if (njs_vm_value_dump(vm, &s, njs_value_arg(&retval), 0, 1) != NJS_OK) {
njs_printf("njs_vm_value_dump() failed\n");
goto done;
}
@@ -23784,14 +23826,14 @@ static njs_int_t
njs_vm_json_test(njs_unit_test_t unused[], size_t num, njs_str_t *name,
njs_opts_t *opts, njs_stat_t *stat)
{
- njs_vm_t *vm;
- njs_int_t ret;
- njs_str_t s, *script;
- njs_uint_t i;
- njs_bool_t success;
- njs_stat_t prev;
- njs_value_t args[3], retval;
- njs_vm_opt_t options;
+ njs_vm_t *vm;
+ njs_int_t ret;
+ njs_str_t s, *script;
+ njs_uint_t i;
+ njs_bool_t success;
+ njs_stat_t prev;
+ njs_vm_opt_t options;
+ njs_opaque_value_t args[3], retval;
static const njs_str_t fname = njs_str("replacer");
static const njs_str_t iname = njs_str("indent");
@@ -23840,29 +23882,31 @@ njs_vm_json_test(njs_unit_test_t unused[
goto done;
}
- ret = njs_vm_start(vm, &args[0]);
+ ret = njs_vm_start(vm, njs_value_arg(&args[0]));
if (ret != NJS_OK) {
njs_printf("njs_vm_start() failed\n");
goto done;
}
- ret = njs_vm_json_parse(vm, args, 1, &retval);
+ ret = njs_vm_json_parse(vm, njs_value_arg(args), 1,
+ njs_value_arg(&retval));
if (ret != NJS_OK) {
njs_printf("njs_vm_json_parse() failed\n");
goto done;
}
njs_value_assign(&args[0], &retval);
- njs_vm_value(vm, &fname, &args[1]);
- njs_vm_value(vm, &iname, &args[2]);
-
- ret = njs_vm_json_stringify(vm, args, 3, &retval);
+ njs_vm_value(vm, &fname, njs_value_arg(&args[1]));
+ njs_vm_value(vm, &iname, njs_value_arg(&args[2]));
+
+ ret = njs_vm_json_stringify(vm, njs_value_arg(args), 3,
+ njs_value_arg(&retval));
if (ret != NJS_OK) {
njs_printf("njs_vm_json_stringify() failed\n");
goto done;
}
- if (njs_vm_value_string(vm, &s, &retval) != NJS_OK) {
+ if (njs_vm_value_string(vm, &s, njs_value_arg(&retval)) != NJS_OK) {
njs_printf("njs_vm_value_string() failed\n");
goto done;
}
@@ -23912,14 +23956,14 @@ static njs_int_t
njs_vm_value_test(njs_unit_test_t unused[], size_t num, njs_str_t *name,
njs_opts_t *opts, njs_stat_t *stat)
{
- njs_vm_t *vm;
- njs_int_t ret;
- njs_str_t s, *script, path;
- njs_uint_t i;
- njs_bool_t success;
- njs_stat_t prev;
- njs_value_t retval;
- njs_vm_opt_t options;
+ njs_vm_t *vm;
+ njs_int_t ret;
+ njs_str_t s, *script, path;
+ njs_uint_t i;
+ njs_bool_t success;
+ njs_stat_t prev;
+ njs_vm_opt_t options;
+ njs_opaque_value_t retval;
static struct {
njs_str_t script;
@@ -24001,7 +24045,7 @@ njs_vm_value_test(njs_unit_test_t unused
goto done;
}
- ret = njs_vm_start(vm, &retval);
+ ret = njs_vm_start(vm, njs_value_arg(&retval));
if (ret != NJS_OK) {
njs_printf("njs_vm_run() failed\n");
goto done;
@@ -24009,7 +24053,7 @@ njs_vm_value_test(njs_unit_test_t unused
path = tests[i].path;
- path.start = njs_mp_alloc(vm->mem_pool, path.length);
+ path.start = njs_mp_alloc(njs_vm_memory_pool(vm), path.length);
if (path.start == NULL) {
njs_printf("njs_mp_alloc() failed\n");
goto done;
@@ -24017,10 +24061,12 @@ njs_vm_value_test(njs_unit_test_t unused
memcpy(path.start, tests[i].path.start, path.length);
- ret = njs_vm_value(vm, &path, &retval);
+ ret = njs_vm_value(vm, &path, njs_value_arg(&retval));
if (ret == NJS_OK) {
- if (njs_vm_value_string(vm, &s, &retval) != NJS_OK) {
+ if (njs_vm_value_string(vm, &s, njs_value_arg(&retval))
+ != NJS_OK)
+ {
njs_printf("njs_vm_value_string() failed\n");
goto done;
}
@@ -24076,32 +24122,37 @@ done:
static njs_int_t
njs_vm_object_alloc_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
{
- njs_int_t ret;
- njs_value_t args[2], obj;
-
- static const njs_value_t num_key = njs_string("num");
- static const njs_value_t bool_key = njs_string("bool");
-
- njs_value_number_set(njs_argument(&args, 0), 1);
- njs_value_boolean_set(njs_argument(&args, 1), 0);
-
- ret = njs_vm_object_alloc(vm, &obj, NULL);
+ njs_int_t ret;
+ njs_opaque_value_t args[2], obj, num_key, bool_key;
+
+ njs_value_number_set(njs_value_arg(&args[0]), 1);
+ njs_value_boolean_set(njs_value_arg(&args[0]), 0);
+
+ (void) njs_vm_value_string_set(vm, njs_value_arg(&num_key),
+ (u_char *) "num", 3);
+ (void) njs_vm_value_string_set(vm, njs_value_arg(&bool_key),
+ (u_char *) "bool", 4);
+
+ ret = njs_vm_object_alloc(vm, njs_value_arg(&obj), NULL);
if (ret != NJS_OK) {
return NJS_ERROR;
}
- ret = njs_vm_object_alloc(vm, &obj, &num_key, NULL);
+ ret = njs_vm_object_alloc(vm, njs_value_arg(&obj), njs_value_arg(&num_key),
+ NULL);
if (ret == NJS_OK) {
return NJS_ERROR;
}
- ret = njs_vm_object_alloc(vm, &obj, &num_key, &args[0], NULL);
+ ret = njs_vm_object_alloc(vm, njs_value_arg(&obj), njs_value_arg(&num_key),
+ njs_value_arg(&args[0]), NULL);
if (ret != NJS_OK) {
return NJS_ERROR;
}
- ret = njs_vm_object_alloc(vm, &obj, &num_key, &args[0], &bool_key,
- &args[1], NULL);
+ ret = njs_vm_object_alloc(vm, njs_value_arg(&obj), njs_value_arg(&num_key),
+ njs_value_arg(&args[0]), njs_value_arg(&bool_key),
+ njs_value_arg(&args[1]), NULL);
if (ret != NJS_OK) {
stat->failed++;
return NJS_OK;
@@ -24216,7 +24267,7 @@ njs_chb_test(njs_vm_t *vm, njs_opts_t *o
static const njs_str_t expected = njs_str("arg: \"XYZ\" -5");
- njs_chb_init(&chain, vm->mem_pool);
+ njs_chb_init(&chain, njs_vm_memory_pool(vm));
p = njs_chb_reserve(&chain, 513);
if (p == NULL) {
@@ -24256,7 +24307,7 @@ njs_chb_test(njs_vm_t *vm, njs_opts_t *o
}
}
- njs_mp_free(vm->mem_pool, string.start);
+ njs_mp_free(njs_vm_memory_pool(vm), string.start);
for (i = 0; i < 222; i++) {;
njs_chb_drain(&chain, 3);
@@ -24335,7 +24386,7 @@ njs_chb_test(njs_vm_t *vm, njs_opts_t *o
}
njs_chb_destroy(&chain);
- njs_mp_free(vm->mem_pool, string.start);
+ njs_mp_free(njs_vm_memory_pool(vm), string.start);
done:
@@ -24481,47 +24532,48 @@ failed:
static njs_int_t
njs_string_to_index_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
{
- njs_str_t s, string;
- njs_int_t ret;
- njs_bool_t success, is_integer_index;
- njs_uint_t i;
- njs_value_t value;
+ double num;
+ njs_str_t s;
+ njs_int_t ret;
+ njs_bool_t success;
+ njs_uint_t i;
+ njs_opaque_value_t value, input;
static const struct {
- njs_value_t value;
+ njs_str_t value;
njs_str_t expected;
- njs_bool_t is_integer_index;
} tests[] = {
- { njs_string(" 1"), njs_str("NaN"), 0 },
- { njs_string(""), njs_str("NaN"), 0 },
- { njs_string("+0"), njs_str("NaN"), 0 },
- { njs_string("-"), njs_str("NaN"), 0 },
-
- { njs_string("-0"), njs_str("-0"), 0 },
- { njs_value(NJS_NUMBER, 0, -0.0), njs_str("-0"), 1 },
-
- { njs_string("-1"), njs_str("-1"), 0 },
- { njs_string("0"), njs_str("0"), 1 },
- { njs_string("0."), njs_str("NaN"), 0 },
- { njs_string("0.0"), njs_str("NaN"), 0 },
- { njs_string("0x1"), njs_str("NaN"), 0 },
- { njs_string("1 "), njs_str("NaN"), 0 },
- { njs_string("1"), njs_str("1"), 1 },
- { njs_string("1."), njs_str("NaN"), 0 },
- { njs_string("1.1"), njs_str("1.1"), 0 },
- { njs_string("100"), njs_str("100"), 1 },
- { njs_string("1a"), njs_str("NaN"), 0 },
- { njs_string("1e+19"), njs_str("NaN"), 0 },
- { njs_string("1e+22"), njs_str("1e+22"), 0 },
- { njs_string("1e22"), njs_str("NaN"), 0 },
- { njs_string("4294967296"), njs_str("4294967296"), 0 },
+ { njs_str(" 1"), njs_str("NaN") },
+ { njs_str(""), njs_str("NaN") },
+ { njs_str("+0"), njs_str("NaN") },
+ { njs_str("-"), njs_str("NaN") },
+ { njs_str("-0"), njs_str("-0") },
+ { njs_str("-1"), njs_str("-1") },
+ { njs_str("0"), njs_str("0") },
+ { njs_str("0."), njs_str("NaN") },
+ { njs_str("0.0"), njs_str("NaN") },
+ { njs_str("0x1"), njs_str("NaN") },
+ { njs_str("1 "), njs_str("NaN") },
+ { njs_str("1"), njs_str("1") },
+ { njs_str("1."), njs_str("NaN") },
+ { njs_str("1.1"), njs_str("1.1") },
+ { njs_str("100"), njs_str("100") },
+ { njs_str("1a"), njs_str("NaN") },
+ { njs_str("1e+19"), njs_str("NaN") },
+ { njs_str("1e+22"), njs_str("1e+22") },
+ { njs_str("1e22"), njs_str("NaN") },
+ { njs_str("4294967296"), njs_str("4294967296") },
};
for (i = 0; i < njs_nitems(tests); i++) {
- if (njs_is_string(&tests[i].value)) {
- njs_set_number(&value, njs_string_to_index(&tests[i].value));
-
- ret = njs_vm_value_dump(vm, &s, &value, 0, 0);
+ (void) njs_vm_value_string_set(vm, njs_value_arg(&input),
+ tests[i].value.start,
+ tests[i].value.length);
+
+ num = njs_string_to_index(njs_value_arg(&input));
+ njs_value_number_set(njs_value_arg(&value), num);
+
+ ret = njs_vm_value_dump(vm, &s, njs_value_arg(&value), 0, 0);
if (ret != NJS_OK) {
njs_printf("njs_string_to_index_test: "
"njs_vm_value_dump() failed\n");
@@ -24531,91 +24583,13 @@ njs_string_to_index_test(njs_vm_t *vm, n
success = njs_strstr_eq(&tests[i].expected, &s);
if (!success) {
- njs_string_get(&tests[i].value, &string);
njs_printf("njs_string_to_index_test(\"%V\"):\n"
"expected: \"%V\"\n got: \"%V\"\n",
- &string, &tests[i].expected, &s);
+ &tests[i].value, &tests[i].expected, &s);
stat->failed++;
continue;
}
- }
-
- is_integer_index = njs_key_is_integer_index(njs_number(&value),
- &tests[i].value);
-
- if (tests[i].is_integer_index != is_integer_index) {
- njs_string_get(&tests[i].value, &string);
- njs_printf("njs_string_to_index_test2(\"%V\"):\n"
- "expected: %b\n got: %b\n",
- &string, tests[i].is_integer_index, is_integer_index);
-
- stat->failed++;
- continue;
- }
-
- stat->passed++;
- }
-
- return NJS_OK;
-}
-
-
-static njs_int_t
-njs_to_int32_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
-{
- int32_t i32, second;
- njs_uint_t i;
-
- static const struct {
- double value;
- int32_t expected;
- } tests[] = {
- { -1.0, -1 },
- { 0.0, 0 },
- { 0.001, 0 },
- { 1.0, 1 },
- { 2147483647.0, 2147483647 },
- { 2147483648.0, -2147483648 },
- { 2147483649.0, -2147483647 },
- { -1844674406941458432.0, -2147483648 },
- { 4.835703278458518e+24 /* 2**(53+29) + 2**30 */, 1073741824 },
- { 9.671406556917036e+24 /* 2**(53+30) + 2**31 */, -2147483648 },
- };
-
- for (i = 0; i < njs_nitems(tests); i++) {
- i32 = njs_number_to_int32(tests[i].value);
-
- if (i32 != tests[i].expected) {
- njs_printf("njs_to_int32_test(%f):\n"
- "expected: %D\n got: %D\n",
- tests[i].value, tests[i].expected, i32);
-
- stat->failed++;
- continue;
- }
-
- second = njs_number_to_int32(i32);
-
- if (i32 != second) {
- njs_printf("njs_to_int32_test(%f): not idempodent\n"
- "expected: %D\n got: %D\n",
- tests[i].value, i32, second);
-
- stat->failed++;
- continue;
- }
-
- second = njs_number_to_int32(njs_number_to_uint32(tests[i].value));
-
- if (i32 != second) {
- njs_printf("ToInt32(%f) != ToInt32(ToUint32(%f))\n"
- "left: %D\n right: %D\n",
- tests[i].value, tests[i].value, i32, second);
-
- stat->failed++;
- continue;
- }
stat->passed++;
}
@@ -24637,7 +24611,7 @@ njs_addr2line_test(njs_vm_t *vm, njs_opt
const char *name;
} tests[] = {
{ njs_addr2line_test, njs_stringify(njs_addr2line_test) },
- { njs_to_int32_test, njs_stringify(njs_to_int32_test) },
+ { njs_string_to_index_test, njs_stringify(njs_string_to_index_test) },
};
for (i = 0; i < njs_nitems(tests); i++) {
@@ -24687,8 +24661,6 @@ njs_vm_internal_api_test(njs_unit_test_t
njs_str("njs_sort_test") },
{ njs_string_to_index_test,
njs_str("njs_string_to_index_test") },
- { njs_to_int32_test,
- njs_str("njs_to_int32_test") },
#ifdef NJS_HAVE_ADDR2LINE
{ njs_addr2line_test,
njs_str("njs_addr2line_test") },
@@ -24764,7 +24736,7 @@ njs_options_parse(njs_opts_t *opts, int
switch (*p) {
case '?':
case 'h':
- (void) write(STDOUT_FILENO, help, njs_length(help));
+ njs_printf("%*s", njs_length(help), help);
return NJS_DONE;
case 'd':
More information about the nginx-devel
mailing list