1.1 --- a/test/buffer_tests.c Thu Apr 17 14:33:06 2014 +0200 1.2 +++ b/test/buffer_tests.c Mon May 05 13:53:27 2014 +0200 1.3 @@ -29,9 +29,120 @@ 1.4 #include "buffer_tests.h" 1.5 #include "ucx/utils.h" 1.6 1.7 -UCX_TEST(test_ucx_buffer_seek) { 1.8 +/* 1.9 + * TODO: refactor tests 1.10 + * 1.11 + * ucx_buffer_extend 1.12 + * ucx_buffer_extract 1.13 + * ucx_buffer_free 1.14 + * ucx_buffer_getc 1.15 + * ucx_buffer_new 1.16 + * ucx_buffer_puts 1.17 + * ucx_buffer_read 1.18 + * ucx_buffer_write 1.19 + * 1.20 + */ 1.21 + 1.22 +UCX_TEST(test_ucx_buffer_eof) { 1.23 + char *test = "0123456789ABCDEF"; 1.24 + UcxBuffer *b = ucx_buffer_new(test, 16, UCX_BUFFER_DEFAULT); 1.25 + UCX_TEST_BEGIN 1.26 + b->pos = 9; b->size = 10; 1.27 + UCX_TEST_ASSERT(!ucx_buffer_eof(b), "false positive"); 1.28 + b->pos = 10; b->size = 10; 1.29 + UCX_TEST_ASSERT(ucx_buffer_eof(b), "pos == size should be EOF"); 1.30 + b->pos = 11; b->size = 10; 1.31 + UCX_TEST_ASSERT(ucx_buffer_eof(b), "false negative"); 1.32 + UCX_TEST_END 1.33 +} 1.34 + 1.35 +UCX_TEST(test_ucx_buffer_seek_overflow) { 1.36 + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); 1.37 + b->size = 32; 1.38 + int r; 1.39 + 1.40 + UCX_TEST_BEGIN 1.41 + size_t bigpos = SIZE_MAX - 5000; 1.42 + b->pos = bigpos; 1.43 + r = ucx_buffer_seek(b, 5016, SEEK_CUR); 1.44 + UCX_TEST_ASSERT(r != 0, "seek cur overflow"); 1.45 + UCX_TEST_ASSERT(b->pos == bigpos, 1.46 + "failed seek shall leave pos unchanged"); 1.47 + 1.48 + b->pos = 0; 1.49 + b->size = SIZE_MAX / 2 + 32; 1.50 + off_t bigoff = SIZE_MAX / 2 - 16; 1.51 + r = ucx_buffer_seek(b, -bigoff, SEEK_CUR); 1.52 + UCX_TEST_ASSERT(r != 0, "seek cur underflow"); 1.53 + UCX_TEST_ASSERT(b->pos == 0, 1.54 + "failed seek shall leave pos unchanged"); 1.55 + 1.56 + UCX_TEST_END 1.57 + 1.58 + ucx_buffer_free(b); 1.59 +} 1.60 + 1.61 +UCX_TEST(test_ucx_buffer_seek_invalid) { 1.62 + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); 1.63 + b->pos = 7; 1.64 + int r; 1.65 + 1.66 + UCX_TEST_BEGIN 1.67 + r = ucx_buffer_seek(b, 0, ~(SEEK_SET|SEEK_CUR|SEEK_END)); 1.68 + UCX_TEST_ASSERT(r != 0, "invalid whence shall fail"); 1.69 + UCX_TEST_ASSERT(b->pos == 7, 1.70 + "failed seek shall leave pos unchanged"); 1.71 + UCX_TEST_END 1.72 + 1.73 + ucx_buffer_free(b); 1.74 +} 1.75 + 1.76 +UCX_TEST(test_ucx_buffer_seek_oob) { 1.77 UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); 1.78 b->size = 16; // less than capacity 1.79 + b->pos = 7; 1.80 + int r; 1.81 + 1.82 + UCX_TEST_BEGIN 1.83 + 1.84 + r = ucx_buffer_seek(b, -1, SEEK_SET); 1.85 + UCX_TEST_ASSERT(r != 0, "seek SET below bounds shall fail"); 1.86 + UCX_TEST_ASSERT(b->pos == 7, 1.87 + "failed seek shall leave pos unchanged"); 1.88 + 1.89 + r = ucx_buffer_seek(b, 16, SEEK_SET); 1.90 + UCX_TEST_ASSERT(r != 0, "seek SET above bounds shall fail"); 1.91 + UCX_TEST_ASSERT(b->pos == 7, 1.92 + "failed seek shall leave pos unchanged"); 1.93 + 1.94 + r = ucx_buffer_seek(b, -8, SEEK_CUR); 1.95 + UCX_TEST_ASSERT(r != 0, "seek CUR below bounds shall fail"); 1.96 + UCX_TEST_ASSERT(b->pos == 7, 1.97 + "failed seek shall leave pos unchanged"); 1.98 + 1.99 + r = ucx_buffer_seek(b, 9, SEEK_CUR); 1.100 + UCX_TEST_ASSERT(r != 0, "seek CUR above bounds shall fail"); 1.101 + UCX_TEST_ASSERT(b->pos == 7, 1.102 + "failed seek shall leave pos unchanged"); 1.103 + 1.104 + r = ucx_buffer_seek(b, -17, SEEK_END); 1.105 + UCX_TEST_ASSERT(r != 0, "seek END below bounds shall fail"); 1.106 + UCX_TEST_ASSERT(b->pos == 7, 1.107 + "failed seek shall leave pos unchanged"); 1.108 + 1.109 + r = ucx_buffer_seek(b, 1, SEEK_END); 1.110 + UCX_TEST_ASSERT(r != 0, "seek END above bounds shall fail"); 1.111 + UCX_TEST_ASSERT(b->pos == 7, 1.112 + "failed seek shall leave pos unchanged"); 1.113 + 1.114 + UCX_TEST_END 1.115 + 1.116 + ucx_buffer_free(b); 1.117 +} 1.118 + 1.119 +UCX_TEST(test_ucx_buffer_seek_set) { 1.120 + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); 1.121 + b->size = 16; 1.122 int r; 1.123 1.124 UCX_TEST_BEGIN 1.125 @@ -39,29 +150,45 @@ 1.126 r = ucx_buffer_seek(b, 5, SEEK_SET); 1.127 UCX_TEST_ASSERT(r == 0, "seek SET+5 failed"); 1.128 UCX_TEST_ASSERT(b->pos == 5, "seek SET+5 set wrong position"); 1.129 + 1.130 + 1.131 + r = ucx_buffer_seek(b, 10, SEEK_SET); 1.132 + UCX_TEST_ASSERT(r == 0, "seek SET+10 failed"); 1.133 + UCX_TEST_ASSERT(b->pos == 10, "seek SET+10 set wrong position"); 1.134 1.135 - r = ucx_buffer_seek(b, 20, SEEK_SET); 1.136 - UCX_TEST_ASSERT(r != 0, "seek beyond bounds shall fail"); 1.137 - UCX_TEST_ASSERT(b->pos == 5, 1.138 - "failed seek shall leave pos unchanged"); 1.139 + UCX_TEST_END 1.140 1.141 + ucx_buffer_free(b); 1.142 +} 1.143 + 1.144 +UCX_TEST(test_ucx_buffer_seek_cur) { 1.145 + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); 1.146 + b->size = 16; 1.147 + int r; 1.148 + 1.149 + UCX_TEST_BEGIN 1.150 + 1.151 + b->pos = 7; 1.152 r = ucx_buffer_seek(b, 5, SEEK_CUR); 1.153 UCX_TEST_ASSERT(r == 0, "seek CUR+5 failed"); 1.154 - UCX_TEST_ASSERT(b->pos == 10, "seek CUR+5 set wrong position"); 1.155 + UCX_TEST_ASSERT(b->pos == 12, "seek CUR+5 set wrong position"); 1.156 1.157 - r = ucx_buffer_seek(b, 10, SEEK_CUR); 1.158 - UCX_TEST_ASSERT(r != 0, "seek CUR beyond bounds shall fail"); 1.159 - UCX_TEST_ASSERT(b->pos == 10, 1.160 - "failed seek shall leave pos unchanged"); 1.161 + UCX_TEST_END 1.162 1.163 + ucx_buffer_free(b); 1.164 +} 1.165 + 1.166 +UCX_TEST(test_ucx_buffer_seek_end) { 1.167 + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); 1.168 + b->size = 16; 1.169 + int r; 1.170 + 1.171 + UCX_TEST_BEGIN 1.172 + 1.173 r = ucx_buffer_seek(b, -5, SEEK_END); 1.174 UCX_TEST_ASSERT(r == 0, "seek END-5 failed"); 1.175 UCX_TEST_ASSERT(b->pos == 11, "seek END-5 set wrong position"); 1.176 1.177 - r = ucx_buffer_seek(b, -20, SEEK_END); 1.178 - UCX_TEST_ASSERT(r != 0, "seek END beyond bounds shall fail"); 1.179 - UCX_TEST_ASSERT(b->pos == 11, 1.180 - "failed seek shall leave pos unchanged"); 1.181 1.182 UCX_TEST_END 1.183 1.184 @@ -77,7 +204,9 @@ 1.185 1.186 UCX_TEST_BEGIN 1.187 1.188 - ucx_buffer_putc(b, '0'); 1.189 + ucx_buffer_seek(b, 0, SEEK_SET); 1.190 + UCX_TEST_ASSERT(ucx_buffer_putc(b, '0'|~0xFF) == '0', 1.191 + "putc shall return (arg & 0xFF)"); 1.192 ucx_buffer_putc(b, '0'); 1.193 ucx_buffer_putc(b, '0'); 1.194 1.195 @@ -89,49 +218,89 @@ 1.196 ucx_buffer_putc(b, '0'); 1.197 1.198 UCX_TEST_ASSERT(b->pos == 16, "pos wrong after last 3 puts"); 1.199 - UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof not set"); 1.200 - UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, 1.201 - "put shall return EOF when buffer is full"); 1.202 1.203 - ucx_buffer_seek(b, 3, SEEK_SET); 1.204 - ucx_buffer_putc(b, 'a'); 1.205 - ucx_buffer_putc(b, 'b'); 1.206 - ucx_buffer_putc(b, 'c'); 1.207 + UCX_TEST_ASSERT(!memcmp(b->space, "000 000", 16), 1.208 + "buffer content wrong") 1.209 + UCX_TEST_END 1.210 + ucx_buffer_free(b); 1.211 + free(buffer); 1.212 +} 1.213 1.214 - UCX_TEST_ASSERT(b->size == 16, "wrong size after seek and puts"); 1.215 - UCX_TEST_ASSERT(memcmp(buffer, "000abc 000", 16) == 0, 1.216 - "buffer contains incorrect content"); 1.217 +UCX_TEST(test_ucx_buffer_putc_oob) { 1.218 + UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_DEFAULT); 1.219 + 1.220 + UCX_TEST_BEGIN 1.221 + b->pos = b->size = b->capacity = 1; 1.222 + b->space[1] = 'X'; 1.223 + 1.224 + UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, "put shall return EOF " 1.225 + "when buffer is full and auto extend is disabled"); 1.226 + UCX_TEST_ASSERT(!memcmp(b->space, "\0X", 2), 1.227 + "wrong buffer content after failed putc"); 1.228 1.229 UCX_TEST_END 1.230 1.231 ucx_buffer_free(b); 1.232 - free(buffer); 1.233 } 1.234 1.235 -UCX_TEST(test_ucx_buffer_putc_ax) { 1.236 + 1.237 +UCX_TEST(test_ucx_buffer_putc_ae) { 1.238 UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND); 1.239 + ucx_buffer_putc(b, '0'); 1.240 + ucx_buffer_putc(b, '1'); 1.241 1.242 UCX_TEST_BEGIN 1.243 1.244 + UCX_TEST_ASSERT(b->pos == 2, "pos wrong after first 2 puts"); 1.245 + UCX_TEST_ASSERT(b->size == 2, "size wrong after first 2 puts"); 1.246 + UCX_TEST_ASSERT(b->capacity == 2, "buffer erroneously extended"); 1.247 + UCX_TEST_ASSERT(!memcmp(b->space,"01", 2), "wrong content"); 1.248 + 1.249 + UCX_TEST_END 1.250 + 1.251 + ucx_buffer_free(b); 1.252 +} 1.253 + 1.254 +UCX_TEST(test_ucx_buffer_putc_oobae) { 1.255 + UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND); 1.256 ucx_buffer_putc(b, '0'); 1.257 ucx_buffer_putc(b, '1'); 1.258 1.259 - UCX_TEST_ASSERT(b->pos == 2, "pos wrong after first 2 puts"); 1.260 - UCX_TEST_ASSERT(b->capacity == 2, "buffer erroneously extended"); 1.261 + UCX_TEST_BEGIN 1.262 1.263 ucx_buffer_putc(b, 'a'); 1.264 1.265 - UCX_TEST_ASSERT(b->pos == 3, "pos wrong after 1 put"); 1.266 + UCX_TEST_ASSERT(b->pos == 3, "pos wrong after put"); 1.267 UCX_TEST_ASSERT(b->capacity == 4, "buffer not properly extended"); 1.268 UCX_TEST_ASSERT(b->size == 3, "wrong buffer size"); 1.269 1.270 - UCX_TEST_ASSERT(b->space[2] == 'a', "wrong content"); 1.271 + UCX_TEST_ASSERT(!memcmp(b->space,"01a\0", 4), "wrong content"); 1.272 1.273 UCX_TEST_END 1.274 1.275 ucx_buffer_free(b); 1.276 } 1.277 1.278 +UCX_TEST(test_ucx_buffer_putc_size) { 1.279 + UcxBuffer *b = ucx_buffer_new(NULL, 4, UCX_BUFFER_DEFAULT); 1.280 + 1.281 + UCX_TEST_BEGIN 1.282 + 1.283 + UCX_TEST_ASSERT(b->size == 0, "wrong initial size"); 1.284 + ucx_buffer_putc(b, 'a'); 1.285 + ucx_buffer_putc(b, 'b'); 1.286 + ucx_buffer_putc(b, 'c'); 1.287 + UCX_TEST_ASSERT(b->size == 3, "size does not increase"); 1.288 + ucx_buffer_seek(b, 1, SEEK_SET); 1.289 + ucx_buffer_putc(b, 'd'); 1.290 + UCX_TEST_ASSERT(b->size == 3, "size shall not decrease"); 1.291 + UCX_TEST_ASSERT(b->pos == 2, "wrong position after seek and putc"); 1.292 + 1.293 + UCX_TEST_END 1.294 + 1.295 + ucx_buffer_free(b); 1.296 +} 1.297 + 1.298 UCX_TEST(test_ucx_buffer_getc) { 1.299 char *buffer = (char*) malloc(16); 1.300 memset(buffer, 32, 8);