From 7a6d1c2946925520c30c8108acfb58631a7fc624 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 16 Jul 2013 19:29:56 +0200 Subject: [PATCH] better test in case of io error --- coreapi/bellesip_sal/sal_impl.c | 7 ++++ coreapi/bellesip_sal/sal_impl.h | 1 + coreapi/bellesip_sal/sal_op_impl.c | 1 + include/sal/sal.h | 3 ++ tester/register_tester.c | 61 ++++++++++++++++++++++++++++++ 5 files changed, 73 insertions(+) diff --git a/coreapi/bellesip_sal/sal_impl.c b/coreapi/bellesip_sal/sal_impl.c index e147efd32..e2052dc15 100644 --- a/coreapi/bellesip_sal/sal_impl.c +++ b/coreapi/bellesip_sal/sal_impl.c @@ -440,6 +440,7 @@ Sal * sal_init(){ belle_sip_provider_add_sip_listener(sal->prov,sal->listener); sal->tls_verify=TRUE; sal->tls_verify_cn=TRUE; + sal->refresher_retry_after=60000; /*default value in ms*/ return sal; } void sal_set_user_pointer(Sal *sal, void *user_data){ @@ -872,3 +873,9 @@ belle_sip_response_t* sal_create_response_from_request ( Sal* sal, belle_sip_req belle_sip_message_add_header(BELLE_SIP_MESSAGE(resp),BELLE_SIP_HEADER(sal->user_agent)); return resp; } +void sal_set_refresher_retry_after(Sal *sal,int value) { + sal->refresher_retry_after=value; +} +int sal_get_refresher_retry_after(const Sal *sal) { + return sal->refresher_retry_after; +} diff --git a/coreapi/bellesip_sal/sal_impl.h b/coreapi/bellesip_sal/sal_impl.h index 2848e97ac..6826d445e 100644 --- a/coreapi/bellesip_sal/sal_impl.h +++ b/coreapi/bellesip_sal/sal_impl.h @@ -44,6 +44,7 @@ struct Sal{ bool_t tls_verify; bool_t tls_verify_cn; bool_t use_dates; + int refresher_retry_after; /*retry after value for refresher*/ }; typedef enum SalOpState { diff --git a/coreapi/bellesip_sal/sal_op_impl.c b/coreapi/bellesip_sal/sal_op_impl.c index b8bdeb1a1..a0e58d726 100644 --- a/coreapi/bellesip_sal/sal_op_impl.c +++ b/coreapi/bellesip_sal/sal_op_impl.c @@ -451,6 +451,7 @@ int sal_op_send_and_create_refresher(SalOp* op,belle_sip_request_t* req, int exp if ((op->refresher = belle_sip_client_transaction_create_refresher(op->pending_client_trans))) { belle_sip_refresher_enable_nat_helper(op->refresher,op->base.root->nat_helper_enabled); belle_sip_refresher_set_listener(op->refresher,listener,op); + belle_sip_refresher_set_retry_after(op->refresher,op->base.root->refresher_retry_after); return 0; } else { return -1; diff --git a/include/sal/sal.h b/include/sal/sal.h index 9cbaba73e..a52757ce8 100644 --- a/include/sal/sal.h +++ b/include/sal/sal.h @@ -606,6 +606,9 @@ void __sal_op_free(SalOp *b); LINPHONE_PUBLIC void sal_set_send_error(Sal *sal,int value); /*1 for no error*/ LINPHONE_PUBLIC void sal_set_recv_error(Sal *sal,int value); +/*refresher retry after value in ms*/ +LINPHONE_PUBLIC void sal_set_refresher_retry_after(Sal *sal,int value); +LINPHONE_PUBLIC int sal_get_refresher_retry_after(const Sal *sal); /*enable contact fixing*/ void sal_nat_helper_enable(Sal *sal,bool_t enable); bool_t sal_nat_helper_enabled(Sal *sal); diff --git a/tester/register_tester.c b/tester/register_tester.c index 317c8d5e3..66263ab07 100644 --- a/tester/register_tester.c +++ b/tester/register_tester.c @@ -383,6 +383,65 @@ static void io_recv_error(){ linphone_core_manager_destroy(mgr); } +static void io_recv_error_retry_immediatly(){ + LinphoneCoreManager *mgr; + LinphoneCore* lc; + int register_ok; + stats* counters ; + int number_of_udp_proxy=0; + + + mgr=configure_lcm(); + lc=mgr->lc; + counters = get_stats(lc); + register_ok=counters->number_of_LinphoneRegistrationOk; + number_of_udp_proxy=get_number_of_udp_proxy(lc); + sal_set_recv_error(lc->sal, 0); + + CU_ASSERT_TRUE(wait_for(lc,NULL,&counters->number_of_LinphoneRegistrationProgress,2*(register_ok-number_of_udp_proxy) /*because 1 udp*/)); + CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0) + sal_set_recv_error(lc->sal, 1); /*reset*/ + + CU_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationOk,2*(register_ok-number_of_udp_proxy))); + + linphone_core_manager_destroy(mgr); +} + +static void io_recv_error_late_recovery(){ + LinphoneCoreManager *mgr; + LinphoneCore* lc; + int register_ok; + stats* counters ; + int number_of_udp_proxy=0; + MSList* lcs; + + mgr=linphone_core_manager_new2( "multi_account_lrc",FALSE); /*to make sure iterates are not call yet*/ + lc=mgr->lc; + sal_set_refresher_retry_after(lc->sal,1000); + counters=&mgr->stat; + CU_ASSERT_TRUE(wait_for(mgr->lc,mgr->lc,&counters->number_of_LinphoneRegistrationOk,ms_list_size(linphone_core_get_proxy_config_list(mgr->lc)))); + + + counters = get_stats(lc); + register_ok=counters->number_of_LinphoneRegistrationOk; + number_of_udp_proxy=get_number_of_udp_proxy(lc); + /*simulate a general socket error*/ + sal_set_recv_error(lc->sal, 0); + sal_set_send_error(lc->sal, -1); + + CU_ASSERT_TRUE(wait_for(lc,NULL,&counters->number_of_LinphoneRegistrationProgress,(register_ok-number_of_udp_proxy)+register_ok /*because 1 udp*/)); + CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0) + + CU_ASSERT_TRUE(wait_for_list(lcs=ms_list_append(NULL,lc),&counters->number_of_LinphoneRegistrationFailed,(register_ok-number_of_udp_proxy),sal_get_refresher_retry_after(lc->sal)+1000)); + + sal_set_recv_error(lc->sal, 1); /*reset*/ + sal_set_send_error(lc->sal, 0); + + CU_ASSERT_TRUE(wait_for_list(lcs=ms_list_append(NULL,lc),&counters->number_of_LinphoneRegistrationOk,register_ok-number_of_udp_proxy +register_ok,sal_get_refresher_retry_after(lc->sal)+1000)); + + linphone_core_manager_destroy(mgr); +} + static void io_recv_error_without_active_register(){ LinphoneCoreManager *mgr; LinphoneCore* lc; @@ -516,6 +575,8 @@ test_t register_tests[] = { { "Transport change", transport_change }, { "Network state change", network_state_change }, { "Io recv error", io_recv_error }, + { "Io recv error with recovery", io_recv_error_retry_immediatly}, + { "Io recv error with late recovery", io_recv_error_late_recovery}, { "Io recv error without active registration", io_recv_error_without_active_register} };