tests/check_session.c: Fix compiler warning.
[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 #include "lib.h"
25
26 static void setup(void)
27 {
28         /* Silence libsigrokdecode while the unit tests run. */
29         srd_log_loglevel_set(SRD_LOG_NONE);
30 }
31
32 static void teardown(void)
33 {
34 }
35
36 /*
37  * Check whether srd_decoder_load_all() works.
38  * If it returns != SRD_OK (or segfaults) this test will fail.
39  */
40 START_TEST(test_load_all)
41 {
42         int ret;
43
44         srd_init(DECODERS_DIR);
45         ret = srd_decoder_load_all();
46         fail_unless(ret == SRD_OK, "srd_decoder_load_all() failed: %d.", ret);
47         srd_exit();
48 }
49 END_TEST
50
51 /*
52  * Check whether srd_decoder_load_all() fails without prior srd_init().
53  * If it returns != SRD_OK (or segfaults) this test will fail.
54  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=178
55  */
56 START_TEST(test_load_all_no_init)
57 {
58         int ret;
59
60         ret = srd_decoder_load_all();
61         fail_unless(ret != SRD_OK, "srd_decoder_load_all() didn't fail properly.");
62 }
63 END_TEST
64
65 /*
66  * Check whether srd_decoder_load() works.
67  * If it returns != SRD_OK (or segfaults) this test will fail.
68  */
69 START_TEST(test_load)
70 {
71         int ret;
72
73         srd_init(DECODERS_DIR);
74         ret = srd_decoder_load("uart");
75         fail_unless(ret == SRD_OK, "srd_decoder_load(uart) failed: %d.", ret);
76         ret = srd_decoder_load("spi");
77         fail_unless(ret == SRD_OK, "srd_decoder_load(spi) failed: %d.", ret);
78         ret = srd_decoder_load("usb_signalling");
79         fail_unless(ret == SRD_OK, "srd_decoder_load(usb_signalling) failed: %d.", ret);
80         srd_exit();
81 }
82 END_TEST
83
84 /*
85  * Check whether srd_decoder_load() fails for non-existing or bogus PDs.
86  * If it returns SRD_OK (or segfaults) this test will fail.
87  */
88 START_TEST(test_load_bogus)
89 {
90         srd_init(DECODERS_DIR);
91         /* http://sigrok.org/bugzilla/show_bug.cgi?id=176 */
92         fail_unless(srd_decoder_load(NULL) != SRD_OK);
93         fail_unless(srd_decoder_load("") != SRD_OK);
94         fail_unless(srd_decoder_load(" ") != SRD_OK);
95         fail_unless(srd_decoder_load("nonexisting") != SRD_OK);
96         fail_unless(srd_decoder_load("UART") != SRD_OK);
97         fail_unless(srd_decoder_load("UaRt") != SRD_OK);
98         fail_unless(srd_decoder_load("u a r t") != 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 ") != SRD_OK);
102         fail_unless(srd_decoder_load("uart spi") != SRD_OK);
103         srd_exit();
104 }
105 END_TEST
106
107 /*
108  * Check whether srd_decoder_load() works/fails for valid/bogus PDs.
109  * If it returns incorrect values (or segfaults) this test will fail.
110  */
111 START_TEST(test_load_valid_and_bogus)
112 {
113         srd_init(DECODERS_DIR);
114         fail_unless(srd_decoder_load("") != SRD_OK);
115         fail_unless(srd_decoder_load("uart") == SRD_OK);
116         fail_unless(srd_decoder_load("") != SRD_OK);
117         fail_unless(srd_decoder_load("spi") == SRD_OK);
118         fail_unless(srd_decoder_load("") != SRD_OK);
119         fail_unless(srd_decoder_load("can") == SRD_OK);
120         fail_unless(srd_decoder_load("") != SRD_OK);
121         srd_exit();
122 }
123 END_TEST
124
125 /*
126  * Check whether srd_decoder_load() fails when run multiple times.
127  * If it returns a value != SRD_OK (or segfaults) this test will fail.
128  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=177
129  */
130 START_TEST(test_load_multiple)
131 {
132         int ret;
133
134         srd_init(DECODERS_DIR);
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(DECODERS_DIR);
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(DECODERS_DIR);
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(DECODERS_DIR);
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(DECODERS_DIR);
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(DECODERS_DIR);
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(DECODERS_DIR);
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(DECODERS_DIR);
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(DECODERS_DIR);
310         fail_unless(srd_decoder_doc_get(NULL) == NULL);
311         srd_exit();
312 }
313 END_TEST
314
315 Suite *suite_decoder(void)
316 {
317         Suite *s;
318         TCase *tc;
319
320         s = suite_create("decoder");
321
322         tc = tcase_create("load");
323         tcase_add_checked_fixture(tc, setup, teardown);
324         tcase_add_test(tc, test_load_all);
325         tcase_add_test(tc, test_load_all_no_init);
326         tcase_add_test(tc, test_load);
327         tcase_add_test(tc, test_load_bogus);
328         tcase_add_test(tc, test_load_valid_and_bogus);
329         tcase_add_test(tc, test_load_multiple);
330         tcase_add_test(tc, test_load_nonexisting_pd_dir);
331         suite_add_tcase(s, tc);
332
333         tc = tcase_create("list");
334         tcase_add_checked_fixture(tc, setup, teardown);
335         tcase_add_test(tc, test_decoder_list);
336         tcase_add_test(tc, test_decoder_list_no_load);
337         tcase_add_test(tc, test_decoder_list_no_init);
338         tcase_add_test(tc, test_decoder_list_no_init_no_load);
339         tcase_add_test(tc, test_decoder_list_correct_numbers);
340         suite_add_tcase(s, tc);
341
342         tc = tcase_create("get_by_id");
343         tcase_add_test(tc, test_get_by_id);
344         tcase_add_test(tc, test_get_by_id_multiple);
345         tcase_add_test(tc, test_get_by_id_bogus);
346         suite_add_tcase(s, tc);
347
348         tc = tcase_create("doc_get");
349         tcase_add_test(tc, test_doc_get);
350         tcase_add_test(tc, test_doc_get_null);
351         suite_add_tcase(s, tc);
352
353         return s;
354 }