dovecot: Added unit testing for buffer_t.

dovecot at dovecot.org dovecot at dovecot.org
Fri Feb 29 03:31:20 EET 2008


details:   http://hg.dovecot.org/dovecot/rev/a56c676ce65d
changeset: 7299:a56c676ce65d
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Feb 29 03:34:07 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 7995da69b348 -r a56c676ce65d src/tests/test-lib.c
--- a/src/tests/test-lib.c	Fri Feb 29 03:33:30 2008 +0200
+++ b/src/tests/test-lib.c	Fri Feb 29 03:34:07 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