@@ -21,6 +21,17 @@ static struct k_thread ztest_thread;
2121#include <unistd.h>
2222#endif
2323
24+ #ifdef CONFIG_ZTEST_SHUFFLE
25+ #include <random/rand32.h>
26+ #include <stdlib.h>
27+ #include <time.h>
28+ #define NUM_ITER_PER_SUITE CONFIG_ZTEST_SHUFFLE_SUITE_REPEAT_COUNT
29+ #define NUM_ITER_PER_TEST CONFIG_ZTEST_SHUFFLE_TEST_REPEAT_COUNT
30+ #else
31+ #define NUM_ITER_PER_SUITE 1
32+ #define NUM_ITER_PER_TEST 1
33+ #endif
34+
2435/* ZTEST_DMEM and ZTEST_BMEM are used for the application shared memory test */
2536
2637/**
@@ -495,12 +506,34 @@ struct ztest_unit_test *ztest_get_next_test(const char *suite, struct ztest_unit
495506 return NULL ;
496507}
497508
509+ #ifdef CONFIG_ZTEST_SHUFFLE
510+ static void z_ztest_shuffle (void * array , size_t num_items , void * tmp , size_t elem_size )
511+ {
512+ char * arr = array ;
513+
514+ for (int i = num_items - 1 ; i > 0 ; i -- ) {
515+ int j = sys_rand32_get () % (i + 1 );
516+
517+ if (i != j ) {
518+ memcpy (tmp , arr + (j * elem_size ), elem_size );
519+ memcpy (arr + (j * elem_size ), arr + (i * elem_size ), elem_size );
520+ memcpy (arr + (i * elem_size ), tmp , elem_size );
521+ }
522+ }
523+
524+ }
525+ #endif /* CONFIG_ZTEST_SHUFFLE */
526+
498527static int z_ztest_run_test_suite_ptr (struct ztest_suite_node * suite )
499528{
500529 struct ztest_unit_test * test = NULL ;
501530 void * data = NULL ;
502531 int fail = 0 ;
503532
533+ #ifdef CONFIG_ZTEST_SHUFFLE
534+ struct ztest_unit_test tmp ;
535+ #endif
536+
504537 if (test_status < 0 ) {
505538 return test_status ;
506539 }
@@ -517,21 +550,33 @@ static int z_ztest_run_test_suite_ptr(struct ztest_suite_node *suite)
517550 if (suite -> setup != NULL ) {
518551 data = suite -> setup ();
519552 }
520- while ((test = ztest_get_next_test (suite -> name , test )) != NULL ) {
521- fail += run_test (suite , test , data );
522553
523- if (fail && FAIL_FAST ) {
524- break ;
554+ for (int i = 0 ; i < NUM_ITER_PER_TEST ; i ++ ) {
555+ fail = 0 ;
556+
557+ #ifdef CONFIG_ZTEST_SHUFFLE
558+ z_ztest_shuffle (_ztest_unit_test_list_start ,
559+ _ztest_unit_test_list_end - _ztest_unit_test_list_start , & tmp ,
560+ sizeof (struct ztest_unit_test ));
561+ #endif
562+
563+ while (((test = ztest_get_next_test (suite -> name , test )) != NULL )) {
564+ fail += run_test (suite , test , data );
565+
566+ if (fail && FAIL_FAST ) {
567+ break ;
568+ }
525569 }
570+
571+ test_status = (test_status || fail ) ? 1 : 0 ;
526572 }
573+
527574 TC_SUITE_END (suite -> name , (fail > 0 ? TC_FAIL : TC_PASS ));
528575 phase = TEST_PHASE_TEARDOWN ;
529576 if (suite -> teardown != NULL ) {
530577 suite -> teardown (data );
531578 }
532579
533- test_status = (test_status || fail ) ? 1 : 0 ;
534-
535580 return fail ;
536581}
537582
@@ -558,6 +603,14 @@ int ztest_run_test_suites(const void *state)
558603 struct ztest_suite_node * ptr ;
559604 int count = 0 ;
560605
606+ #ifdef CONFIG_ZTEST_SHUFFLE
607+ struct ztest_suite_node tmp ;
608+
609+ z_ztest_shuffle (_ztest_suite_node_list_start ,
610+ _ztest_suite_node_list_end - _ztest_suite_node_list_start , & tmp ,
611+ sizeof (struct ztest_suite_node ));
612+ #endif
613+
561614 for (ptr = _ztest_suite_node_list_start ; ptr < _ztest_suite_node_list_end ; ++ ptr ) {
562615 struct ztest_suite_stats * stats = & ptr -> stats ;
563616 bool should_run = true;
@@ -569,14 +622,16 @@ int ztest_run_test_suites(const void *state)
569622 should_run = stats -> run_count == 0 ;
570623 }
571624
572- if (should_run ) {
573- int fail = z_ztest_run_test_suite_ptr (ptr );
625+ for (int i = 0 ; i < NUM_ITER_PER_SUITE ; i ++ ) {
626+ if (should_run ) {
627+ int fail = z_ztest_run_test_suite_ptr (ptr );
574628
575- count ++ ;
576- stats -> run_count ++ ;
577- stats -> fail_count += (fail != 0 ) ? 1 : 0 ;
578- } else {
579- stats -> skip_count ++ ;
629+ count ++ ;
630+ stats -> run_count ++ ;
631+ stats -> fail_count += (fail != 0 ) ? 1 : 0 ;
632+ } else {
633+ stats -> skip_count ++ ;
634+ }
580635 }
581636 }
582637
0 commit comments