FreeRDP
Loading...
Searching...
No Matches
TestQueue.c
1
2#include <winpr/crt.h>
3#include <winpr/tchar.h>
4#include <winpr/collections.h>
5
6static bool wrap_test(bool (*fkt)(wQueue* queue))
7{
8 wQueue* queue = Queue_New(TRUE, -1, -1);
9 if (!queue)
10 return false;
11
12 WINPR_ASSERT(fkt);
13 const bool rc = fkt(queue);
14 Queue_Free(queue);
15 return rc;
16}
17
18static bool check(const void* ptr, size_t pos)
19{
20 if (!ptr)
21 return false;
22 if (ptr != (void*)(pos + 23))
23 return false;
24 return true;
25}
26
27static bool append(wQueue* queue, size_t pos)
28{
29 void* ptr = (void*)(pos + 23);
30 return Queue_Enqueue(queue, ptr);
31}
32
33static bool fill_capcity(wQueue* queue, size_t* pos)
34{
35 WINPR_ASSERT(pos);
36
37 size_t cpos = *pos;
38 const size_t capacity = Queue_Capacity(queue);
39 while (Queue_Count(queue) < capacity)
40 {
41 if (!append(queue, cpos++))
42 return false;
43 }
44 *pos = cpos;
45 return true;
46}
47
48static bool drain(wQueue* queue, size_t expect)
49{
50 void* ptr = Queue_Dequeue(queue);
51 return check(ptr, expect);
52}
53
54static bool drain_capcity(wQueue* queue, size_t remain, size_t* pos)
55{
56 WINPR_ASSERT(pos);
57
58 size_t cpos = *pos;
59 while (Queue_Count(queue) > remain)
60 {
61 if (!drain(queue, cpos++))
62 return false;
63 }
64 *pos = cpos;
65
66 return true;
67}
68
69static bool test_growth_move(wQueue* queue, bool big)
70{
71 WINPR_ASSERT(queue);
72
73 const size_t cap = Queue_Capacity(queue);
74 if (cap < 4)
75 return false;
76
77 size_t wpos = 0;
78 size_t rpos = 0;
79 if (!fill_capcity(queue, &wpos))
80 return false;
81
82 /* Ensure the (base) capacity is larger than the allocation step
83 * so a full copy of tail will not be possible */
84 if (big)
85 {
86 if (!append(queue, wpos++))
87 return false;
88 }
89
90 if (!drain_capcity(queue, 3, &rpos))
91 return false;
92
93 if (!fill_capcity(queue, &wpos))
94 return false;
95
96 if (!append(queue, wpos++))
97 return false;
98
99 return drain_capcity(queue, 0, &rpos);
100}
101
102static bool test_growth_big_move(wQueue* queue)
103{
104 return test_growth_move(queue, true);
105}
106static bool test_growth_small_move(wQueue* queue)
107{
108 return test_growth_move(queue, false);
109}
110
111static bool check_size(wQueue* queue, size_t expected)
112{
113 WINPR_ASSERT(queue);
114 const size_t count = Queue_Count(queue);
115 printf("queue count: %" PRIuz "\n", count);
116 return (count == expected);
117}
118
119static bool enqueue(wQueue* queue, size_t val)
120{
121 WINPR_ASSERT(queue);
122 void* ptr = (void*)(23 + val);
123 return Queue_Enqueue(queue, ptr);
124}
125
126static bool dequeue(wQueue* queue, size_t expected)
127{
128 WINPR_ASSERT(queue);
129 const void* pexpect = (void*)(23 + expected);
130 void* ptr = Queue_Dequeue(queue);
131 return (pexpect == ptr);
132}
133
134static bool legacy_test(wQueue* queue)
135{
136 WINPR_ASSERT(queue);
137
138 for (size_t index = 1; index <= 10; index++)
139 {
140 if (!enqueue(queue, index))
141 return false;
142 }
143
144 if (!check_size(queue, 10))
145 return false;
146
147 for (size_t index = 1; index <= 10; index++)
148 {
149 if (!dequeue(queue, index))
150 return false;
151 }
152
153 if (!check_size(queue, 0))
154 return false;
155
156 if (!enqueue(queue, 1))
157 return false;
158 if (!enqueue(queue, 2))
159 return false;
160 if (!enqueue(queue, 3))
161 return false;
162
163 if (!check_size(queue, 3))
164 return false;
165
166 if (!dequeue(queue, 1))
167 return false;
168 if (!dequeue(queue, 2))
169 return false;
170
171 if (!check_size(queue, 1))
172 return false;
173
174 if (!enqueue(queue, 4))
175 return false;
176 if (!enqueue(queue, 5))
177 return false;
178 if (!enqueue(queue, 6))
179 return false;
180
181 if (!check_size(queue, 4))
182 return false;
183
184 if (!dequeue(queue, 3))
185 return false;
186 if (!dequeue(queue, 4))
187 return false;
188 if (!dequeue(queue, 5))
189 return false;
190 if (!dequeue(queue, 6))
191 return false;
192
193 if (!check_size(queue, 0))
194 return false;
195
196 Queue_Clear(queue);
197
198 if (!check_size(queue, 0))
199 return false;
200
201 for (size_t x = 0; x < 32; x++)
202 {
203 void* ptr = (void*)(23 + x);
204 if (!Queue_Enqueue(queue, ptr))
205 return false;
206 }
207
208 if (!check_size(queue, 32))
209 return false;
210
211 Queue_Clear(queue);
212
213 return check_size(queue, 0);
214}
215
216int TestQueue(WINPR_ATTR_UNUSED int argc, WINPR_ATTR_UNUSED char* argv[])
217{
218 if (!wrap_test(test_growth_big_move))
219 return -1;
220 if (!wrap_test(test_growth_small_move))
221 return -2;
222 if (!wrap_test(legacy_test))
223 return -3;
224 return 0;
225}