test/buffer_tests.c

Thu, 13 Oct 2016 16:25:21 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 13 Oct 2016 16:25:21 +0200
changeset 227
740fbd7bab71
parent 225
a1a068c2c4ef
child 230
4044131874f9
permissions
-rw-r--r--

fixes memory leak in test_ucx_buffer_eof

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

mercurial