📄 test_msg.c
字号:
{ 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_S(msg_header_find_item(ce->k_common, "zz"), "zz"); TEST_P(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_P(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[]){ return msg_make(msg_test_mclass, MSG_DO_EXTRACT_COPY, buffer, -1);}/**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_accept_language_t *se; 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_P(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_P(tst->msg_status, status); TEST_P(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_P(tst->msg_request, request); TEST_P(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_P(tst->msg_separator, separator); TEST_P(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_P(tst->msg_payload->pl_next, payload); TEST_P(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_P(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_P((char *)en->aa_common->h_data + en->aa_common->h_len, fi->aa_common->h_data); TEST(fi->aa_common->h_len, 0); TEST_P((char *)en->aa_common->h_data + en->aa_common->h_len, se->aa_common->h_data); TEST(se->aa_common->h_len, 0); 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_P(en->aa_common->h_data, NULL); TEST_P(en->aa_next, fi); TEST_P(fi->aa_next, de); TEST_P(de->aa_next, NULL); TEST_P(en->aa_common->h_succ, fi); TEST_P(en->aa_common->h_prev, &deflate->aa_common->h_succ); TEST_P(fi->aa_common->h_succ, de); TEST_P(fi->aa_common->h_prev, &en->aa_common->h_succ); TEST_P(de->aa_common->h_succ, NULL); TEST_P(de->aa_common->h_prev, &fi->aa_common->h_succ); TEST_P(se->aa_next, NULL); TEST_P(se->aa_common->h_succ, NULL); TEST_P(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_P(en->aa_next, sv); TEST_P(sv->aa_next->aa_next, de); TEST_P(de->aa_next, NULL); TEST_P(en->aa_common->h_succ, sv); TEST_P(en->aa_common->h_prev, &deflate->aa_common->h_succ); TEST_P(sv->aa_common->h_succ, sv_fi); TEST_P(sv->aa_common->h_prev, &en->aa_common->h_succ); TEST_P(sv_fi->aa_common->h_succ, de); TEST_P(sv_fi->aa_common->h_prev, &sv->aa_common->h_succ); TEST_P(de->aa_common->h_succ, NULL); TEST_P(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 "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_1(se = msg_accept_language_make(home, "se, fi, sv")); TEST_1(se->aa_next); TEST_1(se->aa_next->aa_next); TEST(msg_header_insert(msg, (msg_pub_t *)tst, (void *)se), 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_SIZE(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_SIZE(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_SIZE(language->k_common->h_len, strlen(encoded)); TEST_M(language->k_common->h_data, encoded, language->k_common->h_len); } { char const encoded[] = "Accept-Language: se, fi, sv\r\n"; TEST_SIZE(se->aa_common->h_len, strlen(encoded)); TEST_M(se->aa_common->h_data, encoded, se->aa_common->h_len); TEST_P((char *)se->aa_common->h_data + se->aa_common->h_len, se->aa_next->aa_common->h_data); TEST_P((char *)se->aa_common->h_data + se->aa_common->h_len, se->aa_next->aa_next->aa_common->h_data); } { size_t size = SIZE_MAX; char *s; char body[66 * 15 + 1]; int i; msg_payload_t *pl; /* Bug #1726034 */ for (i = 0; i < 15; i++) strcpy(body + i * 66, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n"); pl = msg_payload_make(msg_home(msg), body); TEST(msg_header_insert(msg, (msg_pub_t *)tst, (void *)pl), 0); s = msg_as_string(msg_home(msg), msg, NULL, 0, &size); TEST_S(s, "GET a-wife HTTP/1.1" CRLF"Foo: bar" CRLF"Content-Length: 6" CRLF"Content-Location: http://localhost:8080/wife\r\n""Content-Language: se-FI, fi-FI, sv-FI\r\n""Accept-Language: se, fi, sv\r\n"CRLF"test" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" CRLF); } 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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -