xref: /openbmc/obmc-console/test/ringbuffer-test-utils.c (revision b70f8713e37719b6dad0cf8e1bf7f6edae5911d6)
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 	size_t 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(void *data __attribute__((unused)),
26 					     size_t force_len
27 					     __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;
37 	size_t total_len;
38 	uint8_t *buf;
39 
40 	if (ctx->ignore_poll) {
41 		return RINGBUFFER_POLL_OK;
42 	}
43 
44 	if (ctx->force_only && !force_len) {
45 		return RINGBUFFER_POLL_OK;
46 	}
47 
48 	ctx->count++;
49 
50 	total_len = 0;
51 	for (;;) {
52 		len = ringbuffer_dequeue_peek(ctx->rbc, total_len, &buf);
53 		if (!len) {
54 			break;
55 		}
56 
57 		if (ctx->force_only && total_len + len > force_len) {
58 			len = force_len - total_len;
59 		}
60 
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 
66 		if (ctx->force_only && total_len >= force_len) {
67 			break;
68 		}
69 	}
70 	ringbuffer_dequeue_commit(ctx->rbc, total_len);
71 
72 	return RINGBUFFER_POLL_OK;
73 }
74 
75 void ringbuffer_dump(struct ringbuffer *rb)
76 {
77 	struct ringbuffer_consumer *rbc;
78 	size_t i;
79 	int j;
80 
81 	printf("---- ringbuffer (%d consumer%s)\n", rb->n_consumers,
82 	       rb->n_consumers == 1 ? "" : "s");
83 
84 	for (i = 0; i < rb->size; i++) {
85 		bool has_consumer = false;
86 		const char *prefix = "";
87 
88 		if (rb->tail == i) {
89 			prefix = "tail=>";
90 		}
91 
92 		printf("%6s %02x", prefix, rb->buf[i]);
93 		for (j = 0; j < rb->n_consumers; j++) {
94 			rbc = rb->consumers[j];
95 			if (rbc->pos != i) {
96 				continue;
97 			}
98 			if (!has_consumer) {
99 				printf(" <=");
100 			}
101 			printf("c[%d],len=%zd ", j, ringbuffer_len(rbc));
102 			has_consumer = true;
103 		}
104 		printf("\n");
105 	}
106 }
107