示例#1
0
/*
 * 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++;
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
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;
}
示例#5
0
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++;
}
示例#6
0
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;
}
示例#7
0
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;
}
示例#8
0
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;
}
示例#9
0
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;
}
示例#10
0
/*
 * 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);
}
示例#11
0
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;
}
示例#12
0
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;
}
示例#13
0
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;
}