summaryrefslogtreecommitdiffhomepage
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/nxt_http_parse_test.c38
-rw-r--r--src/test/nxt_unit_app_test.c134
-rw-r--r--src/test/nxt_unit_websocket_chat.c8
3 files changed, 147 insertions, 33 deletions
diff --git a/src/test/nxt_http_parse_test.c b/src/test/nxt_http_parse_test.c
index 9630b21c..540309c1 100644
--- a/src/test/nxt_http_parse_test.c
+++ b/src/test/nxt_http_parse_test.c
@@ -23,9 +23,15 @@ typedef struct {
} nxt_http_parse_test_request_line_t;
+typedef struct {
+ nxt_int_t result;
+ unsigned discard_unsafe_fields:1;
+} nxt_http_parse_test_fields_t;
+
+
typedef union {
void *pointer;
- nxt_int_t result;
+ nxt_http_parse_test_fields_t fields;
nxt_http_parse_test_request_line_t request_line;
} nxt_http_parse_test_data_t;
@@ -324,10 +330,11 @@ static nxt_http_parse_test_case_t nxt_http_test_cases[] = {
{
nxt_string("GET / HTTP/1.1\r\n"
"X-Unknown-Header: value\r\n"
- "X-Good-Header: value\r\n\r\n"),
+ "X-Good-Header: value\r\n"
+ "!#$%&'*+.^_`|~: skipped\r\n\r\n"),
NXT_DONE,
&nxt_http_parse_test_fields,
- { .result = NXT_OK }
+ { .fields = { NXT_OK, 1 } }
},
{
nxt_string("GET / HTTP/1.1\r\n"
@@ -336,7 +343,14 @@ static nxt_http_parse_test_case_t nxt_http_test_cases[] = {
"X-Bad-Header: value\r\n\r\n"),
NXT_DONE,
&nxt_http_parse_test_fields,
- { .result = NXT_ERROR }
+ { .fields = { NXT_ERROR, 1 } }
+ },
+ {
+ nxt_string("GET / HTTP/1.1\r\n"
+ "!#$%&'*+.^_`|~: allowed\r\n\r\n"),
+ NXT_DONE,
+ &nxt_http_parse_test_fields,
+ { .fields = { NXT_ERROR, 0 } }
},
};
@@ -349,6 +363,10 @@ static nxt_http_field_proc_t nxt_http_test_fields[] = {
{ nxt_string("X-Good-Header"),
&nxt_http_test_header_return,
NXT_OK },
+
+ { nxt_string("!#$%&'*+.^_`|~"),
+ &nxt_http_test_header_return,
+ NXT_ERROR },
};
@@ -540,6 +558,10 @@ nxt_http_parse_test(nxt_thread_t *thr)
return NXT_ERROR;
}
+ if (test->handler == &nxt_http_parse_test_fields) {
+ rp.discard_unsafe_fields = test->data.fields.discard_unsafe_fields;
+ }
+
rc = nxt_http_parse_test_run(&rp, &test->request);
if (rc != test->result) {
@@ -740,7 +762,7 @@ nxt_http_parse_test_request_line(nxt_http_request_parse_t *rp,
return NXT_ERROR;
}
- if (rp->complex_target != test->complex_target) {
+ if (rp->complex_target != (test->complex_target | test->quoted_target)) {
nxt_log_alert(log, "http parse test case failed:\n"
" - request:\n\"%V\"\n"
" - complex_target: %d (expected: %d)",
@@ -748,6 +770,7 @@ nxt_http_parse_test_request_line(nxt_http_request_parse_t *rp,
return NXT_ERROR;
}
+#if 0
if (rp->quoted_target != test->quoted_target) {
nxt_log_alert(log, "http parse test case failed:\n"
" - request:\n\"%V\"\n"
@@ -763,6 +786,7 @@ nxt_http_parse_test_request_line(nxt_http_request_parse_t *rp,
request, rp->space_in_target, test->space_in_target);
return NXT_ERROR;
}
+#endif
return NXT_OK;
}
@@ -776,11 +800,11 @@ nxt_http_parse_test_fields(nxt_http_request_parse_t *rp,
rc = nxt_http_fields_process(rp->fields, &nxt_http_test_fields_hash, NULL);
- if (rc != data->result) {
+ if (rc != data->fields.result) {
nxt_log_alert(log, "http parse test hash failed:\n"
" - request:\n\"%V\"\n"
" - result: %i (expected: %i)",
- request, rc, data->result);
+ request, rc, data->fields.result);
return NXT_ERROR;
}
diff --git a/src/test/nxt_unit_app_test.c b/src/test/nxt_unit_app_test.c
index 4ecb8d6b..a5f3728c 100644
--- a/src/test/nxt_unit_app_test.c
+++ b/src/test/nxt_unit_app_test.c
@@ -6,6 +6,9 @@
#include <nxt_unit.h>
#include <nxt_unit_request.h>
#include <nxt_clang.h>
+#include <pthread.h>
+#include <string.h>
+#include <stdlib.h>
#define CONTENT_TYPE "Content-Type"
@@ -28,12 +31,112 @@
#define BODY " Body:\n"
-static inline char *
-copy(char *p, const void *src, uint32_t len)
+static int ready_handler(nxt_unit_ctx_t *ctx);
+static void *worker(void *main_ctx);
+static void greeting_app_request_handler(nxt_unit_request_info_t *req);
+static inline char *copy(char *p, const void *src, uint32_t len);
+
+
+static int thread_count;
+static pthread_t *threads;
+
+
+int
+main(int argc, char **argv)
{
- memcpy(p, src, len);
+ int i, err;
+ nxt_unit_ctx_t *ctx;
+ nxt_unit_init_t init;
- return p + len;
+ if (argc == 3 && strcmp(argv[1], "-t") == 0) {
+ thread_count = atoi(argv[2]);
+ }
+
+ memset(&init, 0, sizeof(nxt_unit_init_t));
+
+ init.callbacks.request_handler = greeting_app_request_handler;
+ init.callbacks.ready_handler = ready_handler;
+
+ ctx = nxt_unit_init(&init);
+ if (ctx == NULL) {
+ return 1;
+ }
+
+ err = nxt_unit_run(ctx);
+
+ nxt_unit_debug(ctx, "main worker finished with %d code", err);
+
+ if (thread_count > 1) {
+ for (i = 0; i < thread_count - 1; i++) {
+ err = pthread_join(threads[i], NULL);
+
+ if (nxt_fast_path(err == 0)) {
+ nxt_unit_debug(ctx, "join thread #%d", i);
+
+ } else {
+ nxt_unit_alert(ctx, "pthread_join(#%d) failed: %s (%d)",
+ i, strerror(err), err);
+ }
+ }
+
+ nxt_unit_free(ctx, threads);
+ }
+
+ nxt_unit_done(ctx);
+
+ nxt_unit_debug(NULL, "main worker done");
+
+ return 0;
+}
+
+
+static int
+ready_handler(nxt_unit_ctx_t *ctx)
+{
+ int i, err;
+
+ nxt_unit_debug(ctx, "ready");
+
+ if (!nxt_unit_is_main_ctx(ctx) || thread_count <= 1) {
+ return NXT_UNIT_OK;
+ }
+
+ threads = nxt_unit_malloc(ctx, sizeof(pthread_t) * (thread_count - 1));
+ if (threads == NULL) {
+ return NXT_UNIT_ERROR;
+ }
+
+ for (i = 0; i < thread_count - 1; i++) {
+ err = pthread_create(&threads[i], NULL, worker, ctx);
+ if (err != 0) {
+ return NXT_UNIT_ERROR;
+ }
+ }
+
+ return NXT_UNIT_OK;
+}
+
+
+static void *
+worker(void *main_ctx)
+{
+ int rc;
+ nxt_unit_ctx_t *ctx;
+
+ ctx = nxt_unit_ctx_alloc(main_ctx, NULL);
+ if (ctx == NULL) {
+ return NULL;
+ }
+
+ nxt_unit_debug(ctx, "start worker");
+
+ rc = nxt_unit_run(ctx);
+
+ nxt_unit_debug(ctx, "worker finished with %d code", rc);
+
+ nxt_unit_done(ctx);
+
+ return (void *) (intptr_t) rc;
}
@@ -168,24 +271,11 @@ fail:
nxt_unit_request_done(req, rc);
}
-int
-main()
-{
- nxt_unit_ctx_t *ctx;
- nxt_unit_init_t init;
-
- memset(&init, 0, sizeof(nxt_unit_init_t));
-
- init.callbacks.request_handler = greeting_app_request_handler;
- ctx = nxt_unit_init(&init);
- if (ctx == NULL) {
- return 1;
- }
-
- nxt_unit_run(ctx);
-
- nxt_unit_done(ctx);
+static inline char *
+copy(char *p, const void *src, uint32_t len)
+{
+ memcpy(p, src, len);
- return 0;
+ return p + len;
}
diff --git a/src/test/nxt_unit_websocket_chat.c b/src/test/nxt_unit_websocket_chat.c
index 6e274722..39f8a440 100644
--- a/src/test/nxt_unit_websocket_chat.c
+++ b/src/test/nxt_unit_websocket_chat.c
@@ -30,7 +30,7 @@ typedef struct {
static int ws_chat_root(nxt_unit_request_info_t *req);
-static void ws_chat_broadcast(const void *buf, size_t size);
+static void ws_chat_broadcast(const char *buf, size_t size);
static const char ws_chat_index_html[];
@@ -139,18 +139,18 @@ ws_chat_root(nxt_unit_request_info_t *req)
static void
-ws_chat_broadcast(const void *buf, size_t size)
+ws_chat_broadcast(const char *buf, size_t size)
{
ws_chat_request_data_t *data;
nxt_unit_request_info_t *req;
- nxt_unit_debug(NULL, "broadcast: %s", buf);
+ nxt_unit_debug(NULL, "broadcast: %*.s", (int) size, buf);
nxt_queue_each(data, &ws_chat_sessions, ws_chat_request_data_t, link) {
req = nxt_unit_get_request_info_from_data(data);
- nxt_unit_req_debug(req, "broadcast: %s", buf);
+ nxt_unit_req_debug(req, "send: %*.s", (int) size, buf);
nxt_unit_websocket_send(req, NXT_WEBSOCKET_OP_TEXT, 1, buf, size);
} nxt_queue_loop;