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