23#include <freerdp/utils/ringbuffer.h>
25static BOOL test_overlaps(
void)
33 for (
size_t i = 0; i <
sizeof(bytes); i++)
36 if (!ringbuffer_init(&rb, 5))
38 if (!ringbuffer_write(&rb, bytes, 4))
41 ringbuffer_commit_read_bytes(&rb, 2);
43 if (!ringbuffer_write(&rb, &bytes[counter], 2))
47 nchunks = ringbuffer_peek(&rb, chunks, 4);
48 if (nchunks != 2 || chunks[0].size != 3 || chunks[1].size != 1)
51 for (
int x = 0, j = 2; x < nchunks; x++)
53 for (
size_t k = 0; k < chunks[x].size; k++, j++)
55 if (chunks[x].data[k] != (BYTE)j)
60 ringbuffer_commit_read_bytes(&rb, 3);
61 if (ringbuffer_used(&rb) != 1)
64 if (!ringbuffer_write(&rb, &bytes[counter], 6))
67 ringbuffer_commit_read_bytes(&rb, 6);
68 nchunks = ringbuffer_peek(&rb, chunks, 10);
69 if (nchunks != 1 || chunks[0].size != 1 || (*chunks[0].data != 0xb))
72 if (ringbuffer_capacity(&rb) != 5)
75 ringbuffer_destroy(&rb);
78 ringbuffer_destroy(&rb);
82int TestRingBuffer(
int argc,
char* argv[])
86 BYTE* tmpBuf =
nullptr;
87 BYTE* rb_ptr =
nullptr;
93 if (!ringbuffer_init(&ringBuffer, 10))
95 (void)fprintf(stderr,
"unable to initialize ringbuffer\n");
99 tmpBuf = (BYTE*)malloc(50);
103 for (
int i = 0; i < 50; i++)
106 (void)fprintf(stderr,
"%d: basic tests...", ++testNo);
107 if (!ringbuffer_write(&ringBuffer, tmpBuf, 5) || !ringbuffer_write(&ringBuffer, tmpBuf, 5) ||
108 !ringbuffer_write(&ringBuffer, tmpBuf, 5))
110 (void)fprintf(stderr,
"error when writing bytes\n");
114 if (ringbuffer_used(&ringBuffer) != 15)
116 (void)fprintf(stderr,
"invalid used size got %" PRIuz
" when I would expect 15\n",
117 ringbuffer_used(&ringBuffer));
121 if (ringbuffer_peek(&ringBuffer, chunks, 10) != 1 || chunks[0].size != 10)
123 (void)fprintf(stderr,
"error when reading bytes\n");
126 ringbuffer_commit_read_bytes(&ringBuffer, chunks[0].size);
129 for (
size_t i = 0; i < chunks[0].size; i++)
131 if (chunks[0].data[i] != i % 5)
133 (void)fprintf(stderr,
134 "invalid byte at %" PRIuz
", got %" PRIu8
" instead of %" PRIuz
"\n", i,
135 chunks[0].data[i], i % 5U);
140 if (ringbuffer_used(&ringBuffer) != 5)
142 (void)fprintf(stderr,
"invalid used size after read got %" PRIuz
" when I would expect 5\n",
143 ringbuffer_used(&ringBuffer));
148 if (!ringbuffer_write(&ringBuffer, tmpBuf, 6) ||
149 ringbuffer_peek(&ringBuffer, chunks, 11) != 2 || chunks[0].size != 10 ||
152 (void)fprintf(stderr,
"invalid read of split data\n");
156 ringbuffer_commit_read_bytes(&ringBuffer, 11);
157 (void)fprintf(stderr,
"ok\n");
159 (void)fprintf(stderr,
"%d: peek with nothing to read...", ++testNo);
160 if (ringbuffer_peek(&ringBuffer, chunks, 10))
162 (void)fprintf(stderr,
"peek returns some chunks\n");
165 (void)fprintf(stderr,
"ok\n");
167 (void)fprintf(stderr,
"%d: ensure_linear_write / read() shouldn't grow...", ++testNo);
168 for (
int i = 0; i < 1000; i++)
170 rb_ptr = ringbuffer_ensure_linear_write(&ringBuffer, 50);
173 (void)fprintf(stderr,
"ringbuffer_ensure_linear_write() error\n");
177 memcpy(rb_ptr, tmpBuf, 50);
179 if (!ringbuffer_commit_written_bytes(&ringBuffer, 50))
181 (void)fprintf(stderr,
"ringbuffer_commit_written_bytes() error, i=%d\n", i);
188 for (
int i = 0; i < 1000; i++)
189 ringbuffer_commit_read_bytes(&ringBuffer, 25);
191 for (
int i = 0; i < 1000; i++)
192 ringbuffer_commit_read_bytes(&ringBuffer, 25);
194 if (ringbuffer_capacity(&ringBuffer) != 10)
196 (void)fprintf(stderr,
"not the expected capacity, have %" PRIuz
" and expects 10\n",
197 ringbuffer_capacity(&ringBuffer));
200 (void)fprintf(stderr,
"ok\n");
202 (void)fprintf(stderr,
"%d: free size is correctly computed...", ++testNo);
203 for (
int i = 0; i < 1000; i++)
205 if (!ringbuffer_ensure_linear_write(&ringBuffer, 50))
208 if (!ringbuffer_commit_written_bytes(&ringBuffer, 50))
210 (void)fprintf(stderr,
"ringbuffer_commit_written_bytes() error, i=%d\n", i);
214 ringbuffer_commit_read_bytes(&ringBuffer, 50ULL * 1000ULL);
215 (void)fprintf(stderr,
"ok\n");
217 ringbuffer_destroy(&ringBuffer);
219 (void)fprintf(stderr,
"%d: specific overlaps test...", ++testNo);
220 if (!test_overlaps())
222 (void)fprintf(stderr,
"ko\n");
225 (void)fprintf(stderr,
"ok\n");
227 ringbuffer_destroy(&ringBuffer);
a piece of data in the ring buffer, exactly like a glibc iovec