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_token(s) != NULL);
57 ck_assert(!afb_session_is_closed(s));
59 /* token is the initial one */
60 ck_assert_str_eq(afb_session_token(s), GOOD_UUID);
61 ck_assert(afb_session_check_token(s, GOOD_UUID));
62 ck_assert(afb_session_check_token(s, afb_session_token(s)));
64 /* token can be renewed */
65 afb_session_new_token(s);
66 ck_assert(strcmp(afb_session_token(s), GOOD_UUID));
67 ck_assert(!afb_session_check_token(s, GOOD_UUID));
68 ck_assert(afb_session_check_token(s, afb_session_token(s)));
70 /* query the session */
71 uuid = strdup(afb_session_uuid(s));
72 x = afb_session_search(uuid);
75 /* still alive after search */
78 s = afb_session_search(uuid);
82 /* but not after closing */
84 ck_assert(afb_session_is_closed(s));
87 s = afb_session_search(uuid);
93 /*********************************************************************/
94 /* check that the maximum capacity is ensured */
95 START_TEST (check_capacity)
97 struct afb_session *s[3];
98 ck_assert_int_eq(0, afb_session_init(2, 3600, GOOD_UUID));
99 s[0] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
101 s[1] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
103 s[2] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
105 afb_session_close(s[0]);
106 afb_session_unref(s[0]);
107 s[2] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
109 s[0] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
111 afb_session_unref(s[0]);
112 afb_session_unref(s[1]);
113 afb_session_unref(s[2]);
117 /*********************************************************************/
118 /* check the handling of cookies */
120 void *mkcookie(void *closure)
122 mkcookie_got = closure;
126 void *freecookie_got;
127 void freecookie(void *item)
129 freecookie_got = item;
132 START_TEST (check_cookies)
134 char *k[] = { "key1", "key2", "key3", NULL }, *p, *q, *d = "default";
135 struct afb_session *s;
139 ck_assert_int_eq(0, afb_session_init(10, 3600, GOOD_UUID));
141 /* create a session */
142 s = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
146 for (i = 0 ; k[i] ; i++) {
147 for (j = 0 ; k[j] ; j++) {
148 /* retrieve the previous value */
149 mkcookie_got = freecookie_got = NULL;
150 p = afb_session_cookie(s, k[j], NULL, NULL, NULL, 0);
152 /* never set (i = 0) */
153 q = afb_session_cookie(s, k[j], NULL, NULL, d, 0);
155 p = afb_session_cookie(s, k[j], NULL, NULL, NULL, 0);
158 q = afb_session_cookie(s, k[j], mkcookie, freecookie, k[i], 1);
159 ck_assert(q == k[i]);
160 ck_assert(mkcookie_got == q);
161 ck_assert(freecookie_got == p);
166 for (i = 1 ; k[i] ; i++) {
167 mkcookie_got = freecookie_got = NULL;
168 p = afb_session_cookie(s, k[i], NULL, NULL, NULL, 0);
169 ck_assert(!freecookie_got);
170 q = afb_session_cookie(s, k[i], NULL, NULL, NULL, 1);
172 ck_assert(freecookie_got == p);
175 /* closing session */
176 p = afb_session_cookie(s, k[0], NULL, NULL, NULL, 0);
177 mkcookie_got = freecookie_got = NULL;
178 afb_session_close(s);
179 ck_assert(freecookie_got == p);
180 p = afb_session_cookie(s, k[0], NULL, NULL, NULL, 0);
182 afb_session_unref(s);
187 /*********************************************************************/
192 void on_create(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
194 hookflag |= afb_hook_flag_session_create;
197 void on_close(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
199 hookflag |= afb_hook_flag_session_close;
202 void on_destroy(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
204 hookflag |= afb_hook_flag_session_destroy;
207 void on_renew(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
209 hookflag |= afb_hook_flag_session_renew;
212 void on_addref(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
214 hookflag |= afb_hook_flag_session_addref;
217 void on_unref(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
219 hookflag |= afb_hook_flag_session_unref;
222 struct afb_hook_session_itf hookitf = {
223 .hook_session_create = on_create,
224 .hook_session_close = on_close,
225 .hook_session_destroy = on_destroy,
226 .hook_session_renew = on_renew,
227 .hook_session_addref = on_addref,
228 .hook_session_unref = on_unref
231 extern void afb_hook_session_create(struct afb_session *session);
232 extern void afb_hook_session_close(struct afb_session *session);
233 extern void afb_hook_session_destroy(struct afb_session *session);
234 extern void afb_hook_session_renew(struct afb_session *session);
235 extern void afb_hook_session_addref(struct afb_session *session);
236 extern void afb_hook_session_unref(struct afb_session *session);
238 extern struct afb_hook_session *afb_hook_create_session(const char *pattern, int flags, struct afb_hook_session_itf *itf, void *closure);
239 extern struct afb_hook_session *afb_hook_addref_session(struct afb_hook_session *hook);
240 extern void afb_hook_unref_session(struct afb_hook_session *hook);
243 START_TEST (check_hooking)
245 struct afb_hook_session *hs;
246 struct afb_session *s;
249 ck_assert_int_eq(0, afb_session_init(10, 3600, GOOD_UUID));
251 /* create the hooking */
252 hs = afb_hook_create_session(NULL, afb_hook_flags_session_all, &hookitf, NULL);
253 ck_assert_ptr_ne(hs, 0);
255 /* create a session */
257 s = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
258 ck_assert_ptr_ne(s, 0);
259 ck_assert_int_eq(hookflag, afb_hook_flag_session_create);
263 afb_session_addref(s);
264 ck_assert_int_eq(hookflag, afb_hook_flag_session_addref);
268 afb_session_unref(s);
269 ck_assert_int_eq(hookflag, afb_hook_flag_session_unref);
271 /* renew session token */
273 afb_session_new_token(s);
274 ck_assert_int_eq(hookflag, afb_hook_flag_session_renew);
278 afb_session_close(s);
279 ck_assert_int_eq(hookflag, afb_hook_flag_session_close);
283 afb_session_unref(s);
284 ck_assert_int_eq(hookflag, afb_hook_flag_session_unref);
289 ck_assert_int_eq(hookflag, afb_hook_flag_session_destroy);
293 afb_hook_unref_session(hs);
294 s = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
295 ck_assert_ptr_ne(s, 0);
296 ck_assert_int_eq(hookflag, 0);
297 afb_session_unref(s);
298 ck_assert_int_eq(hookflag, 0);
302 /*********************************************************************/
308 void mksuite(const char *name) { suite = suite_create(name); }
309 void addtcase(const char *name) { tcase = tcase_create(name); suite_add_tcase(suite, tcase); }
310 void addtest(TFun fun) { tcase_add_test(tcase, fun); }
314 SRunner *srunner = srunner_create(suite);
315 srunner_run_all(srunner, CK_NORMAL);
316 nerr = srunner_ntests_failed(srunner);
317 srunner_free(srunner);
321 int main(int ac, char **av)
325 addtest(check_initialisation);
326 addtest(check_sanity);
327 addtest(check_creation);
328 addtest(check_capacity);
329 addtest(check_cookies);
330 addtest(check_hooking);