xref: /openbmc/obmc-console/test/ringbuffer-test-utils.c (revision c9775ce74bbd1445c4d0ebb504f3f6ea20a6fa2e)
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 	int i, j;
73 
74 	printf("---- ringbuffer (%d consumer%s)\n", rb->n_consumers,
75 			rb->n_consumers == 1 ? "" : "s");
76 
77 	for (i = 0; i < rb->size; i++) {
78 		bool has_consumer = false;
79 		const char *prefix = "";
80 
81 		if (rb->tail == i)
82 			prefix = "tail=>";
83 
84 		printf("%6s %02x", prefix, rb->buf[i]);
85 		for (j = 0; j < rb->n_consumers; j++) {
86 			rbc = rb->consumers[j];
87 			if (rbc->pos != i)
88 				continue;
89 			if (!has_consumer)
90 				printf(" <=");
91 			printf("c[%d],len=%zd ", j, ringbuffer_len(rbc));
92 			has_consumer = true;
93 		}
94 		printf("\n");
95 	}
96 }
97 
98