1212#include <math.h>
1313#include <stdarg.h>
1414#include <wchar.h>
15+ #include <time.h>
16+ #include <sys/time.h>
1517
1618/* required for sandboxing */
1719#include <sys/types.h>
8688 typedef struct stat STAT_T ;
8789#endif
8890
91+ #define MAX (x , y ) (((x) > (y)) ? (x) : (y))
92+
8993#include "clar.h"
9094
9195static void fs_rm (const char * _source );
@@ -117,6 +121,8 @@ struct clar_report {
117121 const char * suite ;
118122
119123 enum cl_test_status status ;
124+ time_t start ;
125+ double elapsed ;
120126
121127 struct clar_error * errors ;
122128 struct clar_error * last_error ;
@@ -145,7 +151,7 @@ static struct {
145151
146152 int report_errors_only ;
147153 int exit_on_error ;
148- int report_suite_names ;
154+ int verbosity ;
149155
150156 int write_summary ;
151157 char * summary_filename ;
@@ -186,7 +192,7 @@ struct clar_suite {
186192static void clar_print_init (int test_count , int suite_count , const char * suite_names );
187193static void clar_print_shutdown (int test_count , int suite_count , int error_count );
188194static void clar_print_error (int num , const struct clar_report * report , const struct clar_error * error );
189- static void clar_print_ontest (const char * test_name , int test_number , enum cl_test_status failed );
195+ static void clar_print_ontest (const char * suite_name , const char * test_name , int test_number , enum cl_test_status failed );
190196static void clar_print_onsuite (const char * suite_name , int suite_index );
191197static void clar_print_onabort (const char * msg , ...);
192198
@@ -247,10 +253,14 @@ clar_report_all(void)
247253
248254static void
249255clar_run_test (
256+ const struct clar_suite * suite ,
250257 const struct clar_func * test ,
251258 const struct clar_func * initialize ,
252259 const struct clar_func * cleanup )
253260{
261+ struct timeval start , end ;
262+ struct timezone tz ;
263+
254264 _clar .trampoline_enabled = 1 ;
255265
256266 CL_TRACE (CL_TRACE__TEST__BEGIN );
@@ -259,16 +269,24 @@ clar_run_test(
259269 if (initialize -> ptr != NULL )
260270 initialize -> ptr ();
261271
272+ _clar .last_report -> start = time (NULL );
273+ gettimeofday (& start , & tz );
274+
262275 CL_TRACE (CL_TRACE__TEST__RUN_BEGIN );
263276 test -> ptr ();
264277 CL_TRACE (CL_TRACE__TEST__RUN_END );
265278 }
266279
280+ gettimeofday (& end , & tz );
281+
267282 _clar .trampoline_enabled = 0 ;
268283
269284 if (_clar .last_report -> status == CL_TEST_NOTRUN )
270285 _clar .last_report -> status = CL_TEST_OK ;
271286
287+ _clar .last_report -> elapsed = ((double )end .tv_sec + (double )end .tv_usec / 1.0E6 ) -
288+ ((double )start .tv_sec + (double )start .tv_usec / 1.0E6 );
289+
272290 if (_clar .local_cleanup != NULL )
273291 _clar .local_cleanup (_clar .local_cleanup_payload );
274292
@@ -286,7 +304,7 @@ clar_run_test(
286304 if (_clar .report_errors_only ) {
287305 clar_report_errors (_clar .last_report );
288306 } else {
289- clar_print_ontest (test -> name , _clar .tests_ran , _clar .last_report -> status );
307+ clar_print_ontest (suite -> name , test -> name , _clar .tests_ran , _clar .last_report -> status );
290308 }
291309}
292310
@@ -352,7 +370,7 @@ clar_run_suite(const struct clar_suite *suite, const char *filter)
352370
353371 _clar .last_report = report ;
354372
355- clar_run_test (& test [i ], & suite -> initialize , & suite -> cleanup );
373+ clar_run_test (suite , & test [i ], & suite -> initialize , & suite -> cleanup );
356374
357375 if (_clar .exit_on_error && _clar .total_errors )
358376 return ;
@@ -427,7 +445,7 @@ clar_parse_args(int argc, char **argv)
427445 ++ found ;
428446
429447 if (!exact )
430- _clar .report_suite_names = 1 ;
448+ _clar .verbosity = MAX ( _clar . verbosity , 1 ) ;
431449
432450 switch (action ) {
433451 case 's' : {
@@ -486,13 +504,13 @@ clar_parse_args(int argc, char **argv)
486504 }
487505
488506 case 'v' :
489- _clar .report_suite_names = 1 ;
507+ _clar .verbosity ++ ;
490508 break ;
491509
492510 case 'r' :
493511 _clar .write_summary = 1 ;
494512 free (_clar .summary_filename );
495- _clar .summary_filename = strdup ( * (argument + 2 ) ? (argument + 2 ) : "summary.xml" ) ;
513+ _clar .summary_filename = * (argument + 2 ) ? strdup (argument + 2 ) : NULL ;
496514 break ;
497515
498516 default :
@@ -504,6 +522,8 @@ clar_parse_args(int argc, char **argv)
504522void
505523clar_test_init (int argc , char * * argv )
506524{
525+ const char * summary_env ;
526+
507527 if (argc > 1 )
508528 clar_parse_args (argc , argv );
509529
@@ -513,11 +533,15 @@ clar_test_init(int argc, char **argv)
513533 ""
514534 );
515535
516- if ((_clar .summary_filename = getenv ("CLAR_SUMMARY" )) != NULL ) {
536+ if (!_clar .summary_filename &&
537+ (summary_env = getenv ("CLAR_SUMMARY" )) != NULL ) {
517538 _clar .write_summary = 1 ;
518- _clar .summary_filename = strdup (_clar . summary_filename );
539+ _clar .summary_filename = strdup (summary_env );
519540 }
520541
542+ if (_clar .write_summary && !_clar .summary_filename )
543+ _clar .summary_filename = strdup ("summary.xml" );
544+
521545 if (_clar .write_summary &&
522546 !(_clar .summary = clar_summary_init (_clar .summary_filename ))) {
523547 clar_print_onabort ("Failed to open the summary file\n" );
0 commit comments