xref: /openbmc/obmc-console/test/ringbuffer-test-utils.c (revision 8f548f6c86ff1bc9b63b86995c5dea1616ac97d3)
1 
2 struct rb_test_ctx {
3 	struct ringbuffer_consumer	*rbc;
4 	bool	ignore_poll;
5 	bool	force_only;
6 	int	count;
7 	uint8_t	*data;
8 	int	len;
9 };
10 
11 void 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 
20 void ringbuffer_test_context_fini(struct rb_test_ctx *ctx)
21 {
22 	free(ctx->data);
23 }
24 
25 enum ringbuffer_poll_ret ringbuffer_poll_nop(
26 		void *data __attribute__((unused)),
27 		size_t force_len __attribute__((unused)))
28 {
29 	return RINGBUFFER_POLL_OK;
30 }
31 
32 enum ringbuffer_poll_ret ringbuffer_poll_append_all(void *data,
33 		size_t force_len)
34 {
35 	struct rb_test_ctx *ctx = data;
36 	size_t len, total_len;
37 	uint8_t *buf;
38 
39 	if (ctx->ignore_poll)
40 		return RINGBUFFER_POLL_OK;
41 
42 	if (ctx->force_only && !force_len)
43 		return RINGBUFFER_POLL_OK;
44 
45 	ctx->count++;
46 
47 	total_len = 0;
48 	for (;;) {
49 		len = ringbuffer_dequeue_peek(ctx->rbc, total_len, &buf);
50 		if (!len)
51 			break;
52 
53 		if (ctx->force_only && total_len + len > force_len)
54 			len = force_len - total_len;
55 
56 		ctx->data = realloc(ctx->data, ctx->len + len);
57 		memcpy(ctx->data + ctx->len, buf, len);
58 		ctx->len += len;
59 		total_len += len;
60 
61 		if (ctx->force_only && total_len >= force_len)
62 			break;
63 	}
64 	ringbuffer_dequeue_commit(ctx->rbc, total_len);
65 
66 	return RINGBUFFER_POLL_OK;
67 }
68 
69 void ringbuffer_dump(struct ringbuffer *rb)
70 {
71 	struct ringbuffer_consumer *rbc;
72 	size_t i;
73 	int j;
74 
75 	printf("---- ringbuffer (%d consumer%s)\n", rb->n_consumers,
76 			rb->n_consumers == 1 ? "" : "s");
77 
78 	for (i = 0; i < rb->size; i++) {
79 		bool has_consumer = false;
80 		const char *prefix = "";
81 
82 		if (rb->tail == i)
83 			prefix = "tail=>";
84 
85 		printf("%6s %02x", prefix, rb->buf[i]);
86 		for (j = 0; j < rb->n_consumers; j++) {
87 			rbc = rb->consumers[j];
88 			if (rbc->pos != i)
89 				continue;
90 			if (!has_consumer)
91 				printf(" <=");
92 			printf("c[%d],len=%zd ", j, ringbuffer_len(rbc));
93 			has_consumer = true;
94 		}
95 		printf("\n");
96 	}
97 }
98 
99