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 /* query the session */
65 uuid = strdup(afb_session_uuid(s));
66 x = afb_session_search(uuid);
69 /* still alive after search */
72 s = afb_session_search(uuid);
76 /* but not after closing */
78 ck_assert(afb_session_is_closed(s));
81 s = afb_session_search(uuid);
87 /*********************************************************************/
88 /* check that the maximum capacity is ensured */
89 START_TEST (check_capacity)
91 struct afb_session *s[3];
92 ck_assert_int_eq(0, afb_session_init(2, 3600, GOOD_UUID));
93 s[0] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
95 s[1] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
97 s[2] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
99 afb_session_close(s[0]);
100 afb_session_unref(s[0]);
101 s[2] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
103 s[0] = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
105 afb_session_unref(s[0]);
106 afb_session_unref(s[1]);
107 afb_session_unref(s[2]);
111 /*********************************************************************/
112 /* check the handling of cookies */
114 void *mkcookie(void *closure)
116 mkcookie_got = closure;
120 void *freecookie_got;
121 void freecookie(void *item)
123 freecookie_got = item;
126 START_TEST (check_cookies)
128 char *k[] = { "key1", "key2", "key3", NULL }, *p, *q, *d = "default";
129 struct afb_session *s;
133 ck_assert_int_eq(0, afb_session_init(10, 3600, GOOD_UUID));
135 /* create a session */
136 s = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
140 for (i = 0 ; k[i] ; i++) {
141 for (j = 0 ; k[j] ; j++) {
142 /* retrieve the previous value */
143 mkcookie_got = freecookie_got = NULL;
144 p = afb_session_cookie(s, k[j], NULL, NULL, NULL, 0);
146 /* never set (i = 0) */
147 q = afb_session_cookie(s, k[j], NULL, NULL, d, 0);
149 p = afb_session_cookie(s, k[j], NULL, NULL, NULL, 0);
152 q = afb_session_cookie(s, k[j], mkcookie, freecookie, k[i], 1);
153 ck_assert(q == k[i]);
154 ck_assert(mkcookie_got == q);
155 ck_assert(freecookie_got == p);
160 for (i = 1 ; k[i] ; i++) {
161 mkcookie_got = freecookie_got = NULL;
162 p = afb_session_cookie(s, k[i], NULL, NULL, NULL, 0);
163 ck_assert(!freecookie_got);
164 q = afb_session_cookie(s, k[i], NULL, NULL, NULL, 1);
166 ck_assert(freecookie_got == p);
169 /* closing session */
170 p = afb_session_cookie(s, k[0], NULL, NULL, NULL, 0);
171 mkcookie_got = freecookie_got = NULL;
172 afb_session_close(s);
173 ck_assert(freecookie_got == p);
174 p = afb_session_cookie(s, k[0], NULL, NULL, NULL, 0);
176 afb_session_unref(s);
181 /*********************************************************************/
187 void on_create(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
189 hookflag |= afb_hook_flag_session_create;
192 void on_close(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
194 hookflag |= afb_hook_flag_session_close;
197 void on_destroy(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
199 hookflag |= afb_hook_flag_session_destroy;
202 void on_renew(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
204 hookflag |= afb_hook_flag_session_renew;
207 void on_addref(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
209 hookflag |= afb_hook_flag_session_addref;
212 void on_unref(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
214 hookflag |= afb_hook_flag_session_unref;
217 struct afb_hook_session_itf hookitf = {
218 .hook_session_create = on_create,
219 .hook_session_close = on_close,
220 .hook_session_destroy = on_destroy,
221 .hook_session_renew = on_renew,
222 .hook_session_addref = on_addref,
223 .hook_session_unref = on_unref
226 extern void afb_hook_session_create(struct afb_session *session);
227 extern void afb_hook_session_close(struct afb_session *session);
228 extern void afb_hook_session_destroy(struct afb_session *session);
229 extern void afb_hook_session_renew(struct afb_session *session);
230 extern void afb_hook_session_addref(struct afb_session *session);
231 extern void afb_hook_session_unref(struct afb_session *session);
233 extern struct afb_hook_session *afb_hook_create_session(const char *pattern, int flags, struct afb_hook_session_itf *itf, void *closure);
234 extern struct afb_hook_session *afb_hook_addref_session(struct afb_hook_session *hook);
235 extern void afb_hook_unref_session(struct afb_hook_session *hook);
238 START_TEST (check_hooking)
240 struct afb_hook_session *hs;
241 struct afb_session *s;
244 ck_assert_int_eq(0, afb_session_init(10, 3600, GOOD_UUID));
246 /* create the hooking */
247 hs = afb_hook_create_session(NULL, afb_hook_flags_session_all, &hookitf, NULL);
248 ck_assert_ptr_ne(hs, 0);
250 /* create a session */
252 s = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
253 ck_assert_ptr_ne(s, 0);
254 ck_assert_int_eq(hookflag, afb_hook_flag_session_create);
258 afb_session_addref(s);
259 ck_assert_int_eq(hookflag, afb_hook_flag_session_addref);
263 afb_session_unref(s);
264 ck_assert_int_eq(hookflag, afb_hook_flag_session_unref);
266 /* renew session token */
268 afb_session_new_token(s);
269 ck_assert_int_eq(hookflag, afb_hook_flag_session_renew);
273 afb_session_close(s);
274 ck_assert_int_eq(hookflag, afb_hook_flag_session_close);
278 afb_session_unref(s);
279 ck_assert_int_eq(hookflag, afb_hook_flag_session_unref);
284 ck_assert_int_eq(hookflag, afb_hook_flag_session_destroy);
288 afb_hook_unref_session(hs);
289 s = afb_session_create(AFB_SESSION_TIMEOUT_DEFAULT);
290 ck_assert_ptr_ne(s, 0);
291 ck_assert_int_eq(hookflag, 0);
292 afb_session_unref(s);
293 ck_assert_int_eq(hookflag, 0);
299 /*********************************************************************/
305 void mksuite(const char *name) { suite = suite_create(name); }
306 void addtcase(const char *name) { tcase = tcase_create(name); suite_add_tcase(suite, tcase); }
307 void addtest(TFun fun) { tcase_add_test(tcase, fun); }
311 SRunner *srunner = srunner_create(suite);
312 srunner_run_all(srunner, CK_NORMAL);
313 nerr = srunner_ntests_failed(srunner);
314 srunner_free(srunner);
318 int main(int ac, char **av)
322 addtest(check_initialisation);
323 addtest(check_sanity);
324 addtest(check_creation);
325 addtest(check_capacity);
326 addtest(check_cookies);
328 addtest(check_hooking);