From f7f5c7587f6ad5515f31d9b88888ca81efbdcedf Mon Sep 17 00:00:00 2001 From: William King Date: Fri, 10 Jul 2015 07:07:36 -0700 Subject: [PATCH] FS-7820 C level unit testing and micro benchmarking framework, including one example unit test. --- Makefile.am | 2 +- configure.ac | 6 +++++- tests/unit/Makefile.am | 22 +++++++++++++++++++ tests/unit/README | 18 ++++++++++++++++ tests/unit/event_create.c | 45 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 tests/unit/Makefile.am create mode 100644 tests/unit/README create mode 100644 tests/unit/event_create.c diff --git a/Makefile.am b/Makefile.am index c9b797b9c4..63f0896fac 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ EXTRA_DIST = -SUBDIRS = . src build +SUBDIRS = . src build tests/unit AUTOMAKE_OPTIONS = foreign subdir-objects NAME = freeswitch diff --git a/configure.ac b/configure.ac index 1fb30e18c6..9bb07fccfe 100644 --- a/configure.ac +++ b/configure.ac @@ -205,7 +205,6 @@ AC_DEFINE_UNQUOTED([SWITCH_DATA_DIR],"${datadir}",[directory for data files]) AC_SUBST(localstatedir) AC_DEFINE_UNQUOTED([SWITCH_LOCALSTATE_DIR],"${localstatedir}",[directory for local state files]) - AC_SUBST(bindir) AC_SUBST(includedir) @@ -1383,6 +1382,10 @@ PKG_CHECK_MODULES([AMQP], [librabbitmq >= 0.5.2],[ AM_CONDITIONAL([HAVE_AMQP],[true])],[ AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_AMQP],[false])]) +PKG_CHECK_MODULES([TAP], [tap >= 0.1.0],[ + AM_CONDITIONAL([HAVE_TAP],[true])],[ + AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_TAP],[false])]) + PKG_CHECK_MODULES([SMPP34], [libsmpp34 >= 1.10],[ AM_CONDITIONAL([HAVE_SMPP34],[true])],[ AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_SMPP34],[false])]) @@ -1659,6 +1662,7 @@ ac_cv_file_dbd_apr_dbd_mysql_c=no AC_CONFIG_FILES([Makefile build/Makefile src/Makefile + tests/unit/Makefile src/mod/Makefile src/mod/applications/mod_abstraction/Makefile src/mod/applications/mod_avmd/Makefile diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am new file mode 100644 index 0000000000..d88fe761a1 --- /dev/null +++ b/tests/unit/Makefile.am @@ -0,0 +1,22 @@ +FSLD = $(top_builddir)/libfreeswitch.la $(top_builddir)/libs/apr/libapr-1.la $(top_builddir)/libs/apr-util/libaprutil-1.la + +TESTS = event_create + +if HAVE_TAP + +check_PROGRAMS = event_create + + +event_create_SOURCES = event_create.c +event_create_CFLAGS = $(SWITCH_AM_CFLAGS) +event_create_LDADD = $(FSLD) +event_create_LDFLAGS = $(SWITCH_AM_LDFLAGS) -ltap + + +else +install: error +all: error +error: + $(error You must install libtap-dev to build these unit tests) +endif + diff --git a/tests/unit/README b/tests/unit/README new file mode 100644 index 0000000000..79d3b9f07b --- /dev/null +++ b/tests/unit/README @@ -0,0 +1,18 @@ +FreeSWITCH unit tests should be kept as shallow unit tests and micro +benchmarks testing functionality exposed through libfreeswitch. + +Requirements for a new unit tests: + +1. Tests must use TAP(Test Anything Protocol) output format, and must +print to stderr the summary statistics of the test before exiting. + +2. Each test must return 0 on successful completion, or a non-zero +result in case of a failure. + +3. Benchmarking stats should be output as a TAP note at the end of the +test in a human and machine(regex) parsable format + +Use libtap from https://github.com/zorgnax/libtap +cd /usr/local/src/ +git clone https://github.com/zorgnax/libtap.git +make PREFIX=/usr install \ No newline at end of file diff --git a/tests/unit/event_create.c b/tests/unit/event_create.c new file mode 100644 index 0000000000..bfef0cb9f6 --- /dev/null +++ b/tests/unit/event_create.c @@ -0,0 +1,45 @@ +#include +#include +#include + +int main () { + + switch_event_t *event = NULL; + switch_bool_t verbose = SWITCH_TRUE; + const char *err = NULL; + switch_time_t start_ts, end_ts; + int rc = 0, loops = 1000; + switch_status_t status = SWITCH_STATUS_SUCCESS; + + plan(1 + ( 3 * loops)); + + + status = switch_core_init(SCF_MINIMAL, verbose, &err); + + if ( !ok( status == SWITCH_STATUS_SUCCESS, "Initialize FreeSWITCH core\n")) { + bail_out(0, "Bail due to failure to initialize FreeSWITCH[%s]", err); + } + + /* START LOOPS */ + start_ts = switch_time_now(); + + for ( int x = 0; x < loops; x++) { + status = switch_event_create(&event, SWITCH_EVENT_MESSAGE); + ok( status == SWITCH_STATUS_SUCCESS,"Create Event"); + + status = switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "testing", "event_create"); + ok( status == SWITCH_STATUS_SUCCESS,"Add header to event"); + + is(switch_event_get_header(event, "testing"), "event_create", "correct header value returned"); + + switch_event_destroy(&event); + } /* END LOOPS */ + + end_ts = switch_time_now(); + + note("Total %ldus, %ldus per loop, %ld loops per second\n", end_ts - start_ts,(end_ts - start_ts) / loops, 1000000/ ((end_ts - start_ts) / loops)); + + switch_core_destroy(); + + done_testing(); +}