dovecot-2.0-sslstream: Added unit tests for istream-seekable ist...
dovecot at dovecot.org
dovecot at dovecot.org
Sat Feb 13 02:55:41 EET 2010
details: http://hg.dovecot.org/dovecot-2.0-sslstream/rev/49599bbfc900
changeset: 10187:49599bbfc900
user: Timo Sirainen <tss at iki.fi>
date: Mon Oct 26 17:07:57 2009 -0400
description:
Added unit tests for istream-seekable istream-concat.
diffstat:
5 files changed, 255 insertions(+)
src/lib/Makefile.am | 2
src/lib/test-istream-concat.c | 110 ++++++++++++++++++++++++++++++
src/lib/test-istream-seekable.c | 139 +++++++++++++++++++++++++++++++++++++++
src/lib/test-lib.c | 2
src/lib/test-lib.h | 2
diffs (296 lines):
diff -r 7c3605774b93 -r 49599bbfc900 src/lib/Makefile.am
--- a/src/lib/Makefile.am Mon Oct 26 17:07:20 2009 -0400
+++ b/src/lib/Makefile.am Mon Oct 26 17:07:57 2009 -0400
@@ -221,7 +221,9 @@ test_lib_SOURCES = \
test-bsearch-insert-pos.c \
test-buffer.c \
test-hex-binary.c \
+ test-istream-concat.c \
test-istream-crlf.c \
+ test-istream-seekable.c \
test-istream-tee.c \
test-mempool-alloconly.c \
test-network.c \
diff -r 7c3605774b93 -r 49599bbfc900 src/lib/test-istream-concat.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/test-istream-concat.c Mon Oct 26 17:07:57 2009 -0400
@@ -0,0 +1,110 @@
+/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
+
+#include "test-lib.h"
+#include "istream-internal.h"
+#include "istream-concat.h"
+
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+static void test_istream_concat_one(unsigned int buffer_size)
+{
+ static const char *input_string = "xyz";
+#define STREAM_COUNT 5
+#define STREAM_BYTES 3
+ struct istream *streams[STREAM_COUNT+1];
+ struct istream *input;
+ const unsigned char *data;
+ size_t size;
+ unsigned int i, j;
+
+ for (i = 0; i < STREAM_COUNT; i++) {
+ streams[i] = test_istream_create(input_string);
+ test_istream_set_allow_eof(streams[i], TRUE);
+ test_istream_set_size(streams[i], 0);
+ }
+ streams[i] = NULL;
+
+ input = i_stream_create_concat(streams);
+ for (i = 0; i/STREAM_BYTES < STREAM_COUNT; i++) {
+ test_istream_set_size(streams[i/STREAM_BYTES], (i%STREAM_BYTES) + 1);
+ test_assert(i_stream_read(input) == 1);
+ if (i < buffer_size) {
+ data = i_stream_get_data(input, &size);
+ test_assert(size == i+1);
+ } else {
+ i_stream_skip(input, 1);
+ data = i_stream_get_data(input, &size);
+ test_assert(size == buffer_size);
+ }
+ for (j = 0; j < size; j++) {
+ test_assert(data[j] == input_string[(input->v_offset + j) % STREAM_BYTES]);
+ }
+ }
+ i_stream_unref(&input);
+}
+
+static void test_istream_concat_random(void)
+{
+ struct istream **streams, *input;
+ const unsigned char *data;
+ unsigned char *w_data;
+ size_t size;
+ unsigned int i, j, offset, stream_count, data_len;
+
+ srand(1234);
+ stream_count = (rand() % 10) + 2;
+ streams = t_new(struct istream *, stream_count + 1);
+ for (i = 0, offset = 0; i < stream_count; i++) {
+ data_len = rand() % 100 + 1;
+ w_data = t_malloc(data_len);
+ for (j = 0; j < data_len; j++)
+ w_data[j] = offset++;
+ streams[i] = test_istream_create_data(w_data, data_len);
+ test_istream_set_allow_eof(streams[i], TRUE);
+ }
+ streams[i] = NULL;
+
+ input = i_stream_create_concat(streams);
+ for (i = 0; i < 100; i++) {
+ if (rand() % 3 == 0) {
+ i_stream_seek(input, rand() % offset);
+ } else {
+ ssize_t ret = i_stream_read(input);
+ if (input->v_offset + size == offset)
+ test_assert(ret < 0);
+ else {
+ test_assert(ret > 0);
+ test_assert(input->v_offset + ret <= offset);
+ i_stream_skip(input, rand() % ret);
+
+ data = i_stream_get_data(input, &size);
+ for (j = 0; j < size; j++) {
+ test_assert(data[j] == (input->v_offset + j) % 256);
+ }
+ }
+ }
+ (void)i_stream_get_data(input, &size);
+ }
+ for (i = 0; i < stream_count; i++)
+ i_stream_unref(&streams[i]);
+ i_stream_unref(&input);
+}
+
+void test_istream_concat(void)
+{
+ unsigned int i;
+
+ test_begin("istream concat");
+ for (i = 1; i < STREAM_BYTES*STREAM_COUNT; i++) {
+ test_istream_concat_one(i);
+ }
+ test_end();
+
+ test_begin("istream concat random");
+ for (i = 0; i < 100; i++) T_BEGIN {
+ test_istream_concat_random();
+ } T_END;
+ test_end();
+}
diff -r 7c3605774b93 -r 49599bbfc900 src/lib/test-istream-seekable.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/test-istream-seekable.c Mon Oct 26 17:07:57 2009 -0400
@@ -0,0 +1,139 @@
+/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
+
+#include "test-lib.h"
+#include "istream-internal.h"
+#include "istream-seekable.h"
+
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+static int fd_callback(const char **path_r, void *context ATTR_UNUSED)
+{
+ int fd;
+
+ *path_r = "test-lib.tmp";
+ fd = open(*path_r, O_RDWR | O_CREAT | O_TRUNC, 0600);
+ if (fd == -1)
+ i_error("creat(%s) failed: %m", *path_r);
+ else
+ unlink(*path_r);
+ return fd;
+}
+
+static void test_istream_seekable_one(unsigned int buffer_size)
+{
+ static const char *input_string = "xyz";
+#define STREAM_COUNT 5
+#define STREAM_BYTES 3
+ struct istream *streams[STREAM_COUNT+1];
+ struct istream *input;
+ const unsigned char *data;
+ size_t size;
+ unsigned int i, j;
+
+ for (i = 0; i < STREAM_COUNT; i++) {
+ streams[i] = test_istream_create(input_string);
+ streams[i]->seekable = FALSE;
+ test_istream_set_allow_eof(streams[i], TRUE);
+ test_istream_set_size(streams[i], 0);
+ }
+ streams[i] = NULL;
+
+ input = i_stream_create_seekable(streams, buffer_size, fd_callback, NULL);
+ for (i = 0; i/STREAM_BYTES < STREAM_COUNT; i++) {
+ test_istream_set_size(streams[i/STREAM_BYTES], (i%STREAM_BYTES) + 1);
+ if (i < buffer_size) {
+ test_assert(i_stream_read(input) == 1);
+ data = i_stream_get_data(input, &size);
+ test_assert(size == i+1);
+ } else {
+ test_assert(i_stream_read(input) == -2);
+ i_stream_skip(input, 1);
+ test_assert(i_stream_read(input) == 1);
+ data = i_stream_get_data(input, &size);
+ test_assert(size == buffer_size);
+ }
+ for (j = 0; j < size; j++) {
+ test_assert(data[j] == input_string[(input->v_offset + j) % STREAM_BYTES]);
+ }
+ }
+ for (i = 0; i < STREAM_COUNT; i++)
+ i_stream_unref(&streams[i]);
+ i_stream_unref(&input);
+}
+
+static void test_istream_seekable_random(void)
+{
+ struct istream **streams, *input;
+ const unsigned char *data;
+ unsigned char *w_data;
+ size_t size;
+ unsigned int i, j, offset, stream_count, data_len, buffer_size;
+
+ stream_count = (rand() % 10) + 2;
+ streams = t_new(struct istream *, stream_count + 1);
+ for (i = 0, offset = 0; i < stream_count; i++) {
+ data_len = rand() % 100 + 1;
+ w_data = t_malloc(data_len);
+ for (j = 0; j < data_len; j++)
+ w_data[j] = offset++;
+ streams[i] = test_istream_create_data(w_data, data_len);
+ streams[i]->seekable = FALSE;
+ test_istream_set_allow_eof(streams[i], TRUE);
+ }
+ streams[i] = NULL;
+
+ buffer_size = (rand() % 100) + 1; size = 0;
+ input = i_stream_create_seekable(streams, buffer_size, fd_callback, NULL);
+
+ /* first read it through */
+ while (i_stream_read(input) > 0) {
+ (void)i_stream_get_data(input, &size);
+ i_stream_skip(input, size);
+ }
+
+ i_stream_seek(input, 0);
+ for (i = 0; i < 100; i++) {
+ if (rand() % 3 == 0) {
+ i_stream_seek(input, rand() % offset);
+ } else {
+ ssize_t ret = i_stream_read(input);
+ if (input->v_offset + size == offset)
+ test_assert(ret < 0);
+ else if (ret == -2) {
+ data = i_stream_get_data(input, &size);
+ test_assert(size == buffer_size);
+ } else {
+ test_assert(ret > 0);
+ test_assert(input->v_offset + ret <= offset);
+ i_stream_skip(input, rand() % ret);
+
+ data = i_stream_get_data(input, &size);
+ for (j = 0; j < size; j++) {
+ test_assert(data[j] == (input->v_offset + j) % 256);
+ }
+ }
+ }
+ (void)i_stream_get_data(input, &size);
+ }
+ for (i = 0; i < stream_count; i++)
+ i_stream_unref(&streams[i]);
+ i_stream_unref(&input);
+}
+
+void test_istream_seekable(void)
+{
+ unsigned int i;
+
+ test_begin("istream seekable");
+ for (i = 1; i <= STREAM_BYTES*STREAM_COUNT; i++)
+ test_istream_seekable_one(i);
+ test_end();
+
+ test_begin("istream seekable random");
+ for (i = 0; i < 100; i++) T_BEGIN {
+ test_istream_seekable_random();
+ } T_END;
+ test_end();
+}
diff -r 7c3605774b93 -r 49599bbfc900 src/lib/test-lib.c
--- a/src/lib/test-lib.c Mon Oct 26 17:07:20 2009 -0400
+++ b/src/lib/test-lib.c Mon Oct 26 17:07:57 2009 -0400
@@ -11,7 +11,9 @@ int main(void)
test_bsearch_insert_pos,
test_buffer,
test_hex_binary,
+ test_istream_concat,
test_istream_crlf,
+ test_istream_seekable,
test_istream_tee,
test_mempool_alloconly,
test_network,
diff -r 7c3605774b93 -r 49599bbfc900 src/lib/test-lib.h
--- a/src/lib/test-lib.h Mon Oct 26 17:07:20 2009 -0400
+++ b/src/lib/test-lib.h Mon Oct 26 17:07:57 2009 -0400
@@ -10,7 +10,9 @@ void test_bsearch_insert_pos(void);
void test_bsearch_insert_pos(void);
void test_buffer(void);
void test_hex_binary(void);
+void test_istream_concat(void);
void test_istream_crlf(void);
+void test_istream_seekable(void);
void test_istream_tee(void);
void test_mempool_alloconly(void);
void test_network(void);
More information about the dovecot-cvs
mailing list