9 #include "afb-session.h"
12 #define GOOD_UUID "123456789012345678901234567890123456"
13 #define BAD_UUID "1234567890123456789012345678901234567"
15 /*********************************************************************/
16 /* check the initialisation */
17 START_TEST (check_initialisation)
19 ck_assert_int_eq(0, afb_session_init(0, 0, NULL));
20 ck_assert_int_eq(0, afb_session_init(200, 0, NULL));
21 ck_assert_int_eq(0, afb_session_init(10, 0, GOOD_UUID));
22 ck_assert_str_eq(GOOD_UUID, afb_session_initial_token());
23 ck_assert_int_eq(-1, afb_session_init(10, 0, BAD_UUID));
24 ck_assert_int_eq(errno, EINVAL);
28 /*********************************************************************/
29 /* check that NULL is a valid value for addref/unref */
30 START_TEST (check_sanity)
32 struct afb_session *s;
33 s = afb_session_addref(NULL);
35 afb_session_unref(NULL);
40 /*********************************************************************/
41 /* check creation and retrieval of sessions */
42 START_TEST (check_creation)
45 struct afb_session *s, *x;
48 ck_assert_int_eq(0, afb_session_init(10, 3600, GOOD_UUID));
50 /* create a session */
51 s = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
54 /* the session is valid */
55 ck_assert(afb_session_uuid(s) != NULL);
56 ck_assert(!afb_session_is_closed(s));
58 /* token is the initial one */
59 ck_assert(afb_session_check_token(s, GOOD_UUID));
61 /* query the session */
62 uuid = strdup(afb_session_uuid(s));
63 x = afb_session_search(uuid);
66 /* still alive after search */
69 s = afb_session_search(uuid);
73 /* but not after closing */
75 ck_assert(afb_session_is_closed(s));
78 s = afb_session_search(uuid);
84 /*********************************************************************/
85 /* check that the maximum capacity is ensured */
86 START_TEST (check_capacity)
88 struct afb_session *s[3];
89 ck_assert_int_eq(0, afb_session_init(2, 3600, GOOD_UUID));
90 s[0] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
92 s[1] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
94 s[2] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
96 afb_session_close(s[0]);
97 afb_session_unref(s[0]);
98 s[2] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
100 s[0] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
102 afb_session_unref(s[0]);
103 afb_session_unref(s[1]);
104 afb_session_unref(s[2]);
108 /*********************************************************************/
109 /* check the handling of cookies */
111 void *mkcookie(void *closure)
113 mkcookie_got = closure;
117 void *freecookie_got;
118 void freecookie(void *item)
120 freecookie_got = item;
123 START_TEST (check_cookies)
125 char *k[] = { "key1", "key2", "key3", NULL }, *p, *q, *d = "default";
126 struct afb_session *s;
130 ck_assert_int_eq(0, afb_session_init(10, 3600, GOOD_UUID));
132 /* create a session */
133 s = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
137 for (i = 0 ; k[i] ; i++) {
138 for (j = 0 ; k[j] ; j++) {
139 /* retrieve the previous value */
140 mkcookie_got = freecookie_got = NULL;
141 p = afb_session_cookie(s, k[j], NULL, NULL, NULL, 0);
143 /* never set (i = 0) */
144 q = afb_session_cookie(s, k[j], NULL, NULL, d, 0);
146 p = afb_session_cookie(s, k[j], NULL, NULL, NULL, 0);
149 q = afb_session_cookie(s, k[j], mkcookie, freecookie, k[i], 1);
150 ck_assert(q == k[i]);
151 ck_assert(mkcookie_got == q);
152 ck_assert(freecookie_got == p);
157 for (i = 1 ; k[i] ; i++) {
158 mkcookie_got = freecookie_got = NULL;
159 p = afb_session_cookie(s, k[i], NULL, NULL, NULL, 0);
160 ck_assert(!freecookie_got);
161 q = afb_session_cookie(s, k[i], NULL, NULL, NULL, 1);
163 ck_assert(freecookie_got == p);
166 /* closing session */
167 p = afb_session_cookie(s, k[0], NULL, NULL, NULL, 0);
168 mkcookie_got = freecookie_got = NULL;
169 afb_session_close(s);
170 ck_assert(freecookie_got == p);
171 p = afb_session_cookie(s, k[0], NULL, NULL, NULL, 0);
173 afb_session_unref(s);
178 /*********************************************************************/
184 void on_create(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
186 hookflag |= afb_hook_flag_session_create;
189 void on_close(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
191 hookflag |= afb_hook_flag_session_close;
194 void on_destroy(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
196 hookflag |= afb_hook_flag_session_destroy;
199 void on_renew(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
201 hookflag |= afb_hook_flag_session_renew;
204 void on_addref(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
206 hookflag |= afb_hook_flag_session_addref;
209 void on_unref(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
211 hookflag |= afb_hook_flag_session_unref;
214 struct afb_hook_session_itf hookitf = {
215 .hook_session_create = on_create,
216 .hook_session_close = on_close,
217 .hook_session_destroy = on_destroy,
218 .hook_session_renew = on_renew,
219 .hook_session_addref = on_addref,
220 .hook_session_unref = on_unref
223 extern void afb_hook_session_create(struct afb_session *session);
224 extern void afb_hook_session_close(struct afb_session *session);
225 extern void afb_hook_session_destroy(struct afb_session *session);
226 extern void afb_hook_session_renew(struct afb_session *session);
227 extern void afb_hook_session_addref(struct afb_session *session);
228 extern void afb_hook_session_unref(struct afb_session *session);
230 extern struct afb_hook_session *afb_hook_create_session(const char *pattern, int flags, struct afb_hook_session_itf *itf, void *closure);
231 extern struct afb_hook_session *afb_hook_addref_session(struct afb_hook_session *hook);
232 extern void afb_hook_unref_session(struct afb_hook_session *hook);
235 START_TEST (check_hooking)
237 struct afb_hook_session *hs;
238 struct afb_session *s;
241 ck_assert_int_eq(0, afb_session_init(10, 3600, GOOD_UUID));
243 /* create the hooking */
244 hs = afb_hook_create_session(NULL, afb_hook_flags_session_all, &hookitf, NULL);
245 ck_assert_ptr_ne(hs, 0);
247 /* create a session */
249 s = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
250 ck_assert_ptr_ne(s, 0);
251 ck_assert_int_eq(hookflag, afb_hook_flag_session_create);
255 afb_session_addref(s);
256 ck_assert_int_eq(hookflag, afb_hook_flag_session_addref);
260 afb_session_unref(s);
261 ck_assert_int_eq(hookflag, afb_hook_flag_session_unref);
263 /* renew session token */
265 afb_session_new_token(s);
266 ck_assert_int_eq(hookflag, afb_hook_flag_session_renew);
270 afb_session_close(s);
271 ck_assert_int_eq(hookflag, afb_hook_flag_session_close);
275 afb_session_unref(s);
276 ck_assert_int_eq(hookflag, afb_hook_flag_session_unref);
281 ck_assert_int_eq(hookflag, afb_hook_flag_session_destroy);
285 afb_hook_unref_session(hs);
286 s = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
287 ck_assert_ptr_ne(s, 0);
288 ck_assert_int_eq(hookflag, 0);
289 afb_session_unref(s);
290 ck_assert_int_eq(hookflag, 0);
296 /*********************************************************************/
302 void mksuite(const char *name) { suite = suite_create(name); }
303 void addtcase(const char *name) { tcase = tcase_create(name); suite_add_tcase(suite, tcase); }
304 void addtest(TFun fun) { tcase_add_test(tcase, fun); }
308 SRunner *srunner = srunner_create(suite);
309 srunner_run_all(srunner, CK_NORMAL);
310 nerr = srunner_ntests_failed(srunner);
311 srunner_free(srunner);
315 int main(int ac, char **av)
319 addtest(check_initialisation);
320 addtest(check_sanity);
321 addtest(check_creation);
322 addtest(check_capacity);
323 addtest(check_cookies);
325 addtest(check_hooking);