diff -r 5ec9a2ca6328 -r 1fa3f13f774c test/buffer_tests.c --- a/test/buffer_tests.c Thu Apr 17 14:33:06 2014 +0200 +++ b/test/buffer_tests.c Mon May 05 13:53:27 2014 +0200 @@ -29,9 +29,120 @@ #include "buffer_tests.h" #include "ucx/utils.h" -UCX_TEST(test_ucx_buffer_seek) { +/* + * TODO: refactor tests + * + * ucx_buffer_extend + * ucx_buffer_extract + * ucx_buffer_free + * ucx_buffer_getc + * ucx_buffer_new + * ucx_buffer_puts + * ucx_buffer_read + * ucx_buffer_write + * + */ + +UCX_TEST(test_ucx_buffer_eof) { + char *test = "0123456789ABCDEF"; + UcxBuffer *b = ucx_buffer_new(test, 16, UCX_BUFFER_DEFAULT); + UCX_TEST_BEGIN + b->pos = 9; b->size = 10; + UCX_TEST_ASSERT(!ucx_buffer_eof(b), "false positive"); + b->pos = 10; b->size = 10; + UCX_TEST_ASSERT(ucx_buffer_eof(b), "pos == size should be EOF"); + b->pos = 11; b->size = 10; + UCX_TEST_ASSERT(ucx_buffer_eof(b), "false negative"); + UCX_TEST_END +} + +UCX_TEST(test_ucx_buffer_seek_overflow) { + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); + b->size = 32; + int r; + + UCX_TEST_BEGIN + size_t bigpos = SIZE_MAX - 5000; + b->pos = bigpos; + r = ucx_buffer_seek(b, 5016, SEEK_CUR); + UCX_TEST_ASSERT(r != 0, "seek cur overflow"); + UCX_TEST_ASSERT(b->pos == bigpos, + "failed seek shall leave pos unchanged"); + + b->pos = 0; + b->size = SIZE_MAX / 2 + 32; + off_t bigoff = SIZE_MAX / 2 - 16; + r = ucx_buffer_seek(b, -bigoff, SEEK_CUR); + UCX_TEST_ASSERT(r != 0, "seek cur underflow"); + UCX_TEST_ASSERT(b->pos == 0, + "failed seek shall leave pos unchanged"); + + UCX_TEST_END + + ucx_buffer_free(b); +} + +UCX_TEST(test_ucx_buffer_seek_invalid) { + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); + b->pos = 7; + int r; + + UCX_TEST_BEGIN + r = ucx_buffer_seek(b, 0, ~(SEEK_SET|SEEK_CUR|SEEK_END)); + UCX_TEST_ASSERT(r != 0, "invalid whence shall fail"); + UCX_TEST_ASSERT(b->pos == 7, + "failed seek shall leave pos unchanged"); + UCX_TEST_END + + ucx_buffer_free(b); +} + +UCX_TEST(test_ucx_buffer_seek_oob) { UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); b->size = 16; // less than capacity + b->pos = 7; + int r; + + UCX_TEST_BEGIN + + r = ucx_buffer_seek(b, -1, SEEK_SET); + UCX_TEST_ASSERT(r != 0, "seek SET below bounds shall fail"); + UCX_TEST_ASSERT(b->pos == 7, + "failed seek shall leave pos unchanged"); + + r = ucx_buffer_seek(b, 16, SEEK_SET); + UCX_TEST_ASSERT(r != 0, "seek SET above bounds shall fail"); + UCX_TEST_ASSERT(b->pos == 7, + "failed seek shall leave pos unchanged"); + + r = ucx_buffer_seek(b, -8, SEEK_CUR); + UCX_TEST_ASSERT(r != 0, "seek CUR below bounds shall fail"); + UCX_TEST_ASSERT(b->pos == 7, + "failed seek shall leave pos unchanged"); + + r = ucx_buffer_seek(b, 9, SEEK_CUR); + UCX_TEST_ASSERT(r != 0, "seek CUR above bounds shall fail"); + UCX_TEST_ASSERT(b->pos == 7, + "failed seek shall leave pos unchanged"); + + r = ucx_buffer_seek(b, -17, SEEK_END); + UCX_TEST_ASSERT(r != 0, "seek END below bounds shall fail"); + UCX_TEST_ASSERT(b->pos == 7, + "failed seek shall leave pos unchanged"); + + r = ucx_buffer_seek(b, 1, SEEK_END); + UCX_TEST_ASSERT(r != 0, "seek END above bounds shall fail"); + UCX_TEST_ASSERT(b->pos == 7, + "failed seek shall leave pos unchanged"); + + UCX_TEST_END + + ucx_buffer_free(b); +} + +UCX_TEST(test_ucx_buffer_seek_set) { + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); + b->size = 16; int r; UCX_TEST_BEGIN @@ -39,29 +150,45 @@ r = ucx_buffer_seek(b, 5, SEEK_SET); UCX_TEST_ASSERT(r == 0, "seek SET+5 failed"); UCX_TEST_ASSERT(b->pos == 5, "seek SET+5 set wrong position"); + + + r = ucx_buffer_seek(b, 10, SEEK_SET); + UCX_TEST_ASSERT(r == 0, "seek SET+10 failed"); + UCX_TEST_ASSERT(b->pos == 10, "seek SET+10 set wrong position"); - r = ucx_buffer_seek(b, 20, SEEK_SET); - UCX_TEST_ASSERT(r != 0, "seek beyond bounds shall fail"); - UCX_TEST_ASSERT(b->pos == 5, - "failed seek shall leave pos unchanged"); + UCX_TEST_END + ucx_buffer_free(b); +} + +UCX_TEST(test_ucx_buffer_seek_cur) { + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); + b->size = 16; + int r; + + UCX_TEST_BEGIN + + b->pos = 7; r = ucx_buffer_seek(b, 5, SEEK_CUR); UCX_TEST_ASSERT(r == 0, "seek CUR+5 failed"); - UCX_TEST_ASSERT(b->pos == 10, "seek CUR+5 set wrong position"); + UCX_TEST_ASSERT(b->pos == 12, "seek CUR+5 set wrong position"); - r = ucx_buffer_seek(b, 10, SEEK_CUR); - UCX_TEST_ASSERT(r != 0, "seek CUR beyond bounds shall fail"); - UCX_TEST_ASSERT(b->pos == 10, - "failed seek shall leave pos unchanged"); + UCX_TEST_END + ucx_buffer_free(b); +} + +UCX_TEST(test_ucx_buffer_seek_end) { + UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT); + b->size = 16; + int r; + + UCX_TEST_BEGIN + r = ucx_buffer_seek(b, -5, SEEK_END); UCX_TEST_ASSERT(r == 0, "seek END-5 failed"); UCX_TEST_ASSERT(b->pos == 11, "seek END-5 set wrong position"); - r = ucx_buffer_seek(b, -20, SEEK_END); - UCX_TEST_ASSERT(r != 0, "seek END beyond bounds shall fail"); - UCX_TEST_ASSERT(b->pos == 11, - "failed seek shall leave pos unchanged"); UCX_TEST_END @@ -77,7 +204,9 @@ UCX_TEST_BEGIN - ucx_buffer_putc(b, '0'); + ucx_buffer_seek(b, 0, SEEK_SET); + UCX_TEST_ASSERT(ucx_buffer_putc(b, '0'|~0xFF) == '0', + "putc shall return (arg & 0xFF)"); ucx_buffer_putc(b, '0'); ucx_buffer_putc(b, '0'); @@ -89,49 +218,89 @@ ucx_buffer_putc(b, '0'); UCX_TEST_ASSERT(b->pos == 16, "pos wrong after last 3 puts"); - UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof not set"); - UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, - "put shall return EOF when buffer is full"); - ucx_buffer_seek(b, 3, SEEK_SET); - ucx_buffer_putc(b, 'a'); - ucx_buffer_putc(b, 'b'); - ucx_buffer_putc(b, 'c'); + UCX_TEST_ASSERT(!memcmp(b->space, "000 000", 16), + "buffer content wrong") + UCX_TEST_END + ucx_buffer_free(b); + free(buffer); +} - UCX_TEST_ASSERT(b->size == 16, "wrong size after seek and puts"); - UCX_TEST_ASSERT(memcmp(buffer, "000abc 000", 16) == 0, - "buffer contains incorrect content"); +UCX_TEST(test_ucx_buffer_putc_oob) { + UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_DEFAULT); + + UCX_TEST_BEGIN + b->pos = b->size = b->capacity = 1; + b->space[1] = 'X'; + + UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, "put shall return EOF " + "when buffer is full and auto extend is disabled"); + UCX_TEST_ASSERT(!memcmp(b->space, "\0X", 2), + "wrong buffer content after failed putc"); UCX_TEST_END ucx_buffer_free(b); - free(buffer); } -UCX_TEST(test_ucx_buffer_putc_ax) { + +UCX_TEST(test_ucx_buffer_putc_ae) { UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND); + ucx_buffer_putc(b, '0'); + ucx_buffer_putc(b, '1'); UCX_TEST_BEGIN + UCX_TEST_ASSERT(b->pos == 2, "pos wrong after first 2 puts"); + UCX_TEST_ASSERT(b->size == 2, "size wrong after first 2 puts"); + UCX_TEST_ASSERT(b->capacity == 2, "buffer erroneously extended"); + UCX_TEST_ASSERT(!memcmp(b->space,"01", 2), "wrong content"); + + UCX_TEST_END + + ucx_buffer_free(b); +} + +UCX_TEST(test_ucx_buffer_putc_oobae) { + UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND); ucx_buffer_putc(b, '0'); ucx_buffer_putc(b, '1'); - UCX_TEST_ASSERT(b->pos == 2, "pos wrong after first 2 puts"); - UCX_TEST_ASSERT(b->capacity == 2, "buffer erroneously extended"); + UCX_TEST_BEGIN ucx_buffer_putc(b, 'a'); - UCX_TEST_ASSERT(b->pos == 3, "pos wrong after 1 put"); + UCX_TEST_ASSERT(b->pos == 3, "pos wrong after put"); UCX_TEST_ASSERT(b->capacity == 4, "buffer not properly extended"); UCX_TEST_ASSERT(b->size == 3, "wrong buffer size"); - UCX_TEST_ASSERT(b->space[2] == 'a', "wrong content"); + UCX_TEST_ASSERT(!memcmp(b->space,"01a\0", 4), "wrong content"); UCX_TEST_END ucx_buffer_free(b); } +UCX_TEST(test_ucx_buffer_putc_size) { + UcxBuffer *b = ucx_buffer_new(NULL, 4, UCX_BUFFER_DEFAULT); + + UCX_TEST_BEGIN + + UCX_TEST_ASSERT(b->size == 0, "wrong initial size"); + ucx_buffer_putc(b, 'a'); + ucx_buffer_putc(b, 'b'); + ucx_buffer_putc(b, 'c'); + UCX_TEST_ASSERT(b->size == 3, "size does not increase"); + ucx_buffer_seek(b, 1, SEEK_SET); + ucx_buffer_putc(b, 'd'); + UCX_TEST_ASSERT(b->size == 3, "size shall not decrease"); + UCX_TEST_ASSERT(b->pos == 2, "wrong position after seek and putc"); + + UCX_TEST_END + + ucx_buffer_free(b); +} + UCX_TEST(test_ucx_buffer_getc) { char *buffer = (char*) malloc(16); memset(buffer, 32, 8);