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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }