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