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