test/buffer_tests.c

changeset 164
1fa3f13f774c
parent 163
5ec9a2ca6328
child 166
350a0e3898bd
     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);

mercurial