test-istream-concat.c revision 0536ccb51d41e3078c3a9fa33e509fb4b2420f95
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2009-2011 Dovecot authors, see the included COPYING file */
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen#include "test-lib.h"
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen#include "istream-private.h"
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#include "istream-concat.h"
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#include <stdlib.h>
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen#include <fcntl.h>
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen#include <unistd.h>
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenstatic void test_istream_concat_one(unsigned int buffer_size)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen{
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen static const char *input_string = "xyz";
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#define STREAM_COUNT 5
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#define STREAM_BYTES 3
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct istream *streams[STREAM_COUNT+1];
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct istream *input;
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen const unsigned char *data;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen size_t size;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen unsigned int i, j;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (i = 0; i < STREAM_COUNT; i++) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen streams[i] = test_istream_create(input_string);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen test_istream_set_allow_eof(streams[i], TRUE);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen test_istream_set_size(streams[i], 0);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen streams[i] = NULL;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen input = i_stream_create_concat(streams);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (i = 0; i/STREAM_BYTES < STREAM_COUNT; i++) {
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen test_istream_set_size(streams[i/STREAM_BYTES], (i%STREAM_BYTES) + 1);
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen test_assert(i_stream_read(input) == 1);
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen if (i < buffer_size) {
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen data = i_stream_get_data(input, &size);
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen test_assert(size == i+1);
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen } else {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_stream_skip(input, 1);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen data = i_stream_get_data(input, &size);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen test_assert(size == buffer_size);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (j = 0; j < size; j++) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen test_assert((char)data[j] == input_string[(input->v_offset + j) % STREAM_BYTES]);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_stream_unref(&input);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen}
52de839a8249bff5eace53dc1401b28baa0c124bTimo Sirainen
d4002fe1f64d25a792f76fb102ef7dc519cd4e24Martti Rannanjärvistatic void test_istream_concat_random(void)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen{
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct istream **streams, *input;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen const unsigned char *data;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen unsigned char *w_data;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen size_t size = 0;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen unsigned int i, j, offset, stream_count, data_len;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen srand(1234);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen stream_count = (rand() % 10) + 2;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen streams = t_new(struct istream *, stream_count + 1);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (i = 0, offset = 0; i < stream_count; i++) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen data_len = rand() % 100 + 1;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen w_data = t_malloc(data_len);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (j = 0; j < data_len; j++)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen w_data[j] = offset++;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen streams[i] = test_istream_create_data(w_data, data_len);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen test_istream_set_allow_eof(streams[i], TRUE);
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen streams[i] = NULL;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_assert(offset > 0);
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen input = i_stream_create_concat(streams);
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen for (i = 0; i < 100; i++) {
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen if (rand() % 3 == 0) {
98449946caeaf8a3b413a0d93128315b158cbffbTimo Sirainen i_stream_seek(input, rand() % offset);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen } else {
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen ssize_t ret = i_stream_read(input);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen if (input->v_offset + size == offset)
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen test_assert(ret < 0);
d4002fe1f64d25a792f76fb102ef7dc519cd4e24Martti Rannanjärvi else {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen test_assert(ret > 0);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen test_assert(input->v_offset + ret <= offset);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_stream_skip(input, rand() % ret);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen data = i_stream_get_data(input, &size);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (j = 0; j < size; j++) {
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen test_assert(data[j] == (input->v_offset + j) % 256);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen (void)i_stream_get_data(input, &size);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (i = 0; i < stream_count; i++)
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen i_stream_unref(&streams[i]);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen i_stream_unref(&input);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen}
804fa3f03bd9170272168a5ad214053bbe3160c7Josef 'Jeff' Sipek
df3963075d67f76ade66b6a74764f4eae31d9c87Josef 'Jeff' Sipekvoid test_istream_concat(void)
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen{
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen unsigned int i;
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainen
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen test_begin("istream concat");
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen for (i = 1; i < STREAM_BYTES*STREAM_COUNT; i++) {
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen test_istream_concat_one(i);
df3963075d67f76ade66b6a74764f4eae31d9c87Josef 'Jeff' Sipek }
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen test_end();
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen test_begin("istream concat random");
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen for (i = 0; i < 100; i++) T_BEGIN {
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen test_istream_concat_random();
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen } T_END;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen test_end();
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen}
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainen