libbsock/test.c

193 lines
5.7 KiB
C

#include <assert.h>
#include <errno.h>
#include "bsock.h"
#include "ringbuf.h"
static int
ringbuf_verify(struct bsock_ringbuf *buf, char *start, size_t sz)
{
int ret = 1;
ret = ret && (start == buf->start);
ret = ret && (buf->sz == sz);
if (buf->start <= buf->end) {
ret = ret && (buf->end - buf->start == (int)sz);
} else {
ret = ret && (buf->start - buf->end == (int)(buf->max_sz - sz));
}
return ret;
}
static void
assert_write(struct bsock_ringbuf *rbuf, void *ctx, struct bsock_ringbuf_io *io, char *buf,
size_t sz)
{
char *start = rbuf->start;
size_t ssz = rbuf->sz;
assert(bsock_ringbuf_write(rbuf, ctx, io, buf, sz) == (int)sz);
assert(ringbuf_verify(rbuf, start, ssz + sz));
}
static void
assert_read(struct bsock_ringbuf *rbuf, char *buf, size_t sz)
{
char *start = rbuf->start;
size_t ssz = rbuf->sz;
assert(bsock_ringbuf_read(rbuf, buf, sz) == (int)(sz));
if (start + sz > rbuf->buf + rbuf->max_sz) {
start = start + sz - rbuf->max_sz;
} else {
start = start + sz;
}
assert(ringbuf_verify(rbuf, start, ssz - sz));
}
static void
rbuf_set(struct bsock_ringbuf *rbuf, char *start, size_t sz)
{
rbuf->start = start;
rbuf->sz = sz;
rbuf->end = start + sz;
if (rbuf->end > rbuf->start + rbuf->max_sz) {
rbuf->end = rbuf->end - rbuf->max_sz;
}
}
void
bsock_test(void)
{
struct bsock_ringbuf rbuf;
struct bsock_ringbuf_io io = bsock_io_posix();
char *buf = malloc(1024);
char *sbuf = malloc(1024);
for (int i = 0; i < 1024; i++) {
sbuf[i] = rand() % 256;
}
char *buf3 = malloc(1024);
printf("ringbuf - read/write [128]\n");
memset(buf3, 0, 1024);
bsock_ringbuf_init(&rbuf, buf, 1024);
assert_write(&rbuf, NULL, NULL, sbuf, 128);
assert_read(&rbuf, buf3, 128);
assert(memcmp(sbuf, buf3, 128) == 0);
printf("ringbuf - read overflow\n");
memset(buf3, 0, 1024);
bsock_ringbuf_init(&rbuf, buf, 1024);
assert_write(&rbuf, NULL, NULL, sbuf, 128);
assert(bsock_ringbuf_read(&rbuf, buf3, 129) == 128);
printf("ringbuf - read/write [1024]\n");
memset(buf3, 0, 1024);
bsock_ringbuf_init(&rbuf, buf, 1024);
assert_write(&rbuf, NULL, NULL, sbuf, 1024);
assert_read(&rbuf, buf3, 1024);
assert(memcmp(sbuf, buf3, 128) == 0);
printf("ringbuf - read/write [mid]\n");
memset(buf3, 0, 1024);
bsock_ringbuf_init(&rbuf, buf, 1024);
rbuf_set(&rbuf, buf + 256, 0);
assert_write(&rbuf, NULL, NULL, sbuf, 256);
assert_read(&rbuf, buf3, 256);
assert(memcmp(sbuf, buf3, 256) == 0);
printf("ringbuf - read/write [wrapping + small]\n");
memset(buf3, 0, 1024);
bsock_ringbuf_init(&rbuf, buf, 1024);
rbuf_set(&rbuf, buf + 768, 0);
assert_write(&rbuf, NULL, NULL, sbuf, 512);
assert(memcmp(buf + 768, sbuf, 256) == 0);
assert(memcmp(buf, sbuf + 256, 512 - 256) == 0);
assert_read(&rbuf, buf3, 128);
assert(memcmp(sbuf, buf3, 128) == 0);
printf("ringbuf - read/write [wrapping]\n");
memset(buf3, 0, 1024);
bsock_ringbuf_init(&rbuf, buf, 1024);
rbuf_set(&rbuf, buf + 768, 0);
assert_write(&rbuf, NULL, NULL, sbuf, 512);
assert_read(&rbuf, buf3, 512);
assert(memcmp(sbuf, buf3, 512) == 0);
int pipes[2];
printf("ringbuf - write overflow\n");
assert(pipe(pipes) == 0);
memset(buf3, 0, 1024);
bsock_ringbuf_init(&rbuf, buf, 1024);
assert_write(&rbuf, (void *)(uintptr_t)pipes[1], &io, sbuf, 768);
assert(bsock_ringbuf_write(&rbuf, (void *)(uintptr_t)pipes[1], &io, sbuf, 512) == 512);
assert(ringbuf_verify(&rbuf, buf + 768, 512));
assert(read(pipes[0], buf3, 768) == 768);
assert(memcmp(sbuf, buf3, 768) == 0);
assert_read(&rbuf, buf3, 512);
assert(memcmp(sbuf, buf3, 512) == 0);
printf("ringbuf - write large\n");
assert(pipe(pipes) == 0);
memset(buf3, 0, 1024);
bsock_ringbuf_init(&rbuf, buf, 768);
assert_write(&rbuf, (void *)(uintptr_t)pipes[1], &io, sbuf, 512);
assert(bsock_ringbuf_write(&rbuf, (void *)(uintptr_t)pipes[1], &io, sbuf, 1024) == 1024);
assert(read(pipes[0], buf3, 512) == 512);
assert(memcmp(sbuf, buf3, 512) == 0);
assert(read(pipes[0], buf3, 1024) == 1024);
assert(memcmp(sbuf, buf3, 1024) == 0);
assert(ringbuf_verify(&rbuf, buf + 512, 0));
printf("ringbuf - write no buffering\n");
assert(pipe(pipes) == 0);
memset(buf3, 0, 1024);
bsock_ringbuf_init(&rbuf, NULL, 0);
assert(bsock_ringbuf_write(&rbuf, (void *)(uintptr_t)pipes[1], &io, sbuf, 1024) == 1024);
assert(read(pipes[0], buf3, 1024) == 1024);
assert(memcmp(sbuf, buf3, 1024) == 0);
assert(ringbuf_verify(&rbuf, NULL, 0));
printf("ringbuf - poll/flush fp\n");
assert(pipe(pipes) == 0);
assert(write(pipes[0], sbuf, 512) == 512);
bsock_ringbuf_init(&rbuf, buf, 1024);
assert(bsock_ringbuf_poll(&rbuf, (void *)(uintptr_t)pipes[1], &io, 566) == 512);
assert(ringbuf_verify(&rbuf, buf, 512));
assert(bsock_ringbuf_flush(&rbuf, (void *)(uintptr_t)pipes[1], &io, 500) == 500);
assert(ringbuf_verify(&rbuf, buf + 500, 12));
assert(read(pipes[0], buf3, 500) == 500);
assert(memcmp(sbuf, buf3, 500) == 0);
printf("ringbuf - poll fp [wrapping]\n");
assert(pipe(pipes) == 0);
assert(write(pipes[0], sbuf, 512) == 512);
bsock_ringbuf_init(&rbuf, buf, 1024);
rbuf_set(&rbuf, buf + 768, 0);
assert(bsock_ringbuf_poll(&rbuf, (void *)(uintptr_t)pipes[1], &io, 512) == 512);
assert(ringbuf_verify(&rbuf, buf + 768, 512));
assert_read(&rbuf, buf3, 512);
assert(memcmp(sbuf, buf3, 512) == 0);
printf("ringbuf - flush fp [wrapping]\n");
assert(pipe(pipes) == 0);
assert(write(pipes[0], sbuf, 512) == 512);
bsock_ringbuf_init(&rbuf, buf, 1024);
rbuf_set(&rbuf, buf + 768, 0);
assert_write(&rbuf, (void *)(uintptr_t)pipes[1], &io, sbuf, 512);
assert(bsock_ringbuf_flush(&rbuf, (void *)(uintptr_t)pipes[1], &io, 512) == 512);
assert(ringbuf_verify(&rbuf, buf + 256, 0));
assert(read(pipes[0], buf3, 512) == 512);
assert(memcmp(sbuf, buf3, 512) == 0);
}
int
main(void)
{
printf("Starting tests...\n");
bsock_test();
printf("Tests done!\n");
return 0;
}