test/buffer_tests.c

Tue, 06 May 2014 10:56:54 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 06 May 2014 10:56:54 +0200
changeset 167
aed60ba37acf
parent 166
350a0e3898bd
child 168
24a012440dee
permissions
-rw-r--r--

ucx_buffer_extract tests

universe@56 1 /*
universe@103 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@56 3 *
universe@103 4 * Copyright 2013 Olaf Wintermann. All rights reserved.
universe@103 5 *
universe@103 6 * Redistribution and use in source and binary forms, with or without
universe@103 7 * modification, are permitted provided that the following conditions are met:
universe@103 8 *
universe@103 9 * 1. Redistributions of source code must retain the above copyright
universe@103 10 * notice, this list of conditions and the following disclaimer.
universe@103 11 *
universe@103 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@103 13 * notice, this list of conditions and the following disclaimer in the
universe@103 14 * documentation and/or other materials provided with the distribution.
universe@103 15 *
universe@103 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@103 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@103 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@103 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@103 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@103 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@103 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@103 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@103 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@103 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@103 26 * POSSIBILITY OF SUCH DAMAGE.
universe@56 27 */
universe@56 28
universe@60 29 #include "buffer_tests.h"
universe@140 30 #include "ucx/utils.h"
universe@56 31
universe@164 32 /*
universe@164 33 * TODO: refactor tests
universe@164 34 *
universe@164 35 * ucx_buffer_extend
universe@164 36 * ucx_buffer_extract
universe@164 37 * ucx_buffer_write
universe@164 38 *
universe@164 39 */
universe@164 40
universe@166 41 UCX_TEST(test_ucx_buffer_new) {
universe@166 42 UcxBuffer *b = ucx_buffer_new(NULL, 16, UCX_BUFFER_AUTOEXTEND);
universe@166 43 UcxBuffer *b2 = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
universe@166 44 UCX_TEST_BEGIN
universe@166 45
universe@166 46 UCX_TEST_ASSERT(b->capacity==16, "wrong capacity");
universe@166 47 UCX_TEST_ASSERT(b2->capacity==32, "wrong capacity");
universe@166 48
universe@166 49 UCX_TEST_ASSERT(b->size==0, "wrong size");
universe@166 50 UCX_TEST_ASSERT(b2->size==0, "wrong size");
universe@166 51
universe@166 52 UCX_TEST_ASSERT(b->pos==0, "wrong position");
universe@166 53 UCX_TEST_ASSERT(b2->pos==0, "wrong position");
universe@166 54
universe@166 55 UCX_TEST_ASSERT(b->flags==(UCX_BUFFER_AUTOEXTEND|UCX_BUFFER_AUTOFREE),
universe@166 56 "wrong flags for autoextending buffer");
universe@166 57 UCX_TEST_ASSERT(b2->flags==UCX_BUFFER_AUTOFREE,
universe@166 58 "wrong flags for default bufer");
universe@166 59
universe@166 60 UCX_TEST_END
universe@166 61 ucx_buffer_free(b2);
universe@166 62 ucx_buffer_free(b);
universe@166 63 }
universe@166 64
universe@166 65 UCX_TEST(test_ucx_buffer_new_prealloc) {
universe@166 66 char* test = (char*) malloc(16);
universe@166 67 UcxBuffer *b = ucx_buffer_new(test, 16, UCX_BUFFER_DEFAULT);
universe@166 68 UCX_TEST_BEGIN
universe@166 69
universe@166 70 UCX_TEST_ASSERT(b->capacity==16, "wrong capacity");
universe@166 71 UCX_TEST_ASSERT(b->size==0, "wrong size");
universe@166 72 UCX_TEST_ASSERT(b->pos==0, "wrong position");
universe@166 73
universe@166 74 UCX_TEST_ASSERT(b->flags==0, "wrong flags - all should be cleared");
universe@166 75
universe@166 76 UCX_TEST_END
universe@166 77 free(test);
universe@166 78 ucx_buffer_free(b);
universe@166 79 }
universe@166 80
universe@164 81 UCX_TEST(test_ucx_buffer_eof) {
universe@164 82 char *test = "0123456789ABCDEF";
universe@164 83 UcxBuffer *b = ucx_buffer_new(test, 16, UCX_BUFFER_DEFAULT);
universe@164 84 UCX_TEST_BEGIN
universe@164 85 b->pos = 9; b->size = 10;
universe@164 86 UCX_TEST_ASSERT(!ucx_buffer_eof(b), "false positive");
universe@164 87 b->pos = 10; b->size = 10;
universe@164 88 UCX_TEST_ASSERT(ucx_buffer_eof(b), "pos == size should be EOF");
universe@164 89 b->pos = 11; b->size = 10;
universe@164 90 UCX_TEST_ASSERT(ucx_buffer_eof(b), "false negative");
universe@164 91 UCX_TEST_END
universe@164 92 }
universe@164 93
universe@164 94 UCX_TEST(test_ucx_buffer_seek_overflow) {
universe@164 95 UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
universe@164 96 b->size = 32;
universe@164 97 int r;
universe@164 98
universe@164 99 UCX_TEST_BEGIN
universe@164 100 size_t bigpos = SIZE_MAX - 5000;
universe@164 101 b->pos = bigpos;
universe@164 102 r = ucx_buffer_seek(b, 5016, SEEK_CUR);
universe@164 103 UCX_TEST_ASSERT(r != 0, "seek cur overflow");
universe@164 104 UCX_TEST_ASSERT(b->pos == bigpos,
universe@164 105 "failed seek shall leave pos unchanged");
universe@164 106
universe@164 107 b->pos = 0;
universe@164 108 b->size = SIZE_MAX / 2 + 32;
universe@164 109 off_t bigoff = SIZE_MAX / 2 - 16;
universe@164 110 r = ucx_buffer_seek(b, -bigoff, SEEK_CUR);
universe@164 111 UCX_TEST_ASSERT(r != 0, "seek cur underflow");
universe@164 112 UCX_TEST_ASSERT(b->pos == 0,
universe@164 113 "failed seek shall leave pos unchanged");
universe@164 114
universe@164 115 UCX_TEST_END
universe@164 116
universe@164 117 ucx_buffer_free(b);
universe@164 118 }
universe@164 119
universe@164 120 UCX_TEST(test_ucx_buffer_seek_invalid) {
universe@164 121 UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
universe@164 122 b->pos = 7;
universe@164 123 int r;
universe@164 124
universe@164 125 UCX_TEST_BEGIN
universe@164 126 r = ucx_buffer_seek(b, 0, ~(SEEK_SET|SEEK_CUR|SEEK_END));
universe@164 127 UCX_TEST_ASSERT(r != 0, "invalid whence shall fail");
universe@164 128 UCX_TEST_ASSERT(b->pos == 7,
universe@164 129 "failed seek shall leave pos unchanged");
universe@164 130 UCX_TEST_END
universe@164 131
universe@164 132 ucx_buffer_free(b);
universe@164 133 }
universe@164 134
universe@164 135 UCX_TEST(test_ucx_buffer_seek_oob) {
olaf@76 136 UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
olaf@76 137 b->size = 16; // less than capacity
universe@164 138 b->pos = 7;
universe@164 139 int r;
universe@164 140
universe@164 141 UCX_TEST_BEGIN
universe@164 142
universe@164 143 r = ucx_buffer_seek(b, -1, SEEK_SET);
universe@164 144 UCX_TEST_ASSERT(r != 0, "seek SET below bounds shall fail");
universe@164 145 UCX_TEST_ASSERT(b->pos == 7,
universe@164 146 "failed seek shall leave pos unchanged");
universe@164 147
universe@164 148 r = ucx_buffer_seek(b, 16, SEEK_SET);
universe@164 149 UCX_TEST_ASSERT(r != 0, "seek SET above bounds shall fail");
universe@164 150 UCX_TEST_ASSERT(b->pos == 7,
universe@164 151 "failed seek shall leave pos unchanged");
universe@164 152
universe@164 153 r = ucx_buffer_seek(b, -8, SEEK_CUR);
universe@164 154 UCX_TEST_ASSERT(r != 0, "seek CUR below bounds shall fail");
universe@164 155 UCX_TEST_ASSERT(b->pos == 7,
universe@164 156 "failed seek shall leave pos unchanged");
universe@164 157
universe@164 158 r = ucx_buffer_seek(b, 9, SEEK_CUR);
universe@164 159 UCX_TEST_ASSERT(r != 0, "seek CUR above bounds shall fail");
universe@164 160 UCX_TEST_ASSERT(b->pos == 7,
universe@164 161 "failed seek shall leave pos unchanged");
universe@164 162
universe@164 163 r = ucx_buffer_seek(b, -17, SEEK_END);
universe@164 164 UCX_TEST_ASSERT(r != 0, "seek END below bounds shall fail");
universe@164 165 UCX_TEST_ASSERT(b->pos == 7,
universe@164 166 "failed seek shall leave pos unchanged");
universe@164 167
universe@164 168 r = ucx_buffer_seek(b, 1, SEEK_END);
universe@164 169 UCX_TEST_ASSERT(r != 0, "seek END above bounds shall fail");
universe@164 170 UCX_TEST_ASSERT(b->pos == 7,
universe@164 171 "failed seek shall leave pos unchanged");
universe@164 172
universe@164 173 UCX_TEST_END
universe@164 174
universe@164 175 ucx_buffer_free(b);
universe@164 176 }
universe@164 177
universe@164 178 UCX_TEST(test_ucx_buffer_seek_set) {
universe@164 179 UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
universe@164 180 b->size = 16;
universe@56 181 int r;
universe@56 182
universe@56 183 UCX_TEST_BEGIN
universe@56 184
universe@60 185 r = ucx_buffer_seek(b, 5, SEEK_SET);
universe@56 186 UCX_TEST_ASSERT(r == 0, "seek SET+5 failed");
universe@63 187 UCX_TEST_ASSERT(b->pos == 5, "seek SET+5 set wrong position");
universe@164 188
universe@164 189
universe@164 190 r = ucx_buffer_seek(b, 10, SEEK_SET);
universe@164 191 UCX_TEST_ASSERT(r == 0, "seek SET+10 failed");
universe@164 192 UCX_TEST_ASSERT(b->pos == 10, "seek SET+10 set wrong position");
universe@56 193
universe@164 194 UCX_TEST_END
universe@56 195
universe@164 196 ucx_buffer_free(b);
universe@164 197 }
universe@164 198
universe@164 199 UCX_TEST(test_ucx_buffer_seek_cur) {
universe@164 200 UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
universe@164 201 b->size = 16;
universe@164 202 int r;
universe@164 203
universe@164 204 UCX_TEST_BEGIN
universe@164 205
universe@164 206 b->pos = 7;
universe@60 207 r = ucx_buffer_seek(b, 5, SEEK_CUR);
universe@56 208 UCX_TEST_ASSERT(r == 0, "seek CUR+5 failed");
universe@164 209 UCX_TEST_ASSERT(b->pos == 12, "seek CUR+5 set wrong position");
universe@56 210
universe@164 211 UCX_TEST_END
universe@56 212
universe@164 213 ucx_buffer_free(b);
universe@164 214 }
universe@164 215
universe@164 216 UCX_TEST(test_ucx_buffer_seek_end) {
universe@164 217 UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
universe@164 218 b->size = 16;
universe@164 219 int r;
universe@164 220
universe@164 221 UCX_TEST_BEGIN
universe@164 222
universe@60 223 r = ucx_buffer_seek(b, -5, SEEK_END);
universe@56 224 UCX_TEST_ASSERT(r == 0, "seek END-5 failed");
olaf@76 225 UCX_TEST_ASSERT(b->pos == 11, "seek END-5 set wrong position");
universe@56 226
universe@56 227
universe@56 228 UCX_TEST_END
universe@56 229
universe@60 230 ucx_buffer_free(b);
olaf@76 231 }
olaf@76 232
universe@134 233 UCX_TEST(test_ucx_buffer_putc) {
olaf@76 234 char *buffer = (char*) malloc(16);
olaf@76 235 memset(buffer, 32, 16);
olaf@76 236
olaf@76 237 UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
olaf@76 238 b->size = b->capacity;
olaf@76 239
olaf@76 240 UCX_TEST_BEGIN
olaf@76 241
universe@164 242 ucx_buffer_seek(b, 0, SEEK_SET);
universe@164 243 UCX_TEST_ASSERT(ucx_buffer_putc(b, '0'|~0xFF) == '0',
universe@164 244 "putc shall return (arg & 0xFF)");
olaf@76 245 ucx_buffer_putc(b, '0');
olaf@76 246 ucx_buffer_putc(b, '0');
olaf@76 247
olaf@76 248 UCX_TEST_ASSERT(b->pos == 3, "pos wrong after first 3 puts");
olaf@76 249 ucx_buffer_seek(b, 10, SEEK_CUR);
olaf@76 250
olaf@76 251 ucx_buffer_putc(b, '0');
olaf@76 252 ucx_buffer_putc(b, '0');
olaf@76 253 ucx_buffer_putc(b, '0');
olaf@76 254
olaf@76 255 UCX_TEST_ASSERT(b->pos == 16, "pos wrong after last 3 puts");
olaf@76 256
universe@164 257 UCX_TEST_ASSERT(!memcmp(b->space, "000 000", 16),
universe@164 258 "buffer content wrong")
universe@164 259 UCX_TEST_END
universe@164 260 ucx_buffer_free(b);
universe@164 261 free(buffer);
universe@164 262 }
olaf@76 263
universe@164 264 UCX_TEST(test_ucx_buffer_putc_oob) {
universe@164 265 UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_DEFAULT);
universe@164 266
universe@164 267 UCX_TEST_BEGIN
universe@164 268 b->pos = b->size = b->capacity = 1;
universe@164 269 b->space[1] = 'X';
universe@164 270
universe@164 271 UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, "put shall return EOF "
universe@164 272 "when buffer is full and auto extend is disabled");
universe@164 273 UCX_TEST_ASSERT(!memcmp(b->space, "\0X", 2),
universe@164 274 "wrong buffer content after failed putc");
olaf@76 275
olaf@76 276 UCX_TEST_END
olaf@76 277
olaf@76 278 ucx_buffer_free(b);
universe@56 279 }
universe@56 280
universe@164 281
universe@164 282 UCX_TEST(test_ucx_buffer_putc_ae) {
olaf@76 283 UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
universe@164 284 ucx_buffer_putc(b, '0');
universe@164 285 ucx_buffer_putc(b, '1');
olaf@76 286
universe@56 287 UCX_TEST_BEGIN
olaf@76 288
universe@164 289 UCX_TEST_ASSERT(b->pos == 2, "pos wrong after first 2 puts");
universe@164 290 UCX_TEST_ASSERT(b->size == 2, "size wrong after first 2 puts");
universe@164 291 UCX_TEST_ASSERT(b->capacity == 2, "buffer erroneously extended");
universe@164 292 UCX_TEST_ASSERT(!memcmp(b->space,"01", 2), "wrong content");
universe@164 293
universe@164 294 UCX_TEST_END
universe@164 295
universe@164 296 ucx_buffer_free(b);
universe@164 297 }
universe@164 298
universe@164 299 UCX_TEST(test_ucx_buffer_putc_oobae) {
universe@164 300 UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
olaf@76 301 ucx_buffer_putc(b, '0');
olaf@76 302 ucx_buffer_putc(b, '1');
olaf@76 303
universe@164 304 UCX_TEST_BEGIN
olaf@76 305
olaf@76 306 ucx_buffer_putc(b, 'a');
olaf@76 307
universe@164 308 UCX_TEST_ASSERT(b->pos == 3, "pos wrong after put");
olaf@76 309 UCX_TEST_ASSERT(b->capacity == 4, "buffer not properly extended");
olaf@76 310 UCX_TEST_ASSERT(b->size == 3, "wrong buffer size");
olaf@76 311
universe@164 312 UCX_TEST_ASSERT(!memcmp(b->space,"01a\0", 4), "wrong content");
olaf@76 313
universe@56 314 UCX_TEST_END
olaf@76 315
olaf@147 316 ucx_buffer_free(b);
universe@56 317 }
universe@56 318
universe@164 319 UCX_TEST(test_ucx_buffer_putc_size) {
universe@164 320 UcxBuffer *b = ucx_buffer_new(NULL, 4, UCX_BUFFER_DEFAULT);
universe@164 321
universe@164 322 UCX_TEST_BEGIN
universe@164 323
universe@164 324 UCX_TEST_ASSERT(b->size == 0, "wrong initial size");
universe@164 325 ucx_buffer_putc(b, 'a');
universe@164 326 ucx_buffer_putc(b, 'b');
universe@164 327 ucx_buffer_putc(b, 'c');
universe@164 328 UCX_TEST_ASSERT(b->size == 3, "size does not increase");
universe@164 329 ucx_buffer_seek(b, 1, SEEK_SET);
universe@164 330 ucx_buffer_putc(b, 'd');
universe@164 331 UCX_TEST_ASSERT(b->size == 3, "size shall not decrease");
universe@164 332 UCX_TEST_ASSERT(b->pos == 2, "wrong position after seek and putc");
universe@164 333
universe@164 334 UCX_TEST_END
universe@164 335
universe@164 336 ucx_buffer_free(b);
universe@164 337 }
universe@164 338
universe@134 339 UCX_TEST(test_ucx_buffer_getc) {
universe@69 340 char *buffer = (char*) malloc(16);
universe@56 341 memset(buffer, 32, 8);
universe@56 342 for (int i = 8; i < 16 ; i++) {
universe@56 343 buffer[i] = 40+i;
universe@56 344 }
universe@56 345
universe@61 346 UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
olaf@76 347 b->size = b->capacity;
universe@56 348
universe@56 349 UCX_TEST_BEGIN
universe@56 350
universe@56 351 char rb[16];
universe@95 352 for (size_t i = 0 ; i < 16 ; i++) {
universe@166 353 UCX_TEST_ASSERT(b->pos == i, "wrong position");
universe@166 354 UCX_TEST_ASSERT(!ucx_buffer_eof(b), "EOF false positive");
universe@60 355 rb[i] = ucx_buffer_getc(b);
universe@56 356 }
universe@56 357 UCX_TEST_ASSERT(memcmp(rb, " 01234567", 16) == 0,
universe@166 358 "read data incorrect");
universe@166 359
universe@166 360 UCX_TEST_ASSERT(ucx_buffer_eof(b), "EOF not set after last possible read");
universe@166 361 UCX_TEST_ASSERT(b->pos == 16, "wrong position after EOF");
universe@166 362
universe@166 363 UCX_TEST_ASSERT(ucx_buffer_getc(b) == EOF,
universe@166 364 "out of bounds read does not return EOF");
universe@166 365 UCX_TEST_ASSERT(b->pos == 16, "wrong position after out of bounds read");
universe@56 366
universe@56 367 UCX_TEST_END
universe@56 368
universe@60 369 ucx_buffer_free(b);
universe@56 370 free(buffer);
universe@56 371 }
universe@56 372
universe@134 373 UCX_TEST(test_ucx_buffer_write) {
universe@69 374 char *buffer = (char*) malloc(16);
universe@56 375 memset(buffer, 32, 8);
universe@56 376 for (int i = 8; i < 16 ; i++) {
universe@56 377 buffer[i] = 40+i;
universe@56 378 }
universe@56 379
universe@61 380 UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
universe@56 381 int r;
universe@56 382
universe@56 383 UCX_TEST_BEGIN
universe@56 384
universe@69 385 const char* teststring = "this is way too much";
universe@69 386 r = ucx_buffer_write((void*)teststring, 1, 20, b);
universe@56 387 UCX_TEST_ASSERT(r == 16, "string not correctly trimed");
universe@56 388 UCX_TEST_ASSERT(memcmp(buffer, teststring, 16) == 0,
universe@56 389 "buffer data incorrect");
universe@60 390 UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof shall be set");
universe@56 391
universe@60 392 ucx_buffer_seek(b, 8, SEEK_SET);
universe@71 393 r = ucx_buffer_write((void*)"not", 1, 3, b);
universe@56 394 UCX_TEST_ASSERT(r == 3, "three bytes should be replace");
universe@56 395 UCX_TEST_ASSERT(memcmp(buffer, "this is not too much", 16) == 0,
universe@56 396 "modified buffer is incorrect");
universe@56 397
universe@69 398 const char* threebytestring = " t h r e e ";
universe@56 399 memset(buffer, 49, 16);
universe@60 400 ucx_buffer_seek(b, 0, SEEK_SET);
universe@69 401 r = ucx_buffer_write((void*)threebytestring, 3, 6, b);
olaf@76 402 UCX_TEST_ASSERT(r == 5, "three byte string not correctly trimed");
universe@63 403 UCX_TEST_ASSERT(b->pos == 15,
universe@56 404 "position after write of three byte string incorrect");
universe@60 405 UCX_TEST_ASSERT(!ucx_buffer_eof(b), "eof shall not be set");
universe@56 406 UCX_TEST_ASSERT(memcmp(buffer, " t h r e e1", 16) == 0,
universe@56 407 "bufer is incorrect after three byte string has been written");
universe@56 408
universe@56 409 UCX_TEST_END
universe@56 410
universe@60 411 ucx_buffer_free(b);
universe@56 412 free(buffer);
universe@56 413 }
universe@56 414
universe@134 415 UCX_TEST(test_ucx_buffer_write_ax) {
olaf@76 416 char *buffer = (char*) malloc(16);
universe@64 417
universe@64 418 UcxBuffer *b = ucx_buffer_new(buffer, 16,
universe@64 419 UCX_BUFFER_AUTOEXTEND | UCX_BUFFER_AUTOFREE);
universe@64 420 int r;
universe@64 421
universe@64 422 UCX_TEST_BEGIN
universe@64 423
universe@69 424 const char* teststring = "this is way too much";
universe@69 425 r = ucx_buffer_write((void*)teststring, 1, 20, b);
universe@69 426 buffer = (char*) b->space; /*autoextend enabled, we MUST retrieve pointer*/
universe@64 427 UCX_TEST_ASSERT(r == 20, "not all characters written");
olaf@76 428 UCX_TEST_ASSERT(b->capacity == 32, "buffer not properly extended");
universe@64 429 UCX_TEST_ASSERT(b->pos == 20, "position incorrect");
universe@64 430 UCX_TEST_ASSERT(memcmp(buffer,
universe@64 431 "this is way too much\0\0\0\0\0\0\0\0\0\0\0\0", 32) == 0,
universe@64 432 "incorrect buffer content");
universe@64 433
universe@64 434 UCX_TEST_END
universe@64 435
universe@64 436 ucx_buffer_free(b);
universe@64 437 }
universe@64 438
universe@134 439 UCX_TEST(test_ucx_buffer_read) {
olaf@76 440 UcxBuffer *b = ucx_buffer_new(NULL, 8, UCX_BUFFER_AUTOFREE);
universe@166 441 ucx_buffer_write("01234567", 1, 8, b);
universe@166 442 b->pos = 0;
olaf@76 443
olaf@76 444 char buf[32];
olaf@76 445 memset(buf, 'X', 32);
universe@56 446 int r;
olaf@76 447
universe@56 448 UCX_TEST_BEGIN
olaf@76 449
universe@166 450 ucx_buffer_seek(b, 2, SEEK_SET);
universe@166 451 r = ucx_buffer_read(buf, 1, 2, b);
universe@166 452 UCX_TEST_ASSERT(r == 2, "wrong number of bytes read (2 items)");
universe@166 453 UCX_TEST_ASSERT(buf[0] == '2' && buf[1] == '3' && buf[2] == 'X',
universe@166 454 "buffer incorrect after read");
universe@166 455 UCX_TEST_ASSERT(b->pos == 4, "wrong position after read (2 items)");
universe@166 456
universe@166 457 UCX_TEST_END
universe@166 458
universe@166 459 ucx_buffer_free(b);
universe@166 460 }
universe@166 461
universe@166 462 UCX_TEST(test_ucx_buffer_read_oob) {
universe@166 463 UcxBuffer *b = ucx_buffer_new(NULL, 8, UCX_BUFFER_AUTOFREE);
olaf@76 464 ucx_buffer_write("01234567", 1, 8, b);
universe@166 465
universe@166 466 char buf[32];
universe@166 467 memset(buf, 'X', 32);
universe@166 468 int r;
universe@166 469
universe@166 470 UCX_TEST_BEGIN
universe@166 471
universe@166 472 b->pos = 2;
universe@166 473 r = ucx_buffer_read(buf + 2, 1, 8, b);
universe@166 474 UCX_TEST_ASSERT(r == 6, "wrong number of bytes read (8 items)");
universe@166 475 UCX_TEST_ASSERT(memcmp(buf, "XX234567XX", 10) == 0,
universe@166 476 "buffer incorrect after read");
universe@166 477 UCX_TEST_ASSERT(b->pos == 8,
universe@166 478 "wrong position after read (8 items out of bound)");
universe@166 479
olaf@76 480 b->pos = 0;
universe@166 481 memset(buf, 'X', 32);
olaf@76 482
olaf@76 483 r = ucx_buffer_read(buf, 3, 3, b);
olaf@76 484
olaf@76 485 UCX_TEST_ASSERT(r == 2, "wrong number of blocks read");
olaf@76 486 UCX_TEST_ASSERT(memcmp(buf, "012345XX", 8) == 0,
universe@166 487 "buffer incorrect after block out of bounds read");
olaf@76 488
universe@166 489 r = ucx_buffer_read(buf+6, 1, 5, b);
universe@166 490
universe@166 491 UCX_TEST_ASSERT(r == 2, "wrong number of remaining bytes read");
universe@166 492 UCX_TEST_ASSERT(memcmp(buf, "01234567XX", 10) == 0,
universe@166 493 "buffer incorrect after remaining byte read");
olaf@76 494
universe@56 495 UCX_TEST_END
olaf@76 496
olaf@147 497 ucx_buffer_free(b);
universe@56 498 }
universe@62 499
universe@134 500 UCX_TEST(test_ucx_buffer_extract) {
universe@69 501 char *buffer = (char*) malloc(16);
universe@62 502 strcpy(buffer, "this is a test!");
universe@62 503
olaf@76 504 UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
olaf@76 505 src->size = 15;
universe@167 506 UcxBuffer *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_AUTOEXTEND);
universe@62 507
universe@62 508 UCX_TEST_BEGIN
olaf@76 509 UCX_TEST_ASSERT(dst != NULL, "ucx_buffer_extract returned NULL");
universe@167 510 UCX_TEST_ASSERT(dst->flags == (UCX_BUFFER_AUTOEXTEND | UCX_BUFFER_AUTOFREE),
universe@62 511 "autofree flag shall be enforced");
universe@63 512 UCX_TEST_ASSERT(dst->size == 5, "wrong size for new buffer");
universe@167 513 UCX_TEST_ASSERT(dst->capacity == 5, "wrong capacity for new buffer");
universe@167 514 UCX_TEST_ASSERT(dst->pos == 0, "wrong position for new buffer");
universe@62 515 char rb[5];
universe@62 516 ucx_buffer_read(rb, 1, 5, dst);
universe@62 517 UCX_TEST_ASSERT(memcmp(rb, "is a ", 5) == 0,
universe@62 518 "new buffer has incorrect content");
universe@62 519
universe@167 520 UCX_TEST_END
universe@167 521
universe@167 522 ucx_buffer_free(dst);
universe@167 523 ucx_buffer_free(src);
universe@167 524 }
universe@167 525
universe@167 526 UCX_TEST(test_ucx_buffer_extract_oob) {
universe@167 527 char *buffer = (char*) malloc(16);
universe@167 528 strcpy(buffer, "this is a test!");
universe@167 529
universe@167 530 UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
universe@167 531 UCX_TEST_BEGIN
universe@167 532
universe@167 533 UCX_TEST_ASSERT(ucx_buffer_extract(src, 5, 0, UCX_BUFFER_DEFAULT) == NULL,
universe@167 534 "extract shall fail on zero length");
universe@167 535 UCX_TEST_ASSERT(ucx_buffer_extract(src, 10, 10, UCX_BUFFER_DEFAULT) == NULL,
universe@167 536 "extract shall fail on invalid bounds (size exceeds limits)");
universe@167 537 UCX_TEST_ASSERT(ucx_buffer_extract(src, 20, -7, UCX_BUFFER_DEFAULT) == NULL,
universe@167 538 "extract shall fail on invalid bounds (start exceeds limits)");
universe@62 539
universe@62 540 UCX_TEST_END
universe@62 541
universe@167 542 ucx_buffer_free(src);
universe@167 543 }
universe@167 544
universe@167 545 UCX_TEST(test_ucx_buffer_extract_overflow) {
universe@167 546 char *buffer = (char*) malloc(16);
universe@167 547 strcpy(buffer, "this is a test!");
universe@167 548
universe@167 549 UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
universe@167 550 UCX_TEST_BEGIN
universe@167 551
universe@167 552 UCX_TEST_ASSERT(ucx_buffer_extract(src, 5, (size_t)-4,
universe@167 553 UCX_BUFFER_DEFAULT) == NULL, "extract shall fail on integer overflow");
universe@167 554
universe@167 555 UCX_TEST_END
universe@167 556
universe@62 557 ucx_buffer_free(src);
universe@62 558 }
olaf@76 559
universe@140 560 UCX_TEST(test_ucx_stream_copy) {
olaf@76 561 UcxBuffer *b1 = ucx_buffer_new(NULL, 64, UCX_BUFFER_DEFAULT);
olaf@76 562 UcxBuffer *b2 = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
olaf@76 563
olaf@76 564 UCX_TEST_BEGIN
olaf@76 565
olaf@76 566 ucx_buffer_write("01234567", 1, 8, b1);
olaf@76 567 ucx_buffer_write("abcdefgh", 1, 8, b1);
olaf@76 568 UCX_TEST_ASSERT(b1->size == 16, "failed to fill buffer b1");
olaf@76 569 ucx_buffer_seek(b1, 0, SEEK_SET);
olaf@76 570
universe@140 571 size_t ncp = ucx_stream_hcopy(b1, b2, ucx_buffer_read, ucx_buffer_write);
olaf@76 572 UCX_TEST_ASSERT(ncp == 16, "wrong number of copied bytes");
olaf@76 573 UCX_TEST_ASSERT(b2->size == 16, "b2 has wrong size");
olaf@76 574 UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
olaf@76 575 "b1 and b2 have not the same content");
olaf@76 576
olaf@76 577 memset(b2->space, 0, b2->capacity);
olaf@76 578 b2->pos = 0;
olaf@76 579 b2->size = 0;
olaf@76 580 ucx_buffer_seek(b1, 0, SEEK_SET);
olaf@76 581
olaf@76 582 FILE *file = tmpfile();
olaf@76 583 UCX_TEST_ASSERT(file, "test file cannot be opened, test aborted");
olaf@76 584
universe@140 585 ncp = ucx_stream_hcopy(b1, file, ucx_buffer_read, fwrite);
olaf@76 586 UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes to file");
olaf@76 587
olaf@76 588 fseek(file, 0, SEEK_SET);
olaf@76 589
universe@140 590 ncp = ucx_stream_hcopy(file, b2, fread, ucx_buffer_write);
olaf@76 591 UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes from file");
olaf@76 592
olaf@76 593 UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
olaf@76 594 "b1 and b2 content mismatch");
olaf@76 595
olaf@76 596 fclose(file);
universe@140 597
universe@140 598 ucx_buffer_clear(b1);
universe@140 599 ucx_buffer_seek(b2, 0, SEEK_SET);
universe@140 600 ncp = ucx_stream_ncopy(b2, b1, ucx_buffer_read, ucx_buffer_write, 8);
universe@140 601 UCX_TEST_ASSERT(ncp == 8, "copied wrong number of bytes with ncopy");
universe@140 602 UCX_TEST_ASSERT(memcmp(b1->space, "01234567\0\0\0\0\0\0\0\0", 16) == 0,
universe@140 603 "content wrong after ncopy");
olaf@76 604
olaf@76 605 UCX_TEST_END
olaf@76 606
olaf@76 607 ucx_buffer_free(b1);
olaf@76 608 ucx_buffer_free(b2);
olaf@76 609 }

mercurial