📄 test_nth.c
字号:
HTTP_200_OK, HTTPTAG_CONTENT_TYPE_STR("text/html"), HTTPTAG_PAYLOAD_STR("<html><body>sub/</body></html>\n"), TAG_END())); TEST_1(site_create(t, m, "/sub/sub/", HTTP_200_OK, HTTPTAG_CONTENT_TYPE_STR("text/html"), HTTPTAG_PAYLOAD_STR ("<html><body>sub/sub/</body></html>\n"), TAG_END())); TEST_1(sub2 = site_create(t, m, "/sub2/", HTTP_200_OK, HTTPTAG_CONTENT_TYPE_STR("text/html"), HTTPTAG_PAYLOAD_STR("<html><body>sub2/</body></html>\n"), TAG_END())); TEST_1(site_create(t, sub2, "sub/", HTTP_200_OK, HTTPTAG_CONTENT_TYPE_STR("text/html"), HTTPTAG_PAYLOAD_STR ("<html><body>sub2/sub/</body></html>\n"), TAG_END()));#ifndef _WIN32 temp = mkstemp(passwd_name);#else temp = open(passwd_name, O_WRONLY|O_CREAT|O_TRUNC, 666);#endif TEST_1(temp != -1); atexit(remove_tmp); /* Make sure temp file is unlinked */ TEST_SIZE(write(temp, passwd, strlen(passwd)), strlen(passwd)); TEST_1(close(temp) == 0); am = auth_mod_create(t->t_root, AUTHTAG_METHOD("Digest"), AUTHTAG_REALM("auth"), AUTHTAG_DB(passwd_name), TAG_END()); TEST_1(am); TEST_1(site_create(t, m, "auth/", HTTP_200_OK, HTTPTAG_CONTENT_TYPE_STR("text/html"), HTTPTAG_PAYLOAD_STR ("<html><body>auth/</body></html>\n"), NTHTAG_AUTH_MODULE(am), TAG_END())); auth_mod_unref(am); am = auth_mod_create(t->t_root, AUTHTAG_METHOD("Delayed+Basic"), AUTHTAG_REALM("auth2"), AUTHTAG_DB(passwd_name), TAG_END()); TEST_1(am); TEST_1(site_create(t, m, "auth2/", HTTP_200_OK, HTTPTAG_CONTENT_TYPE_STR("text/html"), HTTPTAG_PAYLOAD_STR ("<html><body>auth/</body></html>\n"), NTHTAG_AUTH_MODULE(am), TAG_END())); auth_mod_unref(am); END();}static int send_request(tester_t *t, char const *req, size_t reqlen, int close_socket, char reply[], int rlen, int *return_len){ static su_socket_t c = INVALID_SOCKET; int m, r; su_wait_t w[1]; BEGIN(); if (c == INVALID_SOCKET) { c = su_socket(t->t_addr->su_family, SOCK_STREAM, 0); TEST_1(c != SOCK_STREAM); TEST_1(su_setblocking(c, 1) != -1); TEST_1(connect(c, &t->t_addr->su_sa, t->t_addrlen) != -1); while (su_root_step(t->t_root, 1) == 0); } if (reqlen == (size_t)-1) reqlen = strlen(req); TEST_SIZE(su_send(c, req, reqlen, 0), reqlen); if (close_socket == 1) shutdown(c, 1); TEST(su_wait_create(w, c, SU_WAIT_IN), 0); while (su_root_step(t->t_root, 1) == 0 || su_wait(w, 1, 0) < 0); for (r = 0;;) { TEST_1((m = recv(c, reply, rlen - r - 1, 0)) != -1); r += m; if (m == 0 || r == rlen - 1) break; } reply[r] = '\0'; if (close_socket != -1) su_close(c), c = -1; *return_len = r; END();}int sspace(char const *buffer) { int m = strcspn(buffer, " "); if (buffer[m]) m += 1 + strcspn(buffer + m + 1, " "); return m;}#define CRLF "\r\n"static int test_requests(tester_t *t){ char buffer[4096 + 1]; int m; BEGIN(); { static char const get[] = "GET / HTTP/1.1" CRLF "Host: 127.0.0.1" CRLF "User-Agent: Test-Tool" CRLF "Connection: close" CRLF CRLF; TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = sspace(buffer); buffer[m] = '\0'; TEST_S(buffer, "HTTP/1.1 200"); } { static char const get[] = "GET / HTTP/1.1" CRLF "Host: 127.0.0.1" CRLF "User-Agent: Test-Tool" CRLF "Connection: close" CRLF CRLF; TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = strcspn(buffer, CRLF); buffer[m] = '\0'; TEST_S(buffer, "HTTP/1.1 200 OK"); } { static char const request[] = "GET %s HTTP/1.1" CRLF "Host: 127.0.0.1" CRLF "User-Agent: Test-Tool" CRLF "Connection: close" CRLF CRLF; char *get; get = su_sprintf(NULL, request, "/sub"); TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = sspace(buffer); buffer[m++] = '\0'; TEST_S(buffer, "HTTP/1.1 301"); m += strcspn(buffer + m, CRLF) + 1; free(get); get = su_sprintf(NULL, request, "/sub/"); TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = strcspn(buffer, CRLF); buffer[m++] = '\0'; TEST_S(buffer, "HTTP/1.1 200 OK"); TEST_1(strstr(buffer + m, "<body>sub/</body>")); free(get); get = su_sprintf(NULL, request, "/sub2/"); TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = strcspn(buffer, CRLF); buffer[m++] = '\0'; TEST_S(buffer, "HTTP/1.1 200 OK"); TEST_1(strstr(buffer + m, "<body>sub2/</body>")); free(get); get = su_sprintf(NULL, request, "/sub2/hub"); TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = strcspn(buffer, CRLF); buffer[m++] = '\0'; TEST_S(buffer, "HTTP/1.1 200 OK"); TEST_1(strstr(buffer + m, "<body>sub2/</body>")); free(get); /* Test that absolute path for subdir site is calculated correctly */ get = su_sprintf(NULL, request, "/sub2/sub"); TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = sspace(buffer); buffer[m++] = '\0'; TEST_S(buffer, "HTTP/1.1 301"); TEST_1(strstr(buffer + m, "/sub2/sub/" CRLF)); free(get); get = su_sprintf(NULL, request, "/sub2/sub/"); TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = strcspn(buffer, CRLF); buffer[m++] = '\0'; TEST_S(buffer, "HTTP/1.1 200 OK"); TEST_1(strstr(buffer + m, "<body>sub2/sub/</body>")); free(get); get = su_sprintf(NULL, request, "/sub/sub"); TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = strcspn(buffer, CRLF); buffer[m++] = '\0'; TEST_S(buffer, "HTTP/1.1 200 OK"); TEST_1(strstr(buffer + m, "<body>sub/sub</body>")); free(get); get = su_sprintf(NULL, request, "/auth/"); TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = sspace(buffer); buffer[m++] = '\0'; TEST_S(buffer, "HTTP/1.1 401"); free(get); get = su_sprintf(NULL, request, "/auth2/"); TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = sspace(buffer); buffer[m++] = '\0'; TEST_S(buffer, "HTTP/1.1 401"); free(get); } { static char const get[] = "GET /auth2/ HTTP/1.1" CRLF "Host: 127.0.0.1" CRLF "User-Agent: Test-Tool" CRLF "Connection: close" CRLF /* alice:secret in base64 */ "Authorization: Basic YWxpY2U6c2VjcmV0" CRLF CRLF; TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = sspace(buffer); buffer[m++] = '\0'; TEST_S(buffer, "HTTP/1.1 200"); } { static char const kuik[] = "kuik" CRLF CRLF; TEST(send_request(t, kuik, -1, 0, buffer, sizeof(buffer), &m), 0); m = sspace(buffer); buffer[m] = '\0'; TEST_S(buffer, "HTTP/1.1 400"); } { static char const kuik[] = "POST / HTTP/1.1" CRLF "Host: 127.0.0.1" CRLF "Content-Length: 4294967296" CRLF CRLF; TEST(send_request(t, kuik, -1, 1, buffer, sizeof(buffer), &m), 0); m = sspace(buffer); buffer[m] = '\0'; TEST_S(buffer, "HTTP/1.1 400"); } { static char const get[] = "GET / HTTP/10.10" CRLF "Host: 127.0.0.1" CRLF "User-Agent: Test-Tool" CRLF "Connection: close" CRLF CRLF; TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0); m = sspace(buffer); buffer[m] = '\0'; TEST_S(buffer, "HTTP/1.1 505"); } { static char const get[] = "GET /" CRLF; TEST(send_request(t, get, -1, 1, buffer, sizeof(buffer) - 1, &m), 0); buffer[6] = '\0'; TEST_S(buffer, "<html>"); } if (0) { static char const post[] = "POST /foo HTTP/1.1" CRLF "Host: 127.0.0.1" CRLF "User-Agent: Test-Tool" CRLF "Connection: close" CRLF "Content-Length: 7" CRLF "Expect: 100-continue" CRLF CRLF; static char const body[] = "<html/>"; TEST(send_request(t, post, -1, -1, buffer, sizeof(buffer) - 1, &m), 0); m = sspace(buffer); buffer[m] = '\0'; TEST_S(buffer, "HTTP/1.1 100"); TEST(send_request(t, body, -1, 0, buffer, sizeof(buffer) - 1, &m), 0); m = sspace(buffer); buffer[m] = '\0'; TEST_S(buffer, "HTTP/1.1 200"); } END();}static int init_engine(tester_t *t){ BEGIN(); su_socket_t s; t->t_engine = nth_engine_create(t->t_root, NTHTAG_STREAMING(0), TAG_END()); TEST_1(t->t_engine); t->t_sink = s = su_socket(AF_INET, SOCK_STREAM, 0); TEST_1(s != -1); TEST(bind(s, &t->t_sinkaddr->su_sa, t->t_sinkaddrlen = (sizeof t->t_sinkaddr->su_sin)), 0); TEST_1(getsockname(s, &t->t_sinkaddr->su_sa, &t->t_sinkaddrlen) != -1); TEST(listen(t->t_sink, 5), 0); TEST_1(t->t_sinkuri = (url_string_t *) su_sprintf(t->t_home, "HTTP://127.0.0.1:%u", htons(t->t_sinkaddr->su_port))); END();}static int response_to_client(client_t *c, nth_client_t *hc, http_t const *http){ if (http) { c->c_status = http->http_status->st_status; } else { c->c_status = nth_client_status(hc); } return 0;}static int test_client(tester_t *t){ BEGIN(); nth_client_t *hc; char *uri; client_t client[1]; memset(client, 0, sizeof client); TEST_1(uri = su_strcat(NULL, t->t_master->s_url->us_str, "/")); TEST_1(hc = nth_client_tcreate(t->t_engine, response_to_client, client, HTTP_METHOD_GET, URL_STRING_MAKE(uri), TAG_END())); while (client->c_status == 0) su_root_step(t->t_root, 1); TEST(client->c_status, 200); nth_client_destroy(hc); su_free(NULL, uri); memset(client, 0, sizeof client); TEST_1(hc = nth_client_tcreate(t->t_engine, response_to_client, client, HTTP_METHOD_GET, URL_STRING_MAKE(t->t_sinkuri), NTHTAG_EXPIRES(1000), TAG_END())); while (client->c_status == 0) su_root_step(t->t_root, 1); TEST(client->c_status, 408); nth_client_destroy(hc); END();}#if HAVE_ALARMstatic RETSIGTYPE sig_alarm(int s){ fprintf(stderr, "%s: FAIL! test timeout!\n", name); exit(1);}#endifvoid usage(int exitcode){ fprintf(stderr, "usage: %s [-v|-q] [-a] [-p proxy-uri]\n", name); exit(exitcode);}int main(int argc, char **argv){ int i; int retval = 0; int o_alarm = 1; tester_t t[1] = {{{ SU_HOME_INIT(t) }}}; char const *srcdir = getenv("srcdir"); if (srcdir == NULL) srcdir = "."; for (i = 1; argv[i]; i++) { if (strcmp(argv[i], "-v") == 0) tstflags |= tst_verbatim; else if (strcmp(argv[i], "-a") == 0) tstflags |= tst_abort; else if (strcmp(argv[i], "-q") == 0) tstflags &= ~tst_verbatim; else if (strcmp(argv[i], "-p") == 0 && argv[i + 1]) t->t_proxy = (url_string_t *)argv[++i]; else if (strcmp(argv[i], "-s") == 0 && argv[i + 1]) srcdir = argv[++i]; else if (strcmp(argv[i], "--no-alarm") == 0) { o_alarm = 0; } else if (strcmp(argv[i], "-") == 0) { i++; break; } else if (argv[i][0] != '-') { break; } else usage(1); } t->t_srcdir = srcdir;#if HAVE_ALARM if (o_alarm) { alarm(60); signal(SIGALRM, sig_alarm); }#endif su_init(); retval |= init_test(t); retval |= test_nth_client_api(t); retval |= test_nth_server_api(t); retval |= init_server(t); retval |= test_requests(t); retval |= init_engine(t); retval |= test_client(t); retval |= deinit_test(t); su_deinit(); return retval;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -