1*c9775ce7SJeremy Kerr 
2*c9775ce7SJeremy Kerr #include <stdlib.h>
3*c9775ce7SJeremy Kerr #include <stdint.h>
4*c9775ce7SJeremy Kerr #include <stdio.h>
5*c9775ce7SJeremy Kerr 
6*c9775ce7SJeremy Kerr #include "ringbuffer.c"
7*c9775ce7SJeremy Kerr #include "ringbuffer-test-utils.c"
8*c9775ce7SJeremy Kerr 
9*c9775ce7SJeremy Kerr void test_boundary_read(void)
10*c9775ce7SJeremy Kerr {
11*c9775ce7SJeremy Kerr 	uint8_t *out_buf, in_buf[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
12*c9775ce7SJeremy Kerr 	struct ringbuffer_consumer *rbc;
13*c9775ce7SJeremy Kerr 	struct ringbuffer *rb;
14*c9775ce7SJeremy Kerr 	size_t len, pos;
15*c9775ce7SJeremy Kerr 	int rc;
16*c9775ce7SJeremy Kerr 
17*c9775ce7SJeremy Kerr 	assert(sizeof(in_buf) * 2 > 10);
18*c9775ce7SJeremy Kerr 
19*c9775ce7SJeremy Kerr 	rb = ringbuffer_init(10);
20*c9775ce7SJeremy Kerr 	rbc = ringbuffer_consumer_register(rb, ringbuffer_poll_nop, NULL);
21*c9775ce7SJeremy Kerr 
22*c9775ce7SJeremy Kerr 	/* queue and dequeue, so our tail is non-zero */
23*c9775ce7SJeremy Kerr 	ringbuffer_queue(rb, in_buf, sizeof(in_buf));
24*c9775ce7SJeremy Kerr 	ringbuffer_dequeue_commit(rbc, sizeof(in_buf));
25*c9775ce7SJeremy Kerr 
26*c9775ce7SJeremy Kerr 	/* ensure we're getting the second batch of data back */
27*c9775ce7SJeremy Kerr 	in_buf[0] = 'A';
28*c9775ce7SJeremy Kerr 
29*c9775ce7SJeremy Kerr 	/* the next queue should cross the end of the buffer */
30*c9775ce7SJeremy Kerr 	rc = ringbuffer_queue(rb, in_buf, sizeof(in_buf));
31*c9775ce7SJeremy Kerr 	assert(!rc);
32*c9775ce7SJeremy Kerr 
33*c9775ce7SJeremy Kerr 	/* dequeue everything we can */
34*c9775ce7SJeremy Kerr 	pos = 0;
35*c9775ce7SJeremy Kerr 	for (;;) {
36*c9775ce7SJeremy Kerr 		len = ringbuffer_dequeue_peek(rbc, pos, &out_buf);
37*c9775ce7SJeremy Kerr 		if (len == 0)
38*c9775ce7SJeremy Kerr 			break;
39*c9775ce7SJeremy Kerr 		assert(!memcmp(in_buf+pos, out_buf, len));
40*c9775ce7SJeremy Kerr 		pos += len;
41*c9775ce7SJeremy Kerr 	}
42*c9775ce7SJeremy Kerr 	assert(pos == sizeof(in_buf));
43*c9775ce7SJeremy Kerr 
44*c9775ce7SJeremy Kerr 	ringbuffer_fini(rb);
45*c9775ce7SJeremy Kerr }
46*c9775ce7SJeremy Kerr 
47*c9775ce7SJeremy Kerr int main(void)
48*c9775ce7SJeremy Kerr {
49*c9775ce7SJeremy Kerr 	test_boundary_read();
50*c9775ce7SJeremy Kerr 	return EXIT_SUCCESS;
51*c9775ce7SJeremy Kerr }
52