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