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