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