]> CyberLeo.Net >> Repos - FreeBSD/releng/9.3.git/blob - contrib/ntp/tests/ntpd/ntp_prio_q.c
o Fix invalid TCP checksums with pf(4). [EN-16:02.pf]
[FreeBSD/releng/9.3.git] / contrib / ntp / tests / ntpd / ntp_prio_q.c
1 #include "config.h"
2
3 #include "ntp.h"
4 #include "ntp_calendar.h"
5 #include "ntp_stdlib.h"
6
7 #include "ntp_prio_q.h"
8
9 #include "unity.h"
10
11
12
13 #include <string.h>
14 /*
15 TODO:
16 -fix the includes
17 -makefile: ntpdsim-ntp_prio_q.o - make sure it's okay
18 */
19
20
21 /* helpers */
22
23 typedef struct Element
24 {
25         char str[37]; // 37 seems like a nice candidate to break stuff
26         int number;
27
28 } element;
29
30 int
31 compare_elements(const void * e1, const void * e2)
32 {
33         return ((element*)e1)->number < ((element*)e2)->number;
34 }
35
36 /* tests */
37
38 void
39 test_AllocateDeallocateNode(void) {
40         element* e_ptr = debug_get_node(sizeof(element));
41         free_node(e_ptr);
42 }
43
44
45 void
46 test_EmptyQueue(void) {
47         queue* q = create_queue();
48
49         TEST_ASSERT_NOT_NULL(q);
50         TEST_ASSERT_TRUE(empty(q));
51         TEST_ASSERT_NULL(queue_head(q));
52         TEST_ASSERT_NULL(dequeue(q));
53         TEST_ASSERT_EQUAL(0, get_no_of_elements(q));
54
55         destroy_queue(q);
56 }
57
58
59 void
60 test_OneElementQueue(void) {
61         queue* q = create_queue();
62
63         TEST_ASSERT_NOT_NULL(q);
64
65         element e = {"string", 3};
66         element* e_ptr = debug_get_node(sizeof(element));
67         enqueue(q, e_ptr);
68         *e_ptr = e;
69
70         TEST_ASSERT_FALSE(empty(q));
71         TEST_ASSERT_NOT_NULL(queue_head(q));
72         TEST_ASSERT_EQUAL(1, get_no_of_elements(q));
73
74         element* e_ptr_returned = dequeue(q);
75
76         TEST_ASSERT_NOT_NULL(e_ptr_returned);
77         TEST_ASSERT_EQUAL_STRING(e_ptr_returned->str, "string");
78         TEST_ASSERT_EQUAL_PTR(e_ptr_returned, e_ptr);
79         TEST_ASSERT_EQUAL(0, get_no_of_elements(q));
80         TEST_ASSERT_TRUE(empty(q));
81         TEST_ASSERT_NULL(dequeue(q));
82
83         destroy_queue(q);
84 }
85
86
87 void
88 test_MultipleElementQueue(void) {
89         queue* q = create_queue();
90
91         TEST_ASSERT_NOT_NULL(q);
92
93         element *e1_ptr, *e2_ptr, *e3_ptr;
94
95         e1_ptr = (element*)debug_get_node(sizeof(element));
96         e2_ptr = (element*)debug_get_node(sizeof(element));
97         e3_ptr = (element*)debug_get_node(sizeof(element));
98
99         enqueue(q, e1_ptr);
100         enqueue(q, e2_ptr);
101         enqueue(q, e3_ptr);
102
103         TEST_ASSERT_EQUAL(3, get_no_of_elements(q));
104
105         dequeue(q);
106         enqueue(q, e1_ptr);
107
108         TEST_ASSERT_EQUAL(3, get_no_of_elements(q));
109
110         dequeue(q);
111         dequeue(q);
112         enqueue(q, e3_ptr);
113         enqueue(q, e2_ptr);
114
115         TEST_ASSERT_EQUAL_PTR(dequeue(q), e1_ptr);
116         TEST_ASSERT_EQUAL_PTR(dequeue(q), e3_ptr);
117         TEST_ASSERT_EQUAL_PTR(dequeue(q), e2_ptr);
118         TEST_ASSERT_EQUAL(0, get_no_of_elements(q));
119         TEST_ASSERT_NULL(dequeue(q));
120
121         destroy_queue(q);
122 }
123
124
125 void
126 test_CustomOrderQueue(void) {
127         queue* q = debug_create_priority_queue(compare_elements);
128         element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr;
129
130         e1_ptr = (element*)debug_get_node(sizeof(element));
131         e2_ptr = (element*)debug_get_node(sizeof(element));
132         e3_ptr = (element*)debug_get_node(sizeof(element));
133         e4_ptr = (element*)debug_get_node(sizeof(element));
134         e5_ptr = (element*)debug_get_node(sizeof(element));
135         e6_ptr = (element*)debug_get_node(sizeof(element));
136
137         e1_ptr->number = 1;
138         e2_ptr->number = 1;
139         e3_ptr->number = 10;
140         e4_ptr->number = 10;
141         e5_ptr->number = 100;
142         e6_ptr->number = 100;
143
144         enqueue(q, e3_ptr);
145         enqueue(q, e5_ptr);
146         enqueue(q, e2_ptr);
147         enqueue(q, e1_ptr);
148         enqueue(q, e4_ptr);
149         enqueue(q, e6_ptr);
150
151         TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 100);
152         TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 100);
153
154         TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 100);
155         TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 100);
156
157         TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 10);
158         TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 10);
159
160         TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 10);
161         TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 10);
162
163         TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 1);
164         TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 1);
165
166         TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 1);
167         TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 1);
168
169         TEST_ASSERT_TRUE(empty(q));
170
171         destroy_queue(q);
172
173         free_node(e1_ptr);
174         free_node(e2_ptr);
175         free_node(e3_ptr);
176         free_node(e4_ptr);
177         free_node(e5_ptr);
178         free_node(e6_ptr);
179 }
180
181
182 void
183 test_DestroyNonEmptyQueue(void) {
184         queue* q = create_queue();
185         element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr;
186
187         e1_ptr = (element*)debug_get_node(sizeof(element));
188         e2_ptr = (element*)debug_get_node(sizeof(element));
189         e3_ptr = (element*)debug_get_node(sizeof(element));
190         e4_ptr = (element*)debug_get_node(sizeof(element));
191         e5_ptr = (element*)debug_get_node(sizeof(element));
192         e6_ptr = (element*)debug_get_node(sizeof(element));
193
194         enqueue(q, e3_ptr);
195         enqueue(q, e2_ptr);
196         enqueue(q, e4_ptr);
197         enqueue(q, e1_ptr);
198         enqueue(q, e6_ptr);
199         enqueue(q, e5_ptr);
200
201         destroy_queue(q);
202 }
203
204 void
205 test_AppendQueues(void) {
206         queue* q1 = create_queue();
207         queue* q2 = create_queue();
208         queue* q3 = create_queue();
209         queue* q4 = create_queue();
210         queue* q5 = create_queue();
211
212         // append empty queue to empty queue
213         append_queue(q1, q2);   // destroys q2
214
215         element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr;
216         e1_ptr = (element*)debug_get_node(sizeof(element));
217         e2_ptr = (element*)debug_get_node(sizeof(element));
218         e3_ptr = (element*)debug_get_node(sizeof(element));
219         e4_ptr = (element*)debug_get_node(sizeof(element));
220         e5_ptr = (element*)debug_get_node(sizeof(element));
221         e6_ptr = (element*)debug_get_node(sizeof(element));
222
223         enqueue(q1, e1_ptr);
224         enqueue(q1, e2_ptr);
225         enqueue(q1, e3_ptr);
226
227
228         // append empty queue to non empty queue
229         append_queue(q1, q3);   // destroys q3
230         TEST_ASSERT_EQUAL(3, get_no_of_elements(q1));
231
232         // append non empty queue to empty queue
233         append_queue(q4, q1);   // destroys q1
234         TEST_ASSERT_EQUAL(3, get_no_of_elements(q4));
235
236         enqueue(q5, e4_ptr);
237         enqueue(q5, e5_ptr);
238
239         // append non empty queue to non empty queue
240         append_queue(q4, q5);   // destroys q5
241         TEST_ASSERT_EQUAL(5, get_no_of_elements(q4));
242
243         dequeue(q4);
244         dequeue(q4);
245         dequeue(q4);
246         dequeue(q4);
247         dequeue(q4);
248
249         free_node(e1_ptr);
250         free_node(e2_ptr);
251         free_node(e3_ptr);
252         free_node(e4_ptr);
253         free_node(e5_ptr);
254         free_node(e6_ptr);
255
256         TEST_ASSERT_EQUAL(0, get_no_of_elements(q4));
257
258         // destroy_queue(q1);   // destroyed already
259         // destroy_queue(q2);   // destroyed already
260         // destroy_queue(q3);   // destroyed already
261         destroy_queue(q4);
262         // destroy_queue(q5);   // destroyed already
263 }