dovecot-1.1: Added randomized unit test for seq_range_array*()

dovecot at dovecot.org dovecot at dovecot.org
Fri Feb 29 04:21:10 EET 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/b7d55cccc7f4
changeset: 7306:b7d55cccc7f4
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Feb 29 04:23:58 2008 +0200
description:
Added randomized unit test for seq_range_array*()

diffstat:

1 file changed, 74 insertions(+)
src/tests/test-lib.c |   74 ++++++++++++++++++++++++++++++++++++++++++++++++++

diffs (91 lines):

diff -r 3161b8648468 -r b7d55cccc7f4 src/tests/test-lib.c
--- a/src/tests/test-lib.c	Fri Feb 29 03:36:07 2008 +0200
+++ b/src/tests/test-lib.c	Fri Feb 29 04:23:58 2008 +0200
@@ -461,6 +461,79 @@ static void test_priorityq(void)
 	pool_unref(&pool);
 }
 
+static void test_seq_range_array_random(void)
+{
+#define SEQ_RANGE_TEST_BUFSIZE 1024
+#define SEQ_RANGE_TEST_COUNT 10000
+	unsigned char shadowbuf[SEQ_RANGE_TEST_BUFSIZE];
+	ARRAY_TYPE(seq_range) range;
+	const struct seq_range *seqs;
+	uint32_t seq1, seq2;
+	unsigned int i, j, ret, ret2, count;
+	int test = -1;
+
+	ret = ret2 = 0;
+	i_array_init(&range, 1);
+	memset(shadowbuf, 0, sizeof(shadowbuf));
+	for (i = 0; i < SEQ_RANGE_TEST_COUNT; i++) {
+		seq1 = rand() % SEQ_RANGE_TEST_BUFSIZE;
+		seq2 = seq1 + rand() % (SEQ_RANGE_TEST_BUFSIZE - seq1);
+		test = rand() % 4;
+		switch (test) {
+		case 0:
+			seq_range_array_add(&range, 0, seq1);
+			shadowbuf[seq1] = 1;
+			break;
+		case 1:
+			seq_range_array_add_range(&range, seq1, seq2);
+			memset(shadowbuf + seq1, 1, seq2 - seq1 + 1);
+			break;
+		case 2:
+			ret = seq_range_array_remove(&range, seq1) ? 1 : 0;
+			ret2 = shadowbuf[seq1] != 0 ? 1 : 0;
+			shadowbuf[seq1] = 0;
+			break;
+		case 3:
+			ret = seq_range_array_remove_range(&range, seq1, seq2);
+			for (ret2 = 0; seq1 <= seq2; seq1++) {
+				if (shadowbuf[seq1] != 0) {
+					ret2++;
+					shadowbuf[seq1] = 0;
+				}
+			}
+			break;
+		}
+		if (ret != ret2)
+			break;
+
+		seqs = array_get(&range, &count);
+		for (j = 0, seq1 = 0; j < count; j++) {
+			if (j > 0 && seqs[j-1].seq2 >= seqs[j].seq1)
+				goto fail;
+			for (; seq1 < seqs[j].seq1; seq1++) {
+				if (shadowbuf[seq1] != 0)
+					goto fail;
+			}
+			for (; seq1 <= seqs[j].seq2; seq1++) {
+				if (shadowbuf[seq1] == 0)
+					goto fail;
+			}
+		}
+		i_assert(seq1 <= SEQ_RANGE_TEST_BUFSIZE);
+		for (; seq1 < SEQ_RANGE_TEST_BUFSIZE; seq1++) {
+			if (shadowbuf[seq1] != 0)
+				goto fail;
+		}
+	}
+fail:
+	if (i == SEQ_RANGE_TEST_COUNT)
+		test_out("seq_range_array random", TRUE);
+	else {
+		test_out_reason("seq_range_array random", FALSE,
+			t_strdup_printf("round %u test %d failed", i, test));
+	}
+}
+
 static void test_seq_range_array(void)
 {
 	static const unsigned int input_min = 1, input_max = 5;
@@ -502,6 +575,7 @@ static void test_seq_range_array(void)
 			 success);
 		array_free(&range);
 	}
+	test_seq_range_array_random();
 }
 
 struct str_sanitize_input {


More information about the dovecot-cvs mailing list