testutils.c 1.4 KB
Newer Older
K
Karel Zak 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
/*
 * utils.c: basic test utils
 *
 * Copyright (C) 2005 Red Hat, Inc.
 *
 * See COPYING.LIB for the License of this software
 *
 * Karel Zak <kzak@redhat.com>
 *
 * $Id$
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

#include "testutils.h"

#define GETTIMEOFDAY(T) gettimeofday(T, NULL)
#define DIFF_MSEC(T, U) \
	        ((((int) ((T)->tv_sec - (U)->tv_sec)) * 1000000.0 + \
                  ((int) ((T)->tv_usec - (U)->tv_usec))) / 1000.0)

double
virtTestCountAverage(double *items, int nitems)
{
	long double sum = 0;
	int i;

	for (i=1; i < nitems; i++)
		sum += items[i];

	return (double) (sum / nitems);
}

/* 
 * Runs test anf count average time (if the nloops is grater than 1)
 * 
 * returns: -1 = error, 0 = success 
 */
int
virtTestRun(const char *title, int nloops, int (*body)(void *data), void *data)
{
	int i, ret = 0;
	double *ts = NULL;
	
	if (nloops > 1 && (ts = calloc(nloops, 
				sizeof(double)))==NULL)
		return -1;
	
	for (i=0; i < nloops; i++) {
		struct timeval before, after;

		if (ts)
			GETTIMEOFDAY(&before);
		if ((ret = body(data)) != 0)
			break;
		if (ts)	{
			GETTIMEOFDAY(&after);
			ts[i] = DIFF_MSEC(&after, &before);
		}
	}
	if (ret == 0 && ts)
		fprintf(stderr, "%-50s ... OK     [%.5f ms]\n", title, 
				virtTestCountAverage(ts, nloops));
	else if (ret == 0)
		fprintf(stderr, "%-50s ... OK\n", title);
	else
		fprintf(stderr, "%-50s ... FAILED\n", title);

	if (ts)
		free(ts);
	return ret;  
}