X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=zlint%2Ftest-search-01.cpp;fp=zlint%2Ftest-search-01.cpp;h=a292f3af5ff9289c85e925acf4cf19a2dac418ea;hb=40213edfa0408f88b008c3d1ee4a4f90dcdf2fb9;hp=0000000000000000000000000000000000000000;hpb=b1f8a12e7743258d4f9654157d212ffcd83ae241;p=yazpp-moved-to-github.git diff --git a/zlint/test-search-01.cpp b/zlint/test-search-01.cpp new file mode 100644 index 0000000..a292f3a --- /dev/null +++ b/zlint/test-search-01.cpp @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2004, Index Data. + * See the file LICENSE for details. + * + * $Id: test-search-01.cpp,v 1.1 2004-03-25 23:14:07 adam Exp $ + */ + +#include +#include +#include + +#include + +static const char *try_query[] = { + "@attr 1=4 petersson", + "@attr 1=1016 petersson", + "@attr 1=4 kingdom", + "@attr 1=1016 kingdom", + "@attr 1=62 sword", + "sword" + "seven", + "@attr 1=4 water", + "@attr 1=1016 water", + "computer", + "@attr 1=4 computer", + "@attr 1=1016 computer", + "water", + "join", + "about", + "map", + 0, +}; + +static const char *try_syntax [] = { + "usmarc", + "unimarc", + "danmarc", + "sutrs", + "grs1", + "xml", + "normarc", + 0 +}; + +static const char *try_sort [] = { + "1=4 <", + "1=4 >", + "1=62 >", + "1=62 <", + 0 +}; + +Zlint_test_search_01::Zlint_test_search_01() +{ + m_query_no = 0; + m_record_syntax_no = 0; + m_got_result_set = 0; + m_sort_no = 0; +} + +Zlint_test_search_01::~Zlint_test_search_01() +{ +} + +Zlint_code Zlint_test_search_01::init(Zlint *z) +{ + int len; + Z_APDU *apdu = z->create_Z_PDU(Z_APDU_initRequest); + Z_InitRequest *init = apdu->u.initRequest; + + z->msg_check_for("search and retrieve"); + + ODR_MASK_SET(init->protocolVersion, Z_ProtocolVersion_3); + + ODR_MASK_SET(init->options, Z_Options_namedResultSets); + ODR_MASK_SET(init->options, Z_Options_sort); + + int r = z->send_Z_PDU(apdu, &len); + if (r < 0) + { + z->msg_check_fail("unable to send init request"); + return TEST_FINISHED; + } + return TEST_CONTINUE; +} + +Zlint_code Zlint_test_search_01::sendTest(Zlint *z) +{ + if (!m_got_result_set) + { + Z_APDU *apdu = zget_APDU(z->odr_encode(), Z_APDU_searchRequest); + Z_SearchRequest *sr; + sr = apdu->u.searchRequest; + sr->query = (Z_Query *) odr_malloc(z->odr_encode(), sizeof(*sr->query)); + if (try_query[m_query_no] && sr) + { + sr->query->which = Z_Query_type_1; + Z_RPNQuery *rpn; + YAZ_PQF_Parser pqf_parser = yaz_pqf_create (); + + z->getDatabase(&sr->databaseNames, &sr->num_databaseNames); + + rpn = yaz_pqf_parse(pqf_parser, z->odr_encode(), + try_query[m_query_no]); + + yaz_pqf_destroy (pqf_parser); + + if (!rpn) + { + z->msg_check_fail("Query %s invalid", try_query[m_query_no]); + return TEST_FINISHED; + } + int len; + sr->query->u.type_1 = rpn; + z->send_Z_PDU(apdu, &len); + } + else + { + z->msg_check_notapp(); + z->msg_check_info("unable to get any hit count"); + return TEST_FINISHED; + } + } + else if (m_got_result_set && try_syntax[m_record_syntax_no]) + { + int len; + Z_APDU *apdu = zget_APDU(z->odr_encode(), Z_APDU_presentRequest); + Z_PresentRequest *pr = apdu->u.presentRequest; + *pr->numberOfRecordsRequested = 1; + *pr->resultSetStartPoint = 1; + + z->msg_check_for("record syntax %s", try_syntax[m_record_syntax_no]); + pr->preferredRecordSyntax = + yaz_str_to_z3950oid(z->odr_encode(), CLASS_RECSYN, + try_syntax[m_record_syntax_no]); + z->send_Z_PDU(apdu, &len); + return TEST_CONTINUE; + } + else if(m_got_result_set && !try_syntax[m_record_syntax_no]) + { + Z_APDU *apdu = zget_APDU(z->odr_encode(), Z_APDU_sortRequest); + if (apdu && try_sort[m_sort_no]) + { + z->msg_check_for("sort %s", try_sort[m_sort_no]); + + char *setstring = "default"; + int len; + Z_SortRequest *sr = apdu->u.sortRequest; + + sr->num_inputResultSetNames = 1; + sr->num_inputResultSetNames = 1; + sr->inputResultSetNames = (Z_InternationalString **) + odr_malloc (z->odr_encode(), sizeof(*sr->inputResultSetNames)); + sr->inputResultSetNames[0] = odr_strdup (z->odr_encode(), setstring); + sr->sortedResultSetName = odr_strdup(z->odr_encode(), setstring); + sr->sortSequence = yaz_sort_spec(z->odr_encode(), try_sort[m_sort_no]); + z->send_Z_PDU(apdu, &len); + } + else + return TEST_FINISHED; + } + else + { + return TEST_FINISHED; + } + return TEST_CONTINUE; +} + +Zlint_code Zlint_test_search_01::recv_gdu(Zlint *z, Z_GDU *gdu) +{ + if (gdu->which == Z_GDU_Z3950 && + gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_initResponse) + { + Z_InitResponse *init = gdu->u.z3950->u.initResponse; + int ver = z->initResponseGetVersion(init); + int result = init->result ? *init->result : 0; + if (!result) + { + z->msg_check_notapp(); + z->msg_check_info ("init rejected (result false)"); + return TEST_FINISHED; + } + return sendTest(z); + } + else if (gdu->which == Z_GDU_Z3950 && + gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_searchResponse) + { + Z_SearchResponse *sr = gdu->u.z3950->u.searchResponse; + if (sr->records && (sr->records->which == Z_Records_NSD + || + sr->records->which == Z_Records_multipleNSD)) + m_query_no++; + else if (!sr->resultCount || *sr->resultCount == 0) + m_query_no++; + else + { + z->msg_check_ok(); + z->msg_check_info("got %d result count with %s", *sr->resultCount, + try_query[m_query_no]); + m_got_result_set = 1; + } + return sendTest(z); + } + else if (gdu->which == Z_GDU_Z3950 && + gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_presentResponse) + { + Z_PresentResponse *sr = gdu->u.z3950->u.presentResponse; + if (sr->records && (sr->records->which == Z_Records_NSD + || + sr->records->which == Z_Records_multipleNSD)) + { + z->msg_check_ok(); + z->msg_check_info("present returned NSD for %s", + try_syntax[m_record_syntax_no]); + } + else if (sr->records && sr->records->which == Z_Records_DBOSD + && sr->records->u.databaseOrSurDiagnostics->num_records>0 + && sr->records->u.databaseOrSurDiagnostics->records[0]) + { + if (sr->records->u.databaseOrSurDiagnostics->records[0]->which == Z_NamePlusRecord_databaseRecord) + { + Z_External *ext = sr->records->u.databaseOrSurDiagnostics->records[0]->u.databaseRecord; + Odr_oid *expectRecordSyntax = + yaz_str_to_z3950oid(z->odr_decode(), CLASS_RECSYN, + try_syntax[m_record_syntax_no]); + if (oid_oidcmp(expectRecordSyntax, + ext->direct_reference)) + { + z->msg_check_fail("Got Record in different syntax " + "from that requested %s", + try_syntax[m_record_syntax_no]); + } + else + z->msg_check_ok(); + } + else if (sr->records->u.databaseOrSurDiagnostics->records[0]->which == Z_NamePlusRecord_surrogateDiagnostic) + { + z->msg_check_ok(); + z->msg_check_info("present returned SD %s", + try_syntax[m_record_syntax_no]); + } + else + { + z->msg_check_ok(); + z->msg_check_info("present returned fragment %s", + try_syntax[m_record_syntax_no]); + } + } + else + { + z->msg_check_fail("present returned no records or diagnostics"); + } + m_record_syntax_no++; + return sendTest(z); + } + else if (gdu->which == Z_GDU_Z3950 && + gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_sortResponse) + { + Z_SortResponse *sr = gdu->u.z3950->u.sortResponse; + z->msg_check_ok(); + if (sr->diagnostics) + z->msg_check_info( "sort NSD for %s", try_sort[m_sort_no]); + m_sort_no++; + return sendTest(z); + } + else + z->msg_check_fail("did not receive init/search/present response " + "as expected"); + return TEST_FINISHED; +} + +Zlint_code Zlint_test_search_01::recv_fail(Zlint *z, int reason) +{ + z->msg_check_fail("target closed connection"); + return TEST_FINISHED; +}