/* belle-sip - SIP (RFC3261) library. Copyright (C) 2010 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belle-sip/belle-sip.h" #include "belle_sip_internal.h" #include "belle_sip_tester.h" #include #include "CUnit/Basic.h" static void test_simple_contact_header(void) { belle_sip_header_contact_t* L_tmp; belle_sip_uri_t* L_uri; belle_sip_header_contact_t* L_contact = belle_sip_header_contact_parse("Contact:sip:titi.com"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_contact)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_contact)); L_tmp = belle_sip_header_contact_parse(l_raw_header); L_contact = BELLE_SIP_HEADER_CONTACT(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); L_uri = belle_sip_header_address_get_uri((belle_sip_header_address_t*)L_contact); CU_ASSERT_PTR_NULL(belle_sip_uri_get_user(L_uri)); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_host(L_uri), "titi.com"); CU_ASSERT_PTR_NULL(belle_sip_uri_get_transport_param(L_uri)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_contact)); } static void test_complex_contact_header(void) { belle_sip_header_contact_t* L_contact; belle_sip_uri_t* L_uri; belle_sip_header_contact_t* L_tmp = belle_sip_header_contact_parse("Contact: \"jˇremis\" ;expires=3600;q=0.7, sip:titi.com"); belle_sip_header_t* l_next; belle_sip_header_contact_t* L_next_contact; char* l_raw_header; float l_qvalue; L_contact = BELLE_SIP_HEADER_CONTACT(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); L_uri = belle_sip_header_address_get_uri((belle_sip_header_address_t*)L_contact); CU_ASSERT_PTR_NOT_NULL(L_uri); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_host(L_uri), "sip.linphone.org"); CU_ASSERT_STRING_EQUAL(belle_sip_header_address_get_displayname((belle_sip_header_address_t*)L_contact), "jˇremis"); CU_ASSERT_EQUAL(belle_sip_header_contact_get_expires(L_contact),3600); l_qvalue = belle_sip_header_contact_get_qvalue(L_contact); CU_ASSERT_EQUAL(l_qvalue,0.7f); l_next = belle_sip_header_get_next(BELLE_SIP_HEADER(L_contact)); L_next_contact = BELLE_SIP_HEADER_CONTACT(l_next); CU_ASSERT_PTR_NOT_NULL(L_next_contact); CU_ASSERT_PTR_NOT_NULL( belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_contact))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_contact)); L_contact = belle_sip_header_contact_parse("Contact: toto ;expires=3600; q=0.7"); l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_contact)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_contact)); L_contact = belle_sip_header_contact_parse(l_raw_header); belle_sip_free(l_raw_header); CU_ASSERT_STRING_EQUAL(belle_sip_header_address_get_displayname((belle_sip_header_address_t*)L_contact), "toto"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_contact)); } static void test_from_header(void) { belle_sip_header_from_t* L_tmp; belle_sip_uri_t* L_uri; belle_sip_header_from_t* L_from = belle_sip_header_from_parse("From:;tag=dlfjklcn6545614XX"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_from)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_from)); L_tmp = belle_sip_header_from_parse(l_raw_header); L_from = BELLE_SIP_HEADER_FROM(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); L_uri = belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_from)); CU_ASSERT_PTR_NULL(belle_sip_uri_get_user(L_uri)); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_host(L_uri), "titi.com"); CU_ASSERT_STRING_EQUAL(belle_sip_header_from_get_tag(L_from),"dlfjklcn6545614XX"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_from)); /*test factory*/ L_from = belle_sip_header_from_create2("super ","12345-abc"); CU_ASSERT_PTR_NOT_NULL_FATAL(L_from); L_uri = belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_from)); CU_ASSERT_PTR_NOT_NULL_FATAL(L_uri); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_host(L_uri), "titi.com"); CU_ASSERT_STRING_EQUAL(belle_sip_header_from_get_tag(L_from),"12345-abc"); belle_sip_object_unref(L_from); } static void test_from_header_with_paramless_address_spec(void) { belle_sip_header_from_t* L_from = belle_sip_header_from_parse("From: sip:bob@titi.com;tag=dlfjklcn6545614XX"); CU_ASSERT_PTR_NOT_NULL_FATAL(belle_sip_header_from_get_tag(L_from)); CU_ASSERT_STRING_EQUAL(belle_sip_header_from_get_tag(L_from),"dlfjklcn6545614XX"); belle_sip_object_unref(L_from); } static void test_to_header_with_paramless_address_spec(void) { belle_sip_header_to_t* L_to = belle_sip_header_to_parse("To: sip:bob@titi.com;tag=dlfjklcn6545614XX"); CU_ASSERT_PTR_NOT_NULL_FATAL(belle_sip_header_to_get_tag(L_to)); CU_ASSERT_STRING_EQUAL(belle_sip_header_to_get_tag(L_to),"dlfjklcn6545614XX"); belle_sip_object_unref(L_to); } static void test_contact_header_with_paramless_address_spec(void) { belle_sip_header_contact_t* L_contact = belle_sip_header_contact_parse("Contact: sip:bob@titi.com;expires=60"); CU_ASSERT_EQUAL(belle_sip_header_contact_get_expires(L_contact),60); belle_sip_object_unref(L_contact); } static void test_to_header(void) { belle_sip_uri_t* L_uri; belle_sip_header_to_t* L_to = belle_sip_header_to_parse("To : < sip:titi.com;transport=tcp> ; tag = dlfjklcn6545614XX"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_to)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_to)); L_to = belle_sip_header_to_parse(l_raw_header); belle_sip_free(l_raw_header); L_uri = belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_to)); CU_ASSERT_PTR_NULL(belle_sip_uri_get_user(L_uri)); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_host(L_uri), "titi.com"); CU_ASSERT_STRING_EQUAL(belle_sip_header_to_get_tag(L_to),"dlfjklcn6545614XX"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_to)); /*test factory*/ L_to = belle_sip_header_to_create2("\"super man\" ","12345-abc"); CU_ASSERT_PTR_NOT_NULL_FATAL(L_to); L_uri = belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_to)); CU_ASSERT_PTR_NOT_NULL_FATAL(L_uri); CU_ASSERT_STRING_EQUAL(belle_sip_header_address_get_displayname(BELLE_SIP_HEADER_ADDRESS(L_to)), "super man"); CU_ASSERT_STRING_EQUAL(belle_sip_header_to_get_tag(L_to),"12345-abc"); belle_sip_object_unref(L_to); } static void test_via_header(void) { belle_sip_header_via_t* L_tmp; belle_sip_header_t* l_next; belle_sip_header_via_t* L_next_via; belle_sip_header_via_t* L_via = belle_sip_header_via_parse("Via: SIP/2.0/UDP [::1]:5062;rport;received=::1;branch=z9hG4bK368560724"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_via)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_via)); L_tmp = belle_sip_header_via_parse(l_raw_header); L_via = BELLE_SIP_HEADER_VIA(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_STRING_EQUAL(belle_sip_header_via_get_protocol(L_via), "SIP/2.0"); CU_ASSERT_STRING_EQUAL(belle_sip_header_via_get_transport(L_via), "UDP"); CU_ASSERT_STRING_EQUAL(belle_sip_header_via_get_host(L_via), "::1"); CU_ASSERT_EQUAL(belle_sip_header_via_get_port(L_via),5062); CU_ASSERT_TRUE(belle_sip_parameters_has_parameter(BELLE_SIP_PARAMETERS(L_via),"rport")); CU_ASSERT_STRING_EQUAL(belle_sip_header_via_get_received(L_via),"::1"); CU_ASSERT_STRING_EQUAL(belle_sip_header_via_get_branch(L_via),"z9hG4bK368560724"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_via)); L_via = belle_sip_header_via_parse("Via: SIP/2.0/UDP 192.168.0.19:5062;rport;received=192.169.0.4;branch=z9hG4bK368560724, SIP/2.0/UDP 192.168.0.19:5062"); l_next = belle_sip_header_get_next(BELLE_SIP_HEADER(L_via)); L_next_via = BELLE_SIP_HEADER_VIA(l_next); CU_ASSERT_PTR_NOT_NULL(L_next_via); CU_ASSERT_STRING_EQUAL(belle_sip_header_via_get_host(L_next_via),"192.168.0.19"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_via)); } static void test_call_id_header(void) { belle_sip_header_call_id_t* L_tmp; belle_sip_header_call_id_t* L_call_id = belle_sip_header_call_id_parse("Call-ID: 1665237789@titi.com"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_call_id)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_call_id)); L_tmp= belle_sip_header_call_id_parse(l_raw_header); L_call_id = BELLE_SIP_HEADER_CALL_ID(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_STRING_EQUAL(belle_sip_header_call_id_get_call_id(L_call_id), "1665237789@titi.com"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_call_id)); } static void test_cseq_header(void) { belle_sip_header_cseq_t* L_tmp; belle_sip_header_cseq_t* L_cseq = belle_sip_header_cseq_parse("CSeq: 21 INVITE"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_cseq)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_cseq)); L_tmp = belle_sip_header_cseq_parse(l_raw_header); L_cseq = BELLE_SIP_HEADER_CSEQ(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_EQUAL(belle_sip_header_cseq_get_seq_number(L_cseq),21); CU_ASSERT_STRING_EQUAL(belle_sip_header_cseq_get_method(L_cseq),"INVITE"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_cseq)); /*test factory*/ L_cseq = belle_sip_header_cseq_create(1,"INFO"); CU_ASSERT_EQUAL(belle_sip_header_cseq_get_seq_number(L_cseq),1); CU_ASSERT_STRING_EQUAL(belle_sip_header_cseq_get_method(L_cseq),"INFO"); belle_sip_object_unref(L_cseq); } static void test_content_type_header(void) { belle_sip_header_content_type_t* L_tmp; belle_sip_header_content_type_t* L_content_type = belle_sip_header_content_type_parse("Content-Type: text/html; charset=ISO-8859-4"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_content_type)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_content_type)); L_tmp = belle_sip_header_content_type_parse(l_raw_header); L_content_type = BELLE_SIP_HEADER_CONTENT_TYPE(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_STRING_EQUAL(belle_sip_header_content_type_get_type(L_content_type),"text"); CU_ASSERT_STRING_EQUAL(belle_sip_header_content_type_get_subtype(L_content_type),"html"); CU_ASSERT_STRING_EQUAL(belle_sip_parameters_get_parameter(BELLE_SIP_PARAMETERS(L_content_type),"charset"),"ISO-8859-4"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_content_type)); L_content_type = belle_sip_header_content_type_parse("Content-Type: application/sdp"); l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_content_type)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_content_type)); L_content_type = belle_sip_header_content_type_parse(l_raw_header); belle_sip_free(l_raw_header); CU_ASSERT_STRING_EQUAL(belle_sip_header_content_type_get_type(L_content_type),"application"); CU_ASSERT_STRING_EQUAL(belle_sip_header_content_type_get_subtype(L_content_type),"sdp"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_content_type)); L_content_type = belle_sip_header_content_type_parse("Content-Type: application/pkcs7-mime; smime-type=enveloped-data; \r\n name=smime.p7m"); l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_content_type)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_content_type)); L_content_type = belle_sip_header_content_type_parse(l_raw_header); belle_sip_free(l_raw_header); belle_sip_object_unref(BELLE_SIP_OBJECT(L_content_type)); } static void test_record_route_header(void) { belle_sip_uri_t* L_uri; belle_sip_header_t* l_next; belle_sip_header_record_route_t* L_next_route; belle_sip_header_record_route_t* L_record_route = belle_sip_header_record_route_parse("Record-Route: ;charset=ISO-8859-4"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_record_route)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_record_route)); L_record_route = belle_sip_header_record_route_parse(l_raw_header); belle_sip_free(l_raw_header); L_uri = belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_record_route)); CU_ASSERT_PTR_NULL(belle_sip_uri_get_user(L_uri)); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_host(L_uri), "212.27.52.5"); CU_ASSERT_STRING_EQUAL(belle_sip_parameters_get_parameter(BELLE_SIP_PARAMETERS(L_record_route),"charset"),"ISO-8859-4"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_record_route)); L_record_route = belle_sip_header_record_route_parse("Record-Route: ;charset=ISO-8859-4, "); l_next = belle_sip_header_get_next(BELLE_SIP_HEADER(L_record_route)); L_next_route = BELLE_SIP_HEADER_RECORD_ROUTE(l_next); CU_ASSERT_PTR_NOT_NULL(L_next_route); CU_ASSERT_PTR_NOT_NULL( belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_next_route))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_record_route)); } static void test_route_header(void) { belle_sip_header_route_t* L_route; belle_sip_uri_t* L_uri; belle_sip_header_t* l_next; belle_sip_header_route_t* L_next_route; belle_sip_header_address_t* address = belle_sip_header_address_parse(""); char* l_raw_header; CU_ASSERT_PTR_NOT_NULL_FATAL(address); L_route = belle_sip_header_route_create(address); CU_ASSERT_PTR_NOT_NULL_FATAL(L_route); l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_route)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_route)); L_route = belle_sip_header_route_parse(l_raw_header); belle_sip_free(l_raw_header); L_uri = belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_route)); CU_ASSERT_PTR_NULL(belle_sip_uri_get_user(L_uri)); CU_ASSERT_EQUAL(belle_sip_uri_get_port(L_uri), 5060); belle_sip_object_unref(BELLE_SIP_OBJECT(L_route)); L_route = belle_sip_header_route_parse("Route: ;charset=ISO-8859-4, "); l_next = belle_sip_header_get_next(BELLE_SIP_HEADER(L_route)); L_next_route = BELLE_SIP_HEADER_ROUTE(l_next); CU_ASSERT_PTR_NOT_NULL(L_next_route); CU_ASSERT_PTR_NOT_NULL( belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_next_route))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_route)); } static void test_service_route_header(void) { belle_sip_header_service_route_t* L_service_route = belle_sip_header_service_route_parse("Service-Route: "); belle_sip_uri_t* L_uri; char* l_raw_header; CU_ASSERT_PTR_NOT_NULL_FATAL(L_service_route); l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_service_route)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_service_route)); L_service_route = belle_sip_header_service_route_parse(l_raw_header); belle_sip_free(l_raw_header); L_uri = belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_service_route)); CU_ASSERT_PTR_NOT_NULL(belle_sip_uri_get_user(L_uri)); CU_ASSERT_EQUAL(belle_sip_uri_get_port(L_uri), 6060); belle_sip_object_unref(BELLE_SIP_OBJECT(L_service_route)); } static void test_content_length_header(void) { belle_sip_header_content_length_t* L_tmp; belle_sip_header_content_length_t* L_content_length = belle_sip_header_content_length_parse("Content-Length: 3495"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_content_length)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_content_length)); L_tmp = belle_sip_header_content_length_parse(l_raw_header); L_content_length = BELLE_SIP_HEADER_CONTENT_LENGTH(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_EQUAL(belle_sip_header_content_length_get_content_length(L_content_length), 3495); belle_sip_object_unref(BELLE_SIP_OBJECT(L_content_length)); } static void test_header_extension(void) { belle_sip_header_extension_t* L_tmp; belle_sip_header_extension_t* L_extension = belle_sip_header_extension_parse("toto: titi"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_extension)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_extension)); L_tmp = belle_sip_header_extension_parse(l_raw_header); L_extension = BELLE_SIP_HEADER_EXTENSION(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_STRING_EQUAL(belle_sip_header_extension_get_value(L_extension), "titi"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_extension)); } static void test_authorization_header(void) { const char* l_header = "Authorization: Digest username=\"0033482532176\", "\ "realm=\"sip.ovh.net\", nonce=\"1bcdcb194b30df5f43973d4c69bdf54f\", uri=\"sip:sip.ovh.net\", response=\"eb36c8d5c8642c1c5f44ec3404613c81\","\ "algorithm=MD5, opaque=\"1bc7f9097684320\"," "\r\n qop=auth, nc=00000001,cnonce=\"0a4f113b\", blabla=\"toto\""; belle_sip_header_authorization_t* L_tmp; belle_sip_header_authorization_t* L_authorization = belle_sip_header_authorization_parse(l_header); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_authorization)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_authorization)); L_tmp = belle_sip_header_authorization_parse(l_raw_header); L_authorization = BELLE_SIP_HEADER_AUTHORIZATION(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_PTR_NOT_NULL_FATAL(L_authorization); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_scheme(L_authorization), "Digest"); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_username(L_authorization), "0033482532176"); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_realm(L_authorization), "sip.ovh.net"); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_nonce(L_authorization), "1bcdcb194b30df5f43973d4c69bdf54f"); CU_ASSERT_PTR_NOT_NULL(belle_sip_header_authorization_get_uri(L_authorization)); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_response(L_authorization), "eb36c8d5c8642c1c5f44ec3404613c81"); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_algorithm(L_authorization), "MD5"); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_opaque(L_authorization), "1bc7f9097684320"); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_qop(L_authorization), "auth"); CU_ASSERT_EQUAL(belle_sip_header_authorization_get_nonce_count(L_authorization), 1); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_cnonce(L_authorization), "0a4f113b"); CU_ASSERT_STRING_EQUAL(belle_sip_parameters_get_parameter(BELLE_SIP_PARAMETERS(L_authorization), "blabla"),"\"toto\""); belle_sip_object_unref(BELLE_SIP_OBJECT(L_authorization)); } static void test_proxy_authorization_header(void) { const char* l_header = "Proxy-Authorization: Digest username=\"Alice\"" ", realm=\"atlanta.com\", nonce=\"c60f3082ee1212b402a21831ae\"" ", response=\"245f23415f11432b3434341c022\""; belle_sip_header_proxy_authorization_t* L_authorization = belle_sip_header_proxy_authorization_parse(l_header); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_authorization)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_authorization)); L_authorization = belle_sip_header_proxy_authorization_parse(l_raw_header); belle_sip_free(l_raw_header); CU_ASSERT_PTR_NOT_NULL(L_authorization); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_username(BELLE_SIP_HEADER_AUTHORIZATION(L_authorization)), "Alice"); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_realm(BELLE_SIP_HEADER_AUTHORIZATION(L_authorization)), "atlanta.com"); CU_ASSERT_STRING_EQUAL(belle_sip_header_authorization_get_nonce(BELLE_SIP_HEADER_AUTHORIZATION(L_authorization)), "c60f3082ee1212b402a21831ae"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_authorization)); } static void check_header_authenticate(belle_sip_header_www_authenticate_t* authenticate) { belle_sip_list_t* qop; CU_ASSERT_PTR_NOT_NULL(authenticate); CU_ASSERT_STRING_EQUAL(belle_sip_header_www_authenticate_get_realm(authenticate), "atlanta.com"); CU_ASSERT_STRING_EQUAL(belle_sip_header_www_authenticate_get_domain(authenticate), "sip:boxesbybob.com"); CU_ASSERT_STRING_EQUAL(belle_sip_header_www_authenticate_get_nonce(authenticate), "c60f3082ee1212b402a21831ae"); CU_ASSERT_STRING_EQUAL(belle_sip_header_www_authenticate_get_algorithm(authenticate), "MD5"); CU_ASSERT_STRING_EQUAL(belle_sip_header_www_authenticate_get_opaque(authenticate), "1bc7f9097684320"); CU_ASSERT_PTR_NOT_NULL_FATAL(qop=belle_sip_header_www_authenticate_get_qop(authenticate)); CU_ASSERT_STRING_EQUAL((const char*)qop->data, "auth"); CU_ASSERT_PTR_NOT_NULL_FATAL(qop=qop->next); CU_ASSERT_STRING_EQUAL((const char*)qop->data, "auth-int"); CU_ASSERT_STRING_EQUAL(belle_sip_header_www_authenticate_get_qop(authenticate)->data, "auth"); CU_ASSERT_STRING_EQUAL(belle_sip_header_www_authenticate_get_scheme(authenticate), "Digest"); CU_ASSERT_EQUAL(belle_sip_header_www_authenticate_is_stale(authenticate),1); belle_sip_object_unref(BELLE_SIP_OBJECT(authenticate)); } static void test_www_authenticate_header(void) { const char* l_header = "WWW-Authenticate: Digest " "algorithm=MD5, realm=\"atlanta.com\", opaque=\"1bc7f9097684320\"," " qop=\"auth,auth-int\", nonce=\"c60f3082ee1212b402a21831ae\", stale=true, domain=\"sip:boxesbybob.com\""; belle_sip_header_www_authenticate_t* L_tmp; belle_sip_header_www_authenticate_t* l_authenticate = belle_sip_header_www_authenticate_parse(l_header); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(l_authenticate)); belle_sip_object_unref(BELLE_SIP_OBJECT(l_authenticate)); L_tmp = belle_sip_header_www_authenticate_parse(l_raw_header); l_authenticate = BELLE_SIP_HEADER_WWW_AUTHENTICATE(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); check_header_authenticate(l_authenticate); } static void test_proxy_authenticate_header(void) { const char* l_header = "Proxy-Authenticate: Digest " "algorithm=MD5, realm=\"atlanta.com\", opaque=\"1bc7f9097684320\"," " qop=\"auth,auth-int\", nonce=\"c60f3082ee1212b402a21831ae\", stale=true, domain=\"sip:boxesbybob.com\""; belle_sip_header_proxy_authenticate_t* L_tmp; belle_sip_header_proxy_authenticate_t* L_proxy_authorization = belle_sip_header_proxy_authenticate_parse(l_header); //belle_sip_list_t* qop; char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_proxy_authorization)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_proxy_authorization)); L_tmp = belle_sip_header_proxy_authenticate_parse(l_raw_header); L_proxy_authorization = BELLE_SIP_HEADER_PROXY_AUTHENTICATE(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); check_header_authenticate(BELLE_SIP_HEADER_WWW_AUTHENTICATE(L_proxy_authorization)); } static void test_max_forwards_header(void) { const char* l_header = "Max-Forwards: 6"; belle_sip_header_max_forwards_t* L_tmp; belle_sip_header_max_forwards_t* L_max_forwards = belle_sip_header_max_forwards_parse(l_header); char* l_raw_header; belle_sip_header_max_forwards_decrement_max_forwards(L_max_forwards); l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_max_forwards)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_max_forwards)); L_tmp = belle_sip_header_max_forwards_parse(l_raw_header); L_max_forwards = BELLE_SIP_HEADER_MAX_FORWARDS(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_PTR_NOT_NULL(L_max_forwards); CU_ASSERT_EQUAL(belle_sip_header_max_forwards_get_max_forwards(L_max_forwards), 5); belle_sip_object_unref(BELLE_SIP_OBJECT(L_max_forwards)); } static void test_user_agent_header(void) { const char* l_header = "User-Agent: Linphone/3.4.99.1 (eXosip2/3.3.0)"; const char* values[] ={"Linphone/3.4.99.1" ,"(eXosip2/3.3.0)"}; belle_sip_list_t* products; belle_sip_header_user_agent_t* L_tmp; belle_sip_header_user_agent_t* L_user_agent = belle_sip_header_user_agent_parse(l_header); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_user_agent)); int i=0; belle_sip_object_unref(BELLE_SIP_OBJECT(L_user_agent)); L_tmp = belle_sip_header_user_agent_parse(l_raw_header); L_user_agent = BELLE_SIP_HEADER_USER_AGENT(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); products = belle_sip_header_user_agent_get_products(L_user_agent); for(i=0;i<2;i++){ CU_ASSERT_PTR_NOT_NULL(products); CU_ASSERT_STRING_EQUAL((const char *)(products->data),values[i]); products=products->next; } belle_sip_object_unref(BELLE_SIP_OBJECT(L_user_agent)); } static void test_expires_header(void) { belle_sip_header_expires_t* L_tmp; belle_sip_header_expires_t* L_expires = belle_sip_header_expires_parse("Expires: 3600"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_expires)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_expires)); L_tmp= belle_sip_header_expires_parse(l_raw_header); L_expires = BELLE_SIP_HEADER_EXPIRES(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_EQUAL(belle_sip_header_expires_get_expires(L_expires), 3600); belle_sip_object_unref(BELLE_SIP_OBJECT(L_expires)); /*test factory*/ L_expires = belle_sip_header_expires_create(600); CU_ASSERT_EQUAL(belle_sip_header_expires_get_expires(L_expires), 600); belle_sip_object_unref(L_expires); } static void test_allow_header(void) { belle_sip_header_allow_t* L_tmp; belle_sip_header_allow_t* L_allow = belle_sip_header_allow_parse("Allow:INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_allow)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_allow)); L_tmp = belle_sip_header_allow_parse(l_raw_header); L_allow = BELLE_SIP_HEADER_ALLOW(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_STRING_EQUAL(belle_sip_header_allow_get_method(L_allow), "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_allow)); } static void test_address_with_error_header(void) { belle_sip_header_address_t* laddress = belle_sip_header_address_parse("sip:liblinphone_tester@=auth1.example.org"); CU_ASSERT_PTR_NULL(laddress); } static void test_address_header(void) { belle_sip_uri_t* L_uri; belle_sip_header_address_t* laddress = belle_sip_header_address_parse("\"toto\" "); CU_ASSERT_PTR_NOT_NULL_FATAL(laddress); CU_ASSERT_STRING_EQUAL("toto",belle_sip_header_address_get_displayname(laddress)) L_uri = belle_sip_header_address_get_uri(laddress); CU_ASSERT_PTR_NOT_NULL(belle_sip_uri_get_user(L_uri)); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_host(L_uri), "81.56.11.2"); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_user(L_uri), "liblinphone_tester"); CU_ASSERT_EQUAL(belle_sip_uri_get_port(L_uri), 5060); belle_sip_object_unref(BELLE_SIP_OBJECT(laddress)); } static void test_very_long_address_header(void) { belle_sip_uri_t* L_uri; const char* raw = ""; /*not compliant but*/ belle_sip_header_address_t* laddress = belle_sip_header_address_parse(raw); CU_ASSERT_PTR_NOT_NULL_FATAL(laddress); L_uri = belle_sip_header_address_get_uri(laddress); CU_ASSERT_PTR_NOT_NULL(belle_sip_uri_get_user(L_uri)); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_host(L_uri), "sip.linphone.org"); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_user(L_uri), "jehan"); CU_ASSERT_STRING_EQUAL(belle_sip_parameters_get_parameter(BELLE_SIP_PARAMETERS(L_uri),"pn-tok") ,"APA91bHPVa4PuKOMnr6ppWb3XYUL06QO-ND4eeiw7dG49q4o_Ywzal7BxVRgH-wvqH9iB9V7h6kfb-DCiVdSpnl6CeWO25FAkM4eh6DJyWcbP7SzhKdku_-r9936kJW7-4drI6-Om4qp"); belle_sip_object_unref(BELLE_SIP_OBJECT(laddress)); } static void test_subscription_state_header(void) { belle_sip_header_subscription_state_t* L_tmp; belle_sip_header_subscription_state_t* L_subscription_state = belle_sip_header_subscription_state_parse("Subscription-State: terminated;expires=600"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_subscription_state)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_subscription_state)); L_tmp = belle_sip_header_subscription_state_parse(l_raw_header); L_subscription_state = BELLE_SIP_HEADER_SUBSCRIPTION_STATE(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_STRING_EQUAL(belle_sip_header_subscription_state_get_state(L_subscription_state), "terminated"); CU_ASSERT_EQUAL(belle_sip_header_subscription_state_get_expires(L_subscription_state), 600); belle_sip_object_unref(BELLE_SIP_OBJECT(L_subscription_state)); } static void test_refer_to_header(void) { belle_sip_uri_t* L_uri; belle_sip_header_refer_to_t* L_refer_to = belle_sip_header_refer_to_parse("Refer-To: "); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_refer_to)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_refer_to)); L_refer_to = belle_sip_header_refer_to_parse(l_raw_header); belle_sip_free(l_raw_header); L_uri = belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_refer_to)); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_user(L_uri),"dave"); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_host(L_uri), "denver.example.org"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_refer_to)); /*test factory*/ L_refer_to = belle_sip_header_refer_to_create(belle_sip_header_address_parse("\"super man\" ")); CU_ASSERT_PTR_NOT_NULL_FATAL(L_refer_to); L_uri = belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_refer_to)); CU_ASSERT_PTR_NOT_NULL_FATAL(L_uri); CU_ASSERT_STRING_EQUAL(belle_sip_header_address_get_displayname(BELLE_SIP_HEADER_ADDRESS(L_refer_to)), "super man"); belle_sip_object_unref(L_refer_to); } static void test_referred_by_header(void) { belle_sip_uri_t* L_uri; belle_sip_header_referred_by_t* L_referred_by = belle_sip_header_referred_by_parse("Referred-By: sip:r@ref.example;cid=\"2UWQFN309shb3@ref.example\""); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_referred_by)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_referred_by)); L_referred_by = belle_sip_header_referred_by_parse(l_raw_header); belle_sip_free(l_raw_header); L_uri = belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(L_referred_by)); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_user(L_uri),"r"); CU_ASSERT_STRING_EQUAL(belle_sip_uri_get_host(L_uri), "ref.example"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_referred_by)); } static void test_replaces_header(void) { belle_sip_header_replaces_t* L_tmp; belle_sip_header_replaces_t* L_replaces = belle_sip_header_replaces_parse("Replaces: 12345@149.112.118.3;to-tag=12345;from-tag=54321"); char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_replaces)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_replaces)); L_tmp= belle_sip_header_replaces_parse(l_raw_header); L_replaces = BELLE_SIP_HEADER_REPLACES(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); CU_ASSERT_STRING_EQUAL(belle_sip_header_replaces_get_call_id(L_replaces), "12345@149.112.118.3"); CU_ASSERT_STRING_EQUAL(belle_sip_header_replaces_get_from_tag(L_replaces), "54321"); CU_ASSERT_STRING_EQUAL(belle_sip_header_replaces_get_to_tag(L_replaces), "12345"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_replaces)); } static void test_replaces_escaped_header(void) { belle_sip_header_replaces_t* L_replaces; char* escaped_to_string; char* l_raw_header; belle_sip_header_replaces_t* L_tmp = belle_sip_header_replaces_create("12345@192.168.118.3","5FFE-3994","12345"); escaped_to_string=belle_sip_header_replaces_value_to_escaped_string(L_tmp); L_replaces=belle_sip_header_replaces_create2(escaped_to_string); l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_replaces)); belle_sip_object_unref(BELLE_SIP_OBJECT(L_replaces)); L_tmp= belle_sip_header_replaces_parse(l_raw_header); L_replaces = BELLE_SIP_HEADER_REPLACES(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp))); belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp)); belle_sip_free(l_raw_header); belle_sip_free(escaped_to_string); CU_ASSERT_STRING_EQUAL(belle_sip_header_replaces_get_call_id(L_replaces), "12345@192.168.118.3"); CU_ASSERT_STRING_EQUAL(belle_sip_header_replaces_get_from_tag(L_replaces), "5FFE-3994"); CU_ASSERT_STRING_EQUAL(belle_sip_header_replaces_get_to_tag(L_replaces), "12345"); belle_sip_object_unref(BELLE_SIP_OBJECT(L_replaces)); } static void test_date_header(void){ belle_sip_header_date_t *date,*date2; time_t utc; #define DATE_EXAMPLE "Thu, 21 Feb 2002 13:02:03 GMT" date=belle_sip_header_date_parse("Date: " DATE_EXAMPLE); CU_ASSERT_PTR_NOT_NULL(date); utc=belle_sip_header_date_get_time(date); CU_ASSERT_TRUE(utc!=(time_t)-1); date2=belle_sip_header_date_create_from_time(&utc); CU_ASSERT_PTR_NOT_NULL(date2); CU_ASSERT_TRUE(strcmp(belle_sip_header_date_get_date(date2),DATE_EXAMPLE)==0); } test_t headers_tests[] = { { "Address", test_address_header }, { "Header address (very long)", test_very_long_address_header }, { "Address with error", test_address_with_error_header }, { "Allow", test_allow_header }, { "Authorization", test_authorization_header }, { "Call-ID", test_call_id_header }, { "Contact (Simple)", test_simple_contact_header }, { "Contact (Complex)", test_complex_contact_header }, { "Contact (Param-less address spec)", test_contact_header_with_paramless_address_spec }, { "Content-Length", test_content_length_header }, { "Content-Type", test_content_type_header }, { "CSeq", test_cseq_header }, { "Date", test_date_header }, { "Expires", test_expires_header }, { "From", test_from_header }, { "From (Param-less address spec)", test_from_header_with_paramless_address_spec }, { "Max-Forwards", test_max_forwards_header }, { "Proxy-Authenticate", test_proxy_authenticate_header }, { "Proxy-Authorization", test_proxy_authorization_header }, { "Record-Route", test_record_route_header }, { "Refer-To", test_refer_to_header }, { "Referred-By", test_referred_by_header }, { "Replaces", test_replaces_header }, { "Replaces (Escaped)", test_replaces_escaped_header }, { "Route", test_route_header }, { "Service-Route", test_service_route_header }, { "Subscription-State", test_subscription_state_header }, { "To", test_to_header }, { "To (Param-less address spec)", test_to_header_with_paramless_address_spec }, { "User-Agent", test_user_agent_header }, { "Via", test_via_header }, { "WWW-Authenticate", test_www_authenticate_header }, { "Header extension", test_header_extension } }; test_suite_t headers_test_suite = { "Headers", NULL, NULL, sizeof(headers_tests) / sizeof(headers_tests[0]), headers_tests };