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
/*
 * 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);
}

/* 
K
Karel Zak 已提交
37
 * Runs test and count average time (if the nloops is grater than 1)
K
Karel Zak 已提交
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
 * 
 * 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;  
}