Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Make cunit memory clean
[simgrid.git] / src / xbt / cunit.c
index 7d584eb..ac0ca35 100644 (file)
@@ -9,7 +9,7 @@
 
 /* This is partially inspirated from the OSSP ts (Test Suite Library)       */
 
-#include "gras_config.h"
+#include "portable.h"
 
 #include "xbt/sysdep.h"    /* vasprintf */
 #include "xbt/cunit.h"
@@ -50,13 +50,6 @@ static void xbt_test_log_dump(xbt_test_log_t log) {
   else
     fprintf(stderr,"      log=NULL\n");           
 }
-static void xbt_test_log_free(xbt_test_log_t log) {
-  if (!log)
-    return;
-  if (log->text)
-    free(log->text);
-  free(log);
-}
 
 /* test suite test check */
 typedef struct s_xbt_test_test {
@@ -72,7 +65,7 @@ typedef struct s_xbt_test_test {
 static void xbt_test_test_dump(xbt_test_test_t test){
   if (test) {
     xbt_test_log_t log;
-    int it_log;
+    unsigned int it_log;
     fprintf(stderr,"    test %p(%s:%d)=%s (%s)\n",
            test,test->file,test->line,test->title,
            test->failed?"failed":"not failed");
@@ -100,7 +93,7 @@ struct s_xbt_test_unit {
 static void xbt_test_unit_dump(xbt_test_unit_t unit) {
   if (unit) {
     xbt_test_test_t test;
-    int it_test;
+    unsigned int it_test;
     fprintf(stderr,"  UNIT %s: %s (%s)\n",
            unit->name,unit->title,
            (unit->enabled?"enabled":"disabled"));
@@ -135,17 +128,36 @@ static void xbt_test_suite_free(void *s) {
   free(suite);
 }
 
+static void xbt_test_unit_free(void *unit) {
+   xbt_test_unit_t u = *(xbt_test_unit_t*)unit;
+   /* name is static */
+   free(u->title);
+   xbt_dynar_free(&u->tests);
+   free(u);
+}
+static void xbt_test_test_free(void *test) {
+   xbt_test_test_t t = *(xbt_test_test_t*)test;
+   free(t->title);
+   xbt_dynar_free(&(t->logs));
+   free(t);
+}
+static void xbt_test_log_free(void *log) {
+  xbt_test_log_t l= *(xbt_test_log_t*) log;
+  free(l->text);
+  free(l);
+}
+
 /** @brief create test suite */
 xbt_test_suite_t xbt_test_suite_new(const char *name, const char *fmt, ...) {
   xbt_test_suite_t suite = xbt_new0(struct s_xbt_test_suite,1);
   va_list ap;
 
   if (!_xbt_test_suites) 
-    _xbt_test_suites = xbt_dynar_new(sizeof(xbt_test_suite_t),&xbt_test_suite_free);
+    _xbt_test_suites = xbt_dynar_new(sizeof(xbt_test_suite_t),xbt_test_suite_free);
 
   va_start(ap, fmt);
   vasprintf(&suite->title,fmt, ap);
-  suite->units = xbt_dynar_new(sizeof(xbt_test_unit_t), NULL);
+  suite->units = xbt_dynar_new(sizeof(xbt_test_unit_t), &xbt_test_unit_free);
   va_end(ap);
   suite->name = name;
   suite->enabled = 1;
@@ -158,7 +170,7 @@ xbt_test_suite_t xbt_test_suite_new(const char *name, const char *fmt, ...) {
 /** @brief retrieve a testsuite from name, or create a new one */
 xbt_test_suite_t xbt_test_suite_by_name(const char *name,const char *fmt, ...) {
   xbt_test_suite_t suite;
-  int it_suite;
+  unsigned int it_suite;
 
   char *bufname;
   va_list ap;
@@ -180,7 +192,7 @@ xbt_test_suite_t xbt_test_suite_by_name(const char *name,const char *fmt, ...) {
 void xbt_test_suite_dump(xbt_test_suite_t suite) {
   if (suite) {
     xbt_test_unit_t unit;
-    int it_unit;
+    unsigned int it_unit;
     fprintf(stderr,"TESTSUITE %s: %s (%s)\n",
            suite->name, suite->title,
            suite->enabled?"enabled":"disabled");
@@ -210,7 +222,7 @@ void xbt_test_suite_push(xbt_test_suite_t suite, const char *name, ts_test_cb_t
   unit->file = NULL;
   unit->line = 0;
   unit->enabled = 1;
-  unit->tests = xbt_dynar_new(sizeof(xbt_test_test_t), NULL);
+  unit->tests = xbt_dynar_new(sizeof(xbt_test_test_t), xbt_test_test_free);
   
   xbt_dynar_push(suite->units, &unit);
   return;
@@ -225,7 +237,7 @@ static int xbt_test_suite_run(xbt_test_suite_t suite) {
   const char *file;
   int line;
   char *cp;
-  int it_unit,it_test,it_log;
+  unsigned int it_unit,it_test,it_log;
 
   int first=1; /* for result pretty printing */
 
@@ -245,13 +257,13 @@ static int xbt_test_suite_run(xbt_test_suite_t suite) {
     for (i=1;i<79;i++)
       suite_title[i]='=';
     suite_title[i++]='\n';
-    suite_title[i]='\0';
+    suite_title[79]='\0';
 
     sprintf(suite_title + 40 - (suite_len+4)/2, "[ %s ]", suite->title);
     suite_title[40 + (suite_len+5)/2] = '=';
     if (!suite->enabled) 
       sprintf(suite_title+ 70," DISABLED ");
-    fprintf(stderr, "\n%s",suite_title);
+    fprintf(stderr, "\n%s\n",suite_title);
   }
 
   if (suite->enabled) {        
@@ -308,12 +320,14 @@ static int xbt_test_suite_run(xbt_test_suite_t suite) {
                                          (test->failed?" FAIL":" PASS"))),
                  test->title, file, line);
          
-         xbt_dynar_foreach(test->logs,it_log,log) {
-           file = (log->file != NULL ? log->file : file);
-           line = (log->line != 0    ? log->line : line);
-           fprintf(stderr, "             %s:%d: %s\n", 
-                   file, line,log->text);
-           
+         if  ( (test->expected_failure && !test->failed) || (!test->expected_failure && test->failed) ) {
+            xbt_dynar_foreach(test->logs,it_log,log) {
+               file = (log->file != NULL ? log->file : file);
+               line = (log->line != 0    ? log->line : line);
+               fprintf(stderr, "             %s:%d: %s\n", 
+                       file, line,log->text);
+               
+            }
          }
        }
        fprintf(stderr, "    Summary: %d of %d tests failed",unit->test_failed, unit->nb_tests);
@@ -430,10 +444,13 @@ static void apply_selection(char *selection) {
   int done = 0;
   char dir[1024]; /* the directive */
   /* iterators */
-  int it_suite;
+  unsigned int it_suite;
   xbt_test_suite_t suite;
   xbt_test_unit_t unit;
-  int it_unit;
+  unsigned int it_unit;
+
+  char suitename[512];
+  char unitname[512];
 
   if (!selection || selection[0] == '\0')
     return;
@@ -458,9 +475,11 @@ static void apply_selection(char *selection) {
       enabling = 0;
       memmove(dir,dir+1,strlen(dir));
     }
+    if (dir[0] == '+') {
+      enabling = 1;
+      memmove(dir,dir+1,strlen(dir));
+    }
 
-
-    char suitename[512],unitname[512];
     p =strchr(dir,':');
     if (p) {
       strcpy(unitname,p+1); 
@@ -487,8 +506,8 @@ static void apply_selection(char *selection) {
        suite->enabled = enabling;
       }
     } else {
-      int it;
-      for (it=0; it<xbt_dynar_length(_xbt_test_suites); it++) {
+      unsigned int it;
+      for (it=0; it< xbt_dynar_length(_xbt_test_suites); it++) {
        xbt_test_suite_t thissuite=xbt_dynar_get_as(_xbt_test_suites,it,xbt_test_suite_t);
        if (!strcmp(suitename,thissuite->name)) {
          /* Do not disable the whole suite when we just want to disable a child */
@@ -500,9 +519,9 @@ static void apply_selection(char *selection) {
              unit->enabled = enabling;
            }
          } else { /* act on one child only */
-           int it2_unit;
+           unsigned int it2_unit;
            /* search it, first (we won't reuse it for external loop which gets broken) */
-           for (it2_unit=0; it2_unit<xbt_dynar_length(thissuite->units); it2_unit++) {
+           for (it2_unit=0; it2_unit< xbt_dynar_length(thissuite->units); it2_unit++) {
              xbt_test_unit_t thisunit=xbt_dynar_get_as(thissuite->units,it2_unit,xbt_test_unit_t);
              if (!strcmp(thisunit->name,unitname)) {
                thisunit->enabled = enabling;
@@ -532,7 +551,7 @@ void xbt_test_dump(char *selection) {
   apply_selection(selection);
 
   if (_xbt_test_suites) {
-    int it_suite;
+    unsigned int it_suite;
     xbt_test_suite_t suite;
 
     xbt_dynar_foreach(_xbt_test_suites,it_suite,suite) 
@@ -546,7 +565,7 @@ int xbt_test_run(char *selection) {
   apply_selection(selection);
 
   if (_xbt_test_suites) {
-    int it_suite;
+    unsigned int it_suite;
     xbt_test_suite_t suite;
     int first=1;
     
@@ -616,7 +635,9 @@ int xbt_test_run(char *selection) {
   }
   return _xbt_test_unit_failed;
 }
-
+void xbt_test_exit(void) {
+   xbt_dynar_free(&_xbt_test_suites);
+}
 
 /* annotate test case with test */
 void _xbt_test_add(const char*file,int line, const char *fmt, ...) {
@@ -627,7 +648,7 @@ void _xbt_test_add(const char*file,int line, const char *fmt, ...) {
   xbt_assert(unit);
   xbt_assert(fmt);
 
-  test = xbt_new(struct s_xbt_test_test,1);
+  test = xbt_new0(struct s_xbt_test_test,1);
   va_start(ap, fmt);
   vasprintf(&test->title, fmt, ap);
   va_end(ap);
@@ -636,7 +657,7 @@ void _xbt_test_add(const char*file,int line, const char *fmt, ...) {
   test->ignored = 0;
   test->file = file;
   test->line = line;
-  test->logs = xbt_dynar_new(sizeof(xbt_test_log_t),NULL);
+  test->logs = xbt_dynar_new(sizeof(xbt_test_log_t),xbt_test_log_free);
   xbt_dynar_push(unit->tests,&test);
   return;
 }