2 * @file ike_sa_manager_test.c
4 * @brief Tests to test the IKE_SA-Manager type ike_sa_manager_t
9 * Copyright (C) 2005 Jan Hutter, Martin Willi
10 * Hochschule fuer Technik Rapperswil
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27 #include "ike_sa_manager_test.h"
30 #include <sa/ike_sa_manager.h>
33 static struct ike_sa_manager_test_struct_s
{
35 ike_sa_manager_t
*isam
;
38 static void test1_thread(ike_sa_id_t
*ike_sa_id
)
43 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
44 td
.tester
->assert_true(td
.tester
, (status
== SUCCESS
), "checkout of a blocked ike_sa");
46 status
= td
.isam
->checkin(td
.isam
, ike_sa
);
47 td
.tester
->assert_true(td
.tester
, (status
== SUCCESS
), "checkin of a requested ike_sa");
51 static void test2_thread(ike_sa_id_t
*ike_sa_id
)
56 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
57 td
.tester
->assert_true(td
.tester
, (status
== NOT_FOUND
), "IKE_SA already deleted");
60 static void test3_thread(ike_sa_id_t
*ike_sa_id
)
65 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
66 td
.tester
->assert_true(td
.tester
, (status
== NOT_FOUND
), "IKE_SA already deleted");
68 ike_sa_id
->destroy(ike_sa_id
);
74 void test_ike_sa_manager(tester_t
*tester
)
77 u_int64_t initiator
, responder
;
78 ike_sa_id_t
*ike_sa_id
, *sa_id
;
80 int thread_count
= 200;
83 pthread_t threads
[thread_count
];
86 td
.isam
= ike_sa_manager_create();
87 tester
->assert_true(tester
, (td
.isam
!= NULL
), "ike_sa_manager creation");
93 * we play initiator for IKE_SA_INIT first
98 td
.isam
->create_and_checkout(td
.isam
, &ike_sa
);
99 /* for testing purposes, we manipulate the responder spi.
100 * this is usually done be the response from the communication partner,
101 * but we don't have one...
105 sa_id
= ike_sa
->get_id(ike_sa
);
106 sa_id
->set_responder_spi(sa_id
, responder
);
108 ike_sa_id
= sa_id
->clone(sa_id
);
110 /* check in, so we should have a "completed" sa, specified by ike_sa_id */
111 status
= td
.isam
->checkin(td
.isam
, ike_sa
);
112 tester
->assert_true(tester
, (status
== SUCCESS
), "checkin modified IKE_SA");
114 /* now we check it out and start some other threads */
115 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
116 tester
->assert_true(tester
, (status
== SUCCESS
), "checkout existing IKE_SA 1");
118 for (i
= 0; i
< thread_count
; i
++)
120 if (pthread_create(&threads
[i
], NULL
, (void*(*)(void*))test1_thread
, (void*)ike_sa_id
))
122 /* failed, decrease list */
130 status
= td
.isam
->checkin(td
.isam
, ike_sa
);
131 tester
->assert_true(tester
, (status
== SUCCESS
), "checkin IKE_SA");
135 /* we now delete the IKE_SA, while it is requested by the threads.
136 * this should block until the have done their work.*/
137 status
= td
.isam
->delete(td
.isam
, ike_sa_id
);
138 tester
->assert_true(tester
, (status
== SUCCESS
), "delete IKE_SA by id");
141 for (i
= 0; i
< thread_count
; i
++)
143 pthread_join(threads
[i
], NULL
);
146 ike_sa_id
->destroy(ike_sa_id
);
150 * now we simulate our partner initiates an IKE_SA_INIT,
151 * so we are the responder.
154 memset(&initiator
, 0, sizeof(initiator
));
155 memset(&responder
, 0, sizeof(responder
));
158 ike_sa_id
= ike_sa_id_create(initiator
, responder
, TRUE
);
160 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
161 tester
->assert_true(tester
, (status
== SUCCESS
), "checkout unexisting IKE_SA 2");
162 for (i
= 0; i
< thread_count
; i
++)
164 if (pthread_create(&threads
[i
], NULL
, (void*(*)(void*))test2_thread
, (void*)ike_sa_id
))
166 /* failed, decrease list */
171 /* let them go acquiring */
174 /* this time, we delete the ike_sa while its checked out */
175 td
.isam
->checkin_and_delete(td
.isam
, ike_sa
);
176 tester
->assert_true(tester
, (status
== SUCCESS
), "delete IKE_SA by SA");
178 for (i
= 0; i
< thread_count
; i
++)
180 pthread_join(threads
[i
], NULL
);
183 ike_sa_id
->destroy(ike_sa_id
);
186 * put in a lot of IKE_SAs, check it out, set a thread waiting
187 * and destroy the manager...
190 memset(&initiator
, 0, sizeof(initiator
));
191 memset(&responder
, 0, sizeof(responder
));
193 thread_count
= sa_count
;
195 for (i
= 0; i
< sa_count
; i
++)
198 ike_sa_id
= ike_sa_id_create(initiator
, responder
, FALSE
);
200 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
201 tester
->assert_true(tester
, (status
== SUCCESS
), "checkout unexisting IKE_SA 3");
203 if (pthread_create(&threads
[i
], NULL
, (void*(*)(void*))test3_thread
, (void*)ike_sa_id
))
205 /* failed, decrease list */
210 /* let them go acquiring */
213 td
.isam
->destroy(td
.isam
);
215 for (i
= 0; i
< thread_count
; i
++)
217 pthread_join(threads
[i
], NULL
);