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