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;
8c9775ce7SJeremy Kerr 	int 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 
25*a72711afSAndrew Jeffery enum ringbuffer_poll_ret ringbuffer_poll_nop(void *data __attribute__((unused)),
26*a72711afSAndrew Jeffery 					     size_t force_len
27*a72711afSAndrew 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 
39c9775ce7SJeremy Kerr 	if (ctx->ignore_poll)
40c9775ce7SJeremy Kerr 		return RINGBUFFER_POLL_OK;
41c9775ce7SJeremy Kerr 
42c9775ce7SJeremy Kerr 	if (ctx->force_only && !force_len)
43c9775ce7SJeremy Kerr 		return RINGBUFFER_POLL_OK;
44c9775ce7SJeremy Kerr 
45c9775ce7SJeremy Kerr 	ctx->count++;
46c9775ce7SJeremy Kerr 
47c9775ce7SJeremy Kerr 	total_len = 0;
48c9775ce7SJeremy Kerr 	for (;;) {
49c9775ce7SJeremy Kerr 		len = ringbuffer_dequeue_peek(ctx->rbc, total_len, &buf);
50c9775ce7SJeremy Kerr 		if (!len)
51c9775ce7SJeremy Kerr 			break;
52c9775ce7SJeremy Kerr 
53c9775ce7SJeremy Kerr 		if (ctx->force_only && total_len + len > force_len)
54c9775ce7SJeremy Kerr 			len = force_len - total_len;
55c9775ce7SJeremy Kerr 
56c9775ce7SJeremy Kerr 		ctx->data = realloc(ctx->data, ctx->len + len);
57c9775ce7SJeremy Kerr 		memcpy(ctx->data + ctx->len, buf, len);
58c9775ce7SJeremy Kerr 		ctx->len += len;
59c9775ce7SJeremy Kerr 		total_len += len;
60c9775ce7SJeremy Kerr 
61c9775ce7SJeremy Kerr 		if (ctx->force_only && total_len >= force_len)
62c9775ce7SJeremy Kerr 			break;
63c9775ce7SJeremy Kerr 	}
64c9775ce7SJeremy Kerr 	ringbuffer_dequeue_commit(ctx->rbc, total_len);
65c9775ce7SJeremy Kerr 
66c9775ce7SJeremy Kerr 	return RINGBUFFER_POLL_OK;
67c9775ce7SJeremy Kerr }
68c9775ce7SJeremy Kerr 
69c9775ce7SJeremy Kerr void ringbuffer_dump(struct ringbuffer *rb)
70c9775ce7SJeremy Kerr {
71c9775ce7SJeremy Kerr 	struct ringbuffer_consumer *rbc;
728f548f6cSAndrew Jeffery 	size_t i;
738f548f6cSAndrew Jeffery 	int j;
74c9775ce7SJeremy Kerr 
75c9775ce7SJeremy Kerr 	printf("---- ringbuffer (%d consumer%s)\n", rb->n_consumers,
76c9775ce7SJeremy Kerr 	       rb->n_consumers == 1 ? "" : "s");
77c9775ce7SJeremy Kerr 
78c9775ce7SJeremy Kerr 	for (i = 0; i < rb->size; i++) {
79c9775ce7SJeremy Kerr 		bool has_consumer = false;
80c9775ce7SJeremy Kerr 		const char *prefix = "";
81c9775ce7SJeremy Kerr 
82c9775ce7SJeremy Kerr 		if (rb->tail == i)
83c9775ce7SJeremy Kerr 			prefix = "tail=>";
84c9775ce7SJeremy Kerr 
85c9775ce7SJeremy Kerr 		printf("%6s %02x", prefix, rb->buf[i]);
86c9775ce7SJeremy Kerr 		for (j = 0; j < rb->n_consumers; j++) {
87c9775ce7SJeremy Kerr 			rbc = rb->consumers[j];
88c9775ce7SJeremy Kerr 			if (rbc->pos != i)
89c9775ce7SJeremy Kerr 				continue;
90c9775ce7SJeremy Kerr 			if (!has_consumer)
91c9775ce7SJeremy Kerr 				printf(" <=");
92c9775ce7SJeremy Kerr 			printf("c[%d],len=%zd ", j, ringbuffer_len(rbc));
93c9775ce7SJeremy Kerr 			has_consumer = true;
94c9775ce7SJeremy Kerr 		}
95c9775ce7SJeremy Kerr 		printf("\n");
96c9775ce7SJeremy Kerr 	}
97c9775ce7SJeremy Kerr }
98