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