📄 test_msg.c
字号:
/* Test authentication headers */ su_home_t home[1] = { SU_HOME_INIT(home) }; msg_auth_t au[1] = {{{{ 0 }}}}; char s[] = "Basic foo = \"bar==\" ,, bar=baari," "baz=\"bof,\\\\ \\\" baff\", base\t64/ - is== ,,"; TEST_1(msg_auth_d(home, (msg_header_t *)au, s, strlen(s)) >= 0); TEST_S(au->au_scheme, "Basic"); TEST_1(au->au_params); TEST_S(au->au_params[0], "foo=\042bar==\042"); TEST_S(au->au_params[1], "bar=baari"); TEST_S(au->au_params[2], "baz=\042bof,\\\\ \\\042 baff\042"); TEST_S(au->au_params[3], "base 64/- is=="); TEST_1(!au->au_params[4]); su_home_deinit(home); } /* Test that msg_*_format() works */ { su_home_t home[1] = { SU_HOME_INIT(home) }; msg_content_type_t *c; c = msg_content_type_format(home, "%s/%s;%s;%s;%s;%s;%s;%s", "text", "plain", "charset=iso-8859-15", "format=flowed", "q=0.999", "msg-size=782572564", "name-space-url=\"http://www.nokia.com/foo\"", "foo=bar"); su_home_deinit(home); } { /* Test parameter handling */ su_home_t home[1] = { SU_HOME_INIT(home) }; msg_content_encoding_t *ce; ce = msg_content_encoding_make(home, "zip, zap, zup, lz, zl, zz, ll"); TEST_1(ce); TEST_S(msg_header_find_param(ce->k_common, "zz"), ""); TEST(msg_header_find_param(ce->k_common, "k"), NULL); TEST(msg_header_add_param(home, ce->k_common, "zip"), 0); TEST(msg_header_remove_param(ce->k_common, "zip"), 1); TEST_S(msg_header_find_param(ce->k_common, "zip"), ""); TEST(msg_header_remove_param(ce->k_common, "zip"), 1); TEST(msg_header_find_param(ce->k_common, "zip"), NULL); TEST(msg_header_remove_param(ce->k_common, "zip"), 0); TEST(msg_header_replace_param(home, ce->k_common, "zip=zap"), 0); TEST_S(msg_header_find_param(ce->k_common, "zip=1"), "zap"); TEST(msg_header_replace_param(home, ce->k_common, "zip=zup"), 1); TEST_S(msg_header_find_param(ce->k_common, "zip"), "zup"); su_home_deinit(home); } END();}int hash_test(void){ int i, j, hash = 0; msg_mclass_t const *mc = msg_test_mclass; msg_hclass_t *hc; BEGIN(); for (i = 0; i < mc->mc_hash_size; i++) { hc = mc->mc_hash[i].hr_class; if (hc == NULL) continue; hash = msg_header_name_hash(hc->hc_name, NULL); TEST(hash, hc->hc_hash); /* Cross-check hashes */ for (j = i + 1; j < mc->mc_hash_size; j++) { if (mc->mc_hash[j].hr_class == NULL) continue; if (hc->hc_hash == mc->mc_hash[j].hr_class->hc_hash) fprintf(stderr, "\t%s and %s have same hash\n", hc->hc_name, mc->mc_hash[j].hr_class->hc_name); TEST_1(hc->hc_hash != mc->mc_hash[j].hr_class->hc_hash); } } END();}msg_t *read_msg(char const buffer[]){ int n, m; msg_t *msg; msg_iovec_t iovec[2]; n = strlen(buffer); if (n == 0) return NULL; msg = msg_create(msg_test_mclass, MSG_DO_EXTRACT_COPY); su_home_preload(msg_home(msg), 1, 4096); if (msg_recv_iovec(msg, iovec, 2, n, 1) < 0) { perror("msg_recv_iovec"); } memcpy(iovec->mv_base, buffer, n); msg_recv_commit(msg, n, 1); m = msg_extract(msg); return msg;}/**Check if header chain contains any loops. * * @return * Return 0 if no loop, -1 otherwise. */static int msg_chain_loop(msg_header_t const *h){ msg_header_t const *h2; if (!h) return 0; for (h2 = h->sh_succ; h && h2 && h2->sh_succ; h = h->sh_succ) { if (h == h2 || h == h2->sh_succ) return 1; h2 = h2->sh_succ->sh_succ; if (h == h2) return 1; } return 0;}/** Check header chain consistency. * * @return * Return 0 if consistent, number of errors otherwise. */staticint msg_chain_errors(msg_header_t const *h){ if (msg_chain_loop(h)) return -1; for (; h; h = h->sh_succ) { if (h->sh_succ && h->sh_succ->sh_prev != &h->sh_succ) return -1; if (h->sh_prev && h != (*h->sh_prev)) return -1; } return 0;}int test_msg_parsing(void){ msg_t *msg, *orig; su_home_t *home; msg_test_t *tst, *otst; msg_request_t *request; msg_status_t *status; msg_content_location_t *location; msg_content_language_t *language; msg_separator_t *separator; msg_payload_t *payload; BEGIN(); msg = read_msg("GET a-life HTTP/1.1" CRLF "Content-Length: 6" CRLF "Accept-Language: en;q=0.8, fi, se ; q = 0.6" CRLF "Foo: bar" CRLF CRLF "test" CRLF); home = msg_home(msg); tst = msg_test_public(msg); TEST_1(msg); TEST_1(home); TEST_1(tst); TEST(tst->msg_error, NULL); TEST_1(tst->msg_accept_language); TEST_1(status = msg_status_make(home, "HTTP/1.1 200 Ok")); TEST(msg_header_insert(msg, (msg_pub_t *)tst, (msg_header_t *)status), 0); TEST(tst->msg_status, status); TEST(tst->msg_request, NULL); TEST_1(request = msg_request_make(home, "GET a-wife HTTP/1.0")); TEST(msg_header_insert(msg, (msg_pub_t *)tst, (msg_header_t *)request), 0); TEST(tst->msg_request, request); TEST(tst->msg_status, NULL); TEST_1(separator = msg_separator_make(home, "\r\n")); TEST(msg_header_insert(msg, (msg_pub_t *)tst, (msg_header_t *)separator), 0); TEST(tst->msg_separator, separator); TEST(separator->sep_common->h_succ, tst->msg_payload); /* Try to add a new payload */ TEST_1(payload = msg_payload_make(home, "foofaa\r\n")); TEST(msg_header_insert(msg, (msg_pub_t *)tst, (msg_header_t *)payload), 0); /* It is appended */ TEST(tst->msg_payload->pl_next, payload); TEST(tst->msg_payload->pl_common->h_succ, payload); { msg_param_t vs; int vi = 0; msg_param_t foo = "foo=bar"; vs = NULL; MSG_PARAM_MATCH(vs, foo, "foo"); TEST_S(vs, "bar"); vs = NULL; MSG_PARAM_MATCH(vs, foo, "fo"); TEST(vs, NULL); vi = 0; MSG_PARAM_MATCH_P(vi, foo, "foo"); TEST(vi, 1); MSG_PARAM_MATCH_P(vi, foo, "fo"); TEST(vi, 1); vi = 0; MSG_PARAM_MATCH_P(vi, foo, "fo"); TEST(vi, 0); } msg_destroy(msg); /* Bug #2624: */ msg = read_msg("GET /replaces HTTP/1.1" CRLF "Accept-Encoding: gzip" CRLF "Accept-Encoding: bzip2" CRLF "Accept-Encoding: deflate" CRLF "Accept-Language: en;q=0.8, fi, se ; q = 0.6" CRLF ); TEST_1(msg); tst = msg_test_public(msg); TEST_1(tst); { msg_accept_encoding_t *gzip, *bzip2, *deflate; msg_accept_encoding_t *lzss; msg_accept_language_t *en, *fi, *se; msg_accept_language_t *de, *sv, *sv_fi; TEST_1(gzip = tst->msg_accept_encoding); TEST_1(bzip2 = gzip->aa_next); TEST_1(deflate = bzip2->aa_next); TEST_1(gzip->aa_common->h_data); TEST_1(lzss = msg_accept_encoding_make(msg_home(msg), "lzss")); TEST(msg_header_replace(msg, (msg_pub_t *)tst, (void *)bzip2, (void *)lzss), 0); TEST_1(gzip->aa_common->h_data); TEST_1(en = tst->msg_accept_language); TEST_1(fi = en->aa_next); TEST_1(se = fi->aa_next); TEST_S(en->aa_value, "en"); TEST_M(en->aa_common->h_data, "Accept-Language: en;q=0.8, fi, se ; q = 0.6" CRLF, en->aa_common->h_len); TEST((char *)en->aa_common->h_data + en->aa_common->h_len, fi->aa_common->h_data); TEST_1(de = msg_accept_language_make(msg_home(msg), "de;q=0.3")); TEST(msg_header_replace(msg, (msg_pub_t *)tst, (void *)se, (void *)de), 0); TEST(en->aa_common->h_data, NULL); TEST(en->aa_next, fi); TEST(fi->aa_next, de); TEST(de->aa_next, NULL); TEST(en->aa_common->h_succ, fi); TEST(en->aa_common->h_prev, &deflate->aa_common->h_succ); TEST(fi->aa_common->h_succ, de); TEST(fi->aa_common->h_prev, &en->aa_common->h_succ); TEST(de->aa_common->h_succ, NULL); TEST(de->aa_common->h_prev, &fi->aa_common->h_succ); TEST(se->aa_next, NULL); TEST(se->aa_common->h_succ, NULL); TEST(se->aa_common->h_prev, NULL); TEST_1(sv = msg_accept_language_make(msg_home(msg), "sv;q=0.6,sv_FI;q=0.7")); TEST_1(sv_fi = sv->aa_next); TEST(msg_header_replace(msg, (msg_pub_t *)tst, (void *)fi, (void *)sv), 0); TEST(en->aa_next, sv); TEST(sv->aa_next->aa_next, de); TEST(de->aa_next, NULL); TEST(en->aa_common->h_succ, sv); TEST(en->aa_common->h_prev, &deflate->aa_common->h_succ); TEST(sv->aa_common->h_succ, sv_fi); TEST(sv->aa_common->h_prev, &en->aa_common->h_succ); TEST(sv_fi->aa_common->h_succ, de); TEST(sv_fi->aa_common->h_prev, &sv->aa_common->h_succ); TEST(de->aa_common->h_succ, NULL); TEST(de->aa_common->h_prev, &sv_fi->aa_common->h_succ); TEST(msg_serialize(msg, (msg_pub_t *)tst), 0); } /* Bug #2429 */ orig = read_msg("GET a-life HTTP/1.1" CRLF "Accept-Language: en;q=0.8, fi, se ; q = 0.6" CRLF "Foo: bar" CRLF "Content-Length: 6" CRLF CRLF "test" CRLF "extra stuff" CRLF); TEST_1(orig); otst = msg_test_public(orig); TEST_1(otst); msg = msg_copy(orig); tst = msg_test_public(msg); TEST_1(tst); home = msg_home(msg); TEST_1(request = msg_request_make(home, "GET a-wife HTTP/1.1")); TEST(msg_header_insert(msg, (msg_pub_t *)tst, (void *)request), 0); TEST_1(location = msg_content_location_make(home, "http://localhost:8080/wife")); TEST(msg_header_insert(msg, (msg_pub_t *)tst, (void *)location), 0); TEST(msg_serialize(msg, (msg_pub_t *)tst), 0); TEST_1(msg_prepare(msg) > 0); TEST_1(language = msg_content_language_make(home, "se-FI, fi-FI, sv-FI")); TEST(msg_header_insert(msg, (msg_pub_t *)tst, (void *)language), 0); TEST(msg_serialize(msg, (msg_pub_t *)tst), 0); TEST_1(msg_prepare(msg) > 0); { char const encoded[] = "GET a-wife HTTP/1.1\r\n"; TEST(request->rq_common->h_len, strlen(encoded)); TEST_M(request->rq_common->h_data, encoded, request->rq_common->h_len); } { char const encoded[] = "Content-Location: http://localhost:8080/wife\r\n"; TEST(location->g_common->h_len, strlen(encoded)); TEST_M(location->g_common->h_data, encoded, location->g_common->h_len); } { char const encoded[] = "Content-Language: se-FI, fi-FI, sv-FI\r\n"; TEST(language->k_common->h_len, strlen(encoded)); TEST_M(language->k_common->h_data, encoded, language->k_common->h_len); } msg_destroy(msg); END();}static int test_warning(void){ msg_warning_t *w; su_home_t *home; char buf[64]; BEGIN(); TEST_1(home = su_home_new(sizeof *home)); TEST_1((w = msg_warning_make(home, "399 host:5060 \"Ok\", " "399 [::1]:39999 \"foo\\\" bar\""))); TEST(w->w_code, 399); TEST_S(w->w_host, "host"); TEST_S(w->w_port, "5060"); TEST_S(w->w_text, "Ok"); TEST_1(w = w->w_next); TEST(w->w_code, 399); TEST_S(w->w_host, "[::1]"); TEST_S(w->w_port, "39999"); TEST_S(w->w_text, "foo\" bar"); TEST_1(w->w_next == NULL); TEST_1(msg_warning_e(buf, sizeof buf, (msg_header_t *)w, 0) > 0); TEST_S(buf, "399 [::1]:39999 \"foo\\\" bar\""); su_home_unref(home); END();}/* Test error handling */int test_msg_error(void){ msg_t *msg; su_home_t *home; msg_test_t *tst; BEGIN(); msg = read_msg("GET a-life HTTP/1.1" CRLF "Content-Length: 6" CRLF "Content-Language: fi" CRLF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -