-int Zlint::initResponseGetVersion(Z_InitResponse *init)
-{
- int no = 0;
- int off = 0;
- int i;
- for (i = 0; i<12; i++)
- if (ODR_MASK_GET(init->protocolVersion, no))
- {
- no = i+1;
- if (off)
- yaz_log(LOG_WARN, "%sbad formatted version");
- }
- else
- off = 1;
- return no;
-}
-
-Z_ReferenceId *Zlint::mk_refid(const char *buf, int len)
-{
- Z_ReferenceId *id =
- (Z_ReferenceId *) odr_malloc(odr_encode(), sizeof(*id));
- id->size = id->len = len;
- id->buf = (unsigned char*) odr_malloc(odr_encode(), len);
- memcpy(id->buf, buf, len);
- return id;
-}
-
-void Zlint::recv_GDU(Z_GDU *gdu, int len)
-{
- if (gdu->which != Z_GDU_Z3950)
- {
- yaz_log(LOG_LOG, "%sreceived non-Z39.50 response", m_session_str);
- closeNextTest();
- }
- if (gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_initResponse)
- {
- int i;
- Z_InitResponse *init = gdu->u.z3950->u.initResponse;
- int ver = initResponseGetVersion(init);
- int result = init->result ? *init->result : 0;
- if (!result)
- yaz_log(LOG_WARN, "%sinit rejected");
- switch(m_tst_no)
- {
- case 0:
- if (ver > 3 || ver < 2)
- yaz_log(LOG_WARN, "%sgot version %d, expected 2 or 3",
- m_session_str, ver);
- else
- m_test_state = TEST_STATE_OK;
- m_protocol_version = ver;
- if (!result)
- closeNextTest();
- else
- {
- close();
- nextTest();
- }
- break;
- case 1:
- if (ver != 2)
- yaz_log(LOG_WARN, "%sgot version %d, expected 2",
- m_session_str, ver);
- else
- m_test_state = TEST_STATE_OK;
- closeNextTest();
- break;
- case 2:
- if (ver < 2 || ver > 5)
- yaz_log(LOG_WARN, "%sgot version %d, expected 2-5",
- m_session_str,ver);
- else
- m_test_state = TEST_STATE_OK;
- closeNextTest();
- break;
- case 3:
- if (!init->referenceId)
- yaz_log(LOG_WARN, "%smissing referenceID from init response",
- m_session_str);
- else if (init->referenceId->len != REFID_LEN1
- || memcmp(init->referenceId->buf, REFID_BUF1, REFID_LEN1))
- yaz_log(LOG_WARN, "%sreference ID does not match");
- else
- m_test_state = TEST_STATE_OK;
- closeNextTest();
- break;
- case 4:
- if (m_subtst_no == 0)
- {
- if (!init->referenceId)
- yaz_log(LOG_WARN, "%smissing referenceID from first init response",
- m_session_str);
- else if (init->referenceId->len != REFID_LEN1
- || memcmp(init->referenceId->buf, REFID_BUF1, REFID_LEN1))
- yaz_log(LOG_WARN, "%sreference ID does not match");
- m_subtst_no++;
- }
- else
- {
- if (!init->referenceId)
- yaz_log(LOG_WARN, "%smissing referenceID from second init response",
- m_session_str);
- else if (init->referenceId->len != REFID_LEN2
- || memcmp(init->referenceId->buf, REFID_BUF2, REFID_LEN2))
- yaz_log(LOG_WARN, "%sreference ID does not match");
- else
- m_test_state = TEST_STATE_OK;
- closeNextTest();
- }
- break;
- case 5:
- if (init->options)
- {
- int i;
- int no_set = 0;
- int no_reset = 0;
- for (i = 0; i <= 24; i++)
- if (ODR_MASK_GET(init->options, i))
- no_set++;
- else
- no_reset++;
- if (no_set < 2)
- yaz_log(LOG_WARN, "%ssuspicuously few option bits set",
- m_session_str);
- if (no_reset == 0)
- yaz_log(LOG_WARN, "%ssuspicuously many option bits set",
- m_session_str);
- if (no_set >= 2 && no_reset)
- m_test_state = TEST_STATE_OK;
- }
- closeNextTest();
- break;
- case 6:
- if (ODR_MASK_GET(init->options, Z_Options_negotiationModel))
- {
- Z_CharSetandLanguageNegotiation *p =
- yaz_get_charneg_record(init->otherInfo);
-
- if (p) {
-
- char *charset=NULL, *lang=NULL;
- int selected;
- NMEM m = nmem_create();
-
- yaz_get_response_charneg(m, p, &charset, &lang,
- &selected);
- yaz_log(LOG_DEBUG, "%sAccepted character set : %s",
- m_session_str, charset);
- yaz_log(LOG_DEBUG, "%sAccepted code language : %s",
- m_session_str, lang ? lang : "none");
- yaz_log(LOG_DEBUG, "%sAccepted records in ...: %d",
- m_session_str, selected );
- nmem_destroy(m);
- m_test_state = TEST_STATE_OK;
- }
- }
- else
- m_test_state = TEST_STATE_NOT_APPLIC;
- closeNextTest();
- break;
- case 7:
- if (m_subtst_no * m_subtst_no * 100000 + 2000 < *init->maximumRecordSize)
- {
- yaz_log(LOG_WARN, "%smaximumRecordSize bigger than proposed size");
- closeNextTest();
- }
- else if (m_subtst_no * m_subtst_no * 100000 + 2000 < *init->preferredMessageSize)
- {
- yaz_log(LOG_WARN, "%smaximumRecordSize bigger than proposed size");
- closeNextTest();
- }
- else if (m_subtst_no < 3)
- {
- close();
- m_subtst_no++;
- connect();
- }
- else
- {
- m_test_state = TEST_STATE_OK;
- closeNextTest();
- }
- break;
- case 9:
- if (result && ODR_MASK_GET(init->options, Z_Options_scan))
- sendTest();
- else
- {
- m_test_state = TEST_STATE_NOT_APPLIC;
- closeNextTest();
- }
- break;
- case 10:
- if (result && ODR_MASK_GET(init->options, Z_Options_sort))
- sendTest();
- else
- {
- m_test_state = TEST_STATE_NOT_APPLIC;
- closeNextTest();
- }
- break;
- default:
- if (result)
- sendTest();
- else
- {
- m_test_state = TEST_STATE_NOT_APPLIC;
- closeNextTest();
- }
- }
- }
- else if (gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_searchResponse)
- {
- Z_SearchResponse *sr = gdu->u.z3950->u.searchResponse;
- switch(m_tst_no)
- {
- case 8:
- if (sr->records && (sr->records->which == Z_Records_NSD
- ||
- sr->records->which == Z_Records_multipleNSD))
- {
- yaz_log(LOG_WARN, "%sSearch Error", m_session_str);
- m_query_no++;
- sendTest();
- }
- else if (!sr->resultCount || *sr->resultCount == 0)
- {
- m_query_no++;
- sendTest();
- }
- else
- {
- yaz_log(LOG_DEBUG, "%sgot %d result count with %s",
- m_session_str, *sr->resultCount,
- try_query[m_query_no]);
- m_got_result_set = 1;
- sendTest();
- }
- break;
- case 10:
- if (sr->resultCount && *sr->resultCount > 0)
- {
- m_got_result_set = 1;
- sendTest();
- }
- else
- {
- closeNextTest();
- }
- break;
- default:
- closeNextTest();
- }
- }
- else if (gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_presentResponse)
- {
- Z_PresentResponse *sr = gdu->u.z3950->u.presentResponse;
- switch(m_tst_no)
- {
- case 8:
- if (sr->records && (sr->records->which == Z_Records_NSD
- ||
- sr->records->which == Z_Records_multipleNSD))
- {
- yaz_log(LOG_LOG, "%spresent returned NSD for %s",
- m_session_str, 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(odr_decode(), CLASS_RECSYN,
- try_syntax[m_record_syntax_no]);
- if (oid_oidcmp(expectRecordSyntax,
- ext->direct_reference))
- yaz_log(LOG_WARN, "%sGot Record in different syntax from that required %s",
- m_session_str,
- try_syntax[m_record_syntax_no]);
- else
- {
- yaz_log(LOG_DEBUG, "%spresent OK for %s", m_session_str,
- try_syntax[m_record_syntax_no]);
- m_test_state = TEST_STATE_OK;
- }
- }
- else if (sr->records->u.databaseOrSurDiagnostics->records[0]->which == Z_NamePlusRecord_surrogateDiagnostic)
- yaz_log(LOG_DEBUG, "%spresent returned SD %s", m_session_str,
- try_syntax[m_record_syntax_no]);
- else
- yaz_log(LOG_WARN, "%spresent returned fragment %s",
- m_session_str,
- try_syntax[m_record_syntax_no]);
- }
- else
- {
- yaz_log(LOG_WARN, "%spresent returned no records or diagnostics", m_session_str);
-
- }
- m_record_syntax_no++;
- sendTest();
- }
- }
- else if (gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_scanResponse)
- {
- Z_ScanResponse *sr = gdu->u.z3950->u.scanResponse;
- switch(m_tst_no)
- {
- case 9:
- if (sr->entries->nonsurrogateDiagnostics)
- {
- yaz_log(LOG_LOG, "%sscan NSD for %s", m_session_str,
- try_scan[m_scan_no]);
- m_scan_no++;
- sendTest();
- }
- else if (sr->entries->entries && sr->entries->num_entries > 0)
- {
- yaz_log(LOG_DEBUG, "%sscan OK for %s", m_session_str,
- try_scan[m_scan_no]);
- m_test_state = TEST_STATE_OK;
- closeNextTest();
- }
- else
- {
- yaz_log(LOG_WARN, "%sscan no entries/diagnostics for %s",
- m_session_str,
- try_scan[m_scan_no]);
- m_scan_no++;
- sendTest();
- }
- break;
- default:
- closeNextTest();
- }
- }
- else if (gdu->u.z3950 && gdu->u.z3950->which == Z_APDU_sortResponse)
- {
- Z_SortResponse *sr = gdu->u.z3950->u.sortResponse;
- switch(m_tst_no)
- {
- case 10:
- if (sr->diagnostics)
- {
- yaz_log(LOG_LOG, "%ssort NSD for %s", m_session_str,
- try_sort[m_sort_no]);
- m_sort_no++;
- sendTest();
- }
- else
- {
- yaz_log(LOG_DEBUG, "%ssort OK for %s", m_session_str,
- try_sort[m_sort_no]);
- m_test_state = TEST_STATE_OK;
- closeNextTest();
- }
- break;
- default:
- closeNextTest();
- }
- }
- else
- closeNextTest();
-}
-
-Zlint::Zlint(IYaz_PDU_Observable *the_PDU_Observable) :
- Yaz_Z_Assoc(the_PDU_Observable)