1c9775ce7SJeremy Kerr 
2c9775ce7SJeremy Kerr struct rb_test_ctx {
3c9775ce7SJeremy Kerr 	struct ringbuffer_consumer *rbc;
4c9775ce7SJeremy Kerr 	bool ignore_poll;
5c9775ce7SJeremy Kerr 	bool force_only;
6c9775ce7SJeremy Kerr 	int count;
7c9775ce7SJeremy Kerr 	uint8_t *data;
85c359cc6SAndrew Jeffery 	size_t len;
9c9775ce7SJeremy Kerr };
10c9775ce7SJeremy Kerr 
11c9775ce7SJeremy Kerr void ringbuffer_test_context_init(struct rb_test_ctx *ctx)
12c9775ce7SJeremy Kerr {
13c9775ce7SJeremy Kerr 	ctx->count = 0;
14c9775ce7SJeremy Kerr 	ctx->data = NULL;
15c9775ce7SJeremy Kerr 	ctx->len = 0;
16c9775ce7SJeremy Kerr 	ctx->ignore_poll = false;
17c9775ce7SJeremy Kerr 	ctx->force_only = false;
18c9775ce7SJeremy Kerr }
19c9775ce7SJeremy Kerr 
20c9775ce7SJeremy Kerr void ringbuffer_test_context_fini(struct rb_test_ctx *ctx)
21c9775ce7SJeremy Kerr {
22c9775ce7SJeremy Kerr 	free(ctx->data);
23c9775ce7SJeremy Kerr }
24c9775ce7SJeremy Kerr 
25a72711afSAndrew Jeffery enum ringbuffer_poll_ret ringbuffer_poll_nop(void *data __attribute__((unused)),
26a72711afSAndrew Jeffery 					     size_t force_len
27a72711afSAndrew Jeffery 					     __attribute__((unused)))
28c9775ce7SJeremy Kerr {
29c9775ce7SJeremy Kerr 	return RINGBUFFER_POLL_OK;
30c9775ce7SJeremy Kerr }
31c9775ce7SJeremy Kerr 
32c9775ce7SJeremy Kerr enum ringbuffer_poll_ret ringbuffer_poll_append_all(void *data,
33c9775ce7SJeremy Kerr 						    size_t force_len)
34c9775ce7SJeremy Kerr {
35c9775ce7SJeremy Kerr 	struct rb_test_ctx *ctx = data;
36c9775ce7SJeremy Kerr 	size_t len, total_len;
37c9775ce7SJeremy Kerr 	uint8_t *buf;
38c9775ce7SJeremy Kerr 
39*2834c5b1SAndrew Jeffery 	if (ctx->ignore_poll) {
40c9775ce7SJeremy Kerr 		return RINGBUFFER_POLL_OK;
41*2834c5b1SAndrew Jeffery 	}
42c9775ce7SJeremy Kerr 
43*2834c5b1SAndrew Jeffery 	if (ctx->force_only && !force_len) {
44c9775ce7SJeremy Kerr 		return RINGBUFFER_POLL_OK;
45*2834c5b1SAndrew Jeffery 	}
46c9775ce7SJeremy Kerr 
47c9775ce7SJeremy Kerr 	ctx->count++;
48c9775ce7SJeremy Kerr 
49c9775ce7SJeremy Kerr 	total_len = 0;
50c9775ce7SJeremy Kerr 	for (;;) {
51c9775ce7SJeremy Kerr 		len = ringbuffer_dequeue_peek(ctx->rbc, total_len, &buf);
52*2834c5b1SAndrew Jeffery 		if (!len) {
53c9775ce7SJeremy Kerr 			break;
54*2834c5b1SAndrew Jeffery 		}
55c9775ce7SJeremy Kerr 
56*2834c5b1SAndrew Jeffery 		if (ctx->force_only && total_len + len > force_len) {
57c9775ce7SJeremy Kerr 			len = force_len - total_len;
58*2834c5b1SAndrew Jeffery 		}
59c9775ce7SJeremy Kerr 
60c9775ce7SJeremy Kerr 		ctx->data = realloc(ctx->data, ctx->len + len);
61c9775ce7SJeremy Kerr 		memcpy(ctx->data + ctx->len, buf, len);
62c9775ce7SJeremy Kerr 		ctx->len += len;
63c9775ce7SJeremy Kerr 		total_len += len;
64c9775ce7SJeremy Kerr 
65*2834c5b1SAndrew Jeffery 		if (ctx->force_only && total_len >= force_len) {
66c9775ce7SJeremy Kerr 			break;
67c9775ce7SJeremy Kerr 		}
68*2834c5b1SAndrew Jeffery 	}
69c9775ce7SJeremy Kerr 	ringbuffer_dequeue_commit(ctx->rbc, total_len);
70c9775ce7SJeremy Kerr 
71c9775ce7SJeremy Kerr 	return RINGBUFFER_POLL_OK;
72c9775ce7SJeremy Kerr }
73c9775ce7SJeremy Kerr 
74c9775ce7SJeremy Kerr void ringbuffer_dump(struct ringbuffer *rb)
75c9775ce7SJeremy Kerr {
76c9775ce7SJeremy Kerr 	struct ringbuffer_consumer *rbc;
778f548f6cSAndrew Jeffery 	size_t i;
788f548f6cSAndrew Jeffery 	int j;
79c9775ce7SJeremy Kerr 
80c9775ce7SJeremy Kerr 	printf("---- ringbuffer (%d consumer%s)\n", rb->n_consumers,
81c9775ce7SJeremy Kerr 	       rb->n_consumers == 1 ? "" : "s");
82c9775ce7SJeremy Kerr 
83c9775ce7SJeremy Kerr 	for (i = 0; i < rb->size; i++) {
84c9775ce7SJeremy Kerr 		bool has_consumer = false;
85c9775ce7SJeremy Kerr 		const char *prefix = "";
86c9775ce7SJeremy Kerr 
87*2834c5b1SAndrew Jeffery 		if (rb->tail == i) {
88c9775ce7SJeremy Kerr 			prefix = "tail=>";
89*2834c5b1SAndrew Jeffery 		}
90c9775ce7SJeremy Kerr 
91c9775ce7SJeremy Kerr 		printf("%6s %02x", prefix, rb->buf[i]);
92c9775ce7SJeremy Kerr 		for (j = 0; j < rb->n_consumers; j++) {
93c9775ce7SJeremy Kerr 			rbc = rb->consumers[j];
94*2834c5b1SAndrew Jeffery 			if (rbc->pos != i) {
95c9775ce7SJeremy Kerr 				continue;
96*2834c5b1SAndrew Jeffery 			}
97*2834c5b1SAndrew Jeffery 			if (!has_consumer) {
98c9775ce7SJeremy Kerr 				printf(" <=");
99*2834c5b1SAndrew Jeffery 			}
100c9775ce7SJeremy Kerr 			printf("c[%d],len=%zd ", j, ringbuffer_len(rbc));
101c9775ce7SJeremy Kerr 			has_consumer = true;
102c9775ce7SJeremy Kerr 		}
103c9775ce7SJeremy Kerr 		printf("\n");
104c9775ce7SJeremy Kerr 	}
105c9775ce7SJeremy Kerr }
106