1*8e33eff8Schristos #include "test/jemalloc_test.h" 2*8e33eff8Schristos 3*8e33eff8Schristos TEST_BEGIN(test_malloc_strtoumax_no_endptr) { 4*8e33eff8Schristos int err; 5*8e33eff8Schristos 6*8e33eff8Schristos set_errno(0); 7*8e33eff8Schristos assert_ju_eq(malloc_strtoumax("0", NULL, 0), 0, "Unexpected result"); 8*8e33eff8Schristos err = get_errno(); 9*8e33eff8Schristos assert_d_eq(err, 0, "Unexpected failure"); 10*8e33eff8Schristos } 11*8e33eff8Schristos TEST_END 12*8e33eff8Schristos 13*8e33eff8Schristos TEST_BEGIN(test_malloc_strtoumax) { 14*8e33eff8Schristos struct test_s { 15*8e33eff8Schristos const char *input; 16*8e33eff8Schristos const char *expected_remainder; 17*8e33eff8Schristos int base; 18*8e33eff8Schristos int expected_errno; 19*8e33eff8Schristos const char *expected_errno_name; 20*8e33eff8Schristos uintmax_t expected_x; 21*8e33eff8Schristos }; 22*8e33eff8Schristos #define ERR(e) e, #e 23*8e33eff8Schristos #define KUMAX(x) ((uintmax_t)x##ULL) 24*8e33eff8Schristos #define KSMAX(x) ((uintmax_t)(intmax_t)x##LL) 25*8e33eff8Schristos struct test_s tests[] = { 26*8e33eff8Schristos {"0", "0", -1, ERR(EINVAL), UINTMAX_MAX}, 27*8e33eff8Schristos {"0", "0", 1, ERR(EINVAL), UINTMAX_MAX}, 28*8e33eff8Schristos {"0", "0", 37, ERR(EINVAL), UINTMAX_MAX}, 29*8e33eff8Schristos 30*8e33eff8Schristos {"", "", 0, ERR(EINVAL), UINTMAX_MAX}, 31*8e33eff8Schristos {"+", "+", 0, ERR(EINVAL), UINTMAX_MAX}, 32*8e33eff8Schristos {"++3", "++3", 0, ERR(EINVAL), UINTMAX_MAX}, 33*8e33eff8Schristos {"-", "-", 0, ERR(EINVAL), UINTMAX_MAX}, 34*8e33eff8Schristos 35*8e33eff8Schristos {"42", "", 0, ERR(0), KUMAX(42)}, 36*8e33eff8Schristos {"+42", "", 0, ERR(0), KUMAX(42)}, 37*8e33eff8Schristos {"-42", "", 0, ERR(0), KSMAX(-42)}, 38*8e33eff8Schristos {"042", "", 0, ERR(0), KUMAX(042)}, 39*8e33eff8Schristos {"+042", "", 0, ERR(0), KUMAX(042)}, 40*8e33eff8Schristos {"-042", "", 0, ERR(0), KSMAX(-042)}, 41*8e33eff8Schristos {"0x42", "", 0, ERR(0), KUMAX(0x42)}, 42*8e33eff8Schristos {"+0x42", "", 0, ERR(0), KUMAX(0x42)}, 43*8e33eff8Schristos {"-0x42", "", 0, ERR(0), KSMAX(-0x42)}, 44*8e33eff8Schristos 45*8e33eff8Schristos {"0", "", 0, ERR(0), KUMAX(0)}, 46*8e33eff8Schristos {"1", "", 0, ERR(0), KUMAX(1)}, 47*8e33eff8Schristos 48*8e33eff8Schristos {"42", "", 0, ERR(0), KUMAX(42)}, 49*8e33eff8Schristos {" 42", "", 0, ERR(0), KUMAX(42)}, 50*8e33eff8Schristos {"42 ", " ", 0, ERR(0), KUMAX(42)}, 51*8e33eff8Schristos {"0x", "x", 0, ERR(0), KUMAX(0)}, 52*8e33eff8Schristos {"42x", "x", 0, ERR(0), KUMAX(42)}, 53*8e33eff8Schristos 54*8e33eff8Schristos {"07", "", 0, ERR(0), KUMAX(7)}, 55*8e33eff8Schristos {"010", "", 0, ERR(0), KUMAX(8)}, 56*8e33eff8Schristos {"08", "8", 0, ERR(0), KUMAX(0)}, 57*8e33eff8Schristos {"0_", "_", 0, ERR(0), KUMAX(0)}, 58*8e33eff8Schristos 59*8e33eff8Schristos {"0x", "x", 0, ERR(0), KUMAX(0)}, 60*8e33eff8Schristos {"0X", "X", 0, ERR(0), KUMAX(0)}, 61*8e33eff8Schristos {"0xg", "xg", 0, ERR(0), KUMAX(0)}, 62*8e33eff8Schristos {"0XA", "", 0, ERR(0), KUMAX(10)}, 63*8e33eff8Schristos 64*8e33eff8Schristos {"010", "", 10, ERR(0), KUMAX(10)}, 65*8e33eff8Schristos {"0x3", "x3", 10, ERR(0), KUMAX(0)}, 66*8e33eff8Schristos 67*8e33eff8Schristos {"12", "2", 2, ERR(0), KUMAX(1)}, 68*8e33eff8Schristos {"78", "8", 8, ERR(0), KUMAX(7)}, 69*8e33eff8Schristos {"9a", "a", 10, ERR(0), KUMAX(9)}, 70*8e33eff8Schristos {"9A", "A", 10, ERR(0), KUMAX(9)}, 71*8e33eff8Schristos {"fg", "g", 16, ERR(0), KUMAX(15)}, 72*8e33eff8Schristos {"FG", "G", 16, ERR(0), KUMAX(15)}, 73*8e33eff8Schristos {"0xfg", "g", 16, ERR(0), KUMAX(15)}, 74*8e33eff8Schristos {"0XFG", "G", 16, ERR(0), KUMAX(15)}, 75*8e33eff8Schristos {"z_", "_", 36, ERR(0), KUMAX(35)}, 76*8e33eff8Schristos {"Z_", "_", 36, ERR(0), KUMAX(35)} 77*8e33eff8Schristos }; 78*8e33eff8Schristos #undef ERR 79*8e33eff8Schristos #undef KUMAX 80*8e33eff8Schristos #undef KSMAX 81*8e33eff8Schristos unsigned i; 82*8e33eff8Schristos 83*8e33eff8Schristos for (i = 0; i < sizeof(tests)/sizeof(struct test_s); i++) { 84*8e33eff8Schristos struct test_s *test = &tests[i]; 85*8e33eff8Schristos int err; 86*8e33eff8Schristos uintmax_t result; 87*8e33eff8Schristos char *remainder; 88*8e33eff8Schristos 89*8e33eff8Schristos set_errno(0); 90*8e33eff8Schristos result = malloc_strtoumax(test->input, &remainder, test->base); 91*8e33eff8Schristos err = get_errno(); 92*8e33eff8Schristos assert_d_eq(err, test->expected_errno, 93*8e33eff8Schristos "Expected errno %s for \"%s\", base %d", 94*8e33eff8Schristos test->expected_errno_name, test->input, test->base); 95*8e33eff8Schristos assert_str_eq(remainder, test->expected_remainder, 96*8e33eff8Schristos "Unexpected remainder for \"%s\", base %d", 97*8e33eff8Schristos test->input, test->base); 98*8e33eff8Schristos if (err == 0) { 99*8e33eff8Schristos assert_ju_eq(result, test->expected_x, 100*8e33eff8Schristos "Unexpected result for \"%s\", base %d", 101*8e33eff8Schristos test->input, test->base); 102*8e33eff8Schristos } 103*8e33eff8Schristos } 104*8e33eff8Schristos } 105*8e33eff8Schristos TEST_END 106*8e33eff8Schristos 107*8e33eff8Schristos TEST_BEGIN(test_malloc_snprintf_truncated) { 108*8e33eff8Schristos #define BUFLEN 15 109*8e33eff8Schristos char buf[BUFLEN]; 110*8e33eff8Schristos size_t result; 111*8e33eff8Schristos size_t len; 112*8e33eff8Schristos #define TEST(expected_str_untruncated, ...) do { \ 113*8e33eff8Schristos result = malloc_snprintf(buf, len, __VA_ARGS__); \ 114*8e33eff8Schristos assert_d_eq(strncmp(buf, expected_str_untruncated, len-1), 0, \ 115*8e33eff8Schristos "Unexpected string inequality (\"%s\" vs \"%s\")", \ 116*8e33eff8Schristos buf, expected_str_untruncated); \ 117*8e33eff8Schristos assert_zu_eq(result, strlen(expected_str_untruncated), \ 118*8e33eff8Schristos "Unexpected result"); \ 119*8e33eff8Schristos } while (0) 120*8e33eff8Schristos 121*8e33eff8Schristos for (len = 1; len < BUFLEN; len++) { 122*8e33eff8Schristos TEST("012346789", "012346789"); 123*8e33eff8Schristos TEST("a0123b", "a%sb", "0123"); 124*8e33eff8Schristos TEST("a01234567", "a%s%s", "0123", "4567"); 125*8e33eff8Schristos TEST("a0123 ", "a%-6s", "0123"); 126*8e33eff8Schristos TEST("a 0123", "a%6s", "0123"); 127*8e33eff8Schristos TEST("a 012", "a%6.3s", "0123"); 128*8e33eff8Schristos TEST("a 012", "a%*.*s", 6, 3, "0123"); 129*8e33eff8Schristos TEST("a 123b", "a% db", 123); 130*8e33eff8Schristos TEST("a123b", "a%-db", 123); 131*8e33eff8Schristos TEST("a-123b", "a%-db", -123); 132*8e33eff8Schristos TEST("a+123b", "a%+db", 123); 133*8e33eff8Schristos } 134*8e33eff8Schristos #undef BUFLEN 135*8e33eff8Schristos #undef TEST 136*8e33eff8Schristos } 137*8e33eff8Schristos TEST_END 138*8e33eff8Schristos 139*8e33eff8Schristos TEST_BEGIN(test_malloc_snprintf) { 140*8e33eff8Schristos #define BUFLEN 128 141*8e33eff8Schristos char buf[BUFLEN]; 142*8e33eff8Schristos size_t result; 143*8e33eff8Schristos #define TEST(expected_str, ...) do { \ 144*8e33eff8Schristos result = malloc_snprintf(buf, sizeof(buf), __VA_ARGS__); \ 145*8e33eff8Schristos assert_str_eq(buf, expected_str, "Unexpected output"); \ 146*8e33eff8Schristos assert_zu_eq(result, strlen(expected_str), "Unexpected result");\ 147*8e33eff8Schristos } while (0) 148*8e33eff8Schristos 149*8e33eff8Schristos TEST("hello", "hello"); 150*8e33eff8Schristos 151*8e33eff8Schristos TEST("50%, 100%", "50%%, %d%%", 100); 152*8e33eff8Schristos 153*8e33eff8Schristos TEST("a0123b", "a%sb", "0123"); 154*8e33eff8Schristos 155*8e33eff8Schristos TEST("a 0123b", "a%5sb", "0123"); 156*8e33eff8Schristos TEST("a 0123b", "a%*sb", 5, "0123"); 157*8e33eff8Schristos 158*8e33eff8Schristos TEST("a0123 b", "a%-5sb", "0123"); 159*8e33eff8Schristos TEST("a0123b", "a%*sb", -1, "0123"); 160*8e33eff8Schristos TEST("a0123 b", "a%*sb", -5, "0123"); 161*8e33eff8Schristos TEST("a0123 b", "a%-*sb", -5, "0123"); 162*8e33eff8Schristos 163*8e33eff8Schristos TEST("a012b", "a%.3sb", "0123"); 164*8e33eff8Schristos TEST("a012b", "a%.*sb", 3, "0123"); 165*8e33eff8Schristos TEST("a0123b", "a%.*sb", -3, "0123"); 166*8e33eff8Schristos 167*8e33eff8Schristos TEST("a 012b", "a%5.3sb", "0123"); 168*8e33eff8Schristos TEST("a 012b", "a%5.*sb", 3, "0123"); 169*8e33eff8Schristos TEST("a 012b", "a%*.3sb", 5, "0123"); 170*8e33eff8Schristos TEST("a 012b", "a%*.*sb", 5, 3, "0123"); 171*8e33eff8Schristos TEST("a 0123b", "a%*.*sb", 5, -3, "0123"); 172*8e33eff8Schristos 173*8e33eff8Schristos TEST("_abcd_", "_%x_", 0xabcd); 174*8e33eff8Schristos TEST("_0xabcd_", "_%#x_", 0xabcd); 175*8e33eff8Schristos TEST("_1234_", "_%o_", 01234); 176*8e33eff8Schristos TEST("_01234_", "_%#o_", 01234); 177*8e33eff8Schristos TEST("_1234_", "_%u_", 1234); 178*8e33eff8Schristos 179*8e33eff8Schristos TEST("_1234_", "_%d_", 1234); 180*8e33eff8Schristos TEST("_ 1234_", "_% d_", 1234); 181*8e33eff8Schristos TEST("_+1234_", "_%+d_", 1234); 182*8e33eff8Schristos TEST("_-1234_", "_%d_", -1234); 183*8e33eff8Schristos TEST("_-1234_", "_% d_", -1234); 184*8e33eff8Schristos TEST("_-1234_", "_%+d_", -1234); 185*8e33eff8Schristos 186*8e33eff8Schristos TEST("_-1234_", "_%d_", -1234); 187*8e33eff8Schristos TEST("_1234_", "_%d_", 1234); 188*8e33eff8Schristos TEST("_-1234_", "_%i_", -1234); 189*8e33eff8Schristos TEST("_1234_", "_%i_", 1234); 190*8e33eff8Schristos TEST("_01234_", "_%#o_", 01234); 191*8e33eff8Schristos TEST("_1234_", "_%u_", 1234); 192*8e33eff8Schristos TEST("_0x1234abc_", "_%#x_", 0x1234abc); 193*8e33eff8Schristos TEST("_0X1234ABC_", "_%#X_", 0x1234abc); 194*8e33eff8Schristos TEST("_c_", "_%c_", 'c'); 195*8e33eff8Schristos TEST("_string_", "_%s_", "string"); 196*8e33eff8Schristos TEST("_0x42_", "_%p_", ((void *)0x42)); 197*8e33eff8Schristos 198*8e33eff8Schristos TEST("_-1234_", "_%ld_", ((long)-1234)); 199*8e33eff8Schristos TEST("_1234_", "_%ld_", ((long)1234)); 200*8e33eff8Schristos TEST("_-1234_", "_%li_", ((long)-1234)); 201*8e33eff8Schristos TEST("_1234_", "_%li_", ((long)1234)); 202*8e33eff8Schristos TEST("_01234_", "_%#lo_", ((long)01234)); 203*8e33eff8Schristos TEST("_1234_", "_%lu_", ((long)1234)); 204*8e33eff8Schristos TEST("_0x1234abc_", "_%#lx_", ((long)0x1234abc)); 205*8e33eff8Schristos TEST("_0X1234ABC_", "_%#lX_", ((long)0x1234ABC)); 206*8e33eff8Schristos 207*8e33eff8Schristos TEST("_-1234_", "_%lld_", ((long long)-1234)); 208*8e33eff8Schristos TEST("_1234_", "_%lld_", ((long long)1234)); 209*8e33eff8Schristos TEST("_-1234_", "_%lli_", ((long long)-1234)); 210*8e33eff8Schristos TEST("_1234_", "_%lli_", ((long long)1234)); 211*8e33eff8Schristos TEST("_01234_", "_%#llo_", ((long long)01234)); 212*8e33eff8Schristos TEST("_1234_", "_%llu_", ((long long)1234)); 213*8e33eff8Schristos TEST("_0x1234abc_", "_%#llx_", ((long long)0x1234abc)); 214*8e33eff8Schristos TEST("_0X1234ABC_", "_%#llX_", ((long long)0x1234ABC)); 215*8e33eff8Schristos 216*8e33eff8Schristos TEST("_-1234_", "_%qd_", ((long long)-1234)); 217*8e33eff8Schristos TEST("_1234_", "_%qd_", ((long long)1234)); 218*8e33eff8Schristos TEST("_-1234_", "_%qi_", ((long long)-1234)); 219*8e33eff8Schristos TEST("_1234_", "_%qi_", ((long long)1234)); 220*8e33eff8Schristos TEST("_01234_", "_%#qo_", ((long long)01234)); 221*8e33eff8Schristos TEST("_1234_", "_%qu_", ((long long)1234)); 222*8e33eff8Schristos TEST("_0x1234abc_", "_%#qx_", ((long long)0x1234abc)); 223*8e33eff8Schristos TEST("_0X1234ABC_", "_%#qX_", ((long long)0x1234ABC)); 224*8e33eff8Schristos 225*8e33eff8Schristos TEST("_-1234_", "_%jd_", ((intmax_t)-1234)); 226*8e33eff8Schristos TEST("_1234_", "_%jd_", ((intmax_t)1234)); 227*8e33eff8Schristos TEST("_-1234_", "_%ji_", ((intmax_t)-1234)); 228*8e33eff8Schristos TEST("_1234_", "_%ji_", ((intmax_t)1234)); 229*8e33eff8Schristos TEST("_01234_", "_%#jo_", ((intmax_t)01234)); 230*8e33eff8Schristos TEST("_1234_", "_%ju_", ((intmax_t)1234)); 231*8e33eff8Schristos TEST("_0x1234abc_", "_%#jx_", ((intmax_t)0x1234abc)); 232*8e33eff8Schristos TEST("_0X1234ABC_", "_%#jX_", ((intmax_t)0x1234ABC)); 233*8e33eff8Schristos 234*8e33eff8Schristos TEST("_1234_", "_%td_", ((ptrdiff_t)1234)); 235*8e33eff8Schristos TEST("_-1234_", "_%td_", ((ptrdiff_t)-1234)); 236*8e33eff8Schristos TEST("_1234_", "_%ti_", ((ptrdiff_t)1234)); 237*8e33eff8Schristos TEST("_-1234_", "_%ti_", ((ptrdiff_t)-1234)); 238*8e33eff8Schristos 239*8e33eff8Schristos TEST("_-1234_", "_%zd_", ((ssize_t)-1234)); 240*8e33eff8Schristos TEST("_1234_", "_%zd_", ((ssize_t)1234)); 241*8e33eff8Schristos TEST("_-1234_", "_%zi_", ((ssize_t)-1234)); 242*8e33eff8Schristos TEST("_1234_", "_%zi_", ((ssize_t)1234)); 243*8e33eff8Schristos TEST("_01234_", "_%#zo_", ((ssize_t)01234)); 244*8e33eff8Schristos TEST("_1234_", "_%zu_", ((ssize_t)1234)); 245*8e33eff8Schristos TEST("_0x1234abc_", "_%#zx_", ((ssize_t)0x1234abc)); 246*8e33eff8Schristos TEST("_0X1234ABC_", "_%#zX_", ((ssize_t)0x1234ABC)); 247*8e33eff8Schristos #undef BUFLEN 248*8e33eff8Schristos } 249*8e33eff8Schristos TEST_END 250*8e33eff8Schristos 251*8e33eff8Schristos int 252*8e33eff8Schristos main(void) { 253*8e33eff8Schristos return test( 254*8e33eff8Schristos test_malloc_strtoumax_no_endptr, 255*8e33eff8Schristos test_malloc_strtoumax, 256*8e33eff8Schristos test_malloc_snprintf_truncated, 257*8e33eff8Schristos test_malloc_snprintf); 258*8e33eff8Schristos } 259