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