freeswitch/libs/sofia-sip/s2check/s2base.c
Michael Jerris 1dda329079 Wed Mar 11 09:49:37 CDT 2009 Pekka Pessi <first.last@nokia.com>
* s2base.c: use struct timeval with gettimeofday()
  Ignore-this: 1ca4ea3c958573a1fa845d8b66b7d6ad


git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@12746 d0543943-73ff-0310-b7d9-9358b9ac24b2
2009-03-24 15:43:28 +00:00

181 lines
3.8 KiB
C

/*
* This file is part of the Sofia-SIP package
*
* Copyright (C) 2008 Nokia Corporation.
*
* Contact: Pekka Pessi <pekka.pessi@nokia.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
*/
/**@CFILE s2base.c
* @brief Common check-based tester for Sofia SIP modules
*
* @author Pekka Pessi <Pekka.Pessi@nokia.com>
*
* @date Created: Wed Apr 30 12:48:27 EEST 2008 ppessi
*/
#include "config.h"
#undef NDEBUG
#define TP_MAGIC_T struct tp_magic_s
#include "s2base.h"
#include <sofia-sip/sip_header.h>
#include <sofia-sip/sip_status.h>
#include <sofia-sip/msg_addr.h>
#include <sofia-sip/su_log.h>
#include <sofia-sip/su_tagarg.h>
#include <sofia-sip/su_alloc.h>
#include <sofia-sip/su_string.h>
#include <sofia-sip/sresolv.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <limits.h>
#include <time.h>
#if HAVE_SYS_TIME_H
#include <sys/time.h> /* Get struct timeval */
#endif
#if HAVE_CLOCK_GETTIME
static double
now(void)
{
struct timespec tv;
#if CLOCK_MONOTONIC
if (clock_gettime(CLOCK_MONOTONIC, &tv) != 0)
#endif
clock_gettime(CLOCK_REALTIME, &tv);
return tv.tv_sec * 1.0 + tv.tv_nsec * 1e-9;
}
#elif HAVE_GETTIMEOFDAY
static double
now(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec * 1.0 + tv.tv_usec * 1e-6;
}
#else
#error no gettimeofday for test timing
#endif
/* -- Module globals ---------------------------------------------------- */
struct s2base *s2base;
char const *s2_tester = "s2_tester";
int s2_start_stop;
char const *_s2_suite = "X";
char const *_s2_case = "0.0";
static struct {
double setup, start, done, toredown;
} stamps;
void s2_suite(char const *name)
{
_s2_suite = name;
}
/** Basic setup for test cases */
void s2_setup(char const *label)
{
assert(s2base == NULL);
stamps.setup = now();
if (s2_start_stop > 1) {
printf("%s - setup %s test case\n", s2_tester, label ? label : "next");
}
su_init();
s2base = su_home_new(sizeof *s2base);
assert(s2base != NULL);
s2base->root = su_root_create(s2base);
assert(s2base->root != NULL);
}
void s2_case(char const *number,
char const *title,
char const *description,
char const *function)
{
stamps.start = now();
_s2_case = number;
if (s2_start_stop)
printf("%s - starting %s (%s/%s %s)\n", s2_tester, function,
_s2_suite, _s2_case, title);
}
void s2_step(void)
{
su_root_step(s2base->root, 10);
}
static char const *s2_teardown_label = NULL;
void
s2_teardown_started(char const *label)
{
stamps.done = now();
if (!s2_teardown_label) {
s2_teardown_label = label;
if (s2_start_stop > 1) {
double ms = (stamps.done - stamps.start) * 1000.0;
printf("%s - tearing down %s test case (%g ms)\n", s2_tester, label, ms);
}
}
}
void
s2_teardown(void)
{
struct s2base *_zap = s2base;
s2base = NULL;
su_root_destroy(_zap->root);
su_deinit();
stamps.toredown = now();
if (s2_start_stop > 1) {
double ms = (stamps.toredown - stamps.setup) * 1000.0;
printf("%s - %s test case tore down (total %g ms)\n", s2_tester,
s2_teardown_label ? s2_teardown_label : "previous", ms);
}
s2_teardown_label = NULL;
}