static void check_icu_chain(void) { const char *en_str = "O Romeo, Romeo! wherefore art thou\t Romeo?"; UErrorCode status = U_ZERO_ERROR; struct icu_chain *chain = 0; const char *xml_str = "<icu locale=\"en\">" "<transform rule=\"[:Control:] Any-Remove\"/>" "<tokenize rule=\"l\"/>" "<transform rule=\"[[:WhiteSpace:][:Punctuation:]] Remove\"/>" "<display/>" "<casemap rule=\"l\"/>" "</icu>"; xmlDoc *doc = xmlParseMemory(xml_str, strlen(xml_str)); xmlNode *xml_node = xmlDocGetRootElement(doc); YAZ_CHECK(xml_node); chain = icu_chain_xml_config(xml_node, 0, &status); xmlFreeDoc(doc); YAZ_CHECK(chain); if (!chain) return; YAZ_CHECK(icu_chain_assign_cstr(chain, en_str, &status)); while (icu_chain_next_token(chain, &status)) { yaz_log(YLOG_LOG, "%d '%s' '%s'", icu_chain_token_number(chain), icu_chain_token_norm(chain), icu_chain_token_display(chain)); } YAZ_CHECK_EQ(icu_chain_token_number(chain), 7); YAZ_CHECK(icu_chain_assign_cstr(chain, "what is this?", &status)); while (icu_chain_next_token(chain, &status)) { yaz_log(YLOG_LOG, "%d '%s' '%s'", icu_chain_token_number(chain), icu_chain_token_norm(chain), icu_chain_token_display(chain)); } YAZ_CHECK_EQ(icu_chain_token_number(chain), 3); icu_chain_destroy(chain); }
static void check_chain_empty_chain(void) { UErrorCode status = U_ZERO_ERROR; struct icu_chain *chain = 0; const char *xml_str = "<icu locale=\"en\">" "</icu>"; const char *src8 = "some 5487 weired !ยค%&(/& sTuFf"; char *dest8 = 0; xmlDoc *doc = xmlParseMemory(xml_str, strlen(xml_str)); xmlNode *xml_node = xmlDocGetRootElement(doc); YAZ_CHECK(xml_node); chain = icu_chain_xml_config(xml_node, 0, &status); xmlFreeDoc(doc); YAZ_CHECK(chain); YAZ_CHECK(icu_chain_assign_cstr( chain, src8, &status)); while (icu_chain_next_token(chain, &status)) { ; /* printf("%d '%s' '%s'\n", icu_chain_token_number(chain), icu_chain_token_norm(chain), icu_chain_token_display(chain)); */ } YAZ_CHECK_EQ(icu_chain_token_number(chain), 1); dest8 = (char *) icu_chain_token_norm(chain); YAZ_CHECK_EQ(strcmp(src8, dest8), 0); icu_chain_destroy(chain); }
void iochan_handler(struct iochan *i, int event) { static int number = 0; sel_thread_t p = iochan_getdata(i); if (event & EVENT_INPUT) { struct my_work_data *work; work = sel_thread_result(p); YAZ_CHECK(work); if (work) { YAZ_CHECK_EQ(work->x * 2, work->y); /* stop work after a couple of iterations */ if (work->x > 10) iochan_destroy(i); xfree(work); } } if (event & EVENT_TIMEOUT) { struct my_work_data *work; work = xmalloc(sizeof(*work)); work->x = number; sel_thread_add(p, work); work = xmalloc(sizeof(*work)); work->x = number+1; sel_thread_add(p, work); number += 10; } }
static void tst(void) { yaz_timing_t t = yaz_timing_create(); double real, user, sys; int i = 0; double x = 0; YAZ_CHECK(t); if (!t) return; #ifdef WIN32 Sleep(10); #endif for (i = 0; i<5000000; i++) x += i; YAZ_CHECK_EQ(i, 5000000); yaz_log(YLOG_LOG, "i=%d x=%f", i, x); yaz_timing_stop(t); real = yaz_timing_get_real(t); YAZ_CHECK(real == -1.0 || real >= 0.0); user = yaz_timing_get_user(t); YAZ_CHECK(user == -1.0 || user >= 0.0); sys = yaz_timing_get_sys(t); YAZ_CHECK(sys == -1.0 || sys >= 0.0); yaz_log(YLOG_LOG, "real=%f user=%f sys=%f", real, user, sys); yaz_timing_destroy(&t); YAZ_CHECK(!t); }
static void check_chain_empty_token(void) { UErrorCode status = U_ZERO_ERROR; struct icu_chain *chain = 0; const char *xml_str = "<icu locale=\"en\">" "<tokenize rule=\"w\"/>" "<transform rule=\"[[:WhiteSpace:][:Punctuation:]] Remove\"/>" "</icu>"; xmlDoc *doc = xmlParseMemory(xml_str, strlen(xml_str)); xmlNode *xml_node = xmlDocGetRootElement(doc); YAZ_CHECK(xml_node); chain = icu_chain_xml_config(xml_node, 0, &status); xmlFreeDoc(doc); YAZ_CHECK(chain); YAZ_CHECK(icu_chain_assign_cstr( chain, "a string with 15 tokenss and 8 displays", &status)); while (icu_chain_next_token(chain, &status)) { ; /* printf("%d '%s' '%s'\n", icu_chain_token_number(chain), icu_chain_token_norm(chain), icu_chain_token_display(chain)); */ } YAZ_CHECK_EQ(icu_chain_token_number(chain), 15); icu_chain_destroy(chain); }
static void tst_array_to_uri(void) { ODR odr = odr_createmem(ODR_ENCODE); char **names; char **values; char *query_string; int r; r = yaz_uri_to_array("&", odr, &names, &values); YAZ_CHECK_EQ(r, 0); if (r == 0) { YAZ_CHECK(names[0] == 0); YAZ_CHECK(values[0] == 0); } r = yaz_uri_to_array("&&", odr, &names, &values); YAZ_CHECK_EQ(r, 0); if (r == 0) { yaz_array_to_uri(&query_string, odr, names, values); YAZ_CHECK(!strcmp(query_string, "")); YAZ_CHECK(names[0] == 0); YAZ_CHECK(values[0] == 0); } r = yaz_uri_to_array("a=AA&bb=%42B", odr, &names, &values); YAZ_CHECK_EQ(r, 2); if (r == 2) { YAZ_CHECK(names[0] && !strcmp(names[0], "a")); YAZ_CHECK(values[0] && !strcmp(values[0], "AA")); YAZ_CHECK(names[1] && !strcmp(names[1], "bb")); YAZ_CHECK(values[1] && !strcmp(values[1], "BB")); YAZ_CHECK(names[2] == 0); YAZ_CHECK(values[2] == 0); yaz_array_to_uri(&query_string, odr, names, values); YAZ_CHECK(!strcmp(query_string, "a=AA&bb=BB")); } r = yaz_uri_to_array("a=AA&bb&x", odr, &names, &values); YAZ_CHECK_EQ(r, 3); if (r == 3) { YAZ_CHECK(names[0] && !strcmp(names[0], "a")); YAZ_CHECK(values[0] && !strcmp(values[0], "AA")); YAZ_CHECK(names[1] && !strcmp(names[1], "bb")); YAZ_CHECK(values[1] && !strcmp(values[1], "")); YAZ_CHECK(names[2] && !strcmp(names[2], "x")); YAZ_CHECK(values[2] && !strcmp(values[1], "")); YAZ_CHECK(names[3] == 0); YAZ_CHECK(values[3] == 0); yaz_array_to_uri(&query_string, odr, names, values); YAZ_CHECK(!strcmp(query_string, "a=AA&bb=&x=")); } r = yaz_uri_to_array("a=AA&bb=&x=", odr, &names, &values); YAZ_CHECK_EQ(r, 3); if (r == 3) { YAZ_CHECK(names[0] && !strcmp(names[0], "a")); YAZ_CHECK(values[0] && !strcmp(values[0], "AA")); YAZ_CHECK(names[1] && !strcmp(names[1], "bb")); YAZ_CHECK(values[1] && !strcmp(values[1], "")); YAZ_CHECK(names[2] && !strcmp(names[2], "x")); YAZ_CHECK(values[2] && !strcmp(values[1], "")); YAZ_CHECK(names[3] == 0); YAZ_CHECK(values[3] == 0); yaz_array_to_uri(&query_string, odr, names, values); YAZ_CHECK(!strcmp(query_string, "a=AA&bb=&x=")); } r = yaz_uri_to_array("a=AA&&&bb&x&&", odr, &names, &values); YAZ_CHECK_EQ(r, 3); if (r == 3) { YAZ_CHECK(names[0] && !strcmp(names[0], "a")); YAZ_CHECK(values[0] && !strcmp(values[0], "AA")); YAZ_CHECK(names[1] && !strcmp(names[1], "bb")); YAZ_CHECK(values[1] && !strcmp(values[1], "")); YAZ_CHECK(names[2] && !strcmp(names[2], "x")); YAZ_CHECK(values[2] && !strcmp(values[2], "")); YAZ_CHECK(names[3] == 0); YAZ_CHECK(values[3] == 0); yaz_array_to_uri(&query_string, odr, names, values); YAZ_CHECK(!strcmp(query_string, "a=AA&bb=&x=")); } odr_destroy(odr); }
static void tst_http_response(void) { { /* unlimited content, no headers */ const char *http_buf = /*123456789012345678 */ "HTTP/1.1 200 OK\r\n" "\r\n" "HTTP/1.1 200 OK\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 24), 0); } { /* no content, no headers */ const char *http_buf = /*123456789012345678 */ "HTTP/1.1 204 OK\r\n" "\r\n" "HTTP/1.1 200 OK\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 18), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 19), 19); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 24), 19); } { /* response, content */ const char *http_buf = /*123456789012345678 */ "HTTP/1.1 200 OK\r\n" "Content-Length: 2\r\n" "\r\n" "12" "HTTP/1.1 200 OK\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 39), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 40); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 40); } }
static void tst_http_request(void) { { /* no content, no headers */ const char *http_buf = /*123456789012345678 */ "GET / HTTP/1.1\r\n" "\r\n" "GET / HTTP/1.0\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 16), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 17), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 18), 18); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 19), 18); } { /* one header, no content */ const char *http_buf = /*123456789012345678 */ "GET / HTTP/1.1\r\n" "Content-Type: x\r\n" "\r\n" "GET / HTTP/1.0\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 34), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 35), 35); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 36), 35); } { /* one content-length header, length 0 */ const char *http_buf = /*123456789012345678 */ "GET / HTTP/1.1\r\n" "Content-Length: 0\r\n" "\r\n" "GET / HTTP/1.0\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 35), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 37), 37); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 38), 37); } { /* one content-length header, length 5 */ const char *http_buf = /*123456789012345678 */ "GET / HTTP/1.1\r\n" "Content-Length: 5\r\n" "\r\n" "ABCDE" "GET / HTTP/1.0\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 42), 42); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 43), 42); } { /* LF only in GET, one content-length header, length 5 */ const char *http_buf = /*123456789012345678 */ "GET / HTTP/1.1\n" "Content-Length: 5\r\n" "\r\n" "ABCDE" "GET / HTTP/1.0\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 41); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 42), 41); } { /* LF only in all places, one content-length header, length 5 */ const char *http_buf = /*123456789012345678 */ "GET / HTTP/1.1\n" "Content-Length: 5\n" "\n" "ABCDE" "GET / HTTP/1.0\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 38), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 39), 39); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 39); } { /* one header, unknown transfer-encoding (no content) */ const char *http_buf = /*12345678901234567890123456789 */ "GET / HTTP/1.1\r\n" "Transfer-Encoding: chunke_\r\n" "\r\n" "GET / HTTP/1.0\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 45), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 46), 46); } { /* one header, one chunk */ const char *http_buf = /*12345678901234567890123456789 */ "GET / HTTP/1.1\r\n" "Transfer-Encoding: chunked\r\n" "\r\n" "3\r\n" "123\r\n" "0\r\n\r\n" "GET / HTTP/1.0\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 58), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 59), 59); } { /* one header, two chunks */ const char *http_buf = /*12345678901234567890123456789 */ "GET / HTTP/1.1\r\n" "Transfer-Encoding: chunked\r\n" "\r\n" "3\r\n" "123\r\n" "2\r\n" "12\n" "0\r\n\r\n" "GET / HTTP/1.0\r\n"; YAZ_CHECK_EQ(cs_complete_auto(http_buf, 64), 0); YAZ_CHECK_EQ(cs_complete_auto(http_buf, 65), 65); } }
static void check_bug_1140(void) { UErrorCode status = U_ZERO_ERROR; struct icu_chain *chain = 0; const char *xml_str = "<icu locale=\"en\">" /* if the first rule is normalize instead. Then it works */ #if 0 "<transform rule=\"[:Control:] Any-Remove\"/>" #endif "<tokenize rule=\"l\"/>" "<transform rule=\"[[:WhiteSpace:][:Punctuation:]] Remove\"/>" "<display/>" "<casemap rule=\"l\"/>" "</icu>"; xmlDoc *doc = xmlParseMemory(xml_str, strlen(xml_str)); xmlNode *xml_node = xmlDocGetRootElement(doc); YAZ_CHECK(xml_node); chain = icu_chain_xml_config(xml_node, 0, &status); xmlFreeDoc(doc); YAZ_CHECK(chain); if (!chain) return; YAZ_CHECK(icu_chain_assign_cstr( chain, "O Romeo, Romeo! wherefore art thou\t Romeo?", &status)); while (icu_chain_next_token(chain, &status)) { ; /* printf("%d '%s' '%s'\n", icu_chain_token_number(chain), icu_chain_token_norm(chain), icu_chain_token_display(chain)); */ } YAZ_CHECK_EQ(icu_chain_token_number(chain), 7); YAZ_CHECK(icu_chain_assign_cstr(chain, "what is this?", &status)); while (icu_chain_next_token(chain, &status)) { ; /* printf("%d '%s' '%s'\n", icu_chain_token_number(chain), icu_chain_token_norm(chain), icu_chain_token_display(chain)); */ } /* we expect 'what' 'is' 'this', i.e. 3 tokens */ YAZ_CHECK_EQ(icu_chain_token_number(chain), 3); icu_chain_destroy(chain); }
static void tst(void) { YAZ_CHECK_EQ(pqf2xml_text("@attr 1=4 bad query", "", 0), PQF_FAILED); #if YAZ_HAVE_XML2 YAZ_CHECK_EQ(pqf2xml_text( "@attr 1=4 computer", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"Bib-1\">" "<apt><attr type=\"1\" value=\"4\"/>" "<term type=\"general\">computer</term></apt>" "</rpn></query>\n", "RPN @attrset Bib-1 @attr 1=4 computer" ), XML_MATCH); YAZ_CHECK_EQ(pqf2xml_text( "@attr 2=1 @attr 1=title computer", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"Bib-1\">" "<apt><attr type=\"1\" value=\"title\"/>" "<attr type=\"2\" value=\"1\"/>" "<term type=\"general\">computer</term></apt>" "</rpn></query>\n", "RPN @attrset Bib-1 @attr 1=title @attr 2=1 computer" ), XML_MATCH); YAZ_CHECK_EQ(pqf2xml_text( "@attr 2=1 @attr exp1 1=1 computer", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"Bib-1\">" "<apt><attr set=\"Exp-1\" type=\"1\" value=\"1\"/>" "<attr type=\"2\" value=\"1\"/>" "<term type=\"general\">computer</term></apt>" "</rpn></query>\n", "RPN @attrset Bib-1 @attr Exp-1 1=1 @attr 2=1 computer" ), XML_MATCH); YAZ_CHECK_EQ(pqf2xml_text( "@and a b", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"Bib-1\">" "<operator type=\"and\">" "<apt><term type=\"general\">a</term></apt>" "<apt><term type=\"general\">b</term></apt>" "</operator></rpn></query>\n", "RPN @attrset Bib-1 @and a b" ), XML_MATCH); YAZ_CHECK_EQ(pqf2xml_text( "@or @and a b c", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"Bib-1\">" "<operator type=\"or\">" "<operator type=\"and\">" "<apt><term type=\"general\">a</term></apt>" "<apt><term type=\"general\">b</term></apt></operator>" "<apt><term type=\"general\">c</term></apt>" "</operator></rpn></query>\n", "RPN @attrset Bib-1 @or @and a b c" ), XML_MATCH); YAZ_CHECK_EQ(pqf2xml_text( "@set abe", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"Bib-1\">" "<rset>abe</rset></rpn></query>\n", "RPN @attrset Bib-1 @set abe" ), XML_MATCH); YAZ_CHECK_EQ(pqf2xml_text( /* exclusion, distance, ordered, relationtype, knownunit, proxunit */ "@prox 0 3 1 2 k 2 a b", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"Bib-1\">" "<operator type=\"prox\" exclusion=\"false\" " "distance=\"3\" " "ordered=\"true\" " "relationType=\"2\" " "knownProximityUnit=\"2\">" "<apt><term type=\"general\">a</term></apt>" "<apt><term type=\"general\">b</term></apt>" "</operator></rpn></query>\n", "RPN @attrset Bib-1 @prox 0 3 1 2 k 2 a b" ), XML_MATCH); YAZ_CHECK_EQ(pqf2xml_text( "@term numeric 32", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"Bib-1\">" "<apt>" "<term type=\"numeric\">32</term></apt>" "</rpn></query>\n", "RPN @attrset Bib-1 @term numeric 32" ), XML_MATCH); YAZ_CHECK_EQ(pqf2xml_text( "@term string computer", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"Bib-1\">" "<apt>" "<term type=\"string\">computer</term></apt>" "</rpn></query>\n", "RPN @attrset Bib-1 @term string computer" ), XML_MATCH); YAZ_CHECK_EQ(pqf2xml_text( "@term null void", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"Bib-1\">" "<apt>" "<term type=\"null\"/></apt>" "</rpn></query>\n", "RPN @attrset Bib-1 @term null x" ), XML_MATCH); YAZ_CHECK_EQ(pqf2xml_text( "@attrset gils @attr 4=2 x", "<?xml version=\"1.0\"?>\n" "<query><rpn set=\"GILS\">" "<apt>" "<attr type=\"4\" value=\"2\"/>" "<term type=\"general\">x</term></apt>" "</rpn></query>\n", "RPN @attrset GILS @attr 4=2 x" ), XML_MATCH); #endif }