librfn
An ad-hoc utility library
messageqtest.c
Go to the documentation of this file.
1 /*
2  * messageqtest.c
3  *
4  * Part of librfn (a general utility library from redfelineninja.org.uk)
5  *
6  * Copyright (C) 2013 Daniel Thompson <daniel@redfelineninja.org.uk>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published
10  * by the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  */
13 
14 #undef NDEBUG
15 
16 #include <assert.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 
21 #include <librfn.h>
22 
23 int queue_buf[3];
25  queue_buf, sizeof(queue_buf), sizeof(queue_buf[0]));
26 
27 
28 int main()
29 {
30  messageq_t myqueue;
31 
32  /*
33  * The messageq_t data structure is intended to be safe to *send*
34  * messages from multiple threads (although only one receiver thread
35  * is permitted). However at present these tests only check for
36  * sequential correctness.
37  */
38 
39  /* prove the equivalence of the initializer and the init fn */
40  messageq_init(&myqueue,
41  queue_buf, sizeof(queue_buf), sizeof(queue_buf[0]));
42  verify(0 == memcmp(&queue, &myqueue, sizeof(queue)));
43 
44  /* simple claim, send, receive, release loop */
45  for (int i=0; i<lengthof(queue_buf)*3; i++) {
46  int *sendp = messageq_claim(&queue);
47  verify(queue_buf + (i%lengthof(queue_buf)) == sendp);
48 
49  *sendp = i;
50  messageq_send(&queue, sendp);
51 
52  int *receivep = messageq_receive(&queue);
53  verify(sendp == receivep);
54  verify(*receivep == i);
55 
56  messageq_release(&queue, receivep);
57  }
58 
59  /* zealous claim with in-order sends and greedy receive */
60  verify(queue_buf+0 == messageq_claim(&queue));
61  verify(queue_buf+1 == messageq_claim(&queue));
62  verify(queue_buf+2 == messageq_claim(&queue));
63  verify(NULL == messageq_claim(&queue));
64 
65  messageq_send(&queue, queue_buf+0);
66  verify(queue_buf+0 == messageq_receive(&queue));
67  verify(NULL == messageq_receive(&queue));
68  messageq_release(&queue, queue_buf+0);
69 
70  messageq_send(&queue, queue_buf+1);
71  verify(queue_buf+1 == messageq_receive(&queue));
72  verify(NULL == messageq_receive(&queue));
73  messageq_release(&queue, queue_buf+1);
74 
75  messageq_send(&queue, queue_buf+2);
76  verify(queue_buf+2 == messageq_receive(&queue));
77  verify(NULL == messageq_receive(&queue));
78  messageq_release(&queue, queue_buf+2);
79 
80  /* zealous claim with out-of-order sends and greedy receive */
81  verify(queue_buf+0 == messageq_claim(&queue));
82  verify(queue_buf+1 == messageq_claim(&queue));
83  verify(queue_buf+2 == messageq_claim(&queue));
84  verify(NULL == messageq_claim(&queue));
85 
86  messageq_send(&queue, queue_buf+2);
87  verify(NULL == messageq_receive(&queue));
88 
89  messageq_send(&queue, queue_buf+1);
90  verify(NULL == messageq_receive(&queue));
91 
92  messageq_send(&queue, queue_buf+0);
93  verify(queue_buf+0 == messageq_receive(&queue));
94  messageq_release(&queue, queue_buf+0);
95  verify(queue_buf+1 == messageq_receive(&queue));
96  messageq_release(&queue, queue_buf+1);
97  verify(queue_buf+2 == messageq_receive(&queue));
98  messageq_release(&queue, queue_buf+2);
99  verify(NULL == messageq_receive(&queue));
100 
101  /* emptyness tests */
102  verify(true == messageq_empty(&queue));
103 
104  verify(queue_buf+0 == messageq_claim(&queue));
105  verify(true == messageq_empty(&queue));
106  verify(queue_buf+1 == messageq_claim(&queue));
107  verify(true == messageq_empty(&queue));
108  verify(queue_buf+2 == messageq_claim(&queue));
109  verify(true == messageq_empty(&queue));
110 
111  messageq_send(&queue, queue_buf+0);
112  verify(false == messageq_empty(&queue));
113  messageq_send(&queue, queue_buf+1);
114  verify(false == messageq_empty(&queue));
115  messageq_send(&queue, queue_buf+2);
116  verify(false == messageq_empty(&queue));
117 
118  verify(queue_buf+0 == messageq_receive(&queue));
119  verify(false == messageq_empty(&queue));
120  messageq_release(&queue, queue_buf+0);
121  verify(false == messageq_empty(&queue));
122  verify(queue_buf+1 == messageq_receive(&queue));
123  verify(false == messageq_empty(&queue));
124  messageq_release(&queue, queue_buf+1);
125  verify(false == messageq_empty(&queue));
126  verify(queue_buf+2 == messageq_receive(&queue));
127  verify(true == messageq_empty(&queue));
128  messageq_release(&queue, queue_buf+2);
129  verify(true == messageq_empty(&queue));
130 
131  return 0;
132 }
void messageq_init(messageq_t *mq, void *basep, size_t base_len, size_t msg_len)
Definition: messageq.c:21
#define lengthof(x)
Definition: util.h:44
void messageq_release(messageq_t *mq, void *msg)
Definition: messageq.c:73
void * messageq_claim(messageq_t *mq)
Definition: messageq.c:31
void * messageq_receive(messageq_t *mq)
Definition: messageq.c:57
#define verify(x)
Definition: util.h:55
int main()
Definition: messageqtest.c:28
int queue_buf[3]
Definition: messageqtest.c:23
messageq_t queue
Definition: messageqtest.c:24
#define MESSAGEQ_VAR_INIT(basep, base_len, msg_len)
Definition: messageq.h:54
void messageq_send(messageq_t *mq, void *msg)
Definition: messageq.c:50