]> sigrok.org Git - libsigrok.git/blob - tests/session.c
kingst-la2016: fix segfault that often occurs when a capture is aborted
[libsigrok.git] / tests / session.c
1 /*
2  * This file is part of the libsigrok project.
3  *
4  * Copyright (C) 2014 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, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <stdlib.h>
22 #include <check.h>
23 #include <libsigrok/libsigrok.h>
24 #include "lib.h"
25
26 /*
27  * Check whether sr_session_new() works.
28  * If it returns != SR_OK (or segfaults) this test will fail.
29  */
30 START_TEST(test_session_new)
31 {
32         int ret;
33         struct sr_session *sess;
34
35         ret = sr_session_new(srtest_ctx, &sess);
36         fail_unless(ret == SR_OK, "sr_session_new() failed: %d.", ret);
37         sr_session_destroy(sess);
38 }
39 END_TEST
40
41 /*
42  * Check whether sr_session_new() fails for bogus parameters.
43  * If it returns SR_OK (or segfaults) this test will fail.
44  */
45 START_TEST(test_session_new_bogus)
46 {
47         int ret;
48
49         ret = sr_session_new(srtest_ctx, NULL);
50         fail_unless(ret != SR_OK, "sr_session_new(NULL) worked.");
51 }
52 END_TEST
53
54 /*
55  * Check whether multiple sr_session_new() calls work.
56  * If any call returns != SR_OK (or segfaults) this test will fail.
57  */
58 START_TEST(test_session_new_multiple)
59 {
60         int ret;
61         struct sr_session *sess1, *sess2, *sess3;
62
63         sess1 = sess2 = sess3 = NULL;
64
65         /* Multiple sr_session_new() calls must work. */
66         ret = sr_session_new(srtest_ctx, &sess1);
67         fail_unless(ret == SR_OK, "sr_session_new() 1 failed: %d.", ret);
68         ret = sr_session_new(srtest_ctx, &sess2);
69         fail_unless(ret == SR_OK, "sr_session_new() 2 failed: %d.", ret);
70         ret = sr_session_new(srtest_ctx, &sess3);
71         fail_unless(ret == SR_OK, "sr_session_new() 3 failed: %d.", ret);
72
73         /* The returned session pointers must all be non-NULL. */
74         fail_unless(sess1 != NULL);
75         fail_unless(sess2 != NULL);
76         fail_unless(sess3 != NULL);
77
78         /* The returned session pointers must not be the same. */
79         fail_unless(sess1 != sess2);
80         fail_unless(sess1 != sess3);
81         fail_unless(sess2 != sess3);
82
83         /* Destroying any of the sessions must work. */
84         ret = sr_session_destroy(sess1);
85         fail_unless(ret == SR_OK, "sr_session_destroy() 1 failed: %d.", ret);
86         ret = sr_session_destroy(sess2);
87         fail_unless(ret == SR_OK, "sr_session_destroy() 2 failed: %d.", ret);
88         ret = sr_session_destroy(sess3);
89         fail_unless(ret == SR_OK, "sr_session_destroy() 3 failed: %d.", ret);
90 }
91 END_TEST
92
93 /*
94  * Check whether sr_session_destroy() works.
95  * If it returns != SR_OK (or segfaults) this test will fail.
96  */
97 START_TEST(test_session_destroy)
98 {
99         int ret;
100         struct sr_session *sess;
101
102         sr_session_new(srtest_ctx, &sess);
103         ret = sr_session_destroy(sess);
104         fail_unless(ret == SR_OK, "sr_session_destroy() failed: %d.", ret);
105 }
106 END_TEST
107
108 /*
109  * Check whether sr_session_destroy() fails for bogus sessions.
110  * If it returns SR_OK (or segfaults) this test will fail.
111  */
112 START_TEST(test_session_destroy_bogus)
113 {
114         int ret;
115
116         ret = sr_session_destroy(NULL);
117         fail_unless(ret != SR_OK, "sr_session_destroy() worked.");
118 }
119 END_TEST
120
121 START_TEST(test_session_trigger_set_get)
122 {
123         int ret;
124         struct sr_session *sess;
125         struct sr_trigger *t1, *t2;
126
127         sr_session_new(srtest_ctx, &sess);
128         t1 = sr_trigger_new("T1");
129
130         /* Set a trigger and see if getting it works OK. */
131         ret = sr_session_trigger_set(sess, t1);
132         fail_unless(ret == SR_OK);
133         t2 = sr_session_trigger_get(sess);
134         fail_unless(t2 != NULL);
135         fail_unless(t1 == t2);
136         fail_unless(g_slist_length(t1->stages) == g_slist_length(t2->stages));
137         fail_unless(!strcmp(t1->name, t2->name));
138
139         sr_session_destroy(sess);
140 }
141 END_TEST
142
143 START_TEST(test_session_trigger_set_get_null)
144 {
145         int ret;
146         struct sr_session *sess;
147         struct sr_trigger *t;
148
149         sr_session_new(srtest_ctx, &sess);
150
151         /* Adding a NULL trigger is allowed. */
152         ret = sr_session_trigger_set(sess, NULL);
153         fail_unless(ret == SR_OK);
154         t = sr_session_trigger_get(sess);
155         fail_unless(t == NULL);
156
157         sr_session_destroy(sess);
158 }
159 END_TEST
160
161 START_TEST(test_session_trigger_set_null)
162 {
163         int ret;
164         struct sr_trigger *t;
165
166         t = sr_trigger_new("T1");
167
168         /* NULL session, must not segfault. */
169         ret = sr_session_trigger_set(NULL, t);
170         fail_unless(ret == SR_ERR_ARG);
171
172         /* NULL session and NULL trigger, must not segfault. */
173         ret = sr_session_trigger_set(NULL, NULL);
174         fail_unless(ret == SR_ERR_ARG);
175 }
176 END_TEST
177
178 START_TEST(test_session_trigger_get_null)
179 {
180         struct sr_trigger *t;
181
182         /* NULL session, must not segfault. */
183         t = sr_session_trigger_get(NULL);
184         fail_unless(t == NULL);
185 }
186 END_TEST
187
188 Suite *suite_session(void)
189 {
190         Suite *s;
191         TCase *tc;
192
193         s = suite_create("session");
194
195         tc = tcase_create("new_destroy");
196         tcase_add_checked_fixture(tc, srtest_setup, srtest_teardown);
197         tcase_add_test(tc, test_session_new);
198         tcase_add_test(tc, test_session_new_bogus);
199         tcase_add_test(tc, test_session_new_multiple);
200         tcase_add_test(tc, test_session_destroy);
201         tcase_add_test(tc, test_session_destroy_bogus);
202         suite_add_tcase(s, tc);
203
204         tc = tcase_create("trigger");
205         tcase_add_checked_fixture(tc, srtest_setup, srtest_teardown);
206         tcase_add_test(tc, test_session_trigger_set_get);
207         tcase_add_test(tc, test_session_trigger_set_get_null);
208         tcase_add_test(tc, test_session_trigger_set_null);
209         tcase_add_test(tc, test_session_trigger_get_null);
210         suite_add_tcase(s, tc);
211
212         return s;
213 }