1.1 --- a/test/buffer_tests.c Sun Nov 04 20:50:12 2012 +0100 1.2 +++ b/test/buffer_tests.c Fri Nov 30 13:10:58 2012 +0100 1.3 @@ -5,11 +5,8 @@ 1.4 #include "buffer_tests.h" 1.5 1.6 UCX_TEST_IMPLEMENT(test_ucx_buffer_seektell) { 1.7 - char *buffer = (char*) malloc(16); 1.8 - memset(buffer, 32, 7); 1.9 - buffer[7] = 0; 1.10 - 1.11 - UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); 1.12 + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); 1.13 + b->size = 16; // less than capacity 1.14 int r; 1.15 1.16 UCX_TEST_BEGIN 1.17 @@ -34,43 +31,81 @@ 1.18 1.19 r = ucx_buffer_seek(b, -5, SEEK_END); 1.20 UCX_TEST_ASSERT(r == 0, "seek END-5 failed"); 1.21 - UCX_TEST_ASSERT(b->pos == 2, "seek END-5 set wrong position"); 1.22 + UCX_TEST_ASSERT(b->pos == 11, "seek END-5 set wrong position"); 1.23 1.24 - r = ucx_buffer_seek(b, -10, SEEK_END); 1.25 + r = ucx_buffer_seek(b, -20, SEEK_END); 1.26 UCX_TEST_ASSERT(r != 0, "seek END beyond bounds shall fail"); 1.27 - UCX_TEST_ASSERT(b->pos == 2, 1.28 + UCX_TEST_ASSERT(b->pos == 11, 1.29 "failed seek shall leave pos unchanged"); 1.30 1.31 UCX_TEST_END 1.32 1.33 ucx_buffer_free(b); 1.34 +} 1.35 + 1.36 +UCX_TEST_IMPLEMENT(test_ucx_buffer_putc) { 1.37 + char *buffer = (char*) malloc(16); 1.38 + memset(buffer, 32, 16); 1.39 + 1.40 + UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); 1.41 + b->size = b->capacity; 1.42 + int r; 1.43 + 1.44 + UCX_TEST_BEGIN 1.45 + 1.46 + ucx_buffer_putc(b, '0'); 1.47 + ucx_buffer_putc(b, '0'); 1.48 + ucx_buffer_putc(b, '0'); 1.49 + 1.50 + UCX_TEST_ASSERT(b->pos == 3, "pos wrong after first 3 puts"); 1.51 + ucx_buffer_seek(b, 10, SEEK_CUR); 1.52 + 1.53 + ucx_buffer_putc(b, '0'); 1.54 + ucx_buffer_putc(b, '0'); 1.55 + ucx_buffer_putc(b, '0'); 1.56 + 1.57 + UCX_TEST_ASSERT(b->pos == 16, "pos wrong after last 3 puts"); 1.58 + UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof not set"); 1.59 + UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, 1.60 + "put shall return EOF when buffer is full"); 1.61 + 1.62 + ucx_buffer_seek(b, 3, SEEK_SET); 1.63 + ucx_buffer_putc(b, 'a'); 1.64 + ucx_buffer_putc(b, 'b'); 1.65 + ucx_buffer_putc(b, 'c'); 1.66 + 1.67 + UCX_TEST_ASSERT(b->size == 16, "wrong size after seek and puts"); 1.68 + UCX_TEST_ASSERT(memcmp(buffer, "000abc 000", 16) == 0, 1.69 + "buffer contains incorrect content"); 1.70 + 1.71 + UCX_TEST_END 1.72 + 1.73 + ucx_buffer_free(b); 1.74 free(buffer); 1.75 } 1.76 1.77 -UCX_TEST_IMPLEMENT(test_ucx_buffer_putc) { 1.78 - char *buffer = (char*) malloc(16); 1.79 - memset(buffer, 32, 16); 1.80 - 1.81 - UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); 1.82 - int r; 1.83 - 1.84 +UCX_TEST_IMPLEMENT(test_ucx_buffer_putc_ax) { 1.85 + UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND); 1.86 + 1.87 UCX_TEST_BEGIN 1.88 - 1.89 - ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); 1.90 - UCX_TEST_ASSERT(b->pos == 3, "pos wrong after first 3 puts"); 1.91 - ucx_buffer_seek(b, 10, SEEK_CUR); 1.92 - ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); 1.93 - UCX_TEST_ASSERT(b->pos == 16, "pos wrong after last 3 puts"); 1.94 - UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof not set"); 1.95 - UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, 1.96 - "put shall return EOF when buffer is full"); 1.97 - UCX_TEST_ASSERT(memcmp(buffer, "000 000", 16) == 0, 1.98 - "buffer contains incorrect content"); 1.99 - 1.100 + 1.101 + ucx_buffer_putc(b, '0'); 1.102 + ucx_buffer_putc(b, '1'); 1.103 + 1.104 + UCX_TEST_ASSERT(b->pos == 2, "pos wrong after first 2 puts"); 1.105 + UCX_TEST_ASSERT(b->capacity == 2, "buffer erroneously extended"); 1.106 + 1.107 + ucx_buffer_putc(b, 'a'); 1.108 + 1.109 + UCX_TEST_ASSERT(b->pos == 3, "pos wrong after 1 put"); 1.110 + UCX_TEST_ASSERT(b->capacity == 4, "buffer not properly extended"); 1.111 + UCX_TEST_ASSERT(b->size == 3, "wrong buffer size"); 1.112 + 1.113 + UCX_TEST_ASSERT(b->space[2] == 'a', "wrong content"); 1.114 + 1.115 UCX_TEST_END 1.116 - 1.117 - ucx_buffer_free(b); 1.118 - free(buffer); 1.119 + 1.120 + 1.121 } 1.122 1.123 UCX_TEST_IMPLEMENT(test_ucx_buffer_getc) { 1.124 @@ -81,6 +116,7 @@ 1.125 } 1.126 1.127 UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); 1.128 + b->size = b->capacity; 1.129 int r; 1.130 1.131 UCX_TEST_BEGIN 1.132 @@ -132,7 +168,7 @@ 1.133 memset(buffer, 49, 16); 1.134 ucx_buffer_seek(b, 0, SEEK_SET); 1.135 r = ucx_buffer_write((void*)threebytestring, 3, 6, b); 1.136 - UCX_TEST_ASSERT(r == 15, "three byte string not correctly trimed"); 1.137 + UCX_TEST_ASSERT(r == 5, "three byte string not correctly trimed"); 1.138 UCX_TEST_ASSERT(b->pos == 15, 1.139 "position after write of three byte string incorrect"); 1.140 UCX_TEST_ASSERT(!ucx_buffer_eof(b), "eof shall not be set"); 1.141 @@ -146,7 +182,7 @@ 1.142 } 1.143 1.144 UCX_TEST_IMPLEMENT(test_ucx_buffer_write_ax) { 1.145 - char *buffer = (char*) malloc(4); 1.146 + char *buffer = (char*) malloc(16); 1.147 1.148 UcxBuffer *b = ucx_buffer_new(buffer, 16, 1.149 UCX_BUFFER_AUTOEXTEND | UCX_BUFFER_AUTOFREE); 1.150 @@ -158,7 +194,7 @@ 1.151 r = ucx_buffer_write((void*)teststring, 1, 20, b); 1.152 buffer = (char*) b->space; /*autoextend enabled, we MUST retrieve pointer*/ 1.153 UCX_TEST_ASSERT(r == 20, "not all characters written"); 1.154 - UCX_TEST_ASSERT(b->size == 32, "buffer not properly extended"); 1.155 + UCX_TEST_ASSERT(b->capacity == 32, "buffer not properly extended"); 1.156 UCX_TEST_ASSERT(b->pos == 20, "position incorrect"); 1.157 UCX_TEST_ASSERT(memcmp(buffer, 1.158 "this is way too much\0\0\0\0\0\0\0\0\0\0\0\0", 32) == 0, 1.159 @@ -170,54 +206,53 @@ 1.160 } 1.161 1.162 UCX_TEST_IMPLEMENT(test_ucx_buffer_read) { 1.163 - char *buffer = (char*) malloc(16); 1.164 - memset(buffer, 56, 8); 1.165 - for (int i = 8; i < 16 ; i++) { 1.166 - buffer[i] = 40+i; 1.167 - } 1.168 - 1.169 - UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); 1.170 + UcxBuffer *b = ucx_buffer_new(NULL, 8, UCX_BUFFER_AUTOFREE); 1.171 + 1.172 + char buf[32]; 1.173 + memset(buf, 'X', 32); 1.174 int r; 1.175 - 1.176 + 1.177 UCX_TEST_BEGIN 1.178 - 1.179 - char rb[16]; 1.180 - memset(rb, 32, 16); 1.181 - 1.182 - ucx_buffer_seek(b, 8, SEEK_SET); 1.183 - r = ucx_buffer_read(rb, 1, 16, b); 1.184 - UCX_TEST_ASSERT(r == 8, "read did not stop at buffer end"); 1.185 - UCX_TEST_ASSERT(memcmp(rb, "01234567 ", 16) == 0, 1.186 + 1.187 + ucx_buffer_write("01234567", 1, 8, b); 1.188 + UCX_TEST_ASSERT(b->pos == 8, "buffer not correctly filled"); 1.189 + b->pos = 0; 1.190 + 1.191 + r = ucx_buffer_read(buf, 1, 2, b); 1.192 + UCX_TEST_ASSERT(r == 2, "wrong number of bytes read"); 1.193 + UCX_TEST_ASSERT(buf[0] == '0' && buf[1] == '1' && buf[2] == 'X', 1.194 "buffer incorrect after first read"); 1.195 - UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof shall be set"); 1.196 - 1.197 + 1.198 + r = ucx_buffer_read(buf + 2, 1, 8, b); 1.199 + UCX_TEST_ASSERT(r == 6, "wrong number of bytes read(2)"); 1.200 + UCX_TEST_ASSERT(memcmp(buf, "01234567XX", 10) == 0, 1.201 + "buffer incorrect after second read"); 1.202 + 1.203 + memset(buf, 'X', 32); 1.204 ucx_buffer_seek(b, 0, SEEK_SET); 1.205 - r = ucx_buffer_read(rb+8, 1, 8, b); 1.206 - UCX_TEST_ASSERT(r == 8, "read did not read the specified amount of bytes"); 1.207 - UCX_TEST_ASSERT(memcmp(rb, "0123456788888888", 16) == 0, 1.208 - "buffer incorrect after second read"); 1.209 - 1.210 - ucx_buffer_seek(b, 0, SEEK_SET); 1.211 - r = ucx_buffer_read(rb, 3, 6, b); 1.212 - UCX_TEST_ASSERT(r == 15, 1.213 - "three byte read did not read the desired amount of bytes"); 1.214 - UCX_TEST_ASSERT(memcmp(rb, "8888888801234568", 16) == 0, 1.215 - "buffer incorrect after three byte read"); 1.216 - 1.217 + r = ucx_buffer_read(buf, 3, 3, b); 1.218 + 1.219 + UCX_TEST_ASSERT(r == 2, "wrong number of blocks read"); 1.220 + UCX_TEST_ASSERT(memcmp(buf, "012345XX", 8) == 0, 1.221 + "buffer incorrect after three byte read"); 1.222 + 1.223 + 1.224 UCX_TEST_END 1.225 - 1.226 - ucx_buffer_free(b); 1.227 - free(buffer); 1.228 + 1.229 + 1.230 } 1.231 1.232 UCX_TEST_IMPLEMENT(test_ucx_buffer_extract) { 1.233 char *buffer = (char*) malloc(16); 1.234 strcpy(buffer, "this is a test!"); 1.235 1.236 - UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE), 1.237 - *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_DEFAULT); 1.238 + UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE); 1.239 + src->size = 15; 1.240 + UcxBuffer *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_DEFAULT); 1.241 1.242 UCX_TEST_BEGIN 1.243 + UCX_TEST_ASSERT(dst != NULL, "ucx_buffer_extract returned NULL"); 1.244 + 1.245 UCX_TEST_ASSERT((dst->flags & UCX_BUFFER_AUTOFREE) == UCX_BUFFER_AUTOFREE, 1.246 "autofree flag shall be enforced"); 1.247 UCX_TEST_ASSERT(dst->size == 5, "wrong size for new buffer"); 1.248 @@ -234,3 +269,48 @@ 1.249 ucx_buffer_free(dst); 1.250 ucx_buffer_free(src); 1.251 } 1.252 + 1.253 +UCX_TEST_IMPLEMENT(test_ucx_buffer_generic_copy) { 1.254 + UcxBuffer *b1 = ucx_buffer_new(NULL, 64, UCX_BUFFER_DEFAULT); 1.255 + UcxBuffer *b2 = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND); 1.256 + 1.257 + UCX_TEST_BEGIN 1.258 + 1.259 + ucx_buffer_write("01234567", 1, 8, b1); 1.260 + ucx_buffer_write("abcdefgh", 1, 8, b1); 1.261 + UCX_TEST_ASSERT(b1->size == 16, "failed to fill buffer b1"); 1.262 + ucx_buffer_seek(b1, 0, SEEK_SET); 1.263 + 1.264 + size_t ncp = ucx_buffer_copy(b1, b2, ucx_buffer_read, ucx_buffer_write); 1.265 + UCX_TEST_ASSERT(ncp == 16, "wrong number of copied bytes"); 1.266 + UCX_TEST_ASSERT(b2->size == 16, "b2 has wrong size"); 1.267 + UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0, 1.268 + "b1 and b2 have not the same content"); 1.269 + 1.270 + memset(b2->space, 0, b2->capacity); 1.271 + b2->pos = 0; 1.272 + b2->size = 0; 1.273 + ucx_buffer_seek(b1, 0, SEEK_SET); 1.274 + 1.275 + FILE *file = tmpfile(); 1.276 + UCX_TEST_ASSERT(file, "test file cannot be opened, test aborted"); 1.277 + 1.278 + ncp = ucx_buffer_copy(b1, file, ucx_buffer_read, fwrite); 1.279 + UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes to file"); 1.280 + 1.281 + fseek(file, 0, SEEK_SET); 1.282 + 1.283 + ncp = ucx_buffer_copy(file, b2, fread, ucx_buffer_write); 1.284 + UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes from file"); 1.285 + 1.286 + UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0, 1.287 + "b1 and b2 content mismatch"); 1.288 + 1.289 + fclose(file); 1.290 + 1.291 + 1.292 + UCX_TEST_END 1.293 + 1.294 + ucx_buffer_free(b1); 1.295 + ucx_buffer_free(b2); 1.296 +}