/* * finish a test phase (part of a series) */ void ndmca_test_done_phase(struct ndm_session* sess) { struct ndm_control_agent* ca = sess->control_acb; char* status; int had_active = (sess->control_acb->active_test != 0); /* close previous test if there is one */ ndmca_test_close(sess); if (ca->n_step_fail) status = "Failed"; else if (ca->n_step_warn) status = "Almost"; else if (ca->n_step_pass > 0) status = "Passed"; else status = "Whiffed"; ndmalogf(sess, "TEST", 0, "Test %s %s -- pass=%d warn=%d fail=%d (total %d)", ca->test_phase, status, ca->n_step_pass, ca->n_step_warn, ca->n_step_fail, ca->n_step_tests); ca->total_n_step_pass += ca->n_step_pass; ca->total_n_step_warn += ca->n_step_warn; ca->total_n_step_fail += ca->n_step_fail; ca->total_n_step_tests += ca->n_step_tests; /* advance test count if we didn't have an active test so * clean up phases have a new test count */ if (!had_active) sess->control_acb->test_step++; }
int ndmca_check_tape_mtio (struct ndm_session *sess, ndmp9_error expect_err, ndmp9_tape_mtio_op op, u_long count, u_long resid) { struct ndmconn * conn = sess->plumb.tape; u_long got_resid; int rc; /* close previous test if there is one */ ndmca_test_close (sess); got_resid = ~resid; rc = ndmca_tape_mtio (sess, op, count, &got_resid); rc = ndmca_test_check_expect (conn, rc, expect_err); if (rc) return rc; if (resid != got_resid) { char tmp[128]; sprintf (tmp, "Residual incorrect, got %lu expected %lu", got_resid, resid); ndmca_test_fail (sess, tmp); return -1; } return rc; }
int ndmca_test_data_listen (struct ndm_session *sess, ndmp9_error expect_err, ndmp9_addr_type addr_type) { struct ndmconn * conn = sess->plumb.data; struct ndm_control_agent *ca = sess->control_acb; int rc; /* close previous test if there is one */ ndmca_test_close (sess); switch (conn->protocol_version) { default: return -1234; #ifndef NDMOS_OPTION_NO_NDMP3 case NDMP3VER: NDMC_WITH(ndmp3_data_listen, NDMP3VER) request->addr_type = addr_type; rc = NDMTEST_CALL(conn); if (rc) return rc; if (expect_err == NDMP9_NO_ERR && request->addr_type != reply->data_connection_addr.addr_type) { /* TODO: use proper test format */ ndmalogf (sess, "Test", 1, "DATA_LISTEN addr_type mismatch"); return -1; } ndmp_3to9_addr (&reply->data_connection_addr, &ca->data_addr); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP3 */ #ifndef NDMOS_OPTION_NO_NDMP4 case NDMP4VER: NDMC_WITH(ndmp4_data_listen, NDMP4VER) request->addr_type = addr_type; rc = NDMTEST_CALL(conn); if (rc) return rc; if (expect_err == NDMP9_NO_ERR && request->addr_type != reply->connect_addr.addr_type) { /* TODO: use proper test format */ ndmalogf (sess, "Test", 1, "DATA_LISTEN addr_type mismatch"); return -1; } ndmp_4to9_addr (&reply->connect_addr, &ca->data_addr); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP4 */ } return 0; }
int ndmca_test_call (struct ndmconn *conn, struct ndmp_xa_buf *xa, ndmp9_error expect_err) { struct ndm_session *sess = conn->context; int protocol_version = conn->protocol_version; unsigned msg = xa->request.header.message; char * msgname = ndmp_message_to_str (protocol_version, msg); unsigned reply_error; int rc; /* close previous test if there is one */ ndmca_test_close (sess); /* open new 'test' */ ndmca_test_open (sess, msgname, ndmp9_error_to_str (expect_err)); rc = ndma_call_no_tattle (conn, xa); reply_error = ndmnmb_get_reply_error (&xa->reply); if (rc >= 0) { /* Call succeeded. Body valid */ if (reply_error == expect_err) { /* Worked exactly as expected */ rc = 0; } else if (reply_error != NDMP9_NO_ERR && expect_err != NDMP9_NO_ERR) { /* both are errors, don't be picky about the codes */ rc = 2; } else { /* intolerable mismatch */ rc = 1; } } if (rc != 0) { char tmpbuf[128]; sprintf(tmpbuf, "got %s (call)", ndmp9_error_to_str (reply_error)); if (rc == 2) ndmca_test_warn (sess, tmpbuf); else ndmca_test_fail (sess, tmpbuf); ndma_tattle (conn, xa, rc); if (rc == 2) rc = 0; } return rc; }
void ndmca_test_log_step(struct ndm_session* sess, int level, char* msg) { int had_active = (sess->control_acb->active_test != 0); ndmalogf(sess, "Test", level, "%s #%d -- %s", sess->control_acb->test_phase, sess->control_acb->test_step, msg); /* in case we have a open test -- close it */ ndmca_test_close(sess); /* advance test count if we didn't have an active test */ if (!had_active) sess->control_acb->test_step++; }
int ndmca_test_tape_get_state (struct ndm_session *sess, ndmp9_error expect_err) { struct ndmconn * conn = sess->plumb.tape; int rc; /* close previous test if there is one */ ndmca_test_close (sess); rc = ndmca_tape_get_state (sess); rc = ndmca_test_check_expect (conn, rc, expect_err); return rc; }
int ndmca_test_data_abort (struct ndm_session *sess, ndmp9_error expect_err) { struct ndmconn * conn = sess->plumb.data; int rc; /* close previous test if there is one */ ndmca_test_close (sess); rc = ndmca_data_abort (sess); rc = ndmca_test_check_expect (conn, rc, expect_err); return rc; }
int ndmca_test_tape_read (struct ndm_session *sess, ndmp9_error expect_err, char *buf, unsigned count) { struct ndmconn * conn = sess->plumb.tape; int rc; /* close previous test if there is one */ ndmca_test_close (sess); rc = ndmca_tape_read (sess, buf, count); rc = ndmca_test_check_expect (conn, rc, expect_err); return rc; }
int ndmca_test_tape_mtio (struct ndm_session *sess, ndmp9_error expect_err, ndmp9_tape_mtio_op op, u_long count, u_long *resid) { struct ndmconn * conn = sess->plumb.tape; int rc; /* close previous test if there is one */ ndmca_test_close (sess); rc = ndmca_tape_mtio (sess, op, count, resid); rc = ndmca_test_check_expect (conn, rc, expect_err); return rc; }
/* * finish a test series (which may include test phases) */ void ndmca_test_done_series(struct ndm_session* sess, char* series_name) { struct ndm_control_agent* ca = sess->control_acb; char* status; /* close previous test if there is one */ ndmca_test_close(sess); if (ca->total_n_step_fail) status = "Failed"; else if (ca->total_n_step_warn) status = "Almost"; else status = "Passed"; ndmalogf(sess, "TEST", 0, "FINAL %s %s -- pass=%d warn=%d fail=%d (total %d)", series_name, status, ca->total_n_step_pass, ca->total_n_step_warn, ca->total_n_step_fail, ca->total_n_step_tests); }
int ndmca_test_tape_read_2cnt (struct ndm_session *sess, ndmp9_error expect_err, char *buf, unsigned count, unsigned true_count) { struct ndmconn * conn = sess->plumb.tape; int rc; /* close previous test if there is one */ ndmca_test_close (sess); switch (conn->protocol_version) { default: return -1234; #ifndef NDMOS_OPTION_NO_NDMP2 case NDMP2VER: NDMC_WITH(ndmp2_tape_read, NDMP2VER) request->count = count; rc = NDMTEST_CALL(conn); if (rc == 0 && expect_err == NDMP9_NO_ERR) { if (reply->data_in.data_in_len == true_count) { bcopy (reply->data_in.data_in_val, buf, true_count); } else { rc = -1; } } NDMC_FREE_REPLY(); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP2 */ #ifndef NDMOS_OPTION_NO_NDMP3 case NDMP3VER: NDMC_WITH(ndmp3_tape_read, NDMP3VER) request->count = count; rc = NDMTEST_CALL(conn); if (rc == 0 && expect_err == NDMP9_NO_ERR) { if (reply->data_in.data_in_len == true_count) { bcopy (reply->data_in.data_in_val, buf, true_count); } else { rc = -1; } } NDMC_FREE_REPLY(); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP3 */ #ifndef NDMOS_OPTION_NO_NDMP4 case NDMP4VER: NDMC_WITH(ndmp4_tape_read, NDMP4VER) request->count = count; rc = NDMTEST_CALL(conn); if (rc == 0 && expect_err == NDMP9_NO_ERR) { if (reply->data_in.data_in_len == true_count) { bcopy (reply->data_in.data_in_val, buf, true_count); } else { rc = -1; } } NDMC_FREE_REPLY(); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP4 */ } return rc; }
int ndmca_test_tape_open (struct ndm_session *sess, ndmp9_error expect_err, char *device, int mode) { struct ndmconn * conn = sess->plumb.tape; struct ndm_control_agent *ca = &sess->control_acb; int rc; /* close previous test if there is one */ ndmca_test_close (sess); switch (conn->protocol_version) { default: return -1234; #ifndef NDMOS_OPTION_NO_NDMP2 case NDMP2VER: NDMC_WITH (ndmp2_tape_open, NDMP2VER) if (device) request->device.name = device; else request->device.name = ca->job.tape_device; if (mode != -1) request->mode = mode; else request->mode = ca->tape_mode; rc = NDMTEST_CALL(conn); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP2 */ #ifndef NDMOS_OPTION_NO_NDMP3 case NDMP3VER: NDMC_WITH (ndmp3_tape_open, NDMP3VER) if (device) request->device = device; else request->device = ca->job.tape_device; if (mode != -1) request->mode = mode; else request->mode = ca->tape_mode; rc = NDMTEST_CALL(conn); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP3 */ #ifndef NDMOS_OPTION_NO_NDMP4 case NDMP4VER: NDMC_WITH (ndmp4_tape_open, NDMP4VER) if (device) request->device = device; else request->device = ca->job.tape_device; if (mode != -1) request->mode = mode; else request->mode = ca->tape_mode; rc = NDMTEST_CALL(conn); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP4 */ } return rc; }
int ndmca_test_check_data_state (struct ndm_session *sess, ndmp9_data_state expected, int reason) { struct ndm_control_agent * ca = sess->control_acb; ndmp9_data_get_state_reply * ds = &ca->data_state; int rc; char * what; char errbuf[100]; char tmpbuf[256]; /* close previous test if there is one */ ndmca_test_close (sess); /* open new test */ ndmca_test_open (sess, "data check", ndmp9_data_state_to_str (expected)); strcpy (errbuf, "???"); what = "get_state"; rc = ndmca_data_get_state (sess); if (rc) goto fail; what = "state self-consistent"; /* make sure the sensed state is self consistent */ switch (ds->state) { case NDMP9_DATA_STATE_IDLE: case NDMP9_DATA_STATE_ACTIVE: case NDMP9_DATA_STATE_LISTEN: case NDMP9_DATA_STATE_CONNECTED: if (ds->halt_reason != NDMP9_DATA_HALT_NA) { strcpy (errbuf, "reason != NA"); goto fail; } break; case NDMP9_DATA_STATE_HALTED: break; default: strcpy (errbuf, "bogus state"); goto fail; } what = "state"; if (ds->state != expected) { sprintf (errbuf, "expected %s got %s", ndmp9_data_state_to_str (expected), ndmp9_data_state_to_str (ds->state)); goto fail; } what = "reason"; switch (ds->state) { case NDMP9_DATA_STATE_HALTED: if (ds->halt_reason != (ndmp9_data_halt_reason)reason) { sprintf (errbuf, "expected %s got %s", ndmp9_data_halt_reason_to_str (reason), ndmp9_data_halt_reason_to_str (ds->halt_reason)); goto fail; } break; default: break; } /* test passed */ ndmca_test_close (sess); return 0; fail: /* test failed */ sprintf(tmpbuf, "%s: %s", what, errbuf); ndmca_test_fail(sess, tmpbuf); ndmca_test_close (sess); return -1; }