test-buffer.c revision 5a3ed55cdafe07a2bb0acd4073a4f849cffc908b
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose/* Copyright (c) 2007-2014 Dovecot authors, see the included COPYING file */
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose#include "test-lib.h"
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose#include "buffer.h"
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose#include <stdlib.h>
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bosevoid test_buffer(void)
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose{
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose#define BUF_TEST_SIZE (1024*2)
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose#define BUF_TEST_COUNT 1000
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose buffer_t *buf;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose unsigned char *p, testdata[BUF_TEST_SIZE], shadowbuf[BUF_TEST_SIZE];
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose unsigned int i, shadowbuf_size;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose size_t pos, pos2, size;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose int test = -1;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose bool zero;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose buf = buffer_create_dynamic(default_pool, 1);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose for (i = 0; i < BUF_TEST_SIZE; i++)
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose testdata[i] = rand();
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose memset(shadowbuf, 0, sizeof(shadowbuf));
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose srand(1);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose shadowbuf_size = 0;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose for (i = 0; i < BUF_TEST_COUNT; i++) {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose if (buf->used == BUF_TEST_SIZE) {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose size = shadowbuf_size = rand() % (buf->used - 1);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose buffer_set_used_size(buf, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose memset(shadowbuf + shadowbuf_size, 0,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose BUF_TEST_SIZE - shadowbuf_size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose i_assert(buf->used < BUF_TEST_SIZE);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose }
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose test = rand() % 6;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose zero = rand() % 10 == 0;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose switch (test) {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose case 0:
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose pos = rand() % (BUF_TEST_SIZE-1);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose size = rand() % (BUF_TEST_SIZE - pos);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose if (!zero) {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose buffer_write(buf, pos, testdata, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose memcpy(shadowbuf + pos, testdata, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose } else {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose buffer_write_zero(buf, pos, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose memset(shadowbuf + pos, 0, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose }
e7e61c777e13e0bb07d29b5d1b53e21ca199bf0fJakub Hrozek if (pos + size > shadowbuf_size)
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose shadowbuf_size = pos + size;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose break;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose case 1:
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose size = rand() % (BUF_TEST_SIZE - buf->used);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose if (!zero) {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose buffer_append(buf, testdata, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose memcpy(shadowbuf + shadowbuf_size,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose testdata, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose } else {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose buffer_append_zero(buf, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose memset(shadowbuf + shadowbuf_size, 0, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose }
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose shadowbuf_size += size;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose break;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose case 2:
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose pos = rand() % (BUF_TEST_SIZE-1);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose size = rand() % (BUF_TEST_SIZE - I_MAX(buf->used, pos));
e7e61c777e13e0bb07d29b5d1b53e21ca199bf0fJakub Hrozek if (!zero) {
e7e61c777e13e0bb07d29b5d1b53e21ca199bf0fJakub Hrozek buffer_insert(buf, pos, testdata, size);
e7e61c777e13e0bb07d29b5d1b53e21ca199bf0fJakub Hrozek memmove(shadowbuf + pos + size,
e7e61c777e13e0bb07d29b5d1b53e21ca199bf0fJakub Hrozek shadowbuf + pos,
e7e61c777e13e0bb07d29b5d1b53e21ca199bf0fJakub Hrozek BUF_TEST_SIZE - (pos + size));
e7e61c777e13e0bb07d29b5d1b53e21ca199bf0fJakub Hrozek memcpy(shadowbuf + pos, testdata, size);
e7e61c777e13e0bb07d29b5d1b53e21ca199bf0fJakub Hrozek } else {
e7e61c777e13e0bb07d29b5d1b53e21ca199bf0fJakub Hrozek buffer_insert_zero(buf, pos, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose memmove(shadowbuf + pos + size,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose shadowbuf + pos,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose BUF_TEST_SIZE - (pos + size));
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose memset(shadowbuf + pos, 0, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose }
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose if (pos < shadowbuf_size)
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose shadowbuf_size += size;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose else
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose shadowbuf_size = pos + size;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose break;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose case 3:
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose pos = rand() % (BUF_TEST_SIZE-1);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose size = rand() % (BUF_TEST_SIZE - pos);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose buffer_delete(buf, pos, size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose if (pos < shadowbuf_size) {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose if (pos + size > shadowbuf_size)
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose size = shadowbuf_size - pos;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose memmove(shadowbuf + pos,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose shadowbuf + pos + size,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose BUF_TEST_SIZE - (pos + size));
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose shadowbuf_size -= size;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose memset(shadowbuf + shadowbuf_size, 0,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose BUF_TEST_SIZE - shadowbuf_size);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose }
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose break;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose case 4:
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose if (shadowbuf_size == 0)
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose break;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose pos = rand() % (shadowbuf_size-1); /* dest */
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose pos2 = rand() % (shadowbuf_size-1); /* source */
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose size = rand() % (shadowbuf_size - I_MAX(pos, pos2));
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose buffer_copy(buf, pos, buf, pos2, size);
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose memmove(shadowbuf + pos,
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose shadowbuf + pos2, size);
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose if (pos > pos2 && pos + size > shadowbuf_size)
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose shadowbuf_size = pos + size;
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose break;
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose case 5:
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose pos = rand() % (BUF_TEST_SIZE-1);
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose size = rand() % (BUF_TEST_SIZE - pos);
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose p = buffer_get_space_unsafe(buf, pos, size);
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose memcpy(p, testdata, size);
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose memcpy(shadowbuf + pos, testdata, size);
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose if (pos + size > shadowbuf_size)
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose shadowbuf_size = pos + size;
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose break;
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose }
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose i_assert(shadowbuf_size <= BUF_TEST_SIZE);
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose if (buf->used != shadowbuf_size ||
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose memcmp(buf->data, shadowbuf, buf->used) != 0)
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose break;
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose }
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose if (i == BUF_TEST_COUNT)
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose test_out("buffer", TRUE);
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose else {
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose test_out_reason("buffer", FALSE,
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose t_strdup_printf("round %u test %d failed", i, test));
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose }
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose buffer_free(&buf);
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose}
6cdeb0923c16e3fafe21aaadca6dac1d71474c31Sumit Bose