completed buffer tests

Tue, 06 May 2014 12:03:16 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 06 May 2014 12:03:16 +0200
changeset 168
24a012440dee
parent 167
aed60ba37acf
child 169
279dd3ca7a77

completed buffer tests

test/buffer_tests.c file | annotate | diff | comparison | revisions
test/buffer_tests.h file | annotate | diff | comparison | revisions
test/main.c file | annotate | diff | comparison | revisions
test/utils_tests.c file | annotate | diff | comparison | revisions
test/utils_tests.h file | annotate | diff | comparison | revisions
ucx/buffer.h file | annotate | diff | comparison | revisions
--- a/test/buffer_tests.c	Tue May 06 10:56:54 2014 +0200
+++ b/test/buffer_tests.c	Tue May 06 12:03:16 2014 +0200
@@ -27,16 +27,7 @@
  */
 
 #include "buffer_tests.h"
-#include "ucx/utils.h"
-
-/*
- * TODO: refactor tests
- *  
- * ucx_buffer_extend
- * ucx_buffer_extract
- * ucx_buffer_write
- * 
- */
+#include <stdint.h>
 
 UCX_TEST(test_ucx_buffer_new) {
     UcxBuffer *b = ucx_buffer_new(NULL, 16, UCX_BUFFER_AUTOEXTEND);
@@ -371,41 +362,68 @@
 }
 
 UCX_TEST(test_ucx_buffer_write) {
-    char *buffer = (char*) malloc(16);
+    char *buffer = (char*) malloc(32);
     memset(buffer, 32, 8);
     for (int i = 8; i < 16 ; i++) {
         buffer[i] = 40+i;
     }
 
-    UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
+    UcxBuffer *b = ucx_buffer_new(buffer, 32, UCX_BUFFER_DEFAULT);
     int r;
 
     UCX_TEST_BEGIN
-
-    const char* teststring = "this is way too much";
-    r = ucx_buffer_write((void*)teststring, 1, 20, b);
-    UCX_TEST_ASSERT(r == 16, "string not correctly trimed");
-    UCX_TEST_ASSERT(memcmp(buffer, teststring, 16) == 0,
-            "buffer data incorrect");
-    UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof shall be set");
+    b->pos = 4;
+    r = ucx_buffer_write("test string", 1, 11, b);
+    UCX_TEST_ASSERT(r == 11, "returned incorrect number of written bytes");
+    UCX_TEST_ASSERT(b->pos == 15, "incorrect position");
+    UCX_TEST_ASSERT(memcmp(buffer, "    test string7\0\0", 18) == 0,
+        "incorrect buffer content (test string)");
+    
+    int32_t testarr[4] = {0x09abcdef, 0x05fedcba, 0x01abefcd, 0x3cd07ab};
+    r = ucx_buffer_write(testarr, 4, 4, b);
+    UCX_TEST_ASSERT(r = 4, "returned incorrect number of written elements");
+    UCX_TEST_ASSERT(b->pos == 31, "incorrect position");
+    
+    char cmp[32];
+    memset(cmp, 0, 32);
+    memcpy(cmp, "    test string", 15);
+    int32_t *ptr = (int32_t*) (cmp+15);
+    ptr[0] = testarr[0];
+    ptr[1] = testarr[1];
+    ptr[2] = testarr[2];
+    ptr[3] = testarr[3];
+    UCX_TEST_ASSERT(memcmp(buffer, cmp, 32) == 0,
+        "incorrect buffer content (int array)");
+    
+    UCX_TEST_END
 
-    ucx_buffer_seek(b, 8, SEEK_SET);
-    r = ucx_buffer_write((void*)"not", 1, 3, b);
-    UCX_TEST_ASSERT(r == 3, "three bytes should be replace");
-    UCX_TEST_ASSERT(memcmp(buffer, "this is not too much", 16) == 0,
-            "modified buffer is incorrect");
+    ucx_buffer_free(b);
+    free(buffer);
+}
+
+UCX_TEST(test_ucx_buffer_write_oob) {
+    char *buffer = (char*) malloc(32);
+    memset(buffer, 0, 32);
+
+    UcxBuffer *b = ucx_buffer_new(buffer, 15, UCX_BUFFER_DEFAULT);
+    int r;
 
-    const char* threebytestring = "  t  h  r  e  e   ";
-    memset(buffer, 49, 16);
-    ucx_buffer_seek(b, 0, SEEK_SET);
-    r = ucx_buffer_write((void*)threebytestring, 3, 6, b);
-    UCX_TEST_ASSERT(r == 5, "three byte string not correctly trimed");
-    UCX_TEST_ASSERT(b->pos == 15,
-            "position after write of three byte string incorrect");
-    UCX_TEST_ASSERT(!ucx_buffer_eof(b), "eof shall not be set");
-    UCX_TEST_ASSERT(memcmp(buffer, "  t  h  r  e  e1", 16) == 0,
-                "bufer is incorrect after three byte string has been written");
-
+    UCX_TEST_BEGIN
+    r = ucx_buffer_write("a very long string", 1, 18, b);
+    UCX_TEST_ASSERT(r == 15, "incorrect number of written bytes");
+    UCX_TEST_ASSERT(memcmp(buffer, "a very long str\0\0\0", 18) == 0,
+        "invalid buffer content (test string)");
+    
+    b->size = b->pos = 0;
+    int32_t intarr[4] = {0,-1,0,-1};
+    memset(buffer, 0, 32);
+    
+    r = ucx_buffer_write(intarr, 4, 4, b);
+    UCX_TEST_ASSERT(r == 3, "incorrect number of written elements");
+    UCX_TEST_ASSERT(memcmp(buffer,
+        "\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0", 16) == 0,
+        "invalid buffer content (test string)");
+    
     UCX_TEST_END
 
     ucx_buffer_free(b);
@@ -502,7 +520,7 @@
     strcpy(buffer, "this is a test!");
 
     UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
-    src->size = 15;
+    src->size = 16;
     UcxBuffer *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_AUTOEXTEND);
 
     UCX_TEST_BEGIN
@@ -528,6 +546,8 @@
     strcpy(buffer, "this is a test!");
 
     UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
+    src->size = 16;
+    
     UCX_TEST_BEGIN
     
     UCX_TEST_ASSERT(ucx_buffer_extract(src, 5, 0, UCX_BUFFER_DEFAULT) == NULL,
@@ -547,6 +567,8 @@
     strcpy(buffer, "this is a test!");
 
     UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
+    src->size = 16;
+    
     UCX_TEST_BEGIN
     
     UCX_TEST_ASSERT(ucx_buffer_extract(src, 5, (size_t)-4,
@@ -557,53 +579,21 @@
     ucx_buffer_free(src);
 }
 
-UCX_TEST(test_ucx_stream_copy) {
-    UcxBuffer *b1 = ucx_buffer_new(NULL, 64, UCX_BUFFER_DEFAULT);
-    UcxBuffer *b2 = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
+UCX_TEST(test_ucx_buffer_extend) {
+    
+    UcxBuffer *b = ucx_buffer_new(NULL, 10, UCX_BUFFER_DEFAULT);
     
     UCX_TEST_BEGIN
     
-    ucx_buffer_write("01234567", 1, 8, b1);
-    ucx_buffer_write("abcdefgh", 1, 8, b1);
-    UCX_TEST_ASSERT(b1->size == 16, "failed to fill buffer b1");
-    ucx_buffer_seek(b1, 0, SEEK_SET);
-    
-    size_t ncp = ucx_stream_hcopy(b1, b2, ucx_buffer_read, ucx_buffer_write);
-    UCX_TEST_ASSERT(ncp == 16, "wrong number of copied bytes");
-    UCX_TEST_ASSERT(b2->size == 16, "b2 has wrong size");
-    UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
-            "b1 and b2 have not the same content");
-    
-    memset(b2->space, 0, b2->capacity);
-    b2->pos = 0;
-    b2->size = 0;
-    ucx_buffer_seek(b1, 0, SEEK_SET);
-    
-    FILE *file = tmpfile();
-    UCX_TEST_ASSERT(file, "test file cannot be opened, test aborted");
+    UCX_TEST_ASSERT(ucx_buffer_extend(b, 15) == 0, "shall return 0 on success");
+    UCX_TEST_ASSERT(b->capacity = 40, "wrong capacity");
+    UCX_TEST_ASSERT((b->size == 0 && b->pos == 0),
+        "pos and size shall remain unchanged");
     
-    ncp = ucx_stream_hcopy(b1, file, ucx_buffer_read, fwrite);
-    UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes to file");
-    
-    fseek(file, 0, SEEK_SET);
-    
-    ncp = ucx_stream_hcopy(file, b2, fread, ucx_buffer_write);
-    UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes from file");
-    
-    UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
-            "b1 and b2 content mismatch");
-    
-    fclose(file);
-
-    ucx_buffer_clear(b1);
-    ucx_buffer_seek(b2, 0, SEEK_SET);
-    ncp = ucx_stream_ncopy(b2, b1, ucx_buffer_read, ucx_buffer_write, 8);
-    UCX_TEST_ASSERT(ncp == 8, "copied wrong number of bytes with ncopy");
-    UCX_TEST_ASSERT(memcmp(b1->space, "01234567\0\0\0\0\0\0\0\0", 16) == 0,
-        "content wrong after ncopy");
+    UCX_TEST_ASSERT(ucx_buffer_extend(b, SIZE_MAX - 60) != 0,
+        "shall fail and return a non-zero value on overflow");
     
     UCX_TEST_END
     
-    ucx_buffer_free(b1);
-    ucx_buffer_free(b2);
+    ucx_buffer_free(b);
 }
--- a/test/buffer_tests.h	Tue May 06 10:56:54 2014 +0200
+++ b/test/buffer_tests.h	Tue May 06 12:03:16 2014 +0200
@@ -56,10 +56,11 @@
 UCX_TEST(test_ucx_buffer_extract);
 UCX_TEST(test_ucx_buffer_extract_oob);
 UCX_TEST(test_ucx_buffer_extract_overflow);
-
+UCX_TEST(test_ucx_buffer_extend);
 UCX_TEST(test_ucx_buffer_write);
+UCX_TEST(test_ucx_buffer_write_oob);
 UCX_TEST(test_ucx_buffer_write_ax);
-UCX_TEST(test_ucx_stream_copy);
+
 
 #ifdef	__cplusplus
 }
--- a/test/main.c	Tue May 06 10:56:54 2014 +0200
+++ b/test/main.c	Tue May 06 12:03:16 2014 +0200
@@ -197,13 +197,15 @@
         ucx_test_register(suite, test_ucx_buffer_extract);
         ucx_test_register(suite, test_ucx_buffer_extract_oob);
         ucx_test_register(suite, test_ucx_buffer_extract_overflow);
+        ucx_test_register(suite, test_ucx_buffer_extend);
         ucx_test_register(suite, test_ucx_buffer_write);
+        ucx_test_register(suite, test_ucx_buffer_write_oob);
         ucx_test_register(suite, test_ucx_buffer_write_ax);
-        ucx_test_register(suite, test_ucx_stream_copy);
         
         /* Utils Tests*/
         ucx_test_register(suite, test_ucx_fprintf);
         ucx_test_register(suite, test_ucx_asprintf);
+        ucx_test_register(suite, test_ucx_stream_copy);
 
         ucx_test_run(suite, stdout);
         fflush(stdout);
--- a/test/utils_tests.c	Tue May 06 10:56:54 2014 +0200
+++ b/test/utils_tests.c	Tue May 06 12:03:16 2014 +0200
@@ -90,3 +90,54 @@
     free(teststr1);
     free(teststr2);
 }
+
+UCX_TEST(test_ucx_stream_copy) {
+    UcxBuffer *b1 = ucx_buffer_new(NULL, 64, UCX_BUFFER_DEFAULT);
+    UcxBuffer *b2 = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
+    
+    UCX_TEST_BEGIN
+    
+    ucx_buffer_write("01234567", 1, 8, b1);
+    ucx_buffer_write("abcdefgh", 1, 8, b1);
+    UCX_TEST_ASSERT(b1->size == 16, "failed to fill buffer b1");
+    ucx_buffer_seek(b1, 0, SEEK_SET);
+    
+    size_t ncp = ucx_stream_hcopy(b1, b2, ucx_buffer_read, ucx_buffer_write);
+    UCX_TEST_ASSERT(ncp == 16, "wrong number of copied bytes");
+    UCX_TEST_ASSERT(b2->size == 16, "b2 has wrong size");
+    UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
+            "b1 and b2 have not the same content");
+    
+    memset(b2->space, 0, b2->capacity);
+    b2->pos = 0;
+    b2->size = 0;
+    ucx_buffer_seek(b1, 0, SEEK_SET);
+    
+    FILE *file = tmpfile();
+    UCX_TEST_ASSERT(file, "test file cannot be opened, test aborted");
+    
+    ncp = ucx_stream_hcopy(b1, file, ucx_buffer_read, fwrite);
+    UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes to file");
+    
+    fseek(file, 0, SEEK_SET);
+    
+    ncp = ucx_stream_hcopy(file, b2, fread, ucx_buffer_write);
+    UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes from file");
+    
+    UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
+            "b1 and b2 content mismatch");
+    
+    fclose(file);
+
+    ucx_buffer_clear(b1);
+    ucx_buffer_seek(b2, 0, SEEK_SET);
+    ncp = ucx_stream_ncopy(b2, b1, ucx_buffer_read, ucx_buffer_write, 8);
+    UCX_TEST_ASSERT(ncp == 8, "copied wrong number of bytes with ncopy");
+    UCX_TEST_ASSERT(memcmp(b1->space, "01234567\0\0\0\0\0\0\0\0", 16) == 0,
+        "content wrong after ncopy");
+    
+    UCX_TEST_END
+    
+    ucx_buffer_free(b1);
+    ucx_buffer_free(b2);
+}
--- a/test/utils_tests.h	Tue May 06 10:56:54 2014 +0200
+++ b/test/utils_tests.h	Tue May 06 12:03:16 2014 +0200
@@ -38,6 +38,7 @@
 
 UCX_TEST(test_ucx_fprintf);
 UCX_TEST(test_ucx_asprintf);
+UCX_TEST(test_ucx_stream_copy);
 
 #ifdef	__cplusplus
 }
--- a/ucx/buffer.h	Tue May 06 10:56:54 2014 +0200
+++ b/ucx/buffer.h	Tue May 06 12:03:16 2014 +0200
@@ -120,8 +120,7 @@
  * 
  * @param src the source buffer
  * @param start the start position of extraction
- * @param length the count of bytes to extract or 0 if all of the remaining
- * bytes shall be extracted
+ * @param length the count of bytes to extract (must not be zero)
  * @param flags feature mask for the new buffer
  * @return a new buffer containing the extraction
  */
@@ -136,7 +135,7 @@
  * @return a new buffer with the extracted content
  */
 #define ucx_buffer_clone(src,flags) \
-    ucx_buffer_extract(src, 0, 0, flags)
+    ucx_buffer_extract(src, 0, (src)->capacity, flags)
 
 /**
  * Moves the position of the buffer.
@@ -186,12 +185,12 @@
  * the buffer capacity is doubled, as long as it would not hold the current
  * content plus the additional required bytes.
  * 
- * <b>Attention:</b> the argument provided is the count of <i>additional</i>
- * bytes the buffer shall hold. It is <b>NOT</b> the total count of bytes the
+ * <b>Attention:</b> the argument provided is the number of <i>additional</i>
+ * bytes the buffer shall hold. It is <b>NOT</b> the total number of bytes the
  * buffer shall hold.
  * 
  * @param buffer the buffer to extend
- * @param additional_bytes the count of additional bytes the buffer shall
+ * @param additional_bytes the number of additional bytes the buffer shall
  * <i>at least</i> hold
  * @return 0 on success or a non-zero value on failure
  */

mercurial