dovecot-1.1: Added unit testing for buffer_t.
dovecot at dovecot.org
dovecot at dovecot.org
Fri Feb 29 03:31:17 EET 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/90154a6d225e
changeset: 7304:90154a6d225e
user: Timo Sirainen <tss at iki.fi>
date: Fri Feb 29 03:34:05 2008 +0200
description:
Added unit testing for buffer_t.
diffstat:
1 file changed, 129 insertions(+)
src/tests/test-lib.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++
diffs (146 lines):
diff -r db4a29902723 -r 90154a6d225e src/tests/test-lib.c
--- a/src/tests/test-lib.c Fri Feb 29 03:33:27 2008 +0200
+++ b/src/tests/test-lib.c Fri Feb 29 03:34:05 2008 +0200
@@ -129,6 +129,134 @@ static void test_bsearch_insert_pos(void
}
}
+static void test_buffer(void)
+{
+#define BUF_TEST_SIZE (1024*64)
+#define BUF_TEST_COUNT 1000
+ buffer_t *buf;
+ unsigned char *p, testdata[BUF_TEST_SIZE], shadowbuf[BUF_TEST_SIZE];
+ unsigned int i, shadowbuf_size;
+ size_t pos, pos2, size;
+ int test = -1;
+ bool zero;
+
+ buf = buffer_create_dynamic(default_pool, 1);
+ for (i = 0; i < BUF_TEST_SIZE; i++)
+ testdata[i] = random();
+
+ srand(1);
+ shadowbuf_size = 0;
+ for (i = 0; i < BUF_TEST_COUNT; i++) {
+ if (buf->used == BUF_TEST_SIZE) {
+ size = shadowbuf_size = rand() % (buf->used - 1);
+ buffer_set_used_size(buf, size);
+ memset(shadowbuf + shadowbuf_size, 0,
+ BUF_TEST_SIZE - shadowbuf_size);
+ i_assert(buf->used < BUF_TEST_SIZE);
+ }
+
+ test = rand() % 6;
+ zero = rand() % 10 == 0;
+ switch (test) {
+ case 0:
+ pos = rand() % (BUF_TEST_SIZE-1);
+ size = rand() % (BUF_TEST_SIZE - pos);
+ if (!zero) {
+ buffer_write(buf, pos, testdata, size);
+ memcpy(shadowbuf + pos, testdata, size);
+ } else {
+ buffer_write_zero(buf, pos, size);
+ memset(shadowbuf + pos, 0, size);
+ }
+ if (pos + size > shadowbuf_size)
+ shadowbuf_size = pos + size;
+ break;
+ case 1:
+ size = rand() % (BUF_TEST_SIZE - buf->used);
+ if (!zero) {
+ buffer_append(buf, testdata, size);
+ memcpy(shadowbuf + shadowbuf_size,
+ testdata, size);
+ } else {
+ buffer_append_zero(buf, size);
+ memset(shadowbuf + shadowbuf_size, 0, size);
+ }
+ shadowbuf_size += size;
+ break;
+ case 2:
+ pos = rand() % (BUF_TEST_SIZE-1);
+ size = rand() % (BUF_TEST_SIZE - I_MAX(buf->used, pos));
+ if (!zero) {
+ buffer_insert(buf, pos, testdata, size);
+ memmove(shadowbuf + pos + size,
+ shadowbuf + pos,
+ BUF_TEST_SIZE - (pos + size));
+ memcpy(shadowbuf + pos, testdata, size);
+ } else {
+ buffer_insert_zero(buf, pos, size);
+ memmove(shadowbuf + pos + size,
+ shadowbuf + pos,
+ BUF_TEST_SIZE - (pos + size));
+ memset(shadowbuf + pos, 0, size);
+ }
+ if (pos < shadowbuf_size)
+ shadowbuf_size += size;
+ else
+ shadowbuf_size = pos + size;
+ break;
+ case 3:
+ pos = rand() % (BUF_TEST_SIZE-1);
+ size = rand() % (BUF_TEST_SIZE - pos);
+ buffer_delete(buf, pos, size);
+ if (pos < shadowbuf_size) {
+ if (pos + size > shadowbuf_size)
+ size = shadowbuf_size - pos;
+ memmove(shadowbuf + pos,
+ shadowbuf + pos + size,
+ BUF_TEST_SIZE - (pos + size));
+
+ shadowbuf_size -= size;
+ memset(shadowbuf + shadowbuf_size, 0,
+ BUF_TEST_SIZE - shadowbuf_size);
+ }
+ break;
+ case 4:
+ if (shadowbuf_size == 0)
+ break;
+ pos = rand() % (shadowbuf_size-1); /* dest */
+ pos2 = rand() % (shadowbuf_size-1); /* source */
+ size = rand() % (shadowbuf_size - I_MAX(pos, pos2));
+ buffer_copy(buf, pos, buf, pos2, size);
+ memmove(shadowbuf + pos,
+ shadowbuf + pos2, size);
+ if (pos > pos2 && pos + size > shadowbuf_size)
+ shadowbuf_size = pos + size;
+ break;
+ case 5:
+ pos = rand() % (BUF_TEST_SIZE-1);
+ size = rand() % (BUF_TEST_SIZE - pos);
+ p = buffer_get_space_unsafe(buf, pos, size);
+ memcpy(p, testdata, size);
+ memcpy(shadowbuf + pos, testdata, size);
+ if (pos + size > shadowbuf_size)
+ shadowbuf_size = pos + size;
+ break;
+ }
+ i_assert(shadowbuf_size <= BUF_TEST_SIZE);
+
+ if (buf->used != shadowbuf_size ||
+ memcmp(buf->data, shadowbuf, buf->used) != 0)
+ break;
+ }
+ if (i == BUF_TEST_COUNT)
+ test_out("buffer", TRUE);
+ else {
+ test_out_reason("buffer", FALSE,
+ t_strdup_printf("round %u test %d failed", i, test));
+ }
+ buffer_free(&buf);
+}
+
static bool aqueue_is_ok(struct aqueue *aqueue, unsigned int deleted_n)
{
const unsigned int *p;
@@ -476,6 +604,7 @@ int main(void)
test_base64_encode,
test_base64_decode,
test_bsearch_insert_pos,
+ test_buffer,
test_mempool_alloconly,
test_priorityq,
test_seq_range_array,
More information about the dovecot-cvs
mailing list