]> sigrok.org Git - libsigrokdecode.git/blob - tests/decoder.c
Build: Include <config.h> first in all source files
[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_DIR);
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_DIR);
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_DIR);
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_DIR);
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_DIR);
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_list() returns a non-empty list.
154  * If it returns an empty list (or segfaults) this test will fail.
155  */
156 START_TEST(test_decoder_list)
157 {
158         srd_init(DECODERS_DIR);
159         srd_decoder_load_all();
160         fail_unless(srd_decoder_list() != NULL);
161         srd_exit();
162 }
163 END_TEST
164
165 /*
166  * Check whether srd_decoder_list() without prior srd_decoder_load_all()
167  * returns an empty list (return value != NULL).
168  * If it returns a non-empty list (or segfaults) this test will fail.
169  */
170 START_TEST(test_decoder_list_no_load)
171 {
172         srd_init(DECODERS_DIR);
173         fail_unless(srd_decoder_list() == NULL);
174         srd_exit();
175 }
176 END_TEST
177
178 /*
179  * Check whether srd_decoder_list() without prior srd_init()
180  * returns an empty list.
181  * If it returns a non-empty list (or segfaults) this test will fail.
182  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=178
183  */
184 START_TEST(test_decoder_list_no_init)
185 {
186         srd_decoder_load_all();
187         fail_unless(srd_decoder_list() == NULL);
188 }
189 END_TEST
190
191 /*
192  * Check whether srd_decoder_list() without prior srd_init() and without
193  * prior srd_decoder_load_all() returns an empty list.
194  * If it returns a non-empty list (or segfaults) this test will fail.
195  */
196 START_TEST(test_decoder_list_no_init_no_load)
197 {
198         fail_unless(srd_decoder_list() == NULL);
199 }
200 END_TEST
201
202 /*
203  * Check whether srd_decoder_list() returns the correct number of PDs.
204  * If it returns a wrong number (or segfaults) this test will fail.
205  */
206 START_TEST(test_decoder_list_correct_numbers)
207 {
208         srd_init(DECODERS_DIR);
209         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 0);
210         srd_decoder_load("spi");
211         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 1);
212         srd_decoder_load("uart");
213         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 2);
214         srd_decoder_load("can");
215         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 3);
216         srd_decoder_load("can"); /* Load same PD twice. */
217         fail_unless(g_slist_length((GSList *)srd_decoder_list()) == 3);
218         srd_exit();
219 }
220 END_TEST
221
222 /*
223  * Check whether srd_decoder_get_by_id() works.
224  * If it returns NULL for valid PDs (or segfaults) this test will fail.
225  */
226 START_TEST(test_get_by_id)
227 {
228         srd_init(DECODERS_DIR);
229         srd_decoder_load("uart");
230         fail_unless(srd_decoder_get_by_id("uart") != NULL);
231         fail_unless(srd_decoder_get_by_id("can") == NULL);
232         srd_decoder_load("can");
233         fail_unless(srd_decoder_get_by_id("uart") != NULL);
234         fail_unless(srd_decoder_get_by_id("can") != NULL);
235         srd_exit();
236 }
237 END_TEST
238
239 /*
240  * Check whether srd_decoder_get_by_id() works multiple times in a row.
241  * If it returns NULL for valid PDs (or segfaults) this test will fail.
242  */
243 START_TEST(test_get_by_id_multiple)
244 {
245         srd_init(DECODERS_DIR);
246         srd_decoder_load("uart");
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         fail_unless(srd_decoder_get_by_id("uart") != NULL);
251         srd_exit();
252 }
253 END_TEST
254
255 /*
256  * Check whether srd_decoder_get_by_id() fails for bogus PDs.
257  * If it returns a value != NULL (or segfaults) this test will fail.
258  */
259 START_TEST(test_get_by_id_bogus)
260 {
261         srd_init(DECODERS_DIR);
262         fail_unless(srd_decoder_get_by_id(NULL) == NULL);
263         fail_unless(srd_decoder_get_by_id("") == NULL);
264         fail_unless(srd_decoder_get_by_id(" ") == NULL);
265         fail_unless(srd_decoder_get_by_id("nonexisting") == NULL);
266         fail_unless(srd_decoder_get_by_id("sPi") == NULL);
267         fail_unless(srd_decoder_get_by_id("SPI") == NULL);
268         fail_unless(srd_decoder_get_by_id("s p i") == 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 ") == NULL);
272         fail_unless(srd_decoder_get_by_id("spi uart") == NULL);
273         srd_exit();
274 }
275 END_TEST
276
277 /*
278  * Check whether srd_decoder_doc_get() works.
279  * If it returns NULL for valid PDs (or segfaults) this test will fail.
280  */
281 START_TEST(test_doc_get)
282 {
283         struct srd_decoder *dec;
284
285         srd_init(DECODERS_DIR);
286         srd_decoder_load("uart");
287         dec = srd_decoder_get_by_id("uart");
288         fail_unless(srd_decoder_doc_get(dec) != NULL);
289         srd_exit();
290 }
291 END_TEST
292
293 /*
294  * Check whether srd_decoder_doc_get() fails with NULL as argument.
295  * If it returns a value != NULL (or segfaults) this test will fail.
296  * See also: http://sigrok.org/bugzilla/show_bug.cgi?id=179
297  */
298 START_TEST(test_doc_get_null)
299 {
300         srd_init(DECODERS_DIR);
301         fail_unless(srd_decoder_doc_get(NULL) == NULL);
302         srd_exit();
303 }
304 END_TEST
305
306 Suite *suite_decoder(void)
307 {
308         Suite *s;
309         TCase *tc;
310
311         s = suite_create("decoder");
312
313         tc = tcase_create("load");
314         tcase_set_timeout(tc, 0);
315         tcase_add_checked_fixture(tc, srdtest_setup, srdtest_teardown);
316         tcase_add_test(tc, test_load_all);
317         tcase_add_test(tc, test_load_all_no_init);
318         tcase_add_test(tc, test_load);
319         tcase_add_test(tc, test_load_bogus);
320         tcase_add_test(tc, test_load_valid_and_bogus);
321         tcase_add_test(tc, test_load_multiple);
322         tcase_add_test(tc, test_load_nonexisting_pd_dir);
323         suite_add_tcase(s, tc);
324
325         tc = tcase_create("list");
326         tcase_add_checked_fixture(tc, srdtest_setup, srdtest_teardown);
327         tcase_add_test(tc, test_decoder_list);
328         tcase_add_test(tc, test_decoder_list_no_load);
329         tcase_add_test(tc, test_decoder_list_no_init);
330         tcase_add_test(tc, test_decoder_list_no_init_no_load);
331         tcase_add_test(tc, test_decoder_list_correct_numbers);
332         suite_add_tcase(s, tc);
333
334         tc = tcase_create("get_by_id");
335         tcase_add_test(tc, test_get_by_id);
336         tcase_add_test(tc, test_get_by_id_multiple);
337         tcase_add_test(tc, test_get_by_id_bogus);
338         suite_add_tcase(s, tc);
339
340         tc = tcase_create("doc_get");
341         tcase_add_test(tc, test_doc_get);
342         tcase_add_test(tc, test_doc_get_null);
343         suite_add_tcase(s, tc);
344
345         return s;
346 }