1*8e33eff8Schristos #include "test/jemalloc_test.h" 2*8e33eff8Schristos 3*8e33eff8Schristos #include "jemalloc/internal/log.h" 4*8e33eff8Schristos 5*8e33eff8Schristos static void 6*8e33eff8Schristos expect_no_logging(const char *names) { 7*8e33eff8Schristos log_var_t log_l1 = LOG_VAR_INIT("l1"); 8*8e33eff8Schristos log_var_t log_l2 = LOG_VAR_INIT("l2"); 9*8e33eff8Schristos log_var_t log_l2_a = LOG_VAR_INIT("l2.a"); 10*8e33eff8Schristos 11*8e33eff8Schristos strcpy(log_var_names, names); 12*8e33eff8Schristos 13*8e33eff8Schristos int count = 0; 14*8e33eff8Schristos 15*8e33eff8Schristos for (int i = 0; i < 10; i++) { 16*8e33eff8Schristos log_do_begin(log_l1) 17*8e33eff8Schristos count++; 18*8e33eff8Schristos log_do_end(log_l1) 19*8e33eff8Schristos 20*8e33eff8Schristos log_do_begin(log_l2) 21*8e33eff8Schristos count++; 22*8e33eff8Schristos log_do_end(log_l2) 23*8e33eff8Schristos 24*8e33eff8Schristos log_do_begin(log_l2_a) 25*8e33eff8Schristos count++; 26*8e33eff8Schristos log_do_end(log_l2_a) 27*8e33eff8Schristos } 28*8e33eff8Schristos assert_d_eq(count, 0, "Disabled logging not ignored!"); 29*8e33eff8Schristos } 30*8e33eff8Schristos 31*8e33eff8Schristos TEST_BEGIN(test_log_disabled) { 32*8e33eff8Schristos test_skip_if(!config_log); 33*8e33eff8Schristos atomic_store_b(&log_init_done, true, ATOMIC_RELAXED); 34*8e33eff8Schristos expect_no_logging(""); 35*8e33eff8Schristos expect_no_logging("abc"); 36*8e33eff8Schristos expect_no_logging("a.b.c"); 37*8e33eff8Schristos expect_no_logging("l12"); 38*8e33eff8Schristos expect_no_logging("l123|a456|b789"); 39*8e33eff8Schristos expect_no_logging("|||"); 40*8e33eff8Schristos } 41*8e33eff8Schristos TEST_END 42*8e33eff8Schristos 43*8e33eff8Schristos TEST_BEGIN(test_log_enabled_direct) { 44*8e33eff8Schristos test_skip_if(!config_log); 45*8e33eff8Schristos atomic_store_b(&log_init_done, true, ATOMIC_RELAXED); 46*8e33eff8Schristos log_var_t log_l1 = LOG_VAR_INIT("l1"); 47*8e33eff8Schristos log_var_t log_l1_a = LOG_VAR_INIT("l1.a"); 48*8e33eff8Schristos log_var_t log_l2 = LOG_VAR_INIT("l2"); 49*8e33eff8Schristos 50*8e33eff8Schristos int count; 51*8e33eff8Schristos 52*8e33eff8Schristos count = 0; 53*8e33eff8Schristos strcpy(log_var_names, "l1"); 54*8e33eff8Schristos for (int i = 0; i < 10; i++) { 55*8e33eff8Schristos log_do_begin(log_l1) 56*8e33eff8Schristos count++; 57*8e33eff8Schristos log_do_end(log_l1) 58*8e33eff8Schristos } 59*8e33eff8Schristos assert_d_eq(count, 10, "Mis-logged!"); 60*8e33eff8Schristos 61*8e33eff8Schristos count = 0; 62*8e33eff8Schristos strcpy(log_var_names, "l1.a"); 63*8e33eff8Schristos for (int i = 0; i < 10; i++) { 64*8e33eff8Schristos log_do_begin(log_l1_a) 65*8e33eff8Schristos count++; 66*8e33eff8Schristos log_do_end(log_l1_a) 67*8e33eff8Schristos } 68*8e33eff8Schristos assert_d_eq(count, 10, "Mis-logged!"); 69*8e33eff8Schristos 70*8e33eff8Schristos count = 0; 71*8e33eff8Schristos strcpy(log_var_names, "l1.a|abc|l2|def"); 72*8e33eff8Schristos for (int i = 0; i < 10; i++) { 73*8e33eff8Schristos log_do_begin(log_l1_a) 74*8e33eff8Schristos count++; 75*8e33eff8Schristos log_do_end(log_l1_a) 76*8e33eff8Schristos 77*8e33eff8Schristos log_do_begin(log_l2) 78*8e33eff8Schristos count++; 79*8e33eff8Schristos log_do_end(log_l2) 80*8e33eff8Schristos } 81*8e33eff8Schristos assert_d_eq(count, 20, "Mis-logged!"); 82*8e33eff8Schristos } 83*8e33eff8Schristos TEST_END 84*8e33eff8Schristos 85*8e33eff8Schristos TEST_BEGIN(test_log_enabled_indirect) { 86*8e33eff8Schristos test_skip_if(!config_log); 87*8e33eff8Schristos atomic_store_b(&log_init_done, true, ATOMIC_RELAXED); 88*8e33eff8Schristos strcpy(log_var_names, "l0|l1|abc|l2.b|def"); 89*8e33eff8Schristos 90*8e33eff8Schristos /* On. */ 91*8e33eff8Schristos log_var_t log_l1 = LOG_VAR_INIT("l1"); 92*8e33eff8Schristos /* Off. */ 93*8e33eff8Schristos log_var_t log_l1a = LOG_VAR_INIT("l1a"); 94*8e33eff8Schristos /* On. */ 95*8e33eff8Schristos log_var_t log_l1_a = LOG_VAR_INIT("l1.a"); 96*8e33eff8Schristos /* Off. */ 97*8e33eff8Schristos log_var_t log_l2_a = LOG_VAR_INIT("l2.a"); 98*8e33eff8Schristos /* On. */ 99*8e33eff8Schristos log_var_t log_l2_b_a = LOG_VAR_INIT("l2.b.a"); 100*8e33eff8Schristos /* On. */ 101*8e33eff8Schristos log_var_t log_l2_b_b = LOG_VAR_INIT("l2.b.b"); 102*8e33eff8Schristos 103*8e33eff8Schristos /* 4 are on total, so should sum to 40. */ 104*8e33eff8Schristos int count = 0; 105*8e33eff8Schristos for (int i = 0; i < 10; i++) { 106*8e33eff8Schristos log_do_begin(log_l1) 107*8e33eff8Schristos count++; 108*8e33eff8Schristos log_do_end(log_l1) 109*8e33eff8Schristos 110*8e33eff8Schristos log_do_begin(log_l1a) 111*8e33eff8Schristos count++; 112*8e33eff8Schristos log_do_end(log_l1a) 113*8e33eff8Schristos 114*8e33eff8Schristos log_do_begin(log_l1_a) 115*8e33eff8Schristos count++; 116*8e33eff8Schristos log_do_end(log_l1_a) 117*8e33eff8Schristos 118*8e33eff8Schristos log_do_begin(log_l2_a) 119*8e33eff8Schristos count++; 120*8e33eff8Schristos log_do_end(log_l2_a) 121*8e33eff8Schristos 122*8e33eff8Schristos log_do_begin(log_l2_b_a) 123*8e33eff8Schristos count++; 124*8e33eff8Schristos log_do_end(log_l2_b_a) 125*8e33eff8Schristos 126*8e33eff8Schristos log_do_begin(log_l2_b_b) 127*8e33eff8Schristos count++; 128*8e33eff8Schristos log_do_end(log_l2_b_b) 129*8e33eff8Schristos } 130*8e33eff8Schristos 131*8e33eff8Schristos assert_d_eq(count, 40, "Mis-logged!"); 132*8e33eff8Schristos } 133*8e33eff8Schristos TEST_END 134*8e33eff8Schristos 135*8e33eff8Schristos TEST_BEGIN(test_log_enabled_global) { 136*8e33eff8Schristos test_skip_if(!config_log); 137*8e33eff8Schristos atomic_store_b(&log_init_done, true, ATOMIC_RELAXED); 138*8e33eff8Schristos strcpy(log_var_names, "abc|.|def"); 139*8e33eff8Schristos 140*8e33eff8Schristos log_var_t log_l1 = LOG_VAR_INIT("l1"); 141*8e33eff8Schristos log_var_t log_l2_a_a = LOG_VAR_INIT("l2.a.a"); 142*8e33eff8Schristos 143*8e33eff8Schristos int count = 0; 144*8e33eff8Schristos for (int i = 0; i < 10; i++) { 145*8e33eff8Schristos log_do_begin(log_l1) 146*8e33eff8Schristos count++; 147*8e33eff8Schristos log_do_end(log_l1) 148*8e33eff8Schristos 149*8e33eff8Schristos log_do_begin(log_l2_a_a) 150*8e33eff8Schristos count++; 151*8e33eff8Schristos log_do_end(log_l2_a_a) 152*8e33eff8Schristos } 153*8e33eff8Schristos assert_d_eq(count, 20, "Mis-logged!"); 154*8e33eff8Schristos } 155*8e33eff8Schristos TEST_END 156*8e33eff8Schristos 157*8e33eff8Schristos TEST_BEGIN(test_logs_if_no_init) { 158*8e33eff8Schristos test_skip_if(!config_log); 159*8e33eff8Schristos atomic_store_b(&log_init_done, false, ATOMIC_RELAXED); 160*8e33eff8Schristos 161*8e33eff8Schristos log_var_t l = LOG_VAR_INIT("definitely.not.enabled"); 162*8e33eff8Schristos 163*8e33eff8Schristos int count = 0; 164*8e33eff8Schristos for (int i = 0; i < 10; i++) { 165*8e33eff8Schristos log_do_begin(l) 166*8e33eff8Schristos count++; 167*8e33eff8Schristos log_do_end(l) 168*8e33eff8Schristos } 169*8e33eff8Schristos assert_d_eq(count, 0, "Logging shouldn't happen if not initialized."); 170*8e33eff8Schristos } 171*8e33eff8Schristos TEST_END 172*8e33eff8Schristos 173*8e33eff8Schristos /* 174*8e33eff8Schristos * This really just checks to make sure that this usage compiles; we don't have 175*8e33eff8Schristos * any test code to run. 176*8e33eff8Schristos */ 177*8e33eff8Schristos TEST_BEGIN(test_log_only_format_string) { 178*8e33eff8Schristos if (false) { 179*8e33eff8Schristos LOG("log_str", "No arguments follow this format string."); 180*8e33eff8Schristos } 181*8e33eff8Schristos } 182*8e33eff8Schristos TEST_END 183*8e33eff8Schristos 184*8e33eff8Schristos int 185*8e33eff8Schristos main(void) { 186*8e33eff8Schristos return test( 187*8e33eff8Schristos test_log_disabled, 188*8e33eff8Schristos test_log_enabled_direct, 189*8e33eff8Schristos test_log_enabled_indirect, 190*8e33eff8Schristos test_log_enabled_global, 191*8e33eff8Schristos test_logs_if_no_init, 192*8e33eff8Schristos test_log_only_format_string); 193*8e33eff8Schristos } 194