Blame ndmp-src/ndma_ctst_subr.c

Packit Service 392537
/*
Packit Service 392537
 * Copyright (c) 1998,1999,2000
Packit Service 392537
 *	Traakan, Inc., Los Altos, CA
Packit Service 392537
 *	All rights reserved.
Packit Service 392537
 *
Packit Service 392537
 * Redistribution and use in source and binary forms, with or without
Packit Service 392537
 * modification, are permitted provided that the following conditions
Packit Service 392537
 * are met:
Packit Service 392537
 * 1. Redistributions of source code must retain the above copyright
Packit Service 392537
 *    notice unmodified, this list of conditions, and the following
Packit Service 392537
 *    disclaimer.
Packit Service 392537
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 392537
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 392537
 *    documentation and/or other materials provided with the distribution.
Packit Service 392537
 *
Packit Service 392537
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
Packit Service 392537
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service 392537
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit Service 392537
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
Packit Service 392537
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service 392537
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service 392537
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 392537
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit Service 392537
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit Service 392537
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit Service 392537
 * SUCH DAMAGE.
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * Project:  NDMJOB
Packit Service 392537
 * Ident:    $Id: $
Packit Service 392537
 *
Packit Service 392537
 * Description:
Packit Service 392537
 *
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
Packit Service 392537
#include "ndmagents.h"
Packit Service 392537
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_test_query_conn_types (struct ndm_session *sess,
Packit Service 392537
			     struct ndmconn *ref_conn)
Packit Service 392537
{
Packit Service 392537
    struct ndmconn *conn = ref_conn;
Packit Service 392537
    struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
    int	rc;
Packit Service 392537
    unsigned int i;
Packit Service 392537
Packit Service 392537
    switch (conn->protocol_version) {
Packit Service 392537
	default:	return -1234;
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_NDMP2
Packit Service 392537
	case NDMP2VER:
Packit Service 392537
	    NDMC_WITH_VOID_REQUEST(ndmp2_config_get_mover_type, NDMP2VER)
Packit Service 392537
	        rc = NDMC_CALL(conn);
Packit Service 392537
		if (rc) {
Packit Service 392537
		    ndmalogf (sess, "Test", 1, "GET_MOVER_TYPE failed");
Packit Service 392537
		    return rc;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		for (i = 0; i < reply->methods.methods_len; i++) {
Packit Service 392537
		    switch(reply->methods.methods_val[i]) {
Packit Service 392537
			case NDMP2_ADDR_LOCAL:
Packit Service 392537
			    ca->has_local_addr = 1;
Packit Service 392537
			    break;
Packit Service 392537
			case NDMP2_ADDR_TCP:
Packit Service 392537
			    ca->has_tcp_addr = 1;
Packit Service 392537
			    break;
Packit Service 392537
			default:
Packit Service 392537
			    break;
Packit Service 392537
		    }
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		NDMC_FREE_REPLY();
Packit Service 392537
	    NDMC_ENDWITH
Packit Service 392537
	    break;
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_NDMP2 */
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_NDMP3
Packit Service 392537
	case NDMP3VER:
Packit Service 392537
	    NDMC_WITH_VOID_REQUEST(ndmp3_config_get_connection_type, NDMP3VER)
Packit Service 392537
		rc = NDMC_CALL(conn);
Packit Service 392537
		if (rc) {
Packit Service 392537
		    ndmalogf (sess, "Test", 1, "GET_CONNECTION_TYPE failed");
Packit Service 392537
		    return rc;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		for (i = 0; i < reply->addr_types.addr_types_len; i++) {
Packit Service 392537
		    switch(reply->addr_types.addr_types_val[i]) {
Packit Service 392537
			case NDMP3_ADDR_LOCAL:
Packit Service 392537
			    ca->has_local_addr = 1;
Packit Service 392537
			    break;
Packit Service 392537
			case NDMP3_ADDR_TCP:
Packit Service 392537
			    ca->has_tcp_addr = 1;
Packit Service 392537
			    break;
Packit Service 392537
			default:
Packit Service 392537
			    break;
Packit Service 392537
		    }
Packit Service 392537
		}
Packit Service 392537
		NDMC_FREE_REPLY();
Packit Service 392537
	    NDMC_ENDWITH
Packit Service 392537
	    break;
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_NDMP3 */
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_NDMP4
Packit Service 392537
	case NDMP4VER:
Packit Service 392537
	    NDMC_WITH_VOID_REQUEST(ndmp4_config_get_connection_type, NDMP4VER)
Packit Service 392537
		rc = NDMC_CALL(conn);
Packit Service 392537
		if (rc) {
Packit Service 392537
		    ndmalogf (sess, "Test", 1, "GET_CONNECTION_TYPE failed");
Packit Service 392537
		    return rc;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		for (i = 0; i < reply->addr_types.addr_types_len; i++) {
Packit Service 392537
		    switch(reply->addr_types.addr_types_val[i]) {
Packit Service 392537
			case NDMP4_ADDR_LOCAL:
Packit Service 392537
			    ca->has_local_addr = 1;
Packit Service 392537
			    break;
Packit Service 392537
			case NDMP4_ADDR_TCP:
Packit Service 392537
			    ca->has_tcp_addr = 1;
Packit Service 392537
			    break;
Packit Service 392537
			default:
Packit Service 392537
			    break;
Packit Service 392537
		    }
Packit Service 392537
		}
Packit Service 392537
		NDMC_FREE_REPLY();
Packit Service 392537
	    NDMC_ENDWITH
Packit Service 392537
	    break;
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_NDMP4 */
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_test_load_tape (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			rc;
Packit Service 392537
Packit Service 392537
	ca->tape_mode = NDMP9_TAPE_READ_MODE;
Packit Service 392537
	ca->is_label_op = 1;
Packit Service 392537
Packit Service 392537
	rc = ndmca_op_robot_startup (sess, 1);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_connect_tape_agent(sess);
Packit Service 392537
	if (rc) {
Packit Service 392537
		ndmconn_destruct (sess->plumb.tape);
Packit Service 392537
		return rc;	/* already tattled */
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	rc = ndmca_media_load_first (sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	ndmca_tape_close (sess);
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_test_unload_tape (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	ndmca_tape_open (sess);
Packit Service 392537
Packit Service 392537
	ndmca_media_unload_current(sess);
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_test_check_expect_errs (struct ndmconn *conn, int rc,
Packit Service 392537
  ndmp9_error expect_errs[])
Packit Service 392537
{
Packit Service 392537
	struct ndm_session *sess = conn->context;
Packit Service 392537
	int		protocol_version = conn->protocol_version;
Packit Service 392537
	struct ndmp_xa_buf *xa = &conn->call_xa_buf;
Packit Service 392537
	unsigned	msg = xa->request.header.message;
Packit Service 392537
	char *		msgname = ndmp_message_to_str (protocol_version, msg);
Packit Service 392537
	ndmp9_error	reply_error = conn->last_reply_error;
Packit Service 392537
	int		i;
Packit Service 392537
Packit Service 392537
	/* make sure we have a 'test' active */
Packit Service 392537
	ndmca_test_open (sess, msgname, ndmp9_error_to_str (expect_errs[0]));
Packit Service 392537
Packit Service 392537
	if (rc >= 0) {
Packit Service 392537
		/* Call succeeded. Body valid */
Packit Service 392537
		rc = 1;
Packit Service 392537
		for (i = 0; (int)expect_errs[i] >= 0; i++) {
Packit Service 392537
			if (reply_error == expect_errs[i]) {
Packit Service 392537
				rc = 0;
Packit Service 392537
				break;
Packit Service 392537
			}
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (rc) {
Packit Service 392537
			if (reply_error != NDMP9_NO_ERR
Packit Service 392537
			  && expect_errs[0] != NDMP9_NO_ERR) {
Packit Service 392537
				/* both are errors, don't be picky */
Packit Service 392537
				rc = 2;
Packit Service 392537
			} else {
Packit Service 392537
				/* intolerable mismatch */
Packit Service 392537
			}
Packit Service 392537
		} else {
Packit Service 392537
			/* Worked as expected */
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (rc != 0) {
Packit Service 392537
	    char tmpbuf[128];
Packit Service 392537
Packit Service 392537
	    for (i = 0; (int)expect_errs[i] >= 0; i++) {
Packit Service 392537
		ndmalogf (sess, "Test", 1,
Packit Service 392537
			  "%s #%d -- .... %s %s",
Packit Service 392537
			  sess->control_acb.test_phase,
Packit Service 392537
			  sess->control_acb.test_step,
Packit Service 392537
			  (i==0) ? "expected" : "or",
Packit Service 392537
			  ndmp9_error_to_str (expect_errs[i]));
Packit Service 392537
	    }
Packit Service 392537
Packit Service 392537
	    sprintf(tmpbuf, "got %s (error expected)", ndmp9_error_to_str (reply_error));
Packit Service 392537
Packit Service 392537
	    if (rc == 2)
Packit Service 392537
		ndmca_test_warn (sess, tmpbuf);
Packit Service 392537
	    else
Packit Service 392537
		ndmca_test_fail (sess, tmpbuf);
Packit Service 392537
Packit Service 392537
	    ndma_tattle (conn, xa, rc);
Packit Service 392537
Packit Service 392537
	    if (rc == 2)
Packit Service 392537
		rc = 0;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return rc;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_test_check_expect (struct ndmconn *conn, int rc, ndmp9_error expect_err)
Packit Service 392537
{
Packit Service 392537
	ndmp9_error		errs[2];
Packit Service 392537
Packit Service 392537
	errs[0] = expect_err;
Packit Service 392537
	errs[1] = -1;
Packit Service 392537
Packit Service 392537
	return ndmca_test_check_expect_errs (conn, rc, errs);
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_test_check_expect_no_err (struct ndmconn *conn, int rc)
Packit Service 392537
{
Packit Service 392537
	return ndmca_test_check_expect (conn, rc, NDMP9_NO_ERR);
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_test_check_expect_illegal_state (struct ndmconn *conn, int rc)
Packit Service 392537
{
Packit Service 392537
	return ndmca_test_check_expect (conn, rc, NDMP9_ILLEGAL_STATE_ERR);
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_test_check_expect_illegal_args (struct ndmconn *conn, int rc)
Packit Service 392537
{
Packit Service 392537
	return ndmca_test_check_expect (conn, rc, NDMP9_ILLEGAL_ARGS_ERR);
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_test_call (struct ndmconn *conn,
Packit Service 392537
  struct ndmp_xa_buf *xa, ndmp9_error expect_err)
Packit Service 392537
{
Packit Service 392537
	struct ndm_session *sess = conn->context;
Packit Service 392537
	int		protocol_version = conn->protocol_version;
Packit Service 392537
	unsigned	msg = xa->request.header.message;
Packit Service 392537
	char *		msgname = ndmp_message_to_str (protocol_version, msg);
Packit Service 392537
	unsigned	reply_error;
Packit Service 392537
	int		rc;
Packit Service 392537
Packit Service 392537
	/* close previous test if there is one */
Packit Service 392537
	ndmca_test_close (sess);
Packit Service 392537
Packit Service 392537
	/* open new 'test' */
Packit Service 392537
	ndmca_test_open (sess, msgname, ndmp9_error_to_str (expect_err));
Packit Service 392537
Packit Service 392537
	rc = ndma_call_no_tattle (conn, xa);
Packit Service 392537
Packit Service 392537
	reply_error = ndmnmb_get_reply_error (&xa->reply);
Packit Service 392537
Packit Service 392537
	if (rc >= 0) {
Packit Service 392537
		/* Call succeeded. Body valid */
Packit Service 392537
		if (reply_error == expect_err) {
Packit Service 392537
			/* Worked exactly as expected */
Packit Service 392537
			rc = 0;
Packit Service 392537
		} else if (reply_error != NDMP9_NO_ERR
Packit Service 392537
		        && expect_err != NDMP9_NO_ERR) {
Packit Service 392537
			/* both are errors, don't be picky about the codes */
Packit Service 392537
			rc = 2;
Packit Service 392537
		} else {
Packit Service 392537
			/* intolerable mismatch */
Packit Service 392537
			rc = 1;
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (rc != 0) {
Packit Service 392537
	    char tmpbuf[128];
Packit Service 392537
	    sprintf(tmpbuf, "got %s (call)", ndmp9_error_to_str (reply_error));
Packit Service 392537
	    if (rc == 2)
Packit Service 392537
		ndmca_test_warn (sess, tmpbuf);
Packit Service 392537
	    else
Packit Service 392537
		ndmca_test_fail (sess, tmpbuf);
Packit Service 392537
Packit Service 392537
	    ndma_tattle (conn, xa, rc);
Packit Service 392537
Packit Service 392537
	    if (rc == 2)
Packit Service 392537
		rc = 0;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return rc;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * start or open a test if not already opened
Packit Service 392537
 */
Packit Service 392537
void
Packit Service 392537
ndmca_test_open (struct ndm_session *sess, char *test_name, char *sub_test_name)
Packit Service 392537
{
Packit Service 392537
    static char test_name_buf[512];
Packit Service 392537
Packit Service 392537
    if (sess->control_acb.active_test == 0) {
Packit Service 392537
	/* record name */
Packit Service 392537
	if (sub_test_name)
Packit Service 392537
	    sprintf(test_name_buf, "%s/%s", test_name, sub_test_name);
Packit Service 392537
	else
Packit Service 392537
	    strcpy(test_name_buf, test_name);
Packit Service 392537
	sess->control_acb.active_test = test_name_buf;
Packit Service 392537
Packit Service 392537
	/* make sure flags are cleared */
Packit Service 392537
	sess->control_acb.active_test_failed = (char *)0;
Packit Service 392537
	sess->control_acb.active_test_warned = (char *)0;
Packit Service 392537
Packit Service 392537
    }
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
void
Packit Service 392537
ndmca_test_warn (struct ndm_session *sess, char *warn_msg)
Packit Service 392537
{
Packit Service 392537
    static char warn_msg_buf[512];
Packit Service 392537
Packit Service 392537
    ndmca_test_open (sess, "UNKNOWN WARN", 0);
Packit Service 392537
Packit Service 392537
    strcpy(warn_msg_buf, warn_msg);
Packit Service 392537
    sess->control_acb.active_test_warned = warn_msg_buf;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
void
Packit Service 392537
ndmca_test_fail (struct ndm_session *sess, char *fail_msg)
Packit Service 392537
{
Packit Service 392537
    static char fail_msg_buf[512];
Packit Service 392537
Packit Service 392537
    ndmca_test_open (sess, "UNKNOWN FAIL", 0);
Packit Service 392537
Packit Service 392537
    strcpy(fail_msg_buf, fail_msg);
Packit Service 392537
    sess->control_acb.active_test_failed = fail_msg_buf;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * close or end a test if not already closed
Packit Service 392537
 */
Packit Service 392537
void
Packit Service 392537
ndmca_test_close (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
    if (sess->control_acb.active_test != 0) {
Packit Service 392537
	/* count test */
Packit Service 392537
	sess->control_acb.n_step_tests++;
Packit Service 392537
Packit Service 392537
	/* display results */
Packit Service 392537
	if (sess->control_acb.active_test_failed) {
Packit Service 392537
	    ndmalogf (sess, "Test", 1,
Packit Service 392537
		      "%s #%d -- Failed %s %s",
Packit Service 392537
		      sess->control_acb.test_phase,
Packit Service 392537
		      sess->control_acb.test_step,
Packit Service 392537
		      sess->control_acb.active_test,
Packit Service 392537
		      sess->control_acb.active_test_failed);
Packit Service 392537
	    sess->control_acb.n_step_fail++;
Packit Service 392537
	    exit(1);
Packit Service 392537
	} else if (sess->control_acb.active_test_warned) {
Packit Service 392537
	    ndmalogf (sess, "Test", 1,
Packit Service 392537
		      "%s #%d -- Almost %s %s",
Packit Service 392537
		      sess->control_acb.test_phase,
Packit Service 392537
		      sess->control_acb.test_step,
Packit Service 392537
		      sess->control_acb.active_test,
Packit Service 392537
		      sess->control_acb.active_test_warned);
Packit Service 392537
	    sess->control_acb.n_step_warn++;
Packit Service 392537
	    exit(1);
Packit Service 392537
	} else {
Packit Service 392537
	    ndmalogf (sess, "Test", 2,
Packit Service 392537
		      "%s #%d -- Passed %s",
Packit Service 392537
		      sess->control_acb.test_phase,
Packit Service 392537
		      sess->control_acb.test_step,
Packit Service 392537
		      sess->control_acb.active_test);
Packit Service 392537
	    sess->control_acb.n_step_pass++;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	/* clear flags */
Packit Service 392537
	sess->control_acb.active_test = (char *)0;
Packit Service 392537
	sess->control_acb.active_test_failed = (char *)0;
Packit Service 392537
	sess->control_acb.active_test_warned = (char *)0;
Packit Service 392537
Packit Service 392537
	/* advance test count */
Packit Service 392537
	sess->control_acb.test_step++;
Packit Service 392537
Packit Service 392537
    }
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * start a test phase (part of a series)
Packit Service 392537
 */
Packit Service 392537
void
Packit Service 392537
ndmca_test_phase (struct ndm_session *sess, char *test_phase, char *desc)
Packit Service 392537
{
Packit Service 392537
	ndmalogf (sess, "TEST", 0, "Test %s -- %s", test_phase, desc);
Packit Service 392537
Packit Service 392537
	sess->control_acb.test_phase = test_phase;
Packit Service 392537
	sess->control_acb.test_step = 1;
Packit Service 392537
	sess->control_acb.n_step_pass = 0;
Packit Service 392537
	sess->control_acb.n_step_fail = 0;
Packit Service 392537
	sess->control_acb.n_step_warn = 0;
Packit Service 392537
	sess->control_acb.n_step_tests = 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
void
Packit Service 392537
ndmca_test_log_step (struct ndm_session *sess, int level, char *msg)
Packit Service 392537
{
Packit Service 392537
	int had_active = (sess->control_acb.active_test != 0);
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, "Test", level, "%s #%d -- %s",
Packit Service 392537
		  sess->control_acb.test_phase,
Packit Service 392537
		  sess->control_acb.test_step,
Packit Service 392537
		  msg);
Packit Service 392537
Packit Service 392537
	/* in case we have a open test -- close it */
Packit Service 392537
	ndmca_test_close (sess);
Packit Service 392537
Packit Service 392537
	/* advance test count if we didn't have an active test */
Packit Service 392537
	if (!had_active)
Packit Service 392537
	    sess->control_acb.test_step++;
Packit Service 392537
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
void
Packit Service 392537
ndmca_test_log_note (struct ndm_session *sess, int level, char *msg)
Packit Service 392537
{
Packit Service 392537
	ndmalogf (sess, "Test", level, "%s #%d %s",
Packit Service 392537
		sess->control_acb.test_phase,
Packit Service 392537
		sess->control_acb.test_step,
Packit Service 392537
		msg);
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * finish a test phase (part of a series)
Packit Service 392537
 */
Packit Service 392537
void
Packit Service 392537
ndmca_test_done_phase (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	char *			status;
Packit Service 392537
	int had_active = (sess->control_acb.active_test != 0);
Packit Service 392537
Packit Service 392537
	/* close previous test if there is one */
Packit Service 392537
	ndmca_test_close (sess);
Packit Service 392537
Packit Service 392537
	if (ca->n_step_fail)
Packit Service 392537
		status = "Failed";
Packit Service 392537
	else if (ca->n_step_warn)
Packit Service 392537
		status = "Almost";
Packit Service 392537
	else if (ca->n_step_pass > 0)
Packit Service 392537
		status = "Passed";
Packit Service 392537
	else
Packit Service 392537
		status = "Whiffed";
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, "TEST", 0, "Test %s %s -- pass=%d warn=%d fail=%d (total %d)",
Packit Service 392537
			ca->test_phase,
Packit Service 392537
			status,
Packit Service 392537
			ca->n_step_pass,
Packit Service 392537
			ca->n_step_warn,
Packit Service 392537
			ca->n_step_fail,
Packit Service 392537
			ca->n_step_tests);
Packit Service 392537
Packit Service 392537
	ca->total_n_step_pass += ca->n_step_pass;
Packit Service 392537
	ca->total_n_step_warn += ca->n_step_warn;
Packit Service 392537
	ca->total_n_step_fail += ca->n_step_fail;
Packit Service 392537
	ca->total_n_step_tests += ca->n_step_tests;
Packit Service 392537
Packit Service 392537
	/* advance test count if we didn't have an active test so
Packit Service 392537
	 * clean up phases have a new test count
Packit Service 392537
         */
Packit Service 392537
	if (!had_active)
Packit Service 392537
	    sess->control_acb.test_step++;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * finish a test series (which may include test phases)
Packit Service 392537
 */
Packit Service 392537
void
Packit Service 392537
ndmca_test_done_series (struct ndm_session *sess, char *series_name)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	char *			status;
Packit Service 392537
Packit Service 392537
	/* close previous test if there is one */
Packit Service 392537
	ndmca_test_close (sess);
Packit Service 392537
Packit Service 392537
	if (ca->total_n_step_fail)
Packit Service 392537
		status = "Failed";
Packit Service 392537
	else if (ca->total_n_step_warn)
Packit Service 392537
		status = "Almost";
Packit Service 392537
	else
Packit Service 392537
		status = "Passed";
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, "TEST", 0, "FINAL %s %s -- pass=%d warn=%d fail=%d (total %d)",
Packit Service 392537
			series_name,
Packit Service 392537
			status,
Packit Service 392537
			ca->total_n_step_pass,
Packit Service 392537
			ca->total_n_step_warn,
Packit Service 392537
			ca->total_n_step_fail,
Packit Service 392537
			ca->total_n_step_tests);
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
Packit Service 392537
Packit Service 392537
void
Packit Service 392537
ndmca_test_fill_data (char *buf, int bufsize, int recno, int fileno)
Packit Service 392537
{
Packit Service 392537
	char *		src;
Packit Service 392537
	char *		srcend;
Packit Service 392537
	char *		dst = buf;
Packit Service 392537
	char *		dstend = buf+bufsize;
Packit Service 392537
	unsigned short	sequence = 0;
Packit Service 392537
	struct {
Packit Service 392537
		unsigned short	fileno;
Packit Service 392537
		unsigned short	sequence;
Packit Service 392537
		unsigned long	recno;
Packit Service 392537
	}		x;
Packit Service 392537
Packit Service 392537
	x.fileno = fileno;
Packit Service 392537
	x.recno = recno;
Packit Service 392537
Packit Service 392537
	srcend = (char *) &x;
Packit Service 392537
	srcend += sizeof x;
Packit Service 392537
Packit Service 392537
	while (dst < dstend) {
Packit Service 392537
		x.sequence = sequence++;
Packit Service 392537
		src = (char *) &x;
Packit Service 392537
Packit Service 392537
		while (src < srcend && dst < dstend)
Packit Service 392537
			*dst++ = *src++;
Packit Service 392537
	}
Packit Service 392537
}
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */