- 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)