test/buffer_tests.c

changeset 76
655020a30e77
parent 71
303dabadff1c
child 83
3b552d7a9610
     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 +}

mercurial