END_TEST START_TEST(fetch_6_2_3) { nua_handle_t *nh; struct message *subscribe; struct event *event; S2_CASE("6.2.3", "Event fetch - no NOTIFY", "NUA sends SUBSCRIBE with Expires 0, waits for NOTIFY, times out"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); nua_subscribe(nh, SIPTAG_EVENT_STR(event_type), SIPTAG_EXPIRES_STR("0"), TAG_END()); subscribe = s2_sip_wait_for_request(SIP_METHOD_SUBSCRIBE); s2_sip_respond_to(subscribe, dialog, SIP_202_ACCEPTED, SIPTAG_EXPIRES_STR("0"), TAG_END()); s2_sip_free_message(subscribe); event = s2_wait_for_event(nua_r_subscribe, 202); fail_if(!event); fail_unless(s2_check_substate(event, nua_substate_embryonic)); s2_free_event(event); s2_nua_fast_forward(600, s2base->root); event = s2_wait_for_event(nua_i_notify, 408); fail_if(!event); fail_unless(s2_check_substate(event, nua_substate_terminated)); s2_free_event(event); nua_handle_destroy(nh); }
END_TEST START_TEST(subscribe_6_1_3) { nua_handle_t *nh; struct message *response; struct event *notify, *event; S2_CASE("6.1.3", "Subscription terminated by notifier", "NUA sends SUBSCRIBE, waits for NOTIFY, " "gets NOTIFY terminating the subscription,"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); nua_subscribe(nh, SIPTAG_EVENT_STR(event_type), TAG_END()); notify = subscription_by_nua(nh, nua_substate_embryonic, TAG_END()); s2_free_event(notify); fail_if(s2_sip_request_to(dialog, SIP_METHOD_NOTIFY, NULL, SIPTAG_EVENT_STR(event_type), SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=noresource"), TAG_END())); event = s2_wait_for_event(nua_i_notify, 200); fail_if(!event); fail_unless(s2_check_substate(event, nua_substate_terminated)); s2_free_event(event); response = s2_sip_wait_for_response(200, SIP_METHOD_NOTIFY); fail_if(!response); s2_sip_free_message(response); nua_handle_destroy(nh); }
/** * Deletes operation and attached handles and identities */ void ssc_oper_destroy(ssc_t *ssc, ssc_oper_t *op) { ssc_oper_t **prev; int active_invites = 0; if (!op) return; /* Remove from queue */ for (prev = &ssc->ssc_operations; *prev && *prev != op; prev = &(*prev)->op_next) ; if (*prev) *prev = op->op_next, op->op_next = NULL; if (op->op_handle) nua_handle_destroy(op->op_handle), op->op_handle = NULL; for (prev = &ssc->ssc_operations; *prev; prev = &(*prev)->op_next) { if ((*prev)->op_method == sip_method_invite) ++active_invites; } if (active_invites == 0) { /* last INVITE operation */ #if HAVE_MEDIA_IMPL if (ssc_media_is_initialized(ssc->ssc_media) == TRUE) ssc_media_deactivate(ssc->ssc_media); #endif } su_free(ssc->ssc_home, op); }
END_TEST START_TEST(notify_6_3_5) { nua_handle_t *nh; struct message *notify; struct event *response; sip_t *sip; S2_CASE("6.3.4", "NOTIFY server - terminate with error response to NOTIFY", "NUA receives SUBSCRIBE, sends 202 and NOTIFY. " "The subscription terminates when watcher " "returns 481 to NOTIFY."); nh = subscribe_to_nua("presence", SIPTAG_EXPIRES_STR("300"), TAG_END()); nua_notify(nh, SIPTAG_SUBSCRIPTION_STATE_STR("active"), SIPTAG_PAYLOAD_STR(presence_closed), TAG_END()); notify = s2_sip_wait_for_request(SIP_METHOD_NOTIFY); fail_unless(notify != NULL); sip = notify->sip; fail_unless(sip->sip_subscription_state != NULL); fail_unless(su_strmatch(sip->sip_subscription_state->ss_substate, "active")); s2_sip_respond_to(notify, dialog, SIP_200_OK, TAG_END()); fail_unless_event(nua_r_notify, 200); nua_notify(nh, SIPTAG_SUBSCRIPTION_STATE_STR("active"), SIPTAG_PAYLOAD_STR(presence_open), TAG_END()); notify = s2_sip_wait_for_request(SIP_METHOD_NOTIFY); fail_unless(notify != NULL); sip = notify->sip; fail_unless(sip->sip_subscription_state != NULL); fail_unless(su_strmatch(sip->sip_subscription_state->ss_substate, "active")); nua_notify(nh, NUTAG_NEWSUB(1), SIPTAG_SUBSCRIPTION_STATE_STR("active"), SIPTAG_PAYLOAD_STR(presence_open), TAG_END()); s2_sip_respond_to(notify, dialog, SIP_481_NO_TRANSACTION, TAG_END()); response = s2_wait_for_event(nua_r_notify, 481); fail_unless(s2_event_substate(response) == nua_substate_terminated); notify = s2_sip_wait_for_request(SIP_METHOD_NOTIFY); s2_sip_respond_to(notify, dialog, SIP_481_NO_TRANSACTION, TAG_END()); response = s2_wait_for_event(nua_r_notify, 481); fail_unless(s2_event_substate(response) == nua_substate_terminated); nua_handle_destroy(nh); }
static apt_bool_t mrcp_sofia_session_unref(mrcp_sofia_session_t *sofia_session) { if(sofia_session->nh) { nua_handle_bind(sofia_session->nh, NULL); nua_handle_destroy(sofia_session->nh); sofia_session->nh = NULL; } sofia_session->session = NULL; return TRUE; }
static void mrcp_sofia_on_session_redirect( int status, mrcp_sofia_agent_t *sofia_agent, nua_handle_t *nh, mrcp_sofia_session_t *sofia_session, sip_t const *sip, tagi_t tags[]) { mrcp_session_t *session = sofia_session->session; sip_contact_t *sip_contact; if(!sip) { return; } sip_contact = sip->sip_contact; if(!sip_contact || !sip_contact->m_url) { return; } if(sip_contact->m_url->url_user && sip_contact->m_url->url_user != '\0') { sofia_session->sip_to_str = apr_psprintf(session->pool,"sip:%s@%s:%s", sip_contact->m_url->url_user, sip_contact->m_url->url_host, sip_contact->m_url->url_port); } else { sofia_session->sip_to_str = apr_psprintf(session->pool,"sip:%s:%s", sip_contact->m_url->url_host, sip_contact->m_url->url_port); } apr_thread_mutex_lock(sofia_session->mutex); apt_obj_log(APT_LOG_MARK,APT_PRIO_INFO,session->log_obj,"Redirect "APT_NAMESID_FMT" to %s", session->name, MRCP_SESSION_SID(session), sofia_session->sip_to_str); if(sofia_session->nh) { nua_handle_bind(sofia_session->nh, NULL); nua_handle_destroy(sofia_session->nh); sofia_session->nh = NULL; } sofia_session->nh = nua_handle( sofia_agent->nua, sofia_session, SIPTAG_TO_STR(sofia_session->sip_to_str), SIPTAG_FROM_STR(sofia_agent->sip_from_str), SIPTAG_CONTACT_STR(sofia_agent->sip_contact_str), TAG_END()); apr_thread_mutex_unlock(sofia_session->mutex); mrcp_sofia_session_offer(sofia_session->session,sofia_session->descriptor); }
static int luasofia_nua_handle_destroy(lua_State *L) { /* get and check first argument (should be a luasofia_nua_handle_t) */ luasofia_nua_handle_t *lnh = (luasofia_nua_handle_t*)luaL_checkudata(L, 1, NUA_HANDLE_MTABLE); if (lnh->nh) { /* remove lnh of the luasofia userdata table */ luasofia_userdata_table_remove(L, lnh->nh); nua_handle_destroy(lnh->nh); lnh->nh = NULL; } return 0; }
END_TEST START_TEST(client_1_4_2) { nua_handle_t *nh; struct message *message; struct event *response; S2_CASE("1.4.2", "Retry-After a delay", "Retry MESSAGE after a delay"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); nua_message(nh, SIPTAG_CONTENT_TYPE_STR("text/plain"), SIPTAG_PAYLOAD_STR("hello"), TAG_END()); message = s2_sip_wait_for_request(SIP_METHOD_MESSAGE); s2_sip_respond_to(message, NULL, SIP_503_SERVICE_UNAVAILABLE, SIPTAG_RETRY_AFTER_STR("3"), TAG_END()); s2_sip_free_message(message); response = s2_wait_for_event(nua_r_message, 100); s2_free_event(response); s2_nua_fast_forward(32, s2base->root); /* Too long delay */ message = s2_sip_wait_for_request(SIP_METHOD_MESSAGE); s2_sip_respond_to(message, NULL, SIP_503_SERVICE_UNAVAILABLE, SIPTAG_RETRY_AFTER_STR("32"), TAG_END()); s2_sip_free_message(message); response = s2_wait_for_event(nua_r_message, 503); s2_free_event(response); nua_set_params(nua, NUTAG_MAX_RETRY_AFTER(0), TAG_END()); fail_unless_event(nua_r_set_params, 200); /* Disable feature */ nua_message(nh, SIPTAG_CONTENT_TYPE_STR("text/plain"), SIPTAG_PAYLOAD_STR("hello"), TAG_END()); message = s2_sip_wait_for_request(SIP_METHOD_MESSAGE); s2_sip_respond_to(message, NULL, SIP_503_SERVICE_UNAVAILABLE, SIPTAG_RETRY_AFTER_STR("3"), TAG_END()); s2_sip_free_message(message); response = s2_wait_for_event(nua_r_message, 503); s2_free_event(response); nua_handle_destroy(nh); }
END_TEST START_TEST(SIP_CC_OE_CE_TI_011_012) { nua_handle_t *nh; struct message *invite; S2_CASE("6.1.2", "SIP_CC_OE_CE_TI_011_012", "Ensure that the IUT, when an INVITE client transaction " "has been in the Terminated state, on receipt of a " "retransmitted Success (200 OK) responses sends an ACK " "request until 64*T1 duration expires, after this, " "on receipt of a retransmitted Success (200 OK) " "responses does not send an ACK request."); nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); invite = invite_sent_by_nua(nh, TAG_END()); process_offer(invite); respond_with_sdp(invite, d1, SIP_200_OK, TAG_END()); fail_unless_event(nua_r_invite, 200); fail_unless(s2_check_callstate(nua_callstate_ready)); fail_unless(s2_sip_check_request(SIP_METHOD_ACK)); s2_nua_fast_forward(5, s2base->root); respond_with_sdp(invite, d1, SIP_200_OK, TAG_END()); fail_unless(s2_sip_check_request(SIP_METHOD_ACK)); s2_nua_fast_forward(5, s2base->root); respond_with_sdp(invite, d1, SIP_200_OK, TAG_END()); fail_unless(s2_sip_check_request(SIP_METHOD_ACK)); s2_nua_fast_forward(20, s2base->root); respond_with_sdp(invite, d1, SIP_200_OK, TAG_END()); fail_unless(s2_sip_check_request(SIP_METHOD_ACK)); /* Stack times out the INVITE transaction */ s2_nua_fast_forward(5, s2base->root); respond_with_sdp(invite, d1, SIP_200_OK, SIPTAG_SUBJECT_STR("Stray 200 OK"), TAG_END()); s2_sip_free_message(invite); mark_point(); fail_if(s2_sip_check_request_timeout(SIP_METHOD_ACK, 3)); bye_by_nua(d1, nh, TAG_END()); nua_handle_destroy(nh); }
static apt_bool_t mrcp_sofia_session_destroy(mrcp_sofia_session_t *sofia_session) { if(sofia_session->nh) { nua_handle_bind(sofia_session->nh, NULL); nua_handle_destroy(sofia_session->nh); } if(sofia_session->home) { sofia_session->session->obj = NULL; su_home_unref(sofia_session->home); sofia_session->home = NULL; } return TRUE; }
END_TEST START_TEST(SIP_CC_OE_CE_TI_008) { nua_handle_t *nh; struct message *invite; S2_CASE("6.1.2", "SIP_CC_OE_CE_TI_008", "If an unreliable transport is used, ensure that " "the IUT, when an INVITE client transaction is in " "the Completed state, on receipt of final responses " "that matches the transaction, still answer with an " "ACK request until timer D set to at least 32 second expires."); nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); invite = invite_sent_by_nua(nh, TAG_END()); s2_sip_respond_to(invite, d1, 404, "First not found", TAG_END()); fail_unless_event(nua_r_invite, 404); fail_unless(s2_check_callstate(nua_callstate_terminated)); fail_unless(s2_sip_check_request(SIP_METHOD_ACK)); s2_nua_fast_forward(5, s2base->root); s2_sip_respond_to(invite, d1, 404, "Not found after 5 seconds", TAG_END()); fail_unless(s2_sip_check_request(SIP_METHOD_ACK)); s2_nua_fast_forward(5, s2base->root); s2_sip_respond_to(invite, d1, 404, "Not found after 10 seconds", TAG_END()); fail_unless(s2_sip_check_request(SIP_METHOD_ACK)); s2_nua_fast_forward(21, s2base->root); s2_sip_respond_to(invite, d1, 404, "Not found after 31 seconds", TAG_END()); fail_unless(s2_sip_check_request(SIP_METHOD_ACK)); s2_nua_fast_forward(5, s2base->root); /* Wake up nua thread and let it time out INVITE transaction */ nua_set_params(s2->nua, TAG_END()); fail_unless_event(nua_r_set_params, 0); s2_sip_respond_to(invite, d1, 404, "Not found after 32 seconds", TAG_END()); s2_sip_free_message(invite); fail_if(s2_sip_check_request_timeout(SIP_METHOD_ACK, 3)); nua_handle_destroy(nh); }
END_TEST START_TEST(subscribe_6_1_2) { nua_handle_t *nh; struct message *subscribe, *response; struct event *notify, *event; S2_CASE("6.1.2", "Basic subscription with refresh", "NUA sends SUBSCRIBE, waits for NOTIFY, " "sends re-SUBSCRIBE, waits for NOTIFY, " "sends un-SUBSCRIBE"); send_notify_before_response = 1; nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); nua_subscribe(nh, SIPTAG_EVENT_STR(event_type), TAG_END()); notify = subscription_by_nua(nh, nua_substate_embryonic, TAG_END()); s2_free_event(notify); /* Wait for refresh */ s2_nua_fast_forward(600, s2base->root); subscribe = s2_sip_wait_for_request(SIP_METHOD_SUBSCRIBE); s2_sip_respond_to(subscribe, dialog, SIP_200_OK, SIPTAG_EXPIRES_STR("600"), TAG_END()); event = s2_wait_for_event(nua_r_subscribe, 200); fail_if(!event); fail_unless(s2_check_substate(event, nua_substate_active)); s2_free_event(event); fail_if(s2_sip_request_to(dialog, SIP_METHOD_NOTIFY, NULL, SIPTAG_EVENT(subscribe->sip->sip_event), SIPTAG_SUBSCRIPTION_STATE_STR("active;expires=600"), SIPTAG_CONTENT_TYPE_STR(event_mime_type), SIPTAG_PAYLOAD_STR(event_state), TAG_END())); event = s2_wait_for_event(nua_i_notify, 200); fail_if(!event); fail_unless(s2_check_substate(event, nua_substate_active)); s2_free_event(event); response = s2_sip_wait_for_response(200, SIP_METHOD_NOTIFY); fail_if(!response); s2_sip_free_message(response); unsubscribe_by_nua(nh, TAG_END()); nua_handle_destroy(nh); }
END_TEST START_TEST(subscribe_6_1_5) { nua_handle_t *nh; struct event *notify; sip_via_t *vorig = s2_sip_tport_via(s2sip->udp.tport); sip_via_t via[2]; char *v0_params[8] = {}, *v1_params[8] = {}; char branch0[32], branch1[32]; S2_CASE("6.1.5", "Via handling in response to NOTIFY", "NUA sends SUBSCRIBE, waits for NOTIFY, sends un-SUBSCRIBE"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); nua_subscribe(nh, SIPTAG_EVENT_STR(event_type), TAG_END()); s2_sip_msg_flags = MSG_FLG_COMMA_LISTS|MSG_FLG_COMPACT; fail_if(vorig == NULL); via[0] = *vorig; via[0].v_host = "example.org"; via[0].v_params = (void *)v0_params; snprintf(v0_params[0] = branch0, sizeof branch0, "branch=z9hG4bK%lx", ++s2sip->tid); fail_if(vorig == NULL); via[1] = *vorig; via[1].v_params = (void *)v1_params; snprintf(v1_params[0] = branch1, sizeof branch1, "branch=z9hG4bK%lx", ++s2sip->tid); notify = subscription_by_nua(nh, nua_substate_embryonic, SIPTAG_VIA(via + 1), SIPTAG_VIA(via + 0), TAG_END()); s2_sip_msg_flags = 0; s2_free_event(notify); unsubscribe_by_nua(nh, TAG_END()); nua_handle_destroy(nh); }
END_TEST START_TEST(subscribe_6_1_4) { nua_handle_t *nh; struct message *response; struct event *notify, *event; S2_CASE("6.1.4", "Subscription terminated by notifier, re-established", "NUA sends SUBSCRIBE, waits for NOTIFY, " "gets NOTIFY terminating the subscription,"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); nua_subscribe(nh, SIPTAG_EVENT_STR(event_type), TAG_END()); notify = subscription_by_nua(nh, nua_substate_embryonic, TAG_END()); s2_free_event(notify); fail_if(s2_sip_request_to(dialog, SIP_METHOD_NOTIFY, NULL, SIPTAG_EVENT_STR(event_type), SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=deactivated"), TAG_END())); event = s2_wait_for_event(nua_i_notify, 200); fail_if(!event); fail_unless(s2_check_substate(event, nua_substate_embryonic)); s2_free_event(event); response = s2_sip_wait_for_response(200, SIP_METHOD_NOTIFY); fail_if(!response); s2_sip_free_message(response); su_home_unref((void *)dialog), dialog = su_home_new(sizeof *dialog); fail_if(!dialog); s2_nua_fast_forward(5, s2base->root); /* nua re-establishes the subscription */ notify = subscription_by_nua(nh, nua_substate_embryonic, TAG_END()); s2_free_event(notify); /* Unsubscribe with nua_subscribe() Expires: 0 */ nua_subscribe(nh, SIPTAG_EVENT_STR(event_type), SIPTAG_EXPIRES_STR("0"), TAG_END()); notify = subscription_by_nua(nh, nua_substate_active, TAG_END()); s2_free_event(notify); nua_handle_destroy(nh); }
END_TEST START_TEST(fetch_6_2_2) { nua_handle_t *nh; struct event *notify; S2_CASE("6.2.2", "Event fetch - NOTIFY before 200", "NUA sends SUBSCRIBE with Expires 0, waits for NOTIFY"); send_notify_before_response = 1; nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); nua_subscribe(nh, SIPTAG_EVENT_STR(event_type), SIPTAG_EXPIRES_STR("0"), TAG_END()); notify = subscription_by_nua(nh, nua_substate_embryonic, TAG_END()); s2_check_substate(notify, nua_substate_terminated); s2_free_event(notify); nua_handle_destroy(nh); }
static apt_bool_t mrcp_sofia_on_session_terminate(mrcp_session_t *session) { mrcp_sofia_session_t *sofia_session = session->obj; if(sofia_session) { if(sofia_session->nh) { nua_handle_bind(sofia_session->nh, NULL); nua_handle_destroy(sofia_session->nh); } if(sofia_session->home) { su_home_unref(sofia_session->home); sofia_session->home = NULL; } sofia_session->session = NULL; } apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Destroy Session "APT_SID_FMT, MRCP_SESSION_SID(session)); mrcp_session_destroy(session); return TRUE; }
static apt_bool_t mrcp_sofia_on_session_terminate(mrcp_session_t *session) { mrcp_sofia_session_t *sofia_session = session->obj; if(sofia_session) { if(sofia_session->session) { apt_log(APT_PRIO_NOTICE,"Destroy Session"); mrcp_session_destroy(sofia_session->session); sofia_session->session = NULL; } if(sofia_session->nh) { nua_handle_bind(sofia_session->nh, NULL); nua_handle_destroy(sofia_session->nh); } if(sofia_session->home) { su_home_unref(sofia_session->home); sofia_session->home = NULL; } } return TRUE; }
END_TEST START_TEST(notify_6_3_2) { nua_handle_t *nh; struct message *notify; sip_t *sip; S2_CASE("6.3.2", "NOTIFY server - automatic subscription termination", "NUA receives SUBSCRIBE, sends 202 and NOTIFY. " "The subscription terminates with timeout. "); nh = subscribe_to_nua("presence", SIPTAG_EXPIRES_STR("300"), TAG_END()); nua_notify(nh, NUTAG_SUBSTATE(nua_substate_active), SIPTAG_PAYLOAD_STR(presence_closed), TAG_END()); notify = s2_sip_wait_for_request(SIP_METHOD_NOTIFY); fail_unless(notify != NULL); sip = notify->sip; fail_unless(sip->sip_subscription_state != NULL); fail_unless(su_strmatch(sip->sip_subscription_state->ss_substate, "active")); s2_sip_respond_to(notify, dialog, SIP_200_OK, TAG_END()); fail_unless_event(nua_r_notify, 200); s2_nua_fast_forward(300, s2base->root); notify = s2_sip_wait_for_request(SIP_METHOD_NOTIFY); fail_unless(notify != NULL); sip = notify->sip; fail_unless(sip->sip_subscription_state != NULL); fail_unless(su_strmatch(sip->sip_subscription_state->ss_substate, "terminated")); s2_sip_respond_to(notify, dialog, SIP_200_OK, TAG_END()); fail_unless_event(nua_r_notify, 200); nua_handle_destroy(nh); }
END_TEST START_TEST(message_6_4_3) { nua_handle_t *nh; struct message *message; struct event *response; sip_call_id_t *i; S2_CASE("6.4.1", "SIMPLE MESSAGE", "Send MESSAGE"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); nua_message(nh, SIPTAG_CONTENT_TYPE_STR("text/plain"), SIPTAG_PAYLOAD_STR("hello"), TAG_END()); message = s2_sip_wait_for_request(SIP_METHOD_MESSAGE); s2_sip_respond_to(message, NULL, SIP_407_PROXY_AUTH_REQUIRED, SIPTAG_PROXY_AUTHENTICATE_STR(s2_auth_digest_str), TAG_END()); i = sip_call_id_dup(NULL, message->sip->sip_call_id); fail_unless(i != NULL); s2_sip_free_message(message); fail_unless_event(nua_r_message, 407); nua_authenticate(nh, NUTAG_AUTH(s2_auth_credentials), TAG_END()); message = s2_sip_wait_for_request(SIP_METHOD_MESSAGE); s2_sip_respond_to(message, NULL, SIP_202_ACCEPTED, TAG_END()); fail_unless(su_strmatch(i->i_id, message->sip->sip_call_id->i_id)); s2_sip_free_message(message); response = s2_wait_for_event(nua_r_message, 202); s2_free_event(response); nua_handle_destroy(nh); }
/** Un-register NUA user. * * <pre> * A B * |-----REGISTER---->| * |<-----200 OK------| * | | * </pre> */ void s2_register_teardown(void) { if (s2 && s2->registration->nh) { nua_handle_t *nh = s2->registration->nh; struct message *m; nua_unregister(nh, TAG_END()); m = s2_sip_wait_for_request(SIP_METHOD_REGISTER); assert(m); s2_save_register(m); s2_sip_respond_to(m, NULL, SIP_200_OK, SIPTAG_CONTACT(s2->registration->contact), TAG_END()); assert(s2->registration->contact == NULL); s2_sip_free_message(m); fail_unless_event(nua_r_unregister, 200); nua_handle_destroy(nh); s2->registration->nh = NULL; } }
int test_extension(struct context *ctx) { BEGIN(); struct endpoint *a = &ctx->a, *b = &ctx->b; struct call *a_call = a->call, *b_call = b->call; struct event *e; sip_t const *sip; /* Test for EXTENSION A B |------EXTENSION---->| |<--------501--------| (method not recognized) | | |------EXTENSION---->| |<-------200---------| (method allowed, responded) | | */ if (print_headings) printf("TEST NUA-13.1: EXTENSION\n"); TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END())); /* Test first without NUTAG_METHOD() */ METHOD(a, a_call, a_call->nh, TAG_IF(!ctx->proxy_tests, NUTAG_URL(b->contact->m_url)), TAG_END()); run_ab_until(ctx, -1, save_until_final_response, -1, NULL); /* Client events: nua_method(), nua_r_method */ TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_r_method); TEST(e->data->e_status, 900); /* Internal error */ TEST_1(!e->data->e_msg); TEST_1(!e->next); free_events_in_list(ctx, a->events); nua_handle_destroy(a_call->nh), a_call->nh = NULL; TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END())); METHOD(a, a_call, a_call->nh, TAG_IF(!ctx->proxy_tests, NUTAG_URL(b->contact->m_url)), NUTAG_METHOD("EXTENSION"), TAG_END()); run_ab_until(ctx, -1, save_until_final_response, -1, NULL); /* Client events: nua_method(), nua_r_method */ TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_r_method); TEST(e->data->e_status, 501); TEST_1(!e->next); free_events_in_list(ctx, a->events); nua_handle_destroy(a_call->nh), a_call->nh = NULL; free_events_in_list(ctx, b->events); nua_handle_destroy(b_call->nh), b_call->nh = NULL; nua_set_params(b->nua, NUTAG_ALLOW("EXTENSION"), TAG_END()); run_b_until(ctx, nua_r_set_params, until_final_response); TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END())); METHOD(a, a_call, a_call->nh, TAG_IF(!ctx->proxy_tests, NUTAG_URL(b->contact->m_url)), NUTAG_METHOD("EXTENSION"), TAG_END()); run_ab_until(ctx, -1, save_until_final_response, -1, respond_to_extension); /* Client events: nua_method(), nua_r_method */ TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_r_method); TEST(e->data->e_status, 200); TEST_1(sip = sip_object(e->data->e_msg)); TEST_1(!e->next); /* Server events: nua_i_method */ TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_i_method); TEST(e->data->e_status, 100); TEST_1(!e->next); free_events_in_list(ctx, a->events); nua_handle_destroy(a_call->nh), a_call->nh = NULL; free_events_in_list(ctx, b->events); nua_handle_destroy(b_call->nh), b_call->nh = NULL; nua_set_params(b->nua, SIPTAG_ALLOW(b->allow), NUTAG_APPL_METHOD(NULL), NUTAG_APPL_METHOD(b->appl_method), TAG_END()); run_b_until(ctx, nua_r_set_params, until_final_response); if (print_headings) printf("TEST NUA-13.1: PASSED\n"); END(); }
END_TEST START_TEST(message_6_4_2) { nua_handle_t *nh; struct message *message; struct event *response; S2_CASE("6.4.2", "MESSAGE with 302/305", "Send MESSAGE"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2sip->aor), TAG_END()); nua_message(nh, SIPTAG_CONTENT_TYPE_STR("text/plain"), SIPTAG_PAYLOAD_STR("hello"), TAG_END()); message = s2_sip_wait_for_request(SIP_METHOD_MESSAGE); s2_sip_respond_to(message, NULL, SIP_302_MOVED_TEMPORARILY, SIPTAG_CONTACT_STR("<sip:[email protected]>"), TAG_END()); s2_sip_free_message(message); response = s2_wait_for_event(nua_r_message, 100); s2_free_event(response); message = s2_sip_wait_for_request(SIP_METHOD_MESSAGE); fail_unless(message->sip->sip_request->rq_url->url_user != NULL); fail_if(strcmp(message->sip->sip_request->rq_url->url_user, "302ed")); s2_sip_respond_to(message, NULL, SIP_305_USE_PROXY, SIPTAG_CONTACT_STR("<sip:[email protected];lr>"), TAG_END()); s2_sip_free_message(message); response = s2_wait_for_event(nua_r_message, 100); s2_free_event(response); message = s2_sip_wait_for_request(SIP_METHOD_MESSAGE); fail_unless(message->sip->sip_route != NULL); fail_unless(message->sip->sip_route->r_url->url_user != NULL); fail_if(strcmp(message->sip->sip_route->r_url->url_user, "routed")); s2_sip_respond_to(message, NULL, SIP_200_OK, TAG_END()); s2_sip_free_message(message); response = s2_wait_for_event(nua_r_message, 200); s2_free_event(response); /* ---------------------------------------------------------------------- */ nua_message(nh, NUTAG_AUTO302(0), SIPTAG_CONTENT_TYPE_STR("text/plain"), SIPTAG_PAYLOAD_STR("hello 2"), TAG_END()); message = s2_sip_wait_for_request(SIP_METHOD_MESSAGE); s2_sip_respond_to(message, NULL, SIP_302_MOVED_TEMPORARILY, SIPTAG_CONTACT_STR("<sip:[email protected]>"), TAG_END()); s2_sip_free_message(message); response = s2_wait_for_event(nua_r_message, 302); fail_unless(response->sip && response->sip->sip_contact); nua_message(nh, NUTAG_URL(response->sip->sip_contact->m_url), NUTAG_AUTO305(0), SIPTAG_CONTENT_TYPE_STR("text/plain"), SIPTAG_PAYLOAD_STR("hello 2"), TAG_END()); s2_free_event(response); message = s2_sip_wait_for_request(SIP_METHOD_MESSAGE); fail_unless(message->sip->sip_request->rq_url->url_user != NULL); fail_if(strcmp(message->sip->sip_request->rq_url->url_user, "not302ed")); s2_sip_respond_to(message, NULL, SIP_305_USE_PROXY, SIPTAG_CONTACT_STR("<sip:[email protected]>"), TAG_END()); s2_sip_free_message(message); response = s2_wait_for_event(nua_r_message, 305); s2_free_event(response); nua_handle_destroy(nh); }
int test_events(struct context *ctx) { BEGIN(); struct endpoint *a = &ctx->a, *b = &ctx->b; struct call *a_call = a->call, *b_call = b->call; struct event *e, *en, *es; sip_t const *sip; tagi_t const *t, *n_tags, *r_tags; url_t b_url[1]; enum nua_substate substate; nea_sub_t *sub = NULL; char const open[] = "<?xml version='1.0' encoding='UTF-8'?>\n" "<presence xmlns='urn:ietf:params:xml:ns:cpim-pidf' \n" " entity='pres:[email protected]'>\n" " <tuple id='ksac9udshce'>\n" " <status><basic>open</basic></status>\n" " <contact priority='1.0'>sip:[email protected]</contact>\n" " </tuple>\n" "</presence>\n"; char const closed[] = "<?xml version='1.0' encoding='UTF-8'?>\n" "<presence xmlns='urn:ietf:params:xml:ns:cpim-pidf' \n" " entity='pres:[email protected]'>\n" " <tuple id='ksac9udshce'>\n" " <status><basic>closed</basic></status>\n" " </tuple>\n" "</presence>\n"; /* SUBSCRIBE test A B |------SUBSCRIBE---->| |<--------405--------| | | */ if (print_headings) printf("TEST NUA-12.1: SUBSCRIBE without notifier\n"); nua_set_params(b->nua, SIPTAG_ALLOW_EVENTS(NULL), TAG_END()); run_b_until(ctx, nua_r_set_params, until_final_response); TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END())); SUBSCRIBE(a, a_call, a_call->nh, NUTAG_URL(b->contact->m_url), SIPTAG_EVENT_STR("presence"), TAG_END()); run_ab_until(ctx, -1, save_until_final_response, -1, NULL /* XXX save_until_received */); /* Client events: nua_subscribe(), nua_r_subscribe */ TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_r_subscribe); TEST(e->data->e_status, 489); TEST_1(!e->next); #if 0 /* XXX */ /* Server events: nua_i_subscribe */ TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_i_subscribe); TEST(e->data->e_status, 405); TEST_1(sip = sip_object(e->data->e_msg)); TEST_1(sip->sip_event); TEST_S(sip->sip_event->o_type, "presence"); TEST_1(!e->next); #endif free_events_in_list(ctx, a->events); free_events_in_list(ctx, b->events); nua_handle_destroy(b_call->nh), b_call->nh = NULL; if (print_headings) printf("TEST NUA-12.1: PASSED\n"); /* ---------------------------------------------------------------------- */ /* SUBSCRIBE test using notifier and establishing subscription A B | | |------SUBSCRIBE---->| |<--------202--------| |<------NOTIFY-------| |-------200 OK------>| | | */ if (print_headings) printf("TEST NUA-12.2: using notifier and establishing subscription\n"); TEST_1(b_call->nh = nua_handle(b->nua, b_call, TAG_END())); *b_url = *b->contact->m_url; NOTIFIER(b, b_call, b_call->nh, NUTAG_URL(b_url), SIPTAG_EVENT_STR("presence"), SIPTAG_CONTENT_TYPE_STR("application/pidf+xml"), SIPTAG_PAYLOAD_STR(closed), NEATAG_THROTTLE(1), TAG_END()); run_b_until(ctx, nua_r_notifier, until_final_response); SUBSCRIBE(a, a_call, a_call->nh, NUTAG_URL(b->contact->m_url), SIPTAG_EVENT_STR("presence"), SIPTAG_ACCEPT_STR("application/xpidf, application/pidf+xml"), TAG_END()); run_ab_until(ctx, -1, save_until_notified_and_responded, -1, save_until_received); /* Client events: nua_subscribe(), nua_i_notify/nua_r_subscribe */ TEST_1(en = event_by_type(a->events->head, nua_i_notify)); TEST_1(es = event_by_type(a->events->head, nua_r_subscribe)); TEST_1(e = es); TEST_E(e->data->e_event, nua_r_subscribe); r_tags = e->data->e_tags; TEST_1(tl_find(r_tags, nutag_substate)); if (es->next == en) { TEST_1(200 <= e->data->e_status && e->data->e_status < 300); TEST(tl_find(r_tags, nutag_substate)->t_value, nua_substate_embryonic); } else { TEST_1(200 <= e->data->e_status && e->data->e_status < 300); TEST(tl_find(r_tags, nutag_substate)->t_value, nua_substate_active); } TEST_1(e = en); TEST_E(e->data->e_event, nua_i_notify); TEST_1(sip = sip_object(e->data->e_msg)); n_tags = e->data->e_tags; TEST_1(sip->sip_event); TEST_S(sip->sip_event->o_type, "presence"); TEST_1(sip->sip_content_type); TEST_S(sip->sip_content_type->c_type, "application/pidf+xml"); TEST_1(sip->sip_subscription_state); TEST_S(sip->sip_subscription_state->ss_substate, "active"); TEST_1(sip->sip_subscription_state->ss_expires); TEST_1(tl_find(n_tags, nutag_substate)); TEST(tl_find(n_tags, nutag_substate)->t_value, nua_substate_active); TEST_1(!en->next || !es->next); free_events_in_list(ctx, a->events); /* XXX --- Do not check server side events */ free_events_in_list(ctx, b->events); if (print_headings) printf("TEST NUA-12.2: PASSED\n"); /* ---------------------------------------------------------------------- */ /* NOTIFY with updated content A B | | |<------NOTIFY-------| |-------200 OK------>| | | */ if (print_headings) printf("TEST NUA-12.3: update notifier\n"); /* Update presence data */ NOTIFIER(b, b_call, b_call->nh, SIPTAG_EVENT_STR("presence"), SIPTAG_CONTENT_TYPE_STR("application/pidf+xml"), SIPTAG_PAYLOAD_STR(open), TAG_END()); run_ab_until(ctx, -1, save_until_notified, -1, save_until_received); /* subscriber events: nua_i_notify */ TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_notify); TEST_1(sip = sip_object(e->data->e_msg)); TEST_1(sip->sip_event); TEST_S(sip->sip_event->o_type, "presence"); TEST_1(sip->sip_content_type); TEST_S(sip->sip_content_type->c_type, "application/pidf+xml"); TEST_1(sip->sip_subscription_state); TEST_S(sip->sip_subscription_state->ss_substate, "active"); TEST_1(sip->sip_subscription_state->ss_expires); n_tags = e->data->e_tags; TEST_1(tl_find(n_tags, nutag_substate)); TEST(tl_find(n_tags, nutag_substate)->t_value, nua_substate_active); TEST_1(!e->next); free_events_in_list(ctx, a->events); /* XXX --- Do not check server side events */ free_events_in_list(ctx, b->events); if (print_headings) printf("TEST NUA-12.3: PASSED\n"); /* ---------------------------------------------------------------------- */ /* un-SUBSCRIBE A B | | |------SUBSCRIBE---->| |<--------202--------| |<------NOTIFY-------| |-------200 OK------>| | | */ if (print_headings) printf("TEST NUA-12.5: un-SUBSCRIBE\n"); memset(&a->flags, 0, sizeof a->flags); UNSUBSCRIBE(a, a_call, a_call->nh, TAG_END()); run_ab_until(ctx, -1, save_until_notified_and_responded, -1, save_until_subscription); /* Client events: nua_unsubscribe(), nua_i_notify/nua_r_unsubscribe */ TEST_1(e = a->events->head); if (e->data->e_event == nua_i_notify) { TEST_E(e->data->e_event, nua_i_notify); TEST_1(sip = sip_object(e->data->e_msg)); n_tags = e->data->e_tags; TEST_1(sip->sip_event); TEST_1(sip->sip_subscription_state); TEST_S(sip->sip_subscription_state->ss_substate, "terminated"); TEST_1(!sip->sip_subscription_state->ss_expires); TEST_1(tl_find(n_tags, nutag_substate)); TEST(tl_find(n_tags, nutag_substate)->t_value, nua_substate_terminated); TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_unsubscribe); TEST_1(tl_find(e->data->e_tags, nutag_substate)); TEST(tl_find(e->data->e_tags, nutag_substate)->t_value, nua_substate_terminated); } else { TEST_E(e->data->e_event, nua_r_unsubscribe); TEST_1(tl_find(e->data->e_tags, nutag_substate)); /* NOTIFY is no more dropped after successful response to unsubscribe */ TEST(tl_find(e->data->e_tags, nutag_substate)->t_value, nua_substate_active); TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_notify); TEST_1(sip = sip_object(e->data->e_msg)); n_tags = e->data->e_tags; TEST_1(sip->sip_event); TEST_1(sip->sip_subscription_state); TEST_S(sip->sip_subscription_state->ss_substate, "terminated"); TEST_1(!sip->sip_subscription_state->ss_expires); TEST_1(tl_find(n_tags, nutag_substate)); TEST(tl_find(n_tags, nutag_substate)->t_value, nua_substate_terminated); } TEST_1(!e->next); free_events_in_list(ctx, a->events); /* Server events: nua_i_subscription with terminated status */ TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_i_subscription); TEST(tl_gets(e->data->e_tags, NEATAG_SUB_REF(sub), NUTAG_SUBSTATE_REF(substate), TAG_END()), 2); TEST_1(sub); TEST(substate, nua_substate_terminated); TEST_1(!e->next); free_events_in_list(ctx, b->events); if (print_headings) printf("TEST NUA-12.5: PASSED\n"); /* ---------------------------------------------------------------------- */ /* Fetch event, SUBSCRIBE with expires: 0 A B | | |------SUBSCRIBE---->| |<--------202--------| |<------NOTIFY-------| |-------200 OK------>| | | */ if (print_headings) printf("TEST NUA-12.5.1: event fetch\n"); SUBSCRIBE(a, a_call, a_call->nh, NUTAG_URL(b->contact->m_url), SIPTAG_EVENT_STR("presence"), SIPTAG_ACCEPT_STR("application/pidf+xml"), SIPTAG_EXPIRES_STR("0"), TAG_END()); run_ab_until(ctx, -1, save_until_notified_and_responded, -1, save_until_subscription); /* Client events: nua_subscribe(), nua_i_notify/nua_r_subscribe */ TEST_1(en = event_by_type(a->events->head, nua_i_notify)); TEST_1(es = event_by_type(a->events->head, nua_r_subscribe)); e = es; TEST_E(e->data->e_event, nua_r_subscribe); TEST_1(t = tl_find(e->data->e_tags, nutag_substate)); TEST_1(t->t_value == nua_substate_pending || t->t_value == nua_substate_terminated || t->t_value == nua_substate_embryonic); e = en; TEST_E(e->data->e_event, nua_i_notify); TEST_1(sip = sip_object(e->data->e_msg)); n_tags = e->data->e_tags; TEST_1(sip->sip_event); TEST_S(sip->sip_event->o_type, "presence"); TEST_1(sip->sip_content_type); TEST_S(sip->sip_content_type->c_type, "application/pidf+xml"); TEST_1(sip->sip_payload && sip->sip_payload->pl_data); TEST_1(sip->sip_subscription_state); TEST_S(sip->sip_subscription_state->ss_substate, "terminated"); TEST_1(tl_find(n_tags, nutag_substate)); TEST(tl_find(n_tags, nutag_substate)->t_value, nua_substate_terminated); TEST_1(!en->next || !es->next); free_events_in_list(ctx, a->events); /* Server events: nua_i_subscription */ TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_i_subscription); TEST(tl_gets(e->data->e_tags, NEATAG_SUB_REF(sub), TAG_END()), 1); TEST_1(sub); TEST_1(!e->next); free_events_in_list(ctx, b->events); if (print_headings) printf("TEST NUA-12.4.1: PASSED\n"); /* ---------------------------------------------------------------------- */ /* 2nd SUBSCRIBE with event id A B | | |------SUBSCRIBE---->| |<--------202--------| |<------NOTIFY-------| |-------200 OK------>| | | */ /* XXX - we should do this before unsubscribing first one */ if (print_headings) printf("TEST NUA-12.4.2: establishing 2nd subscription\n"); NOTIFIER(b, b_call, b_call->nh, SIPTAG_EVENT_STR("presence"), SIPTAG_CONTENT_TYPE_STR("application/xpidf+xml"), SIPTAG_PAYLOAD_STR(open), NEATAG_THROTTLE(1), NUTAG_SUBSTATE(nua_substate_pending), TAG_END()); run_b_until(ctx, nua_r_notifier, until_final_response); NOTIFIER(b, b_call, b_call->nh, SIPTAG_EVENT_STR("presence"), SIPTAG_CONTENT_TYPE_STR("application/xpidf+xml"), SIPTAG_PAYLOAD_STR(closed), NEATAG_THROTTLE(1), NEATAG_FAKE(1), NUTAG_SUBSTATE(nua_substate_pending), TAG_END()); run_b_until(ctx, nua_r_notifier, until_final_response); SUBSCRIBE(a, a_call, a_call->nh, NUTAG_URL(b->contact->m_url), SIPTAG_EVENT_STR("presence;id=1"), SIPTAG_ACCEPT_STR("application/xpidf+xml"), TAG_END()); run_ab_until(ctx, -1, save_until_notified_and_responded, -1, save_until_subscription); /* Client events: nua_subscribe(), nua_i_notify/nua_r_subscribe */ TEST_1(en = event_by_type(a->events->head, nua_i_notify)); TEST_1(es = event_by_type(a->events->head, nua_r_subscribe)); e = es; TEST_E(e->data->e_event, nua_r_subscribe); TEST_1(t = tl_find(e->data->e_tags, nutag_substate)); TEST_1(t->t_value == nua_substate_pending || t->t_value == nua_substate_embryonic); e = en; TEST_E(e->data->e_event, nua_i_notify); TEST_1(sip = sip_object(e->data->e_msg)); n_tags = e->data->e_tags; TEST_1(sip->sip_event); TEST_S(sip->sip_event->o_type, "presence"); TEST_S(sip->sip_event->o_id, "1"); TEST_1(sip->sip_content_type); TEST_S(sip->sip_content_type->c_type, "application/xpidf+xml"); TEST_1(sip->sip_payload && sip->sip_payload->pl_data); /* Check that we really got "fake" content */ TEST_1(memmem(sip->sip_payload->pl_data, sip->sip_payload->pl_len, "<basic>closed</basic>", strlen("<basic>closed</basic>"))); TEST_1(sip->sip_subscription_state); TEST_S(sip->sip_subscription_state->ss_substate, "pending"); TEST_1(sip->sip_subscription_state->ss_expires); TEST_1(tl_find(n_tags, nutag_substate)); TEST(tl_find(n_tags, nutag_substate)->t_value, nua_substate_pending); TEST_1(!en->next || !es->next); free_events_in_list(ctx, a->events); /* Server events: nua_i_subscription */ TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_i_subscription); TEST(tl_gets(e->data->e_tags, NEATAG_SUB_REF(sub), TAG_END()), 1); TEST_1(sub); TEST_1(!e->next); free_events_in_list(ctx, b->events); /* Authorize user A */ AUTHORIZE(b, b_call, b_call->nh, NUTAG_SUBSTATE(nua_substate_active), NEATAG_SUB(sub), NEATAG_FAKE(0), TAG_END()); run_ab_until(ctx, -1, save_until_notified, -1, save_until_final_response); /* subscriber events: nua_i_notify with NUTAG_SUBSTATE(nua_substate_active) */ TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_notify); TEST_1(sip = sip_object(e->data->e_msg)); TEST_1(sip->sip_event); TEST_S(sip->sip_event->o_type, "presence"); TEST_1(sip->sip_content_type); TEST_S(sip->sip_content_type->c_type, "application/xpidf+xml"); TEST_1(sip->sip_payload && sip->sip_payload->pl_data); /* Check that we really got real content */ TEST_1(memmem(sip->sip_payload->pl_data, sip->sip_payload->pl_len, "<basic>open</basic>", strlen("<basic>open</basic>"))); TEST_1(sip->sip_subscription_state); TEST_S(sip->sip_subscription_state->ss_substate, "active"); TEST_1(sip->sip_subscription_state->ss_expires); n_tags = e->data->e_tags; TEST_1(tl_find(n_tags, nutag_substate)); TEST(tl_find(n_tags, nutag_substate)->t_value, nua_substate_active); TEST_1(!e->next); free_events_in_list(ctx, a->events); /* Server events: nua_r_authorize */ TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_r_authorize); TEST_1(!e->next); free_events_in_list(ctx, b->events); if (print_headings) printf("TEST NUA-12.4: PASSED\n"); /* ---------------------------------------------------------------------- */ /* NOTIFY terminating subscription A B | | |<------NOTIFY-------| |-------200 OK------>| | | */ if (print_headings) printf("TEST NUA-12.6: terminate notifier\n"); TERMINATE(b, b_call, b_call->nh, TAG_END()); run_ab_until(ctx, -1, save_until_notified, -1, until_final_response); /* Client events: nua_i_notify */ TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_notify); TEST_1(sip = sip_object(e->data->e_msg)); TEST_1(sip->sip_event); TEST_S(sip->sip_event->o_type, "presence"); TEST_S(sip->sip_event->o_id, "1"); TEST_1(sip->sip_subscription_state); TEST_S(sip->sip_subscription_state->ss_substate, "terminated"); TEST_1(!sip->sip_subscription_state->ss_expires); n_tags = e->data->e_tags; TEST_1(tl_find(n_tags, nutag_substate)); TEST(tl_find(n_tags, nutag_substate)->t_value, nua_substate_terminated); TEST_1(!e->next); free_events_in_list(ctx, a->events); if (print_headings) printf("TEST NUA-12.6: PASSED\n"); /* ---------------------------------------------------------------------- */ nua_handle_destroy(a_call->nh), a_call->nh = NULL; nua_handle_destroy(b_call->nh), b_call->nh = NULL; END(); /* test_events */ }
END_TEST START_TEST(notify_6_3_6) { nua_handle_t *nh; struct event *subscribe; struct message *notify, *response; sip_t *sip; S2_CASE("6.3.6", "Explicit refresh with NUTAG_APPL_EVENT()", "Process subscription refresh by application"); nua_set_params(nua, NUTAG_APPL_METHOD("SUBSCRIBE"), NUTAG_APPL_EVENT("presence"), SIPTAG_ALLOW_EVENTS_STR("presence"), TAG_END()); fail_unless_event(nua_r_set_params, 200); s2_sip_request_to(dialog, SIP_METHOD_SUBSCRIBE, NULL, SIPTAG_EVENT_STR("presence"), TAG_END()); subscribe = s2_wait_for_event(nua_i_subscribe, 100); nh = subscribe->nh; nua_respond(nh, SIP_202_ACCEPTED, NUTAG_WITH_SAVED(subscribe->event), TAG_END()); s2_free_event(subscribe); response = s2_sip_wait_for_response(202, SIP_METHOD_SUBSCRIBE); s2_sip_update_dialog(dialog, response); fail_unless(response->sip->sip_expires != NULL); s2_sip_free_message(response); nua_notify(nh, NUTAG_SUBSTATE(nua_substate_active), SIPTAG_PAYLOAD_STR(presence_closed), TAG_END()); notify = s2_sip_wait_for_request(SIP_METHOD_NOTIFY); fail_unless(notify != NULL); sip = notify->sip; fail_unless(sip->sip_subscription_state != NULL); fail_unless(su_strmatch(sip->sip_subscription_state->ss_substate, "active")); s2_sip_respond_to(notify, dialog, SIP_200_OK, TAG_END()); fail_unless_event(nua_r_notify, 200); s2_sip_request_to(dialog, SIP_METHOD_SUBSCRIBE, NULL, SIPTAG_EVENT_STR("presence"), TAG_END()); subscribe = s2_wait_for_event(nua_i_subscribe, 100); nh = subscribe->nh; nua_respond(nh, SIP_202_ACCEPTED, NUTAG_WITH_SAVED(subscribe->event), TAG_END()); s2_free_event(subscribe); response = s2_sip_wait_for_response(202, SIP_METHOD_SUBSCRIBE); s2_sip_update_dialog(dialog, response); fail_unless(response->sip->sip_expires != NULL); s2_sip_free_message(response); notify = s2_sip_wait_for_request(SIP_METHOD_NOTIFY); fail_unless(notify != NULL); sip = notify->sip; fail_unless(sip->sip_subscription_state != NULL); fail_unless(su_strmatch(sip->sip_subscription_state->ss_substate, "active")); s2_sip_respond_to(notify, dialog, SIP_200_OK, TAG_END()); fail_unless_event(nua_r_notify, 200); /* Now clear list of application events */ nua_set_params(nua, NUTAG_APPL_EVENT(NULL), NUTAG_SUB_EXPIRES(360), TAG_END()); fail_unless_event(nua_r_set_params, 200); s2_sip_request_to(dialog, SIP_METHOD_SUBSCRIBE, NULL, SIPTAG_EVENT_STR("presence"), TAG_END()); /* Automatically responded && refreshed */ subscribe = s2_wait_for_event(nua_i_subscribe, 200); s2_free_event(subscribe); response = s2_sip_wait_for_response(200, SIP_METHOD_SUBSCRIBE); s2_sip_update_dialog(dialog, response); fail_unless(response->sip->sip_expires != NULL); fail_unless(response->sip->sip_expires->ex_delta == 360); s2_sip_free_message(response); notify = s2_sip_wait_for_request(SIP_METHOD_NOTIFY); fail_unless(notify != NULL); sip = notify->sip; fail_unless(sip->sip_subscription_state != NULL); fail_unless(su_strmatch(sip->sip_subscription_state->ss_substate, "active")); s2_sip_respond_to(notify, dialog, SIP_200_OK, TAG_END()); fail_unless_event(nua_r_notify, 200); nua_handle_destroy(nh); notify = s2_sip_wait_for_request(SIP_METHOD_NOTIFY); sip = notify->sip; fail_unless(sip->sip_subscription_state != NULL); fail_unless(su_strmatch(sip->sip_subscription_state->ss_substate, "terminated")); s2_sip_respond_to(notify, dialog, SIP_481_NO_TRANSACTION, TAG_END()); }