Tue Feb 10 08:10:41 CST 2009 Pekka Pessi <first.last@nokia.com>

* check_nua: run all the test cases with and without stack thread
  Ignore-this: e1966c560fb8e32d5a2d292e5e8dbdc0
  
  Better detect race conditions.



git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11936 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Michael Jerris 2009-02-12 21:03:16 +00:00
parent b5c88496bf
commit ea9eaeaf44
6 changed files with 218 additions and 105 deletions

View File

@ -22,11 +22,12 @@
* *
*/ */
/**@CFILE check_session.c /**@CFILE check_etsi.c
* *
* @brief NUA module tests for SIP session handling * @brief ETSI test cases
* *
* @author Pekka Pessi <Pekka.Pessi@nokia.com> * @author Pekka Pessi <Pekka.Pessi@nokia.com>
* @author Paulo Pizarro
* *
* @copyright (C) 2008 Nokia Corporation. * @copyright (C) 2008 Nokia Corporation.
*/ */
@ -83,6 +84,18 @@ static void etsi_setup(void)
d2 = su_home_new(sizeof *d2); fail_if(!d2); d2 = su_home_new(sizeof *d2); fail_if(!d2);
} }
static void etsi_thread_setup(void)
{
s2_nua_thread = 1;
etsi_setup();
}
static void etsi_threadless_setup(void)
{
s2_nua_thread = 0;
etsi_setup();
}
static void etsi_teardown(void) static void etsi_teardown(void)
{ {
s2_teardown_started("ETSI"); s2_teardown_started("ETSI");
@ -239,29 +252,33 @@ START_TEST(SIP_CC_OE_CE_TI_008)
invite = invite_sent_by_nua(nh, TAG_END()); invite = invite_sent_by_nua(nh, TAG_END());
s2_respond_to(invite, d1, SIP_404_NOT_FOUND, TAG_END()); s2_respond_to(invite, d1, 404, "First not found", TAG_END());
fail_unless(s2_check_event(nua_r_invite, 404)); fail_unless(s2_check_event(nua_r_invite, 404));
fail_unless(s2_check_callstate(nua_callstate_terminated)); fail_unless(s2_check_callstate(nua_callstate_terminated));
fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_request(SIP_METHOD_ACK));
s2_fast_forward(5, s2->root);; s2_fast_forward(5, s2->root);
s2_respond_to(invite, d1, SIP_404_NOT_FOUND, TAG_END()); s2_respond_to(invite, d1, 404, "Not found after 5 seconds", TAG_END());
fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_request(SIP_METHOD_ACK));
s2_fast_forward(5, s2->root);; s2_fast_forward(5, s2->root);
s2_respond_to(invite, d1, SIP_404_NOT_FOUND, TAG_END()); s2_respond_to(invite, d1, 404, "Not found after 10 seconds", TAG_END());
fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_request(SIP_METHOD_ACK));
s2_fast_forward(21, s2->root);; s2_fast_forward(21, s2->root);
s2_respond_to(invite, d1, SIP_404_NOT_FOUND, TAG_END()); s2_respond_to(invite, d1, 404, "Not found after 31 seconds", TAG_END());
fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_request(SIP_METHOD_ACK));
s2_fast_forward(1, s2->root);; s2_fast_forward(5, s2->root);
s2_respond_to(invite, d1, SIP_404_NOT_FOUND, TAG_END()); /* Wake up nua thread and let it time out INVITE transaction */
nua_set_params(s2->nua, TAG_END());
s2_check_event(nua_r_set_params, 0);
s2_respond_to(invite, d1, 404, "Not found after 32 seconds", TAG_END());
s2_free_message(invite); s2_free_message(invite);
fail_if(s2_check_request_timeout(SIP_METHOD_ACK, 500)); fail_if(s2_check_request_timeout(SIP_METHOD_ACK, 500));
@ -294,19 +311,24 @@ START_TEST(SIP_CC_OE_CE_TI_011_012)
fail_unless(s2_check_callstate(nua_callstate_ready)); fail_unless(s2_check_callstate(nua_callstate_ready));
fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_request(SIP_METHOD_ACK));
s2_fast_forward(5, s2->root);; s2_fast_forward(5, s2->root);
respond_with_sdp(invite, d1, SIP_200_OK, TAG_END()); respond_with_sdp(invite, d1, SIP_200_OK, TAG_END());
fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_request(SIP_METHOD_ACK));
s2_fast_forward(5, s2->root);; s2_fast_forward(5, s2->root);
respond_with_sdp(invite, d1, SIP_200_OK, TAG_END()); respond_with_sdp(invite, d1, SIP_200_OK, TAG_END());
fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_request(SIP_METHOD_ACK));
s2_fast_forward(21, s2->root);; s2_fast_forward(21, s2->root);
respond_with_sdp(invite, d1, SIP_200_OK, TAG_END()); respond_with_sdp(invite, d1, SIP_200_OK, TAG_END());
fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_request(SIP_METHOD_ACK));
s2_fast_forward(1, s2->root);; s2_fast_forward(5, s2->root);
/* Wake up nua thread and let it time out INVITE transaction */
nua_set_params(s2->nua, TAG_END());
s2_check_event(nua_r_set_params, 0);
respond_with_sdp(invite, d1, SIP_200_OK, TAG_END()); respond_with_sdp(invite, d1, SIP_200_OK, TAG_END());
s2_free_message(invite); s2_free_message(invite);
fail_if(s2_check_request_timeout(SIP_METHOD_ACK, 500)); fail_if(s2_check_request_timeout(SIP_METHOD_ACK, 500));
@ -317,10 +339,13 @@ START_TEST(SIP_CC_OE_CE_TI_011_012)
} }
END_TEST END_TEST
TCase *sip_cc_oe_ce_tcase(void) TCase *sip_cc_oe_ce_tcase(int threading)
{ {
TCase *tc = tcase_create("6.1 - ETSI CC OE - Call Establishment"); TCase *tc = tcase_create("6.1 - ETSI CC OE - Call Establishment");
tcase_add_checked_fixture(tc, etsi_setup, etsi_teardown);
void (*setup)(void) = threading ? etsi_thread_setup : etsi_threadless_setup;
tcase_add_checked_fixture(tc, setup, etsi_teardown);
{ {
tcase_add_test(tc, SIP_CC_OE_CE_V_019); tcase_add_test(tc, SIP_CC_OE_CE_V_019);
tcase_add_test(tc, SIP_CC_OE_CE_TI_008); tcase_add_test(tc, SIP_CC_OE_CE_TI_008);
@ -331,7 +356,7 @@ TCase *sip_cc_oe_ce_tcase(void)
/* ====================================================================== */ /* ====================================================================== */
void check_etsi_cases(Suite *suite) void check_etsi_cases(Suite *suite, int threading)
{ {
suite_add_tcase(suite, sip_cc_oe_ce_tcase()); suite_add_tcase(suite, sip_cc_oe_ce_tcase(threading));
} }

View File

@ -48,20 +48,28 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int failed = 0; int failed = 0;
int threading;
Suite *suite = suite_create("Unit tests for Sofia-SIP UA Engine");
SRunner *runner; SRunner *runner;
Suite *suite = suite_create("Unit tests for Sofia-SIP UA Engine");
s2_tester = "check_nua"; s2_tester = "check_nua";
if (getenv("CHECK_NUA_VERBOSE")) if (getenv("CHECK_NUA_VERBOSE"))
s2_start_stop = strtoul(getenv("CHECK_NUA_VERBOSE"), NULL, 10); s2_start_stop = strtoul(getenv("CHECK_NUA_VERBOSE"), NULL, 10);
s2_select_tests(getenv("CHECK_NUA_CASES")); s2_select_tests(getenv("CHECK_NUA_CASES"));
check_register_cases(suite); check_register_cases(suite, threading = 0);
check_session_cases(suite); check_simple_cases(suite, threading = 0);
check_etsi_cases(suite); check_session_cases(suite, threading = 0);
check_simple_cases(suite); check_etsi_cases(suite, threading = 0);
check_register_cases(suite, threading = 1);
check_session_cases(suite, threading = 1);
check_etsi_cases(suite, threading = 1);
check_simple_cases(suite, threading = 1);
runner = srunner_create(suite); runner = srunner_create(suite);

View File

@ -2,10 +2,10 @@
#include <s2check.h> #include <s2check.h>
void check_session_cases(Suite *suite); void check_session_cases(Suite *suite, int threading);
void check_register_cases(Suite *suite); void check_register_cases(Suite *suite, int threading);
void check_etsi_cases(Suite *suite); void check_etsi_cases(Suite *suite, int threading);
void check_simple_cases(Suite *suite); void check_simple_cases(Suite *suite, int threading);
#endif #endif

View File

@ -57,7 +57,19 @@ static void register_setup(void)
nua = s2_nua_setup("register", TAG_END()); nua = s2_nua_setup("register", TAG_END());
} }
static void register_pingpong_setup(void) static void register_thread_setup(void)
{
s2_nua_thread = 1;
register_setup();
}
static void register_threadless_setup(void)
{
s2_nua_thread = 1;
register_setup();
}
static void pingpong_setup(void)
{ {
nua = s2_nua_setup("register with pingpong", nua = s2_nua_setup("register with pingpong",
TPTAG_PINGPONG(20000), TPTAG_PINGPONG(20000),
@ -66,6 +78,17 @@ static void register_pingpong_setup(void)
tport_set_params(s2->tcp.tport, TPTAG_PONG2PING(1), TAG_END()); tport_set_params(s2->tcp.tport, TPTAG_PONG2PING(1), TAG_END());
} }
static void pingpong_thread_setup(void)
{
s2_nua_thread = 1;
pingpong_setup();
}
static void pingpong_threadless_setup(void)
{
s2_nua_thread = 0;
pingpong_setup();
}
static void register_teardown(void) static void register_teardown(void)
{ {
@ -75,6 +98,17 @@ static void register_teardown(void)
s2_nua_teardown(); s2_nua_teardown();
} }
static void add_register_fixtures(TCase *tc, int threading, int pingpong)
{
void (*setup)(void);
if (pingpong)
setup = threading ? pingpong_thread_setup : pingpong_threadless_setup;
else
setup = threading ? register_thread_setup : register_threadless_setup;
tcase_add_checked_fixture(tc, setup, register_teardown);
}
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -335,7 +369,7 @@ START_TEST(register_1_2_2_2)
s2_free_message(m); s2_free_message(m);
su_root_step(s2->root, 20); su_root_step(s2->root, 20); su_root_step(s2->root, 20); su_root_step(s2->root, 20);
s2_fast_forward(120, s2->root);; /* Default keepalive interval */ s2_fast_forward(120, s2->root); /* Default keepalive interval */
mark_point(); mark_point();
m = s2_wait_for_request(SIP_METHOD_OPTIONS); m = s2_wait_for_request(SIP_METHOD_OPTIONS);
@ -346,7 +380,7 @@ START_TEST(register_1_2_2_2)
s2_free_message(m); s2_free_message(m);
su_root_step(s2->root, 20); su_root_step(s2->root, 20); su_root_step(s2->root, 20); su_root_step(s2->root, 20);
s2_fast_forward(120, s2->root);; /* Default keepalive interval */ s2_fast_forward(120, s2->root); /* Default keepalive interval */
mark_point(); mark_point();
receive_natted = "received=4.255.255.10"; receive_natted = "received=4.255.255.10";
@ -400,7 +434,7 @@ START_TEST(register_1_2_2_3)
receive_natted = "received=4.255.255.10"; receive_natted = "received=4.255.255.10";
s2_fast_forward(3600, s2->root);; s2_fast_forward(3600, s2->root);
mark_point(); mark_point();
m = s2_wait_for_request(SIP_METHOD_REGISTER); m = s2_wait_for_request(SIP_METHOD_REGISTER);
@ -637,7 +671,7 @@ START_TEST(register_1_3_3_1)
if (!tport_is_udp(m->tport)) /* Drop UDP */ if (!tport_is_udp(m->tport)) /* Drop UDP */
break; break;
s2_free_message(m); s2_free_message(m);
s2_fast_forward(4, s2->root);; s2_fast_forward(4, s2->root);
} }
tcp = tport_ref(m->tport); tcp = tport_ref(m->tport);
@ -695,7 +729,7 @@ START_TEST(register_1_3_3_1)
su_root_step(s2->root, 5); su_root_step(s2->root, 5);
su_root_step(s2->root, 5); su_root_step(s2->root, 5);
su_root_step(s2->root, 5); su_root_step(s2->root, 5);
s2_fast_forward(5, s2->root);; s2_fast_forward(5, s2->root);
} }
} }
@ -705,11 +739,12 @@ END_TEST
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
TCase *register_tcase(void) TCase *register_tcase(int threading)
{ {
TCase *tc = tcase_create("1 - REGISTER"); TCase *tc = tcase_create("1 - REGISTER");
/* Each testcase is run in different process */
tcase_add_checked_fixture(tc, register_setup, register_teardown); add_register_fixtures(tc, threading, 0);
{ {
tcase_add_test(tc, register_1_0_1); tcase_add_test(tc, register_1_0_1);
tcase_add_test(tc, register_1_1_1); tcase_add_test(tc, register_1_1_1);
@ -727,21 +762,23 @@ TCase *register_tcase(void)
return tc; return tc;
} }
TCase *pingpong_tcase(void) TCase *pingpong_tcase(int threading)
{ {
TCase *tc = tcase_create("1 - REGISTER with PingPong"); TCase *tc = tcase_create("1 - REGISTER (with PingPong)");
/* Each testcase is run in different process */
tcase_add_checked_fixture(tc, register_pingpong_setup, register_teardown); add_register_fixtures(tc, threading, 1);
{ {
tcase_add_test(tc, register_1_3_3_1); tcase_add_test(tc, register_1_3_3_1);
} }
tcase_set_timeout(tc, 10); tcase_set_timeout(tc, 10);
return tc; return tc;
} }
void check_register_cases(Suite *suite) void check_register_cases(Suite *suite, int threading)
{ {
suite_add_tcase(suite, register_tcase()); suite_add_tcase(suite, register_tcase(threading));
suite_add_tcase(suite, pingpong_tcase()); suite_add_tcase(suite, pingpong_tcase(threading));
} }

View File

@ -82,6 +82,12 @@ static void call_setup(void)
s2_register_setup(); s2_register_setup();
} }
static void call_thread_setup(void)
{
s2_nua_thread = 1;
call_setup();
}
static void call_teardown(void) static void call_teardown(void)
{ {
s2_teardown_started("call"); s2_teardown_started("call");
@ -96,6 +102,15 @@ static void call_teardown(void)
s2_nua_teardown(); s2_nua_teardown();
} }
static void
add_call_fixtures(TCase *tc, int threading)
{
if (threading)
tcase_add_checked_fixture(tc, call_thread_setup, call_teardown);
else
tcase_add_checked_fixture(tc, call_setup, call_teardown);
}
static void save_sdp_to_soa(struct message *message) static void save_sdp_to_soa(struct message *message)
{ {
sip_payload_t *pl; sip_payload_t *pl;
@ -666,10 +681,10 @@ START_TEST(call_2_1_8)
END_TEST END_TEST
TCase *invite_tcase(void) TCase *invite_tcase(int threading)
{ {
TCase *tc = tcase_create("2.1 - Basic INVITE"); TCase *tc = tcase_create("2.1 - Basic INVITE");
tcase_add_checked_fixture(tc, call_setup, call_teardown); add_call_fixtures(tc, threading);
{ {
tcase_add_test(tc, call_2_1_1); tcase_add_test(tc, call_2_1_1);
tcase_add_test(tc, call_2_1_2_1); tcase_add_test(tc, call_2_1_2_1);
@ -986,10 +1001,10 @@ START_TEST(cancel_2_2_7)
} }
END_TEST END_TEST
TCase *cancel_tcase(void) TCase *cancel_tcase(int threading)
{ {
TCase *tc = tcase_create("2.2 - CANCEL"); TCase *tc = tcase_create("2.2 - CANCEL");
tcase_add_checked_fixture(tc, call_setup, call_teardown); add_call_fixtures(tc, threading);
tcase_add_test(tc, cancel_2_2_1); tcase_add_test(tc, cancel_2_2_1);
tcase_add_test(tc, cancel_2_2_2); tcase_add_test(tc, cancel_2_2_2);
@ -1054,11 +1069,11 @@ START_TEST(call_2_3_1)
SIPTAG_REQUIRE_STR("timer"), SIPTAG_REQUIRE_STR("timer"),
TAG_END()); TAG_END());
s2_fast_forward(300, s2->root);; s2_fast_forward(300, s2->root);
ack = invite_timer_round(nh, "300;refresher=uac", rr); ack = invite_timer_round(nh, "300;refresher=uac", rr);
fail_if(ack->sip->sip_route && fail_if(ack->sip->sip_route &&
su_strmatch(ack->sip->sip_route->r_url->url_user, "record")); su_strmatch(ack->sip->sip_route->r_url->url_user, "record"));
s2_fast_forward(300, s2->root);; s2_fast_forward(300, s2->root);
invite_timer_round(nh, "300;refresher=uac", NULL); invite_timer_round(nh, "300;refresher=uac", NULL);
bye_by_nua(nh, TAG_END()); bye_by_nua(nh, TAG_END());
@ -1082,9 +1097,9 @@ START_TEST(call_2_3_2)
SIPTAG_REQUIRE_STR("timer"), SIPTAG_REQUIRE_STR("timer"),
TAG_END()); TAG_END());
s2_fast_forward(300, s2->root);; s2_fast_forward(300, s2->root);
invite_timer_round(nh, "300", NULL); invite_timer_round(nh, "300", NULL);
s2_fast_forward(300, s2->root);; s2_fast_forward(300, s2->root);
invite_timer_round(nh, "300", NULL); invite_timer_round(nh, "300", NULL);
bye_by_nua(nh, TAG_END()); bye_by_nua(nh, TAG_END());
@ -1095,10 +1110,10 @@ END_TEST
TCase *session_timer_tcase(void) TCase *session_timer_tcase(int threading)
{ {
TCase *tc = tcase_create("2.3 - Session timers"); TCase *tc = tcase_create("2.3 - Session timers");
tcase_add_checked_fixture(tc, call_setup, call_teardown); add_call_fixtures(tc, threading);
{ {
tcase_add_test(tc, call_2_3_1); tcase_add_test(tc, call_2_3_1);
tcase_add_test(tc, call_2_3_2); tcase_add_test(tc, call_2_3_2);
@ -1227,10 +1242,10 @@ START_TEST(call_2_4_2)
} }
END_TEST END_TEST
TCase *invite_100rel_tcase(void) TCase *invite_100rel_tcase(int threading)
{ {
TCase *tc = tcase_create("2.4 - INVITE with 100rel"); TCase *tc = tcase_create("2.4 - INVITE with 100rel");
tcase_add_checked_fixture(tc, call_setup, call_teardown); add_call_fixtures(tc, threading);
{ {
tcase_add_test(tc, call_2_4_1); tcase_add_test(tc, call_2_4_1);
tcase_add_test(tc, call_2_4_2); tcase_add_test(tc, call_2_4_2);
@ -1459,10 +1474,10 @@ START_TEST(call_2_5_3)
} }
END_TEST END_TEST
TCase *invite_precondition_tcase(void) TCase *invite_precondition_tcase(int threading)
{ {
TCase *tc = tcase_create("2.5 - Call with preconditions"); TCase *tc = tcase_create("2.5 - Call with preconditions");
tcase_add_checked_fixture(tc, call_setup, call_teardown); add_call_fixtures(tc, threading);
{ {
tcase_add_test(tc, call_2_5_1); tcase_add_test(tc, call_2_5_1);
tcase_add_test(tc, call_2_5_2); tcase_add_test(tc, call_2_5_2);
@ -1551,7 +1566,7 @@ START_TEST(call_2_6_2)
/* We get nua_r_invite with 100 trying (and 500 in sip->sip_status) */ /* We get nua_r_invite with 100 trying (and 500 in sip->sip_status) */
fail_unless(s2_check_event(nua_r_invite, 100)); fail_unless(s2_check_event(nua_r_invite, 100));
s2_fast_forward(10, s2->root);; s2_fast_forward(10, s2->root);
fail_unless(s2_check_callstate(nua_callstate_calling)); fail_unless(s2_check_callstate(nua_callstate_calling));
@ -1605,7 +1620,7 @@ START_TEST(call_2_6_3)
fail_unless(s2_check_event(nua_i_ack, 200)); fail_unless(s2_check_event(nua_i_ack, 200));
fail_unless(s2_check_callstate(nua_callstate_ready)); fail_unless(s2_check_callstate(nua_callstate_ready));
s2_fast_forward(10, s2->root);; s2_fast_forward(10, s2->root);
nua_set_hparams(nh, NUTAG_REFRESH_WITHOUT_SDP(1), TAG_END()); nua_set_hparams(nh, NUTAG_REFRESH_WITHOUT_SDP(1), TAG_END());
fail_unless(s2_check_event(nua_r_set_params, 200)); fail_unless(s2_check_event(nua_r_set_params, 200));
@ -1673,11 +1688,11 @@ START_TEST(call_2_6_4)
} }
END_TEST END_TEST
TCase *reinvite_tcase(void) TCase *reinvite_tcase(int threading)
{ {
TCase *tc = tcase_create("2.6 - re-INVITEs"); TCase *tc = tcase_create("2.6 - re-INVITEs");
tcase_add_checked_fixture(tc, call_setup, call_teardown); add_call_fixtures(tc, threading);
{ {
tcase_add_test(tc, call_2_6_1); tcase_add_test(tc, call_2_6_1);
tcase_add_test(tc, call_2_6_2); tcase_add_test(tc, call_2_6_2);
@ -1752,7 +1767,7 @@ START_TEST(call_3_1_2)
if (i == 3) if (i == 3)
break; break;
fail_unless(s2_check_event(nua_r_invite, 100)); fail_unless(s2_check_event(nua_r_invite, 100));
s2_fast_forward(5, s2->root);; s2_fast_forward(5, s2->root);
} }
fail_unless(s2_check_event(nua_r_invite, 500)); fail_unless(s2_check_event(nua_r_invite, 500));
@ -1822,7 +1837,7 @@ START_TEST(call_3_2_2)
if (i == 3) if (i == 3)
break; break;
fail_unless(s2_check_event(nua_r_invite, 100)); fail_unless(s2_check_event(nua_r_invite, 100));
s2_fast_forward(5, s2->root);; s2_fast_forward(5, s2->root);
} }
fail_unless(s2_check_event(nua_r_invite, 500)); fail_unless(s2_check_event(nua_r_invite, 500));
@ -1869,10 +1884,10 @@ START_TEST(call_3_2_3)
END_TEST END_TEST
TCase *invite_error_tcase(void) TCase *invite_error_tcase(int threading)
{ {
TCase *tc = tcase_create("3 - Call Errors"); TCase *tc = tcase_create("3 - Call Errors");
tcase_add_checked_fixture(tc, call_setup, call_teardown); add_call_fixtures(tc, threading);
{ {
tcase_add_test(tc, call_3_1_1); tcase_add_test(tc, call_3_1_1);
tcase_add_test(tc, call_3_1_2); tcase_add_test(tc, call_3_1_2);
@ -2344,7 +2359,7 @@ START_TEST(bye_4_2_1)
SIPTAG_REQUIRE_STR("timer"), SIPTAG_REQUIRE_STR("timer"),
TAG_END()); TAG_END());
s2_fast_forward(300, s2->root);; s2_fast_forward(300, s2->root);
invite_timer_round(nh, "300", NULL); invite_timer_round(nh, "300", NULL);
nua_bye(nh, TAG_END()); nua_bye(nh, TAG_END());
@ -2357,7 +2372,7 @@ START_TEST(bye_4_2_1)
s2_free_message(bye); s2_free_message(bye);
fail_unless(s2_check_event(nua_r_bye, 407)); fail_unless(s2_check_event(nua_r_bye, 407));
s2_fast_forward(300, s2->root);; s2_fast_forward(300, s2->root);
nua_authenticate(nh, NUTAG_AUTH("Digest:\"s2test\":abc:abc"), TAG_END()); nua_authenticate(nh, NUTAG_AUTH("Digest:\"s2test\":abc:abc"), TAG_END());
bye = s2_wait_for_request(SIP_METHOD_BYE); bye = s2_wait_for_request(SIP_METHOD_BYE);
@ -2388,10 +2403,10 @@ START_TEST(bye_4_2_2)
SIPTAG_REQUIRE_STR("timer"), SIPTAG_REQUIRE_STR("timer"),
TAG_END()); TAG_END());
s2_fast_forward(300, s2->root);; s2_fast_forward(300, s2->root);
invite_timer_round(nh, "300", NULL); invite_timer_round(nh, "300", NULL);
s2_fast_forward(140, s2->root);; s2_fast_forward(140, s2->root);
nua_bye(nh, TAG_END()); nua_bye(nh, TAG_END());
@ -2403,7 +2418,7 @@ START_TEST(bye_4_2_2)
s2_free_message(bye); s2_free_message(bye);
fail_unless(s2_check_event(nua_r_bye, 407)); fail_unless(s2_check_event(nua_r_bye, 407));
s2_fast_forward(160, s2->root);; s2_fast_forward(160, s2->root);
nua_authenticate(nh, NUTAG_AUTH(s2_auth_credentials), TAG_END()); nua_authenticate(nh, NUTAG_AUTH(s2_auth_credentials), TAG_END());
bye = s2_wait_for_request(SIP_METHOD_BYE); bye = s2_wait_for_request(SIP_METHOD_BYE);
@ -2418,10 +2433,10 @@ START_TEST(bye_4_2_2)
} }
END_TEST END_TEST
TCase *termination_tcase(void) TCase *termination_tcase(int threading)
{ {
TCase *tc = tcase_create("4 - Call Termination"); TCase *tc = tcase_create("4 - Call Termination");
tcase_add_checked_fixture(tc, call_setup, call_teardown); add_call_fixtures(tc, threading);
{ {
tcase_add_test(tc, bye_4_1_1); tcase_add_test(tc, bye_4_1_1);
tcase_add_test(tc, bye_4_1_2); tcase_add_test(tc, bye_4_1_2);
@ -2928,11 +2943,11 @@ START_TEST(destroy_4_4_3_2)
} }
END_TEST END_TEST
TCase *destroy_tcase(void) static TCase *destroy_tcase(int threading)
{ {
TCase *tc = tcase_create("4.3 - Destroying Handle"); TCase *tc = tcase_create("4.3 - Destroying Handle");
tcase_add_checked_fixture(tc, call_setup, call_teardown); add_call_fixtures(tc, threading);
{ {
tcase_add_test(tc, destroy_4_3_1); tcase_add_test(tc, destroy_4_3_1);
@ -3056,7 +3071,7 @@ START_TEST(options_5_1_2)
END_TEST END_TEST
#endif #endif
TCase *options_tcase(void) TCase *options_tcase(int threading)
{ {
TCase *tc = tcase_create("5 - OPTIONS, etc"); TCase *tc = tcase_create("5 - OPTIONS, etc");
@ -3068,7 +3083,6 @@ TCase *options_tcase(void)
return tc; return tc;
} }
static void options_setup(void) static void options_setup(void)
{ {
s2_nua_thread = 1; s2_nua_thread = 1;
@ -3096,13 +3110,14 @@ START_TEST(empty)
s2_setup_logs(0); s2_setup_logs(0);
tport_set_params(s2->master, TPTAG_LOG(0), TAG_END()); tport_set_params(s2->master, TPTAG_LOG(0), TAG_END());
} }
END_TEST END_TEST
TCase *empty_tcase(void) TCase *empty_tcase(int threading)
{ {
TCase *tc = tcase_create("0 - Empty"); TCase *tc = tcase_create("0 - Empty");
tcase_add_checked_fixture(tc, call_setup, call_teardown);
add_call_fixtures(tc, threading);
tcase_add_test(tc, empty); tcase_add_test(tc, empty);
return tc; return tc;
@ -3110,19 +3125,19 @@ TCase *empty_tcase(void)
/* ====================================================================== */ /* ====================================================================== */
void check_session_cases(Suite *suite) void check_session_cases(Suite *suite, int threading)
{ {
suite_add_tcase(suite, invite_tcase()); suite_add_tcase(suite, invite_tcase(threading));
suite_add_tcase(suite, cancel_tcase()); suite_add_tcase(suite, cancel_tcase(threading));
suite_add_tcase(suite, session_timer_tcase()); suite_add_tcase(suite, session_timer_tcase(threading));
suite_add_tcase(suite, invite_100rel_tcase()); suite_add_tcase(suite, invite_100rel_tcase(threading));
suite_add_tcase(suite, invite_precondition_tcase()); suite_add_tcase(suite, invite_precondition_tcase(threading));
suite_add_tcase(suite, reinvite_tcase()); suite_add_tcase(suite, reinvite_tcase(threading));
suite_add_tcase(suite, invite_error_tcase()); suite_add_tcase(suite, invite_error_tcase(threading));
suite_add_tcase(suite, termination_tcase()); suite_add_tcase(suite, termination_tcase(threading));
suite_add_tcase(suite, destroy_tcase()); suite_add_tcase(suite, destroy_tcase(threading));
suite_add_tcase(suite, options_tcase()); suite_add_tcase(suite, options_tcase(threading));
if (0) /* Template */ if (0) /* Template */
suite_add_tcase(suite, empty_tcase()); suite_add_tcase(suite, empty_tcase(threading));
} }

View File

@ -95,6 +95,22 @@ void s2_dialog_teardown(void)
s2_nua_teardown(); s2_nua_teardown();
} }
static void simple_thread_setup(void)
{
s2_nua_thread = 1;
s2_dialog_setup();
}
static void simple_threadless_setup(void)
{
s2_nua_thread = 0;
s2_dialog_setup();
}
static void simple_teardown(void)
{
s2_dialog_teardown();
}
static char const presence_open[] = static char const presence_open[] =
"<?xml version='1.0' encoding='UTF-8'?>\n" "<?xml version='1.0' encoding='UTF-8'?>\n"
@ -290,7 +306,7 @@ START_TEST(subscribe_6_1_2)
s2_free_event(notify); s2_free_event(notify);
/* Wait for refresh */ /* Wait for refresh */
s2_fast_forward(600, s2->root);; s2_fast_forward(600, s2->root);
subscribe = s2_wait_for_request(SIP_METHOD_SUBSCRIBE); subscribe = s2_wait_for_request(SIP_METHOD_SUBSCRIBE);
s2_respond_to(subscribe, dialog, SIP_200_OK, s2_respond_to(subscribe, dialog, SIP_200_OK,
SIPTAG_EXPIRES_STR("600"), SIPTAG_EXPIRES_STR("600"),
@ -377,7 +393,7 @@ START_TEST(subscribe_6_1_4)
su_home_unref((void *)dialog), dialog = su_home_new(sizeof *dialog); fail_if(!dialog); su_home_unref((void *)dialog), dialog = su_home_new(sizeof *dialog); fail_if(!dialog);
s2_fast_forward(5, s2->root);; s2_fast_forward(5, s2->root);
/* nua re-establishes the subscription */ /* nua re-establishes the subscription */
notify = subscription_by_nua(nh, nua_substate_embryonic, TAG_END()); notify = subscription_by_nua(nh, nua_substate_embryonic, TAG_END());
s2_free_event(notify); s2_free_event(notify);
@ -391,10 +407,14 @@ START_TEST(subscribe_6_1_4)
} }
END_TEST END_TEST
TCase *subscribe_tcase(void) TCase *subscribe_tcase(int threading)
{ {
TCase *tc = tcase_create("6.1 - Basic SUBSCRIBE_"); TCase *tc = tcase_create("6.1 - Basic SUBSCRIBE_");
tcase_add_checked_fixture(tc, s2_dialog_setup, s2_dialog_teardown); void (*simple_setup)(void);
simple_setup = threading ? simple_thread_setup : simple_threadless_setup;
tcase_add_checked_fixture(tc, simple_setup, simple_teardown);
{ {
tcase_add_test(tc, subscribe_6_1_1); tcase_add_test(tc, subscribe_6_1_1);
tcase_add_test(tc, subscribe_6_1_2); tcase_add_test(tc, subscribe_6_1_2);
@ -460,7 +480,7 @@ START_TEST(fetch_6_2_3)
fail_unless(s2_check_substate(event, nua_substate_embryonic)); fail_unless(s2_check_substate(event, nua_substate_embryonic));
s2_free_event(event); s2_free_event(event);
s2_fast_forward(600, s2->root);; s2_fast_forward(600, s2->root);
event = s2_wait_for_event(nua_i_notify, 408); fail_if(!event); event = s2_wait_for_event(nua_i_notify, 408); fail_if(!event);
fail_unless(s2_check_substate(event, nua_substate_terminated)); fail_unless(s2_check_substate(event, nua_substate_terminated));
@ -471,10 +491,14 @@ START_TEST(fetch_6_2_3)
END_TEST END_TEST
TCase *fetch_tcase(void) TCase *fetch_tcase(int threading)
{ {
TCase *tc = tcase_create("6.2 - Event fetch"); TCase *tc = tcase_create("6.2 - Event fetch");
tcase_add_checked_fixture(tc, s2_dialog_setup, s2_dialog_teardown); void (*simple_setup)(void);
simple_setup = threading ? simple_thread_setup : simple_threadless_setup;
tcase_add_checked_fixture(tc, simple_setup, simple_teardown);
{ {
tcase_add_test(tc, fetch_6_2_1); tcase_add_test(tc, fetch_6_2_1);
tcase_add_test(tc, fetch_6_2_2); tcase_add_test(tc, fetch_6_2_2);
@ -500,10 +524,14 @@ START_TEST(empty)
END_TEST END_TEST
static TCase *empty_tcase(void) static TCase *empty_tcase(int threading)
{ {
TCase *tc = tcase_create("0 - Empty"); TCase *tc = tcase_create("0 - Empty");
tcase_add_checked_fixture(tc, s2_dialog_setup, s2_dialog_teardown); void (*simple_setup)(void);
simple_setup = threading ? simple_thread_setup : simple_threadless_setup;
tcase_add_checked_fixture(tc, simple_setup, simple_teardown);
tcase_add_test(tc, empty); tcase_add_test(tc, empty);
return tc; return tc;
@ -511,12 +539,12 @@ static TCase *empty_tcase(void)
/* ====================================================================== */ /* ====================================================================== */
void check_simple_cases(Suite *suite) void check_simple_cases(Suite *suite, int threading)
{ {
suite_add_tcase(suite, subscribe_tcase()); suite_add_tcase(suite, subscribe_tcase(threading));
suite_add_tcase(suite, fetch_tcase()); suite_add_tcase(suite, fetch_tcase(threading));
if (0) /* Template */ if (0) /* Template */
suite_add_tcase(suite, empty_tcase()); suite_add_tcase(suite, empty_tcase(threading));
} }