]> sigrok.org Git - libsigrokdecode.git/blob - tests/check_decoder.c
0b46348b70dc60419ebb50bea10d3a6469cf5876
[libsigrokdecode.git] / tests / check_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 "../libsigrokdecode.h" /* First, to avoid compiler warning. */
22 #include <stdlib.h>
23 #include <check.h>
24
25 static void setup(void)
26 {
27         /* Silence libsigrokdecode while the unit tests run. */
28         srd_log_loglevel_set(SRD_LOG_NONE);
29 }
30
31 static void teardown(void)
32 {
33 }
34
35 /*
36  * Check whether srd_decoder_load_all() works.
37  * If it returns != SRD_OK (or segfaults) this test will fail.
38  */
39 START_TEST(test_load_all)
40 {
41         int ret;
42
43         srd_init(NULL);
44         ret = srd_decoder_load_all();
45         fail_unless(ret == SRD_OK, "srd_decoder_load_all() failed: %d.", ret);
46         srd_exit();
47 }
48 END_TEST
49
50 /*
51  * Check whether srd_decoder_load_all() fails without prior srd_init().
52  * If it returns != SRD_OK (or segfaults) this test will fail.
53  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=178
54  */
55 START_TEST(test_load_all_no_init)
56 {
57         int ret;
58
59         ret = srd_decoder_load_all();
60         fail_unless(ret == SRD_OK, "srd_decoder_load_all() failed: %d.", ret);
61 }
62 END_TEST
63
64 /*
65  * Check whether srd_decoder_load() works.
66  * If it returns != SRD_OK (or segfaults) this test will fail.
67  */
68 START_TEST(test_load)
69 {
70         int ret;
71
72         srd_init(NULL);
73         ret = srd_decoder_load("uart");
74         fail_unless(ret == SRD_OK, "srd_decoder_load(uart) failed: %d.", ret);
75         ret = srd_decoder_load("spi");
76         fail_unless(ret == SRD_OK, "srd_decoder_load(spi) failed: %d.", ret);
77         ret = srd_decoder_load("usb_signalling");
78         fail_unless(ret == SRD_OK, "srd_decoder_load(usb_signalling) failed: %d.", ret);
79         srd_exit();
80 }
81 END_TEST
82
83 /*
84  * Check whether srd_decoder_load() fails for non-existing or bogus PDs.
85  * If it returns SRD_OK (or segfaults) this test will fail.
86  */
87 START_TEST(test_load_bogus)
88 {
89         srd_init(NULL);
90         /* http://sigrok.org/bugzilla/show_bug.cgi?id=176 */
91         fail_unless(srd_decoder_load(NULL) != SRD_OK);
92         fail_unless(srd_decoder_load("") != SRD_OK);
93         fail_unless(srd_decoder_load(" ") != SRD_OK);
94         fail_unless(srd_decoder_load("nonexisting") != SRD_OK);
95         fail_unless(srd_decoder_load("UART") != SRD_OK);
96         fail_unless(srd_decoder_load("UaRt") != SRD_OK);
97         fail_unless(srd_decoder_load("u a r t") != SRD_OK);
98         fail_unless(srd_decoder_load("uart ") != SRD_OK);
99         fail_unless(srd_decoder_load(" uart") != SRD_OK);
100         fail_unless(srd_decoder_load(" uart ") != SRD_OK);
101         fail_unless(srd_decoder_load("uart spi") != SRD_OK);
102         srd_exit();
103 }
104 END_TEST
105
106 /*
107  * Check whether srd_decoder_load() works/fails for valid/bogus PDs.
108  * If it returns incorrect values (or segfaults) this test will fail.
109  */
110 START_TEST(test_load_valid_and_bogus)
111 {
112         srd_init(NULL);
113         fail_unless(srd_decoder_load("") != SRD_OK);
114         fail_unless(srd_decoder_load("uart") == SRD_OK);
115         fail_unless(srd_decoder_load("") != SRD_OK);
116         fail_unless(srd_decoder_load("spi") == SRD_OK);
117         fail_unless(srd_decoder_load("") != SRD_OK);
118         fail_unless(srd_decoder_load("can") == SRD_OK);
119         fail_unless(srd_decoder_load("") != SRD_OK);
120         srd_exit();
121 }
122 END_TEST
123
124 /*
125  * Check whether srd_decoder_load() fails when run multiple times.
126  * If it returns a value != SRD_OK (or segfaults) this test will fail.
127  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=177
128  */
129 START_TEST(test_load_multiple)
130 {
131         int ret;
132
133         srd_init(NULL);
134         srd_log_loglevel_set(SRD_LOG_SPEW);
135         ret = srd_decoder_load("uart");
136         fail_unless(ret == SRD_OK, "Loading uart PD 1x failed: %d", ret);
137         ret = srd_decoder_load("uart");
138         fail_unless(ret == SRD_OK, "Loading uart PD 2x failed: %d", ret);
139         ret = srd_decoder_load("uart");
140         fail_unless(ret == SRD_OK, "Loading uart PD 3x failed: %d", ret);
141         srd_exit();
142 }
143 END_TEST
144
145 /*
146  * Check whether srd_decoder_load() fails if a non-existing PD dir is used.
147  * If it returns SRD_OK (or segfaults) this test will fail.
148  */
149 START_TEST(test_load_nonexisting_pd_dir)
150 {
151 #if 0
152         /* TODO: Build libsigrokdecode with no default PD dir. */
153         srd_init("/nonexisting_dir");
154         fail_unless(srd_decoder_load("spi") != SRD_OK);
155         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 0);
156         srd_exit();
157 #endif
158 }
159 END_TEST
160
161 /*
162  * Check whether srd_decoder_list() returns a non-empty list.
163  * If it returns an empty list (or segfaults) this test will fail.
164  */
165 START_TEST(test_decoder_list)
166 {
167         srd_init(NULL);
168         srd_decoder_load_all();
169         fail_unless(srd_decoder_list() != NULL);
170         srd_exit();
171 }
172 END_TEST
173
174 /*
175  * Check whether srd_decoder_list() without prior srd_decoder_load_all()
176  * returns an empty list (return value != NULL).
177  * If it returns a non-empty list (or segfaults) this test will fail.
178  */
179 START_TEST(test_decoder_list_no_load)
180 {
181         srd_init(NULL);
182         fail_unless(srd_decoder_list() == NULL);
183         srd_exit();
184 }
185 END_TEST
186
187 /*
188  * Check whether srd_decoder_list() without prior srd_init()
189  * returns an empty list.
190  * If it returns a non-empty list (or segfaults) this test will fail.
191  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=178
192  */
193 START_TEST(test_decoder_list_no_init)
194 {
195         srd_decoder_load_all();
196         fail_unless(srd_decoder_list() == NULL);
197 }
198 END_TEST
199
200 /*
201  * Check whether srd_decoder_list() without prior srd_init() and without
202  * prior srd_decoder_load_all() returns an empty list.
203  * If it returns a non-empty list (or segfaults) this test will fail.
204  */
205 START_TEST(test_decoder_list_no_init_no_load)
206 {
207         fail_unless(srd_decoder_list() == NULL);
208 }
209 END_TEST
210
211 /*
212  * Check whether srd_decoder_list() returns the correct number of PDs.
213  * If it returns a wrong number (or segfaults) this test will fail.
214  */
215 START_TEST(test_decoder_list_correct_numbers)
216 {
217         srd_init(NULL);
218         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 0);
219         srd_decoder_load("spi");
220         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 1);
221         srd_decoder_load("uart");
222         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 2);
223         srd_decoder_load("can");
224         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 3);
225         srd_decoder_load("can"); /* Load same PD twice. */
226         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 3);
227         srd_exit();
228 }
229 END_TEST
230
231 /*
232  * Check whether srd_decoder_get_by_id() works.
233  * If it returns NULL for valid PDs (or segfaults) this test will fail.
234  */
235 START_TEST(test_get_by_id)
236 {
237         srd_init(NULL);
238         srd_decoder_load("uart");
239         fail_unless(srd_decoder_get_by_id("uart") != NULL);
240         fail_unless(srd_decoder_get_by_id("can") == NULL);
241         srd_decoder_load("can");
242         fail_unless(srd_decoder_get_by_id("uart") != NULL);
243         fail_unless(srd_decoder_get_by_id("can") != NULL);
244         srd_exit();
245 }
246 END_TEST
247
248 /*
249  * Check whether srd_decoder_get_by_id() works multiple times in a row.
250  * If it returns NULL for valid PDs (or segfaults) this test will fail.
251  */
252 START_TEST(test_get_by_id_multiple)
253 {
254         srd_init(NULL);
255         srd_decoder_load("uart");
256         fail_unless(srd_decoder_get_by_id("uart") != NULL);
257         fail_unless(srd_decoder_get_by_id("uart") != NULL);
258         fail_unless(srd_decoder_get_by_id("uart") != NULL);
259         fail_unless(srd_decoder_get_by_id("uart") != NULL);
260         srd_exit();
261 }
262 END_TEST
263
264 /*
265  * Check whether srd_decoder_get_by_id() fails for bogus PDs.
266  * If it returns a value != NULL (or segfaults) this test will fail.
267  */
268 START_TEST(test_get_by_id_bogus)
269 {
270         srd_init(NULL);
271         fail_unless(srd_decoder_get_by_id(NULL) == NULL);
272         fail_unless(srd_decoder_get_by_id("") == NULL);
273         fail_unless(srd_decoder_get_by_id(" ") == NULL);
274         fail_unless(srd_decoder_get_by_id("nonexisting") == NULL);
275         fail_unless(srd_decoder_get_by_id("sPi") == NULL);
276         fail_unless(srd_decoder_get_by_id("SPI") == NULL);
277         fail_unless(srd_decoder_get_by_id("s p i") == NULL);
278         fail_unless(srd_decoder_get_by_id(" spi") == NULL);
279         fail_unless(srd_decoder_get_by_id("spi ") == NULL);
280         fail_unless(srd_decoder_get_by_id(" spi ") == NULL);
281         fail_unless(srd_decoder_get_by_id("spi uart") == NULL);
282         srd_exit();
283 }
284 END_TEST
285
286 /*
287  * Check whether srd_decoder_doc_get() works.
288  * If it returns NULL for valid PDs (or segfaults) this test will fail.
289  */
290 START_TEST(test_doc_get)
291 {
292         struct srd_decoder *dec;
293
294         srd_init(NULL);
295         srd_decoder_load("uart");
296         dec = srd_decoder_get_by_id("uart");
297         fail_unless(srd_decoder_doc_get(dec) != NULL);
298         srd_exit();
299 }
300 END_TEST
301
302 /*
303  * Check whether srd_decoder_doc_get() fails with NULL as argument.
304  * If it returns a value != NULL (or segfaults) this test will fail.
305  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=179
306  */
307 START_TEST(test_doc_get_null)
308 {
309         srd_init(NULL);
310         fail_unless(srd_decoder_doc_get(NULL) != NULL);
311         srd_exit();
312 }
313 END_TEST
314
315 /*
316  * Check whether srd_decoder_doc_get() fails with an "empty" argument.
317  * If it returns a value != NULL (or segfaults) this test will fail.
318  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=180
319  */
320 START_TEST(test_doc_get_empty)
321 {
322         struct srd_decoder dec;
323
324         srd_init(NULL);
325
326         memset(&dec, 0, sizeof(struct srd_decoder));
327         fail_unless(srd_decoder_doc_get(&dec) == NULL);
328
329         srd_exit();
330 }
331 END_TEST
332
333 Suite *suite_decoder(void)
334 {
335         Suite *s;
336         TCase *tc;
337
338         s = suite_create("decoder");
339
340         tc = tcase_create("load");
341         tcase_add_checked_fixture(tc, setup, teardown);
342         tcase_add_test(tc, test_load_all);
343         tcase_add_test(tc, test_load_all_no_init);
344         tcase_add_test(tc, test_load);
345         tcase_add_test(tc, test_load_bogus);
346         tcase_add_test(tc, test_load_valid_and_bogus);
347         tcase_add_test(tc, test_load_multiple);
348         tcase_add_test(tc, test_load_nonexisting_pd_dir);
349         suite_add_tcase(s, tc);
350
351         tc = tcase_create("list");
352         tcase_add_checked_fixture(tc, setup, teardown);
353         tcase_add_test(tc, test_decoder_list);
354         tcase_add_test(tc, test_decoder_list_no_load);
355         tcase_add_test(tc, test_decoder_list_no_init);
356         tcase_add_test(tc, test_decoder_list_no_init_no_load);
357         tcase_add_test(tc, test_decoder_list_correct_numbers);
358         suite_add_tcase(s, tc);
359
360         tc = tcase_create("get_by_id");
361         tcase_add_test(tc, test_get_by_id);
362         tcase_add_test(tc, test_get_by_id_multiple);
363         tcase_add_test(tc, test_get_by_id_bogus);
364         suite_add_tcase(s, tc);
365
366         tc = tcase_create("doc_get");
367         tcase_add_test(tc, test_doc_get);
368         tcase_add_test(tc, test_doc_get_null);
369         tcase_add_test(tc, test_doc_get_empty);
370         suite_add_tcase(s, tc);
371
372         return s;
373 }