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"
29 #include "../tester.h"
30 #include "../ike_sa_manager.h"
33 static struct ike_sa_manager_test_struct_s
{
35 ike_sa_manager_t
*isam
;
38 static void successful_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");
50 static void failed_thread(ike_sa_id_t
*ike_sa_id
)
55 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
56 td
.tester
->assert_true(td
.tester
, (status
== NOT_FOUND
), "IKE_SA already deleted");
59 void test_ike_sa_manager(tester_t
*tester
)
62 spi_t initiator
, responder
;
63 ike_sa_id_t
*ike_sa_id
;
65 int thread_count
= 200;
68 pthread_t threads
[thread_count
];
71 td
.isam
= ike_sa_manager_create();
72 tester
->assert_true(tester
, (td
.isam
!= NULL
), "ike_sa_manager creation");
79 * we play initiator for IKE_SA_INIT first
83 memset(&initiator
, 0, sizeof(initiator
));
84 memset(&responder
, 0, sizeof(responder
));
86 ike_sa_id
= ike_sa_id_create(initiator
, responder
, INITIATOR
);
88 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
89 tester
->assert_true(tester
, (status
== SUCCESS
), "checkout unexisting IKE_SA");
90 /* for testing purposes, we manipulate the responder spi.
91 * this is usually done be the response from the communication partner,
92 * but we don't have one...
94 ike_sa_id
->destroy(ike_sa_id
);
95 ike_sa_id
= ike_sa
->get_id(ike_sa
);
97 ike_sa_id
->set_responder_spi(ike_sa_id
, responder
);
98 /* check in, so we should have a "completed" sa, specified by ike_sa_id */
99 status
= td
.isam
->checkin(td
.isam
, ike_sa
);
100 tester
->assert_true(tester
, (status
== SUCCESS
), "checkin modified IKE_SA");
102 /* now we check it out and start some other threads */
103 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
104 tester
->assert_true(tester
, (status
== SUCCESS
), "checkout existing IKE_SA 1");
108 for (i
= 0; i
< thread_count
; i
++)
110 if (pthread_create(&threads
[i
], NULL
, (void*(*)(void*))successful_thread
, (void*)ike_sa_id
))
112 /* failed, decrease list */
120 status
= td
.isam
->checkin(td
.isam
, ike_sa
);
121 tester
->assert_true(tester
, (status
== SUCCESS
), "checkin IKE_SA");
125 /* we now delete the IKE_SA, while it is requested by the threads.
126 * this should block until the have done their work.*/
127 status
= td
.isam
->delete(td
.isam
, ike_sa_id
);
128 tester
->assert_true(tester
, (status
== SUCCESS
), "delete IKE_SA by id");
131 for (i
= 0; i
< thread_count
; i
++)
133 pthread_join(threads
[i
], NULL
);
136 //ike_sa_id->destroy(ike_sa_id);
143 * now we simulate our partner initiates an IKE_SA_INIT,
144 * so we are the responder.
148 memset(&initiator
, 0, sizeof(initiator
));
149 memset(&responder
, 0, sizeof(responder
));
152 ike_sa_id
= ike_sa_id_create(initiator
, responder
, RESPONDER
);
154 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
155 tester
->assert_true(tester
, (status
== SUCCESS
), "checkout unexisting IKE_SA 2");
156 for (i
= 0; i
< thread_count
; i
++)
158 if (pthread_create(&threads
[i
], NULL
, (void*(*)(void*))failed_thread
, (void*)ike_sa_id
))
160 /* failed, decrease list */
165 /* let them go acquiring */
168 /* this time, we delete the ike_sa while its checked out */
169 td
.isam
->checkin_and_delete(td
.isam
, ike_sa
);
170 tester
->assert_true(tester
, (status
== SUCCESS
), "delete IKE_SA by SA");
172 for (i
= 0; i
< thread_count
; i
++)
174 pthread_join(threads
[i
], NULL
);
177 //ike_sa_id->destroy(ike_sa_id);
180 * put in a lot of IKE_SAs, check it out, set a thread waiting
181 * and destroy the manager...
184 memset(&initiator
, 0, sizeof(initiator
));
185 memset(&responder
, 0, sizeof(responder
));
187 thread_count
= sa_count
;
189 for (i
= 0; i
< sa_count
; i
++)
191 initiator
.low
= i
+ 1;
192 ike_sa_id
= ike_sa_id_create(initiator
, responder
, RESPONDER
);
194 status
= td
.isam
->checkout(td
.isam
, ike_sa_id
, &ike_sa
);
195 tester
->assert_true(tester
, (status
== SUCCESS
), "checkout unexisting IKE_SA 3");
197 if (pthread_create(&threads
[i
], NULL
, (void*(*)(void*))failed_thread
, (void*)ike_sa_id
))
199 /* failed, decrease list */
202 //ike_sa_id->destroy(ike_sa_id);
205 /* let them go acquiring */
208 status
= td
.isam
->destroy(td
.isam
);
209 tester
->assert_true(tester
, (status
== SUCCESS
), "ike_sa_manager destruction");
211 for (i
= 0; i
< thread_count
; i
++)
213 pthread_join(threads
[i
], NULL
);