debug mem leak valgrind on fmock

This commit is contained in:
2024-02-09 16:05:55 +01:00
parent 9c58ca2873
commit 877891987a
3 changed files with 132 additions and 75 deletions
Binary file not shown.
+17 -2
View File
@@ -12,7 +12,7 @@
#include "ftest/ftest.h" #include "ftest/ftest.h"
#include "fmock/fmock.h" #include "fmock/fmock.h"
#if 0 #if 1
TEST(true__){ TEST(true__){
PRINTF("another test again false\n"); PRINTF("another test again false\n");
bool val_bool = false; bool val_bool = false;
@@ -156,6 +156,8 @@ MOCK_FUNC(int, f_mock, (), ())
EXPECT_MOCK_CALL(int,f_mock, (),false, 2) { EXPECT_MOCK_CALL(int,f_mock, (),false, 2) {
EXPECT_EQ_IN_MOCKF(21,21,f_mock); EXPECT_EQ_IN_MOCKF(21,21,f_mock);
EXPECT_EQ(1,3); EXPECT_EQ(1,3);
@@ -182,7 +184,7 @@ TEST(mockf1){
#endif #endif
#if 0 #if 1
MOCK_FUNC(int, f2_mock,(int a,int b),(a,b)) MOCK_FUNC(int, f2_mock,(int a,int b),(a,b))
@@ -254,6 +256,19 @@ TEST(f2mock_test){
} }
#endif
#if 1
TEST(f3_mock_test){ TEST(f3_mock_test){
INIT_CALLER_MOCK(f3_mock); INIT_CALLER_MOCK(f3_mock);
+115 -73
View File
@@ -138,6 +138,66 @@ __attribute__((constructor))
pthread_mutex_init(&mut_count_expect_mock, NULL); pthread_mutex_init(&mut_count_expect_mock, NULL);
} }
void clear_fmock_info_list(struct func_mock_info_struct **f_mock_list){
if(*f_mock_list){
struct func_mock_info_struct *tmp_fmock_info = *f_mock_list, *ttmp_fmock_info;
while(tmp_fmock_info){
ttmp_fmock_info = tmp_fmock_info;
tmp_fmock_info = tmp_fmock_info->next;
free(ttmp_fmock_info->str_namefunc);
free(ttmp_fmock_info->str_conditions);
free(ttmp_fmock_info->str_caller);
clear_variable_current(&(ttmp_fmock_info->l_current_var));
free(ttmp_fmock_info);
}
*f_mock_list = NULL;
}
}
void clear_list_base_fmock(struct list_base_fmock **l_fmock){
if(*l_fmock){
struct list_base_fmock *tmp_l_n = *l_fmock, *ttmp_l_n;
while(tmp_l_n){
ttmp_l_n = tmp_l_n;
tmp_l_n = tmp_l_n->next;
//clear_fmock_info_list(&((ttmp_l_n->next)->info_mock));
free(ttmp_l_n);
}
*l_fmock=NULL;
}
}
void clear_variable_current(struct list_current_variable **lcurrent_var){
if(*lcurrent_var){
struct list_current_variable *tmp_lcv = *lcurrent_var, *ttmp_lcv;
while(tmp_lcv){
ttmp_lcv = tmp_lcv;
tmp_lcv = tmp_lcv->next;
free(ttmp_lcv->str_current_variables);
free(ttmp_lcv);
}
*lcurrent_var=NULL;
}
}
__attribute__((destructor))
void purge_fmock(){
clear_fmock_info_list(&f_mock_glist);
PRINT_DEBUG("purge f_mock_glist %s\n","done");
clear_list_base_fmock(&g_list_base_fmock);
//PRINT_DEBUG("purge g_list_base_fmock %s\n","done");
}
extern bool is_parallel_nb; extern bool is_parallel_nb;
@@ -193,7 +253,7 @@ __attribute__((destructor))
struct winsize w; struct winsize w;
ioctl(1, TIOCGWINSZ, &w); ioctl(1, TIOCGWINSZ, &w);
char *reader=malloc(w.ws_col+1); char *reader=malloc(w.ws_col+3);
strcpy(reader,"STAT OF MOCK FUNCTIONS"); strcpy(reader,"STAT OF MOCK FUNCTIONS");
fprintf(F_OUT,"%s\n\n%0*d\n %*s \n%0*d %s\n\n", colors_f[k_YELLOW] ,w.ws_col,0, (int)(w.ws_col+strlen(reader))/2, reader,w.ws_col,0, DEFAULT_K ); fprintf(F_OUT,"%s\n\n%0*d\n %*s \n%0*d %s\n\n", colors_f[k_YELLOW] ,w.ws_col,0, (int)(w.ws_col+strlen(reader))/2, reader,w.ws_col,0, DEFAULT_K );
@@ -209,21 +269,28 @@ __attribute__((destructor))
PRINT_DEBUG("**** STAT mock function:%s, conditions:%s t_left:%ld, init_left:%ld, failed_call:%ld\n",tmock->str_namefunc, tmock->str_conditions, tmock->times_left,tmock->init_times_left, tmock->failed_call); PRINT_DEBUG("**** STAT mock function:%s, conditions:%s t_left:%ld, init_left:%ld, failed_call:%ld\n",tmock->str_namefunc, tmock->str_conditions, tmock->times_left,tmock->init_times_left, tmock->failed_call);
if(((tmock->expect_call) && (tmock->init_times_left == tmock->times_left)) || (tmock->failed_call)){ if(((tmock->expect_call) && (tmock->init_times_left == tmock->times_left)) || (tmock->failed_call)){
if(tmock->l_current_var){ if(tmock->l_current_var){
char *str_nb_call = number_call_translate(tmock->init_times_left);
PRINTF("%s%s %s%s %s: expect %s, it was called %ld times and failed %ld times, with condition %s\n",colors_f[k_RED],tab_hk_f[hk_FL],colors_f[k_YELLOW],tmock->str_namefunc,DEFAULT_K, PRINTF("%s%s %s%s %s: expect %s, it was called %ld times and failed %ld times, with condition %s\n",colors_f[k_RED],tab_hk_f[hk_FL],colors_f[k_YELLOW],tmock->str_namefunc,DEFAULT_K,
number_call_translate(tmock->init_times_left), str_nb_call,
tmock->call/*tmock->failed_call + (tmock->init_times_left - tmock->times_left)*/, tmock->call/*tmock->failed_call + (tmock->init_times_left - tmock->times_left)*/,
tmock->failed_call, tmock->failed_call,
tmock->str_conditions tmock->str_conditions
); );
free(str_nb_call);
PRINT_VAR_CUR(tmock); PRINT_VAR_CUR(tmock);
} }
else else{
char *str_nb_call = number_call_translate(tmock->init_times_left);
PRINTF("%s%s %s%s %s: expect %s, it was called %ld times and failed %ld times, with condition %s \n",colors_f[k_RED],tab_hk_f[hk_FL],colors_f[k_YELLOW],tmock->str_namefunc,DEFAULT_K, PRINTF("%s%s %s%s %s: expect %s, it was called %ld times and failed %ld times, with condition %s \n",colors_f[k_RED],tab_hk_f[hk_FL],colors_f[k_YELLOW],tmock->str_namefunc,DEFAULT_K,
number_call_translate(tmock->init_times_left), str_nb_call,
tmock->call/*tmock->failed_call + (tmock->init_times_left - tmock->times_left)*/, tmock->call/*tmock->failed_call + (tmock->init_times_left - tmock->times_left)*/,
tmock->failed_call, tmock->failed_call,
tmock->str_conditions tmock->str_conditions
); );
free(str_nb_call);
}
} }
tmock=tmock->next; tmock=tmock->next;
//free(tfree); //free(tfree);
@@ -235,8 +302,8 @@ __attribute__((destructor))
/* list each fmock an each calls */ /* list each fmock an each calls */
while(tmp_list_fm){ while(tmp_list_fm){
tmp_inf_mock = tmp_list_fm->info_mock; tmp_inf_mock = tmp_list_fm->info_mock;
memset(reader,'=',w.ws_col); for(size_t i=0;i<w.ws_col-2;++i) reader[i]='='; //memset(reader,'=',w.ws_col);
reader[w.ws_col-1]='\0'; reader[w.ws_col-2]='\0';
char *caller=""; char *caller="";
if(tmp_inf_mock->str_caller){ if(tmp_inf_mock->str_caller){
caller = extract_func_edited_TEST_from_exec_func_name(tmp_inf_mock->str_caller); caller = extract_func_edited_TEST_from_exec_func_name(tmp_inf_mock->str_caller);
@@ -262,46 +329,70 @@ __attribute__((destructor))
reader[bg_rd+len_nameff]=' '; reader[bg_rd+len_nameff]=' ';
} }
PRINTF("%s%s%s\n\n",colors_f[k_BLUE],reader,DEFAULT_K ); PRINTF("%s%s%s\n\n",colors_f[k_BLUE],reader,DEFAULT_K );
if(strcmp(caller,"")) free(caller);
while(tmp_inf_mock){ while(tmp_inf_mock){
if(0==strncmp(tmp_inf_mock->str_namefunc,nameff, len_nameff)){ if(0==strncmp(tmp_inf_mock->str_namefunc,nameff, len_nameff)){
if(tmp_inf_mock->expect_call==1){ if(tmp_inf_mock->expect_call==1){
int success = !((tmp_inf_mock->init_times_left == tmp_inf_mock->times_left) || (tmp_inf_mock->failed_call)); int success = !((tmp_inf_mock->init_times_left == tmp_inf_mock->times_left) || (tmp_inf_mock->failed_call));
if(tmp_inf_mock->l_current_var){ if(tmp_inf_mock->l_current_var){
char *str_caller = strprint_caller_(tmp_inf_mock->str_caller);
char *str_nb_call = number_call_translate(tmp_inf_mock->init_times_left);
PRINTF("%s%s%s %s\t expect to%s,\t called %ld times and failed %ld times %s,\t with condition: %s%s\n" , PRINTF("%s%s%s %s\t expect to%s,\t called %ld times and failed %ld times %s,\t with condition: %s%s\n" ,
colors_f[!unicolour*(k_RED - success)],tab_hk_f[hk_FL-success],colors_f[k_NOTHING * success],tmp_inf_mock->str_namefunc, number_call_translate(tmp_inf_mock->init_times_left), tmp_inf_mock->call, colors_f[!unicolour*(k_RED - success)],tab_hk_f[hk_FL-success],colors_f[k_NOTHING * success],tmp_inf_mock->str_namefunc, str_nb_call, tmp_inf_mock->call,
tmp_inf_mock->failed_call, strprint_caller_(tmp_inf_mock->str_caller), tmp_inf_mock->str_conditions, DEFAULT_K); tmp_inf_mock->failed_call, str_caller, tmp_inf_mock->str_conditions, DEFAULT_K);
free(str_nb_call);
if(strcmp(str_caller,"")) free(str_caller);
PRINT_VAR_CUR(tmp_inf_mock); PRINT_VAR_CUR(tmp_inf_mock);
}else{ }else{
char *str_caller = strprint_caller_(tmp_inf_mock->str_caller);
char *str_nb_call = number_call_translate(tmp_inf_mock->init_times_left);
PRINTF("%s%s%s %s\t expect to%s,\t called %ld times and failed %ld times %s,\t with condition: %s%s\n" , PRINTF("%s%s%s %s\t expect to%s,\t called %ld times and failed %ld times %s,\t with condition: %s%s\n" ,
colors_f[!unicolour*(k_RED - success)],tab_hk_f[hk_FL-success],colors_f[k_NOTHING*success],tmp_inf_mock->str_namefunc, number_call_translate(tmp_inf_mock->init_times_left), tmp_inf_mock->call, colors_f[!unicolour*(k_RED - success)],tab_hk_f[hk_FL-success],colors_f[k_NOTHING*success],tmp_inf_mock->str_namefunc, str_nb_call, tmp_inf_mock->call,
tmp_inf_mock->failed_call, strprint_caller_(tmp_inf_mock->str_caller), tmp_inf_mock->str_conditions , DEFAULT_K); tmp_inf_mock->failed_call, str_caller, tmp_inf_mock->str_conditions , DEFAULT_K);
free(str_nb_call);
if(strcmp(str_caller,"")) free(str_caller);
} }
}else if(tmp_inf_mock->expect_call==0) {/* will expect */ }else if(tmp_inf_mock->expect_call==0) {/* will expect */
int success = !(tmp_inf_mock->failed_call); int success = !(tmp_inf_mock->failed_call);
if(tmp_inf_mock->l_current_var){ if(tmp_inf_mock->l_current_var){
char *str_caller = strprint_caller_(tmp_inf_mock->str_caller);
char *str_nb_call = number_call_translate(tmp_inf_mock->init_times_left);
PRINTF("%s%s%s %s\t will%s,\t called %ld times and failed %ld times %s,\t with condition: %s,%s\n" , PRINTF("%s%s%s %s\t will%s,\t called %ld times and failed %ld times %s,\t with condition: %s,%s\n" ,
colors_f[!unicolour*(k_RED + success)],tab_hk_f[hk_FL-success],colors_f[k_NOTHING*success],tmp_inf_mock->str_namefunc, number_call_translate(tmp_inf_mock->init_times_left), tmp_inf_mock->call, colors_f[!unicolour*(k_RED + success)],tab_hk_f[hk_FL-success],colors_f[k_NOTHING*success],tmp_inf_mock->str_namefunc, str_nb_call, tmp_inf_mock->call,
tmp_inf_mock->failed_call, strprint_caller_(tmp_inf_mock->str_caller), tmp_inf_mock->str_conditions , DEFAULT_K); tmp_inf_mock->failed_call, str_caller, tmp_inf_mock->str_conditions , DEFAULT_K);
free(str_nb_call);
if(strcmp(str_caller,"")) free(str_caller);
PRINT_VAR_CUR(tmp_inf_mock); PRINT_VAR_CUR(tmp_inf_mock);
}else{ }else{
char *str_caller = strprint_caller_(tmp_inf_mock->str_caller);
char *str_nb_call = number_call_translate(tmp_inf_mock->init_times_left);
PRINTF("%s%s%s %s\t will%s,\t called %ld times and failed %ld times %s,\t with condition: %s %s\n" , PRINTF("%s%s%s %s\t will%s,\t called %ld times and failed %ld times %s,\t with condition: %s %s\n" ,
colors_f[!unicolour*(k_RED + success)],tab_hk_f[hk_FL-success],colors_f[k_NOTHING*success],tmp_inf_mock->str_namefunc, number_call_translate(tmp_inf_mock->init_times_left), tmp_inf_mock->call, colors_f[!unicolour*(k_RED + success)],tab_hk_f[hk_FL-success],colors_f[k_NOTHING*success],tmp_inf_mock->str_namefunc, str_nb_call, tmp_inf_mock->call,
tmp_inf_mock->failed_call, strprint_caller_(tmp_inf_mock->str_caller), tmp_inf_mock->str_conditions , DEFAULT_K); tmp_inf_mock->failed_call, str_caller, tmp_inf_mock->str_conditions , DEFAULT_K);
free(str_nb_call);
if(strcmp(str_caller,"")) free(str_caller);
} }
} }
else if(tmp_inf_mock->expect_call==-1){ else if(tmp_inf_mock->expect_call==-1){
if(tmp_inf_mock->l_current_var){ if(tmp_inf_mock->l_current_var){
char *str_caller = strprint_caller_(tmp_inf_mock->str_caller);
char *str_nb_call = number_call_translate(tmp_inf_mock->init_times_left);
PRINTF("%s%s%s %s\t %s,\t called %ld times, %s\n" , PRINTF("%s%s%s %s\t %s,\t called %ld times, %s\n" ,
colors_f[!unicolour*(k_RED)],tab_hk_f[hk_FL],colors_f[k_DEFAULT],tmp_inf_mock->str_namefunc, colors_f[!unicolour*(k_RED)],tab_hk_f[hk_FL],colors_f[k_DEFAULT],tmp_inf_mock->str_namefunc,
number_call_translate(tmp_inf_mock->init_times_left), tmp_inf_mock->call, str_nb_call, tmp_inf_mock->call, str_caller );
strprint_caller_(tmp_inf_mock->str_caller) ); free(str_nb_call);
if(strcmp(str_caller,"")) free(str_caller);
PRINT_VAR_CUR(tmp_inf_mock); PRINT_VAR_CUR(tmp_inf_mock);
}else{ }else{
char *str_nb_call = number_call_translate(tmp_inf_mock->init_times_left);
char *str_caller = strprint_caller_(tmp_inf_mock->str_caller);
PRINTF("%s%s%s %s\t %s,\t called %ld times, %s\n" , PRINTF("%s%s%s %s\t %s,\t called %ld times, %s\n" ,
colors_f[!unicolour*(k_RED)],tab_hk_f[hk_FL],colors_f[k_DEFAULT],tmp_inf_mock->str_namefunc, colors_f[!unicolour*(k_RED)],tab_hk_f[hk_FL],colors_f[k_DEFAULT],tmp_inf_mock->str_namefunc,
number_call_translate(tmp_inf_mock->init_times_left), tmp_inf_mock->call, str_nb_call, tmp_inf_mock->call, str_caller);
strprint_caller_(tmp_inf_mock->str_caller)); free(str_nb_call);
if(strcmp(str_caller,"")) free(str_caller);
} }
} }
@@ -310,8 +401,12 @@ __attribute__((destructor))
} }
PRINT_DEBUG(" end listing info mock of %s \n", nameff); PRINT_DEBUG(" end listing info mock of %s \n", nameff);
tmp_list_fm = tmp_list_fm->next; tmp_list_fm = tmp_list_fm->next;
free(nameff);
} }
free(reader);
PRINT_DEBUG("%s\n","info mock done!"); PRINT_DEBUG("%s\n","info mock done!");
pthread_mutex_destroy(&mut_g_list_base_fmock); pthread_mutex_destroy(&mut_g_list_base_fmock);
@@ -321,60 +416,7 @@ __attribute__((destructor))
pthread_mutex_destroy(&mut_count_expect_mock); pthread_mutex_destroy(&mut_count_expect_mock);
PRINT_DEBUG("%s\n","pthread_mutex_destroy done!"); PRINT_DEBUG("%s\n","pthread_mutex_destroy done!");
PRINT_DEBUG("%s\n","check mock done!"); PRINT_DEBUG("%s\n","check mock done!");
} }
void clear_fmock_info_list(struct func_mock_info_struct **f_mock_list){
if(*f_mock_list){
struct func_mock_info_struct *tmp_fmock_info = *f_mock_list, *ttmp_fmock_info;
while(tmp_fmock_info){
ttmp_fmock_info = tmp_fmock_info;
tmp_fmock_info = tmp_fmock_info->next;
free(ttmp_fmock_info->str_namefunc);
free(ttmp_fmock_info->str_conditions);
free(ttmp_fmock_info->str_caller);
clear_variable_current(&(ttmp_fmock_info->l_current_var));
free(ttmp_fmock_info);
}
*f_mock_list = NULL;
}
}
void clear_list_base_fmock(struct list_base_fmock **l_fmock){
if(*l_fmock){
struct list_base_fmock *tmp_l_n = *l_fmock, *ttmp_l_n;
while(tmp_l_n){
ttmp_l_n = tmp_l_n;
tmp_l_n = tmp_l_n->next;
//clear_fmock_info_list(&((ttmp_l_n->next)->info_mock));
free(ttmp_l_n);
}
*l_fmock=NULL;
}
}
void clear_variable_current(struct list_current_variable **lcurrent_var){
if(*lcurrent_var){
struct list_current_variable *tmp_lcv = *lcurrent_var, *ttmp_lcv;
while(tmp_lcv){
ttmp_lcv = tmp_lcv;
tmp_lcv = tmp_lcv->next;
free(ttmp_lcv->str_current_variables);
free(ttmp_lcv);
}
*lcurrent_var=NULL;
}
}
__attribute__((constructor))
void purge_fmock(){
clear_fmock_info_list(&f_mock_glist);
PRINT_DEBUG("purge f_mock_glist %s\n","done");
//clear_list_base_fmock(&g_list_base_fmock);
//PRINT_DEBUG("purge g_list_base_fmock %s\n","done");
}