2b88785859e32a44f79c527feb71103d9dfe9756
[libsigrokdecode.git] / tests / decoder.c
1 /*
2  * This file is part of the libsigrokdecode project.
3  *
4  * Copyright (C) 2013 Uwe Hermann <uwe@hermann-uwe.de>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19  */
20
21 #include <config.h>
22 #include <libsigrokdecode.h> /* First, to avoid compiler warning. */
23 #include <stdlib.h>
24 #include <check.h>
25 #include "lib.h"
26
27 /*
28  * Check whether srd_decoder_load_all() works.
29  * If it returns != SRD_OK (or segfaults) this test will fail.
30  */
31 START_TEST(test_load_all)
32 {
33         int ret;
34
35         srd_init(DECODERS_TESTDIR);
36         ret = srd_decoder_load_all();
37         fail_unless(ret == SRD_OK, "srd_decoder_load_all() failed: %d.", ret);
38         srd_exit();
39 }
40 END_TEST
41
42 /*
43  * Check whether srd_decoder_load_all() fails without prior srd_init().
44  * If it returns != SRD_OK (or segfaults) this test will fail.
45  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=178
46  */
47 START_TEST(test_load_all_no_init)
48 {
49         int ret;
50
51         ret = srd_decoder_load_all();
52         fail_unless(ret != SRD_OK, "srd_decoder_load_all() didn't fail properly.");
53 }
54 END_TEST
55
56 /*
57  * Check whether srd_decoder_load() works.
58  * If it returns != SRD_OK (or segfaults) this test will fail.
59  */
60 START_TEST(test_load)
61 {
62         int ret;
63
64         srd_init(DECODERS_TESTDIR);
65         ret = srd_decoder_load("uart");
66         fail_unless(ret == SRD_OK, "srd_decoder_load(uart) failed: %d.", ret);
67         ret = srd_decoder_load("spi");
68         fail_unless(ret == SRD_OK, "srd_decoder_load(spi) failed: %d.", ret);
69         ret = srd_decoder_load("usb_signalling");
70         fail_unless(ret == SRD_OK, "srd_decoder_load(usb_signalling) failed: %d.", ret);
71         srd_exit();
72 }
73 END_TEST
74
75 /*
76  * Check whether srd_decoder_load() fails for non-existing or bogus PDs.
77  * If it returns SRD_OK (or segfaults) this test will fail.
78  */
79 START_TEST(test_load_bogus)
80 {
81         srd_init(DECODERS_TESTDIR);
82         /* http://sigrok.org/bugzilla/show_bug.cgi?id=176 */
83         fail_unless(srd_decoder_load(NULL) != SRD_OK);
84         fail_unless(srd_decoder_load("") != SRD_OK);
85         fail_unless(srd_decoder_load(" ") != SRD_OK);
86         fail_unless(srd_decoder_load("nonexisting") != SRD_OK);
87         fail_unless(srd_decoder_load("UART") != SRD_OK);
88         fail_unless(srd_decoder_load("UaRt") != SRD_OK);
89         fail_unless(srd_decoder_load("u a r t") != SRD_OK);
90         fail_unless(srd_decoder_load("uart ") != SRD_OK);
91         fail_unless(srd_decoder_load(" uart") != SRD_OK);
92         fail_unless(srd_decoder_load(" uart ") != SRD_OK);
93         fail_unless(srd_decoder_load("uart spi") != SRD_OK);
94         srd_exit();
95 }
96 END_TEST
97
98 /*
99  * Check whether srd_decoder_load() works/fails for valid/bogus PDs.
100  * If it returns incorrect values (or segfaults) this test will fail.
101  */
102 START_TEST(test_load_valid_and_bogus)
103 {
104         srd_init(DECODERS_TESTDIR);
105         fail_unless(srd_decoder_load("") != SRD_OK);
106         fail_unless(srd_decoder_load("uart") == SRD_OK);
107         fail_unless(srd_decoder_load("") != SRD_OK);
108         fail_unless(srd_decoder_load("spi") == SRD_OK);
109         fail_unless(srd_decoder_load("") != SRD_OK);
110         fail_unless(srd_decoder_load("can") == SRD_OK);
111         fail_unless(srd_decoder_load("") != SRD_OK);
112         srd_exit();
113 }
114 END_TEST
115
116 /*
117  * Check whether srd_decoder_load() fails when run multiple times.
118  * If it returns a value != SRD_OK (or segfaults) this test will fail.
119  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=177
120  */
121 START_TEST(test_load_multiple)
122 {
123         int ret;
124
125         srd_init(DECODERS_TESTDIR);
126         ret = srd_decoder_load("uart");
127         fail_unless(ret == SRD_OK, "Loading uart PD 1x failed: %d", ret);
128         ret = srd_decoder_load("uart");
129         fail_unless(ret == SRD_OK, "Loading uart PD 2x failed: %d", ret);
130         ret = srd_decoder_load("uart");
131         fail_unless(ret == SRD_OK, "Loading uart PD 3x failed: %d", ret);
132         srd_exit();
133 }
134 END_TEST
135
136 /*
137  * Check whether srd_decoder_load() fails if a non-existing PD dir is used.
138  * If it returns SRD_OK (or segfaults) this test will fail.
139  */
140 START_TEST(test_load_nonexisting_pd_dir)
141 {
142 #if 0
143         /* TODO: Build libsigrokdecode with no default PD dir. */
144         srd_init("/nonexisting_dir");
145         fail_unless(srd_decoder_load("spi") != SRD_OK);
146         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 0);
147         srd_exit();
148 #endif
149 }
150 END_TEST
151
152 /*
153  * Check whether srd_decoder_unload_all() works.
154  * If it returns != SRD_OK (or segfaults) this test will fail.
155  */
156 START_TEST(test_unload_all)
157 {
158         int ret;
159
160         srd_init(DECODERS_TESTDIR);
161         ret = srd_decoder_load_all();
162         fail_unless(ret == SRD_OK, "srd_decoder_load_all() failed: %d.", ret);
163         ret = srd_decoder_unload_all();
164         fail_unless(ret == SRD_OK, "srd_decoder_unload_all() failed: %d.", ret);
165         srd_exit();
166 }
167 END_TEST
168
169 /*
170  * Check whether srd_decoder_unload_all() works without prior srd_init().
171  * If it returns != SRD_OK (or segfaults) this test will fail.
172  */
173 START_TEST(test_unload_all_no_init)
174 {
175         int ret;
176
177         ret = srd_decoder_unload_all();
178         fail_unless(ret == SRD_OK, "srd_decoder_unload_all() failed: %d.", ret);
179 }
180 END_TEST
181
182 /*
183  * Check whether srd_decoder_unload_all() works multiple times.
184  * If it returns != SRD_OK (or segfaults) this test will fail.
185  */
186 START_TEST(test_unload_all_multiple)
187 {
188         int ret, i;
189
190         srd_init(DECODERS_TESTDIR);
191         for (i = 0; i < 10; i++) {
192                 ret = srd_decoder_load_all();
193                 fail_unless(ret == SRD_OK, "srd_decoder_load_all() failed: %d.", ret);
194                 ret = srd_decoder_unload_all();
195                 fail_unless(ret == SRD_OK, "srd_decoder_unload_all() failed: %d.", ret);
196         }
197         srd_exit();
198 }
199 END_TEST
200
201 /*
202  * Check whether srd_decoder_unload_all() works multiple times (no load).
203  * If it returns != SRD_OK (or segfaults) this test will fail.
204  */
205 START_TEST(test_unload_all_multiple_noload)
206 {
207         int ret, i;
208
209         srd_init(DECODERS_TESTDIR);
210         for (i = 0; i < 10; i++) {
211                 ret = srd_decoder_unload_all();
212                 fail_unless(ret == SRD_OK, "srd_decoder_unload_all() failed: %d.", ret);
213         }
214         srd_exit();
215 }
216 END_TEST
217
218 /*
219  * Check whether srd_decoder_unload() works.
220  * If it returns != SRD_OK (or segfaults) this test will fail.
221  */
222 START_TEST(test_unload)
223 {
224         int ret;
225         struct srd_decoder *dec;
226
227         srd_init(DECODERS_TESTDIR);
228         ret = srd_decoder_load("uart");
229         fail_unless(ret == SRD_OK, "srd_decoder_load(uart) failed: %d.", ret);
230         dec = srd_decoder_get_by_id("uart");
231         fail_unless(dec != NULL);
232         ret = srd_decoder_unload(dec);
233         fail_unless(ret == SRD_OK, "srd_decoder_unload() failed: %d.", ret);
234         srd_exit();
235 }
236 END_TEST
237
238 /*
239  * Check whether srd_decoder_unload(NULL) fails.
240  * If it returns SRD_OK (or segfaults) this test will fail.
241  */
242 START_TEST(test_unload_null)
243 {
244         srd_init(DECODERS_TESTDIR);
245         fail_unless(srd_decoder_unload(NULL) != SRD_OK);
246         srd_exit();
247 }
248 END_TEST
249
250 /*
251  * Check whether srd_decoder_unload(NULL) fails without prior srd_init().
252  * If it returns SRD_OK (or segfaults) this test will fail.
253  */
254 START_TEST(test_unload_null_no_init)
255 {
256         fail_unless(srd_decoder_unload(NULL) != SRD_OK);
257 }
258 END_TEST
259
260 /*
261  * Check whether srd_decoder_list() returns a non-empty list.
262  * If it returns an empty list (or segfaults) this test will fail.
263  */
264 START_TEST(test_decoder_list)
265 {
266         srd_init(DECODERS_TESTDIR);
267         srd_decoder_load_all();
268         fail_unless(srd_decoder_list() != NULL);
269         srd_exit();
270 }
271 END_TEST
272
273 /*
274  * Check whether srd_decoder_list() without prior srd_decoder_load_all()
275  * returns an empty list (return value != NULL).
276  * If it returns a non-empty list (or segfaults) this test will fail.
277  */
278 START_TEST(test_decoder_list_no_load)
279 {
280         srd_init(DECODERS_TESTDIR);
281         fail_unless(srd_decoder_list() == NULL);
282         srd_exit();
283 }
284 END_TEST
285
286 /*
287  * Check whether srd_decoder_list() without prior srd_init()
288  * returns an empty list.
289  * If it returns a non-empty list (or segfaults) this test will fail.
290  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=178
291  */
292 START_TEST(test_decoder_list_no_init)
293 {
294         srd_decoder_load_all();
295         fail_unless(srd_decoder_list() == NULL);
296 }
297 END_TEST
298
299 /*
300  * Check whether srd_decoder_list() without prior srd_init() and without
301  * prior srd_decoder_load_all() returns an empty list.
302  * If it returns a non-empty list (or segfaults) this test will fail.
303  */
304 START_TEST(test_decoder_list_no_init_no_load)
305 {
306         fail_unless(srd_decoder_list() == NULL);
307 }
308 END_TEST
309
310 /*
311  * Check whether srd_decoder_list() returns the correct number of PDs.
312  * If it returns a wrong number (or segfaults) this test will fail.
313  */
314 START_TEST(test_decoder_list_correct_numbers)
315 {
316         srd_init(DECODERS_TESTDIR);
317         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 0);
318         srd_decoder_load("spi");
319         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 1);
320         srd_decoder_load("uart");
321         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 2);
322         srd_decoder_load("can");
323         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 3);
324         srd_decoder_load("can"); /* Load same PD twice. */
325         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 3);
326         srd_exit();
327 }
328 END_TEST
329
330 /*
331  * Check whether srd_decoder_get_by_id() works.
332  * If it returns NULL for valid PDs (or segfaults) this test will fail.
333  */
334 START_TEST(test_get_by_id)
335 {
336         srd_init(DECODERS_TESTDIR);
337         srd_decoder_load("uart");
338         fail_unless(srd_decoder_get_by_id("uart") != NULL);
339         fail_unless(srd_decoder_get_by_id("can") == NULL);
340         srd_decoder_load("can");
341         fail_unless(srd_decoder_get_by_id("uart") != NULL);
342         fail_unless(srd_decoder_get_by_id("can") != NULL);
343         srd_exit();
344 }
345 END_TEST
346
347 /*
348  * Check whether srd_decoder_get_by_id() works multiple times in a row.
349  * If it returns NULL for valid PDs (or segfaults) this test will fail.
350  */
351 START_TEST(test_get_by_id_multiple)
352 {
353         srd_init(DECODERS_TESTDIR);
354         srd_decoder_load("uart");
355         fail_unless(srd_decoder_get_by_id("uart") != NULL);
356         fail_unless(srd_decoder_get_by_id("uart") != NULL);
357         fail_unless(srd_decoder_get_by_id("uart") != NULL);
358         fail_unless(srd_decoder_get_by_id("uart") != NULL);
359         srd_exit();
360 }
361 END_TEST
362
363 /*
364  * Check whether srd_decoder_get_by_id() fails for bogus PDs.
365  * If it returns a value != NULL (or segfaults) this test will fail.
366  */
367 START_TEST(test_get_by_id_bogus)
368 {
369         srd_init(DECODERS_TESTDIR);
370         fail_unless(srd_decoder_get_by_id(NULL) == NULL);
371         fail_unless(srd_decoder_get_by_id("") == NULL);
372         fail_unless(srd_decoder_get_by_id(" ") == NULL);
373         fail_unless(srd_decoder_get_by_id("nonexisting") == NULL);
374         fail_unless(srd_decoder_get_by_id("sPi") == NULL);
375         fail_unless(srd_decoder_get_by_id("SPI") == NULL);
376         fail_unless(srd_decoder_get_by_id("s p i") == NULL);
377         fail_unless(srd_decoder_get_by_id(" spi") == NULL);
378         fail_unless(srd_decoder_get_by_id("spi ") == NULL);
379         fail_unless(srd_decoder_get_by_id(" spi ") == NULL);
380         fail_unless(srd_decoder_get_by_id("spi uart") == NULL);
381         srd_exit();
382 }
383 END_TEST
384
385 /*
386  * Check whether srd_decoder_doc_get() works.
387  * If it returns NULL for valid PDs (or segfaults) this test will fail.
388  */
389 START_TEST(test_doc_get)
390 {
391         struct srd_decoder *dec;
392
393         srd_init(DECODERS_TESTDIR);
394         srd_decoder_load("uart");
395         dec = srd_decoder_get_by_id("uart");
396         fail_unless(srd_decoder_doc_get(dec) != NULL);
397         srd_exit();
398 }
399 END_TEST
400
401 /*
402  * Check whether srd_decoder_doc_get() fails with NULL as argument.
403  * If it returns a value != NULL (or segfaults) this test will fail.
404  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=179
405  */
406 START_TEST(test_doc_get_null)
407 {
408         srd_init(DECODERS_TESTDIR);
409         fail_unless(srd_decoder_doc_get(NULL) == NULL);
410         srd_exit();
411 }
412 END_TEST
413
414 Suite *suite_decoder(void)
415 {
416         Suite *s;
417         TCase *tc;
418
419         s = suite_create("decoder");
420
421         tc = tcase_create("load");
422         tcase_set_timeout(tc, 0);
423         tcase_add_checked_fixture(tc, srdtest_setup, srdtest_teardown);
424         tcase_add_test(tc, test_load_all);
425         tcase_add_test(tc, test_load_all_no_init);
426         tcase_add_test(tc, test_load);
427         tcase_add_test(tc, test_load_bogus);
428         tcase_add_test(tc, test_load_valid_and_bogus);
429         tcase_add_test(tc, test_load_multiple);
430         tcase_add_test(tc, test_load_nonexisting_pd_dir);
431         suite_add_tcase(s, tc);
432
433         tc = tcase_create("unload");
434         tcase_add_checked_fixture(tc, srdtest_setup, srdtest_teardown);
435         tcase_add_test(tc, test_unload_all);
436         tcase_add_test(tc, test_unload_all_no_init);
437         tcase_add_test(tc, test_unload_all_multiple);
438         tcase_add_test(tc, test_unload_all_multiple_noload);
439         tcase_add_test(tc, test_unload);
440         tcase_add_test(tc, test_unload_null);
441         tcase_add_test(tc, test_unload_null_no_init);
442         suite_add_tcase(s, tc);
443
444         tc = tcase_create("list");
445         tcase_add_checked_fixture(tc, srdtest_setup, srdtest_teardown);
446         tcase_add_test(tc, test_decoder_list);
447         tcase_add_test(tc, test_decoder_list_no_load);
448         tcase_add_test(tc, test_decoder_list_no_init);
449         tcase_add_test(tc, test_decoder_list_no_init_no_load);
450         tcase_add_test(tc, test_decoder_list_correct_numbers);
451         suite_add_tcase(s, tc);
452
453         tc = tcase_create("get_by_id");
454         tcase_add_test(tc, test_get_by_id);
455         tcase_add_test(tc, test_get_by_id_multiple);
456         tcase_add_test(tc, test_get_by_id_bogus);
457         suite_add_tcase(s, tc);
458
459         tc = tcase_create("doc_get");
460         tcase_add_test(tc, test_doc_get);
461         tcase_add_test(tc, test_doc_get_null);
462         suite_add_tcase(s, tc);
463
464         return s;
465 }