1 
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <stdio.h>
5 
6 #include "ringbuffer.c"
7 #include "ringbuffer-test-utils.c"
8 
test_boundary_poll(void)9 void test_boundary_poll(void)
10 {
11 	uint8_t in_buf[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
12 	struct rb_test_ctx _ctx;
13 	struct rb_test_ctx *ctx = &_ctx;
14 	struct ringbuffer *rb;
15 	int rc;
16 
17 	ringbuffer_test_context_init(ctx);
18 
19 	rb = ringbuffer_init(10);
20 
21 	ctx->rbc = ringbuffer_consumer_register(rb, ringbuffer_poll_append_all,
22 						ctx);
23 
24 	/* don't consume initial data in the poll callback */
25 	ctx->ignore_poll = true;
26 
27 	/* queue and dequeue, so our tail is non-zero */
28 	ringbuffer_queue(rb, in_buf, sizeof(in_buf));
29 	ringbuffer_dequeue_commit(ctx->rbc, sizeof(in_buf));
30 
31 	/* start queueing data */
32 	ctx->ignore_poll = false;
33 
34 	/* ensure we're getting the second batch of data back */
35 	in_buf[0] = 'A';
36 
37 	rc = ringbuffer_queue(rb, in_buf, sizeof(in_buf));
38 	assert(!rc);
39 
40 	assert(ctx->count == 1);
41 	assert(ctx->len == sizeof(in_buf));
42 	assert(!memcmp(in_buf, ctx->data, ctx->len));
43 
44 	ringbuffer_fini(rb);
45 	ringbuffer_test_context_fini(ctx);
46 }
47 
main(void)48 int main(void)
49 {
50 	test_boundary_poll();
51 	return EXIT_SUCCESS;
52 }
53