changeset 22431:691b5466edb3

lib: Created basic test suite for ostream-buffer.
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Sun, 02 Jul 2017 12:05:36 +0200
parents 2d9175af5c99
children aff38b5d7f1f
files src/lib/Makefile.am src/lib/test-lib.c src/lib/test-lib.h src/lib/test-ostream-buffer.c
diffstat 4 files changed, 111 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/Makefile.am	Tue Aug 08 16:56:02 2017 +0300
+++ b/src/lib/Makefile.am	Sun Jul 02 12:05:36 2017 +0200
@@ -352,6 +352,7 @@
 	test-pkcs5.c \
 	test-net.c \
 	test-numpack.c \
+	test-ostream-buffer.c \
 	test-ostream-escaped.c \
 	test-ostream-failure-at.c \
 	test-ostream-file.c \
--- a/src/lib/test-lib.c	Tue Aug 08 16:56:02 2017 +0300
+++ b/src/lib/test-lib.c	Sun Jul 02 12:05:36 2017 +0200
@@ -46,6 +46,7 @@
 		test_net,
 		test_numpack,
 		test_pkcs5_pbkdf2,
+		test_ostream_buffer,
 		test_ostream_escaped,
 		test_ostream_failure_at,
 		test_ostream_file,
--- a/src/lib/test-lib.h	Tue Aug 08 16:56:02 2017 +0300
+++ b/src/lib/test-lib.h	Sun Jul 02 12:05:36 2017 +0200
@@ -50,6 +50,7 @@
 void test_pkcs5_pbkdf2(void);
 void test_net(void);
 void test_numpack(void);
+void test_ostream_buffer(void);
 void test_ostream_escaped(void);
 void test_ostream_failure_at(void);
 void test_ostream_file(void);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/test-ostream-buffer.c	Sun Jul 02 12:05:36 2017 +0200
@@ -0,0 +1,108 @@
+/* Copyright (c) 2017 Dovecot authors, see the included COPYING file */
+
+#include "test-lib.h"
+#include "buffer.h"
+#include "str.h"
+#include "randgen.h"
+#include "istream.h"
+#include "ostream.h"
+
+#define MAX_BUFSIZE 256
+
+static void test_ostream_buffer_random_once(void)
+{
+	buffer_t *buffer;
+	struct ostream *output;
+	char buf[MAX_BUFSIZE*4], randbuf[MAX_BUFSIZE];
+	unsigned int i, offset, size;
+
+	buffer = buffer_create_dynamic(default_pool, 8);
+
+	memset(buf, 0, sizeof(buf));
+
+	output = o_stream_create_buffer(buffer);
+	o_stream_cork(output);
+
+	size = (rand() % MAX_BUFSIZE) + 1;
+	random_fill_weak(randbuf, size);
+	memcpy(buf, randbuf, size);
+	test_assert(o_stream_send(output, buf, size) > 0);
+
+	for (i = 0; i < 10; i++) {
+		offset = rand() % (MAX_BUFSIZE*3);
+		size = (rand() % MAX_BUFSIZE) + 1;
+		random_fill_weak(randbuf, size);
+		memcpy(buf + offset, randbuf, size);
+		test_assert(o_stream_pwrite(output, randbuf, size, offset) == 0);
+		if (rand() % 10 == 0)
+			test_assert(o_stream_flush(output) > 0);
+	}
+
+	test_assert(o_stream_flush(output) > 0);
+	o_stream_uncork(output);
+
+	i_assert(buffer->used <= MAX_BUFSIZE*4);
+	test_assert(memcmp(buf, buffer->data, buffer->used) == 0);
+
+	o_stream_unref(&output);
+	buffer_free(&buffer);
+}
+
+static void test_ostream_buffer_random(void)
+{
+	unsigned int i;
+
+	test_begin("ostream buffer pwrite random");
+	for (i = 0; i < 100; i++) T_BEGIN {
+		test_ostream_buffer_random_once();
+	} T_END;
+	test_end();
+}
+
+static void test_ostream_buffer_size(void)
+{
+	struct ostream *output;
+	string_t *str = t_str_new(64);
+
+	test_begin("ostream buffer size/available");
+	output = o_stream_create_buffer(str);
+	test_assert(o_stream_get_buffer_used_size(output) == 0);
+	test_assert(o_stream_get_buffer_avail_size(output) == (size_t)-1);
+
+	/* test shrinking sink's max buffer size */
+	o_stream_set_max_buffer_size(output, 10);
+	test_assert(o_stream_get_buffer_used_size(output) == 0);
+	test_assert(o_stream_get_buffer_avail_size(output) == 10);
+
+	/* partial send */
+	const char *partial_input = "01234567890123456789";
+	ssize_t ret = o_stream_send_str(output, partial_input);
+	test_assert(ret == 10);
+	test_assert(o_stream_get_buffer_used_size(output) == 10);
+	test_assert(o_stream_get_buffer_avail_size(output) == 0);
+	
+	/* increase max buffer size so that it can hold the whole message */
+	o_stream_set_max_buffer_size(output, 100);
+	test_assert(o_stream_get_buffer_used_size(output) == 10);
+	test_assert(o_stream_get_buffer_avail_size(output) == 90);
+
+	/* send the rest */
+	ret += o_stream_send_str(output, partial_input + ret);
+	test_assert(ret == (ssize_t)strlen(partial_input));
+	test_assert(output->offset == str_len(str));
+	test_assert(o_stream_get_buffer_used_size(output) == 20);
+	test_assert(o_stream_get_buffer_avail_size(output) == 80);
+
+	/* check buffered data */
+	test_assert(strcmp(str_c(str), partial_input) == 0);
+
+	o_stream_unref(&output);
+
+	test_end();
+}
+
+void test_ostream_buffer(void)
+{
+	test_ostream_buffer_random();
+	test_ostream_buffer_size();
+}