2 * Copyright © 2013 Red Hat, Inc.
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that copyright
7 * notice and this permission notice appear in supporting documentation, and
8 * that the name of the copyright holders not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission. The copyright holders make no representations
11 * about the suitability of this software for any purpose. It is provided "as
12 * is" without express or implied warranty.
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
25 #include <libevdev/libevdev-int.h>
26 #include "test-common.h"
31 START_TEST(test_queue_alloc)
36 rc = queue_alloc(&dev, 0);
37 ck_assert_int_eq(rc, -ENOMEM);
39 rc = queue_alloc(&dev, ULONG_MAX);
40 ck_assert_int_eq(rc, -ENOMEM);
42 rc = queue_alloc(&dev, 100);
43 ck_assert_int_eq(rc, 0);
45 ck_assert_int_eq(dev.queue_size, 100);
46 ck_assert_int_eq(dev.queue_next, 0);
49 ck_assert_int_eq(dev.queue_size, 0);
50 ck_assert_int_eq(dev.queue_next, 0);
55 START_TEST(test_queue_sizes)
57 struct libevdev dev = {0};
60 ck_assert_int_eq(queue_num_elements(&dev), 0);
61 ck_assert_int_eq(queue_num_free_elements(&dev), 0);
62 ck_assert_int_eq(queue_size(&dev), 0);
64 queue_alloc(&dev, 100);
65 ck_assert_int_eq(queue_num_elements(&dev), 0);
66 ck_assert_int_eq(queue_num_free_elements(&dev), 100);
67 ck_assert_int_eq(queue_size(&dev), 100);
71 ck_assert_int_eq(queue_num_elements(&dev), 0);
72 ck_assert_int_eq(queue_num_free_elements(&dev), 0);
73 ck_assert_int_eq(queue_size(&dev), 0);
77 START_TEST(test_queue_push)
79 struct libevdev dev = {0};
80 struct input_event *ev;
83 ev = queue_push(&dev);
84 ck_assert(ev == NULL);
87 ev = queue_push(&dev);
88 ck_assert(ev == dev.queue);
89 ck_assert_int_eq(queue_num_elements(&dev), 1);
90 ck_assert_int_eq(queue_num_free_elements(&dev), 1);
92 ev = queue_push(&dev);
93 ck_assert(ev == dev.queue + 1);
95 ev = queue_push(&dev);
96 ck_assert(ev == NULL);
99 ev = queue_push(&dev);
100 ck_assert(ev == NULL);
105 START_TEST(test_queue_pop)
107 struct libevdev dev = {0};
108 struct input_event ev, *e, tmp;
111 queue_alloc(&dev, 0);
112 rc = queue_pop(&dev, &ev);
113 ck_assert_int_eq(rc, 1);
115 queue_alloc(&dev, 2);
116 e = queue_push(&dev);
117 memset(e, 0xab, sizeof(*e));
118 ck_assert_int_eq(queue_num_elements(&dev), 1);
119 ck_assert_int_eq(queue_num_free_elements(&dev), 1);
121 rc = queue_pop(&dev, &ev);
122 ck_assert_int_eq(rc, 0);
123 memset(&tmp, 0xab, sizeof(tmp));
124 rc = memcmp(&tmp, &ev, sizeof(tmp));
125 ck_assert_int_eq(rc, 0);
127 ck_assert_int_eq(queue_num_elements(&dev), 0);
128 ck_assert_int_eq(queue_num_free_elements(&dev), 2);
130 rc = queue_pop(&dev, &ev);
131 ck_assert_int_eq(rc, 1);
137 START_TEST(test_queue_peek)
139 struct libevdev dev = {0};
140 struct input_event ev, *e, tmp;
143 queue_alloc(&dev, 0);
144 rc = queue_peek(&dev, 0, &ev);
145 ck_assert_int_eq(rc, 1);
147 queue_alloc(&dev, 2);
148 e = queue_push(&dev);
149 memset(e, 0xab, sizeof(*e));
151 rc = queue_peek(&dev, 0, &ev);
152 ck_assert_int_eq(rc, 0);
153 memset(&tmp, 0xab, sizeof(tmp));
154 rc = memcmp(&tmp, &ev, sizeof(tmp));
155 ck_assert_int_eq(rc, 0);
157 ck_assert_int_eq(queue_num_elements(&dev), 1);
158 e = queue_push(&dev);
159 memset(e, 0xbc, sizeof(*e));
161 rc = queue_peek(&dev, 1, &ev);
162 ck_assert_int_eq(rc, 0);
163 memset(&tmp, 0xbc, sizeof(tmp));
164 rc = memcmp(&tmp, &ev, sizeof(tmp));
165 ck_assert_int_eq(rc, 0);
167 rc = queue_peek(&dev, 0, &ev);
168 ck_assert_int_eq(rc, 0);
169 memset(&tmp, 0xab, sizeof(tmp));
170 rc = memcmp(&tmp, &ev, sizeof(tmp));
171 ck_assert_int_eq(rc, 0);
173 ck_assert_int_eq(queue_num_elements(&dev), 2);
179 START_TEST(test_queue_shift)
181 struct libevdev dev = {0};
182 struct input_event ev, *first, *second, e1, e2;
185 ck_assert_int_eq(queue_shift(&dev, &ev), 1);
187 queue_alloc(&dev, 10);
188 ck_assert_int_eq(queue_shift(&dev, &ev), 1);
190 first = queue_push(&dev);
191 ck_assert(first != NULL);
192 memset(first, 0xab, sizeof(*first));
196 second = queue_push(&dev);
197 ck_assert(second != NULL);
198 memset(second, 0x12, sizeof(*second));
202 rc = queue_shift(&dev, &ev);
203 ck_assert_int_eq(rc, 0);
204 rc = memcmp(&ev, &e1, sizeof(ev));
205 ck_assert_int_eq(rc, 0);
207 rc = queue_shift(&dev, &ev);
208 ck_assert_int_eq(rc, 0);
209 rc = memcmp(&ev, &e2, sizeof(ev));
210 ck_assert_int_eq(rc, 0);
212 ck_assert_int_eq(queue_shift(&dev, &ev), 1);
218 START_TEST(test_queue_shift_multiple)
220 struct libevdev dev = {0};
221 struct input_event ev, *first, *second, e1, e2;
222 struct input_event events[5];
225 ck_assert_int_eq(queue_shift_multiple(&dev, 1, &ev), 0);
226 ck_assert_int_eq(queue_shift_multiple(&dev, 0, &ev), 0);
228 queue_alloc(&dev, 10);
229 ck_assert_int_eq(queue_shift_multiple(&dev, 1, &ev), 0);
230 ck_assert_int_eq(queue_shift_multiple(&dev, 0, &ev), 0);
232 first = queue_push(&dev);
233 ck_assert(first != NULL);
234 memset(first, 0xab, sizeof(*first));
237 second = queue_push(&dev);
238 ck_assert(second != NULL);
239 memset(second, 0x12, sizeof(*second));
242 rc = queue_shift_multiple(&dev, 5, events);
243 ck_assert_int_eq(rc, 2);
244 rc = memcmp(&events[0], &e1, sizeof(ev));
245 ck_assert_int_eq(rc, 0);
246 rc = memcmp(&events[1], &e2, sizeof(ev));
247 ck_assert_int_eq(rc, 0);
249 first = queue_push(&dev);
250 ck_assert(first != NULL);
251 memset(first, 0xab, sizeof(*first));
254 second = queue_push(&dev);
255 ck_assert(second != NULL);
256 memset(second, 0x12, sizeof(*second));
259 rc = queue_shift_multiple(&dev, 1, events);
260 ck_assert_int_eq(rc, 1);
261 rc = memcmp(&events[0], &e1, sizeof(ev));
262 ck_assert_int_eq(rc, 0);
264 rc = queue_shift_multiple(&dev, 1, events);
265 ck_assert_int_eq(rc, 1);
266 rc = memcmp(&events[0], &e2, sizeof(ev));
267 ck_assert_int_eq(rc, 0);
269 ck_assert_int_eq(queue_shift_multiple(&dev, 1, events), 0);
275 START_TEST(test_queue_next_element)
277 struct libevdev dev = {0};
278 struct input_event ev, *first, *second;
281 queue_alloc(&dev, 0);
282 first = queue_next_element(&dev);
283 ck_assert(first == NULL);
285 queue_alloc(&dev, 2);
286 first = queue_next_element(&dev);
287 ck_assert(first != NULL);
288 memset(first, 0xab, sizeof(*first));
290 second = queue_next_element(&dev);
291 ck_assert(second != NULL);
292 memset(second, 0xbc, sizeof(*second));
294 /* queue_next_element does not advance, so we overwrite */
295 memset(&ev, 0xbc, sizeof(ev));
296 rc = memcmp(&ev, first, sizeof(ev));
297 ck_assert_int_eq(rc, 0);
299 ck_assert_int_eq(queue_num_elements(&dev), 0);
301 first = queue_next_element(&dev);
302 ck_assert(first != NULL);
303 memset(first, 0xab, sizeof(*first));
305 queue_set_num_elements(&dev, 1);
306 ck_assert_int_eq(queue_num_elements(&dev), 1);
308 second = queue_next_element(&dev);
309 ck_assert(second != NULL);
310 memset(second, 0xbc, sizeof(*second));
312 memset(&ev, 0xab, sizeof(ev));
313 rc = memcmp(&ev, first, sizeof(ev));
314 ck_assert_int_eq(rc, 0);
320 START_TEST(test_queue_set_num_elements)
322 struct libevdev dev = {0};
324 queue_alloc(&dev, 0);
325 ck_assert_int_eq(queue_set_num_elements(&dev, 1), 1);
327 queue_alloc(&dev, 2);
328 ck_assert_int_eq(queue_set_num_elements(&dev, 3), 1);
329 ck_assert_int_eq(queue_set_num_elements(&dev, 2), 0);
338 Suite *s = suite_create("Event queue");
340 TCase *tc = tcase_create("Queue allocation");
341 tcase_add_test(tc, test_queue_alloc);
342 tcase_add_test(tc, test_queue_sizes);
343 suite_add_tcase(s, tc);
345 tc = tcase_create("Queue push/pop/peek");
346 tcase_add_test(tc, test_queue_push);
347 tcase_add_test(tc, test_queue_pop);
348 tcase_add_test(tc, test_queue_peek);
349 suite_add_tcase(s, tc);
351 tc = tcase_create("Queue shift");
352 tcase_add_test(tc, test_queue_shift);
353 tcase_add_test(tc, test_queue_shift_multiple);
354 suite_add_tcase(s, tc);
356 tc = tcase_create("Queue next elem");
357 tcase_add_test(tc, test_queue_next_element);
358 tcase_add_test(tc, test_queue_set_num_elements);
359 suite_add_tcase(s, tc);