示例#1
0
文件: test-iobuf.c 项目: afett/iobuf
static void test_one_byte()
{
	struct iobuf *buf = iobuf_new();

	iobuf_reserve(buf, 1);
	TEST_ASSERT(iobuf_rstart(buf) != NULL);
	TEST_ASSERT(iobuf_rsize(buf) == 0);
	TEST_ASSERT(iobuf_wstart(buf) != NULL);
	TEST_ASSERT(iobuf_wsize(buf) == 1);

	*((char *)iobuf_wstart(buf)) = 42;
	iobuf_fill(buf, 1);
	TEST_ASSERT(iobuf_rstart(buf) != NULL);
	TEST_ASSERT(iobuf_rsize(buf) == 1);
	TEST_ASSERT(iobuf_wstart(buf) != NULL);
	TEST_ASSERT(iobuf_wsize(buf) == 0);

	TEST_ASSERT(*((char *)iobuf_rstart(buf)) == 42);
	iobuf_drain(buf, 1);

	TEST_ASSERT(iobuf_rstart(buf) != NULL);
	TEST_ASSERT(iobuf_rsize(buf) == 0);
	TEST_ASSERT(iobuf_wstart(buf) != NULL);
	TEST_ASSERT(iobuf_wsize(buf) == 1);

	iobuf_free(buf);
}
示例#2
0
文件: test-iobuf.c 项目: afett/iobuf
static void test_random_access()
{
	struct fake_fd fd;
	fake_fd_init(&fd);
	char out[sizeof(fd.in)];
	memset(out, 0, sizeof(out));

	size_t read = 0;
	struct iobuf *buf = iobuf_new();
	for (;;) {
		iobuf_reserve(buf, 1024);
		TEST_ASSERT(iobuf_wsize(buf) >= 1024);
		ssize_t ret = fake_read(&fd, iobuf_wstart(buf), 1024);
		if (ret == 0) {
			break;
		}

		TEST_ASSERT(ret);
		read += ret;
	}

	TEST_ASSERT_EQUAL(sizeof(fd.in), read);

	iobuf_free(buf);
}
示例#3
0
文件: test-iobuf.c 项目: afett/iobuf
static void test_empty()
{
	struct iobuf *buf = iobuf_new();
	TEST_ASSERT(iobuf_rstart(buf) == NULL);
	TEST_ASSERT(iobuf_rsize(buf) == 0);
	TEST_ASSERT(iobuf_wstart(buf) == NULL);
	TEST_ASSERT(iobuf_wsize(buf) == 0);

	iobuf_drain(buf, 0);
	TEST_ASSERT(iobuf_rstart(buf) == NULL);
	TEST_ASSERT(iobuf_rsize(buf) == 0);
	TEST_ASSERT(iobuf_wstart(buf) == NULL);
	TEST_ASSERT(iobuf_wsize(buf) == 0);

	iobuf_reserve(buf, 0);
	TEST_ASSERT(iobuf_rstart(buf) == NULL);
	TEST_ASSERT(iobuf_rsize(buf) == 0);
	TEST_ASSERT(iobuf_wstart(buf) == NULL);
	TEST_ASSERT(iobuf_wsize(buf) == 0);

	iobuf_fill(buf, 0);
	TEST_ASSERT(iobuf_rstart(buf) == NULL);
	TEST_ASSERT(iobuf_rsize(buf) == 0);
	TEST_ASSERT(iobuf_wstart(buf) == NULL);
	TEST_ASSERT(iobuf_wsize(buf) == 0);

	iobuf_free(buf);
}
示例#4
0
文件: test-iobuf.c 项目: afett/iobuf
static void test_grow()
{
	struct iobuf *buf = iobuf_new();

	for (size_t i = 0; i < 4096; ++i) {
		iobuf_reserve(buf, i);
		TEST_ASSERT(iobuf_wsize(buf) == i);
	}

	for (size_t i = 4096; i != 0; --i) {
		iobuf_reserve(buf, i);
		TEST_ASSERT(iobuf_wsize(buf) == 4096);
	}

	iobuf_free(buf);
}
示例#5
0
文件: test-iobuf.c 项目: afett/iobuf
static void test_reserved()
{
	struct iobuf *buf = iobuf_new();
	iobuf_reserve(buf, 4096);
	TEST_ASSERT(iobuf_wstart(buf) != NULL);
	TEST_ASSERT(iobuf_wsize(buf) == 4096);
	iobuf_free(buf);
}
示例#6
0
文件: test-iobuf.c 项目: afett/iobuf
static void test_reclaim_full()
{
	struct iobuf *buf = iobuf_new();
	iobuf_reserve(buf, 4096);
	TEST_ASSERT(iobuf_wsize(buf) == 4096);
	memset(iobuf_wstart(buf), 1, 4096);
	iobuf_fill(buf, 4096);
	TEST_ASSERT(iobuf_wsize(buf) == 0);
	TEST_ASSERT(iobuf_rsize(buf) == 4096);
	TEST_ASSERT(memneq(iobuf_rstart(buf), 1, iobuf_rsize(buf)));
	iobuf_drain(buf, 2048);
	TEST_ASSERT(iobuf_wsize(buf) == 0);
	TEST_ASSERT(iobuf_rsize(buf) == 2048);
	iobuf_reserve(buf, 2048);
	TEST_ASSERT(iobuf_wsize(buf) == 2048);
	TEST_ASSERT(iobuf_rsize(buf) == 2048);
	TEST_ASSERT(memneq(iobuf_rstart(buf), 1, iobuf_rsize(buf)));
	iobuf_free(buf);
}
示例#7
0
文件: test-iobuf.c 项目: afett/iobuf
static void test_reclaim()
{
	struct iobuf *buf = iobuf_new();

	iobuf_reserve(buf, 4096);
	TEST_ASSERT(iobuf_wsize(buf) == 4096);
	memset(iobuf_wstart(buf), 1, 2048);
	iobuf_fill(buf, 2048);
	TEST_ASSERT(iobuf_wsize(buf) == 2048);
	TEST_ASSERT(iobuf_rsize(buf) == 2048);
	TEST_ASSERT(memneq(iobuf_rstart(buf), 1, iobuf_rsize(buf)));
	iobuf_drain(buf, 1024);
	TEST_ASSERT_EQUAL(2048, iobuf_wsize(buf));
	TEST_ASSERT_EQUAL(1024, iobuf_rsize(buf));
	iobuf_reserve(buf, 4096);
	TEST_ASSERT_EQUAL(4096, iobuf_wsize(buf));
	TEST_ASSERT_EQUAL(1024, iobuf_rsize(buf));
	TEST_ASSERT(memneq(iobuf_rstart(buf), 1, iobuf_rsize(buf)));

	iobuf_free(buf);
}
示例#8
0
文件: iobuf.c 项目: Drustan/OpenSMTPD
int
iobuf_queue(struct iobuf *io, const void *data, size_t len)
{
	void	*buf;

	if (len == 0)
		return (0);

	if ((buf = iobuf_reserve(io, len)) == NULL)
		return (-1);

	memmove(buf, data, len);

	return (0);
}
示例#9
0
文件: test-iobuf.c 项目: afett/iobuf
static void test_fill_drain()
{
	struct iobuf *buf = iobuf_new();

	iobuf_reserve(buf, 4096);
	TEST_ASSERT(iobuf_wsize(buf) == 4096);

	iobuf_fill(buf, 2048);
	TEST_ASSERT(iobuf_wsize(buf) == 2048);
	TEST_ASSERT(iobuf_rsize(buf) == 2048);
	iobuf_reserve(buf, 4096);
	TEST_ASSERT(iobuf_wsize(buf) == 4096);
	TEST_ASSERT(iobuf_rsize(buf) == 2048);
	iobuf_fill(buf, 2048);
	TEST_ASSERT(iobuf_wsize(buf) == 2048);
	TEST_ASSERT(iobuf_rsize(buf) == 4096);
	iobuf_drain(buf, 2048);
	TEST_ASSERT_EQUAL(2048, iobuf_wsize(buf));
	TEST_ASSERT(iobuf_rsize(buf) == 2048);
	iobuf_drain(buf, 2048);
	TEST_ASSERT_EQUAL(4096 + 2048, iobuf_wsize(buf));

	iobuf_free(buf);
}
示例#10
0
文件: iobuf.c 项目: Drustan/OpenSMTPD
int
iobuf_queuev(struct iobuf *io, const struct iovec *iov, int iovcnt)
{
	int	 i;
	size_t	 len = 0;
	char	*buf;

	for (i = 0; i < iovcnt; i++)
		len += iov[i].iov_len;

	if ((buf = iobuf_reserve(io, len)) == NULL)
		return (-1);

	for (i = 0; i < iovcnt; i++) {
		if (iov[i].iov_len == 0)
			continue;
		memmove(buf, iov[i].iov_base, iov[i].iov_len);
		buf += iov[i].iov_len;
	}

	return (0);

}