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_read(void)9c9775ce7SJeremy Kerr void test_boundary_read(void)
10c9775ce7SJeremy Kerr {
11*b70f8713SAndrew Jeffery uint8_t *out_buf;
12*b70f8713SAndrew Jeffery uint8_t in_buf[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
13c9775ce7SJeremy Kerr struct ringbuffer_consumer *rbc;
14c9775ce7SJeremy Kerr struct ringbuffer *rb;
15*b70f8713SAndrew Jeffery size_t len;
16*b70f8713SAndrew Jeffery size_t pos;
17c9775ce7SJeremy Kerr int rc;
18c9775ce7SJeremy Kerr
194ee419dfSAndrew Jeffery static_assert(sizeof(in_buf) * 2 > 10, "");
20c9775ce7SJeremy Kerr
21c9775ce7SJeremy Kerr rb = ringbuffer_init(10);
22c9775ce7SJeremy Kerr rbc = ringbuffer_consumer_register(rb, ringbuffer_poll_nop, NULL);
23c9775ce7SJeremy Kerr
24c9775ce7SJeremy Kerr /* queue and dequeue, so our tail is non-zero */
25c9775ce7SJeremy Kerr ringbuffer_queue(rb, in_buf, sizeof(in_buf));
26c9775ce7SJeremy Kerr ringbuffer_dequeue_commit(rbc, sizeof(in_buf));
27c9775ce7SJeremy Kerr
28c9775ce7SJeremy Kerr /* ensure we're getting the second batch of data back */
29c9775ce7SJeremy Kerr in_buf[0] = 'A';
30c9775ce7SJeremy Kerr
31c9775ce7SJeremy Kerr /* the next queue should cross the end of the buffer */
32c9775ce7SJeremy Kerr rc = ringbuffer_queue(rb, in_buf, sizeof(in_buf));
33c9775ce7SJeremy Kerr assert(!rc);
34c9775ce7SJeremy Kerr
35c9775ce7SJeremy Kerr /* dequeue everything we can */
36c9775ce7SJeremy Kerr pos = 0;
37c9775ce7SJeremy Kerr for (;;) {
38c9775ce7SJeremy Kerr len = ringbuffer_dequeue_peek(rbc, pos, &out_buf);
392834c5b1SAndrew Jeffery if (len == 0) {
40c9775ce7SJeremy Kerr break;
412834c5b1SAndrew Jeffery }
42c9775ce7SJeremy Kerr assert(!memcmp(in_buf + pos, out_buf, len));
43c9775ce7SJeremy Kerr pos += len;
44c9775ce7SJeremy Kerr }
45c9775ce7SJeremy Kerr assert(pos == sizeof(in_buf));
46c9775ce7SJeremy Kerr
47c9775ce7SJeremy Kerr ringbuffer_fini(rb);
48c9775ce7SJeremy Kerr }
49c9775ce7SJeremy Kerr
main(void)50c9775ce7SJeremy Kerr int main(void)
51c9775ce7SJeremy Kerr {
52c9775ce7SJeremy Kerr test_boundary_read();
53c9775ce7SJeremy Kerr return EXIT_SUCCESS;
54c9775ce7SJeremy Kerr }
55