blob: 3b3a4a9513939155541acbdde941b4dd365e280d [file] [log] [blame]
Jeremy Kerrc9775ce2017-02-07 16:25:34 +08001
2struct rb_test_ctx {
Andrew Jefferya72711a2023-04-18 18:19:41 +09303 struct ringbuffer_consumer *rbc;
4 bool ignore_poll;
5 bool force_only;
6 int count;
7 uint8_t *data;
Andrew Jeffery5c359cc2023-04-18 22:50:07 +09308 size_t len;
Jeremy Kerrc9775ce2017-02-07 16:25:34 +08009};
10
11void ringbuffer_test_context_init(struct rb_test_ctx *ctx)
12{
13 ctx->count = 0;
14 ctx->data = NULL;
15 ctx->len = 0;
16 ctx->ignore_poll = false;
17 ctx->force_only = false;
18}
19
20void ringbuffer_test_context_fini(struct rb_test_ctx *ctx)
21{
22 free(ctx->data);
23}
24
Andrew Jefferya72711a2023-04-18 18:19:41 +093025enum ringbuffer_poll_ret ringbuffer_poll_nop(void *data __attribute__((unused)),
26 size_t force_len
27 __attribute__((unused)))
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080028{
29 return RINGBUFFER_POLL_OK;
30}
31
32enum ringbuffer_poll_ret ringbuffer_poll_append_all(void *data,
Andrew Jefferya72711a2023-04-18 18:19:41 +093033 size_t force_len)
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080034{
35 struct rb_test_ctx *ctx = data;
Andrew Jefferyb70f8712023-04-19 12:53:34 +093036 size_t len;
37 size_t total_len;
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080038 uint8_t *buf;
39
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093040 if (ctx->ignore_poll) {
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080041 return RINGBUFFER_POLL_OK;
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093042 }
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080043
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093044 if (ctx->force_only && !force_len) {
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080045 return RINGBUFFER_POLL_OK;
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093046 }
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080047
48 ctx->count++;
49
50 total_len = 0;
51 for (;;) {
52 len = ringbuffer_dequeue_peek(ctx->rbc, total_len, &buf);
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093053 if (!len) {
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080054 break;
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093055 }
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080056
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093057 if (ctx->force_only && total_len + len > force_len) {
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080058 len = force_len - total_len;
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093059 }
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080060
61 ctx->data = realloc(ctx->data, ctx->len + len);
62 memcpy(ctx->data + ctx->len, buf, len);
63 ctx->len += len;
64 total_len += len;
65
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093066 if (ctx->force_only && total_len >= force_len) {
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080067 break;
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093068 }
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080069 }
70 ringbuffer_dequeue_commit(ctx->rbc, total_len);
71
72 return RINGBUFFER_POLL_OK;
73}
74
75void ringbuffer_dump(struct ringbuffer *rb)
76{
77 struct ringbuffer_consumer *rbc;
Andrew Jeffery8f548f62023-04-18 11:48:49 +093078 size_t i;
79 int j;
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080080
81 printf("---- ringbuffer (%d consumer%s)\n", rb->n_consumers,
Andrew Jefferya72711a2023-04-18 18:19:41 +093082 rb->n_consumers == 1 ? "" : "s");
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080083
84 for (i = 0; i < rb->size; i++) {
85 bool has_consumer = false;
86 const char *prefix = "";
87
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093088 if (rb->tail == i) {
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080089 prefix = "tail=>";
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093090 }
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080091
92 printf("%6s %02x", prefix, rb->buf[i]);
93 for (j = 0; j < rb->n_consumers; j++) {
94 rbc = rb->consumers[j];
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093095 if (rbc->pos != i) {
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080096 continue;
Andrew Jeffery2834c5b2023-04-19 12:47:09 +093097 }
98 if (!has_consumer) {
Jeremy Kerrc9775ce2017-02-07 16:25:34 +080099 printf(" <=");
Andrew Jeffery2834c5b2023-04-19 12:47:09 +0930100 }
Jeremy Kerrc9775ce2017-02-07 16:25:34 +0800101 printf("c[%d],len=%zd ", j, ringbuffer_len(rbc));
102 has_consumer = true;
103 }
104 printf("\n");
105 }
106}