Commit 43070856 authored by jehan's avatar jehan

add Max-Forwards

fix belle_sip_header_get_headers
add sdp connection+attribute
parent f80fb643
......@@ -67,6 +67,16 @@
</tool>
</toolChain>
</folderInfo>
<fileInfo id="cdt.managedbuild.config.gnu.macosx.exe.debug.341835025.2100612038" name="belle_sdp_tester.c" rcbsApplicability="disable" resourcePath="tester/belle_sdp_tester.c" toolsToInvoke="cdt.managedbuild.tool.gnu.c.compiler.macosx.exe.debug.315151201.1004313556">
<tool id="cdt.managedbuild.tool.gnu.c.compiler.macosx.exe.debug.315151201.1004313556" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.macosx.exe.debug.315151201">
<option id="gnu.c.compiler.option.include.paths.1078534444" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="/Users/jehanmonnier/opt/include"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/belle-sip/include}&quot;"/>
<listOptionValue builtIn="false" value="/opt/local/include"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1568636532" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
</tool>
</fileInfo>
<fileInfo id="cdt.managedbuild.config.gnu.macosx.exe.debug.341835025.1422516973" name="belle_sip_headers_tester.c" rcbsApplicability="disable" resourcePath="tester/belle_sip_headers_tester.c" toolsToInvoke="cdt.managedbuild.tool.gnu.c.compiler.macosx.exe.debug.315151201.476090798">
<tool id="cdt.managedbuild.tool.gnu.c.compiler.macosx.exe.debug.315151201.476090798" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.macosx.exe.debug.315151201">
<option id="gnu.c.compiler.option.include.paths.1874152018" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
......
/*
belle-sip - SIP (RFC3261) library.
belle-sdp - SIP (RFC4566) library.
Copyright (C) 2010 Belledonne Communications SARL
This program is free software: you can redistribute it and/or modify
......@@ -19,7 +19,7 @@
#ifndef BELLE_SDP_H_
#define BELLE_SDP_H_
#include "belle-sip.h"
#define BELLE_SIP_CAST(t) BELLE_SDP_CAST(t)
#define BELLE_SDP_CAST(t) BELLE_SIP_CAST(t)
/***************************************************************************************
* Attribute
......@@ -58,7 +58,7 @@ const char* belle_sdp_connection_get_address_type(const belle_sdp_connection_t*
const char* belle_sdp_connection_get_network_type(const belle_sdp_connection_t* connection);
void belle_sdp_connection_set_address(belle_sdp_connection_t* connection, const char* addr);
void belle_sdp_connection_set_address_type(belle_sdp_connection_t* connection, const char* type);
void belle_sdp_connection_set_set_network_type(belle_sdp_connection_t* connection, const char* type);
void belle_sdp_connection_set_network_type(belle_sdp_connection_t* connection, const char* type);
#define BELLE_SDP_CONNECTION(t) BELLE_SDP_CAST(t,belle_sdp_connection_t);
/***************************************************************************************
* Email
......
......@@ -68,6 +68,7 @@ typedef enum belle_sip_type_id{
BELLE_SIP_TYPE_ID(belle_sip_header_authorization_t),
BELLE_SIP_TYPE_ID(belle_sip_header_www_authenticate_t),
BELLE_SIP_TYPE_ID(belle_sip_header_proxy_authorization_t),
BELLE_SIP_TYPE_ID(belle_sip_header_max_forwards_t),
BELLE_SIP_TYPE_ID(belle_sdp_attribute_t),
BELLE_SIP_TYPE_ID(belle_sdp_bandwidth_t),
BELLE_SIP_TYPE_ID(belle_sdp_connection_t),
......
......@@ -330,6 +330,20 @@ belle_sip_header_extension_t* belle_sip_header_extension_parse (const char* exte
const char* belle_sip_header_extension_get_value(const belle_sip_header_extension_t* extension);
void belle_sip_header_extension_set_value(belle_sip_header_extension_t* extension,const char* value);
#define BELLE_SIP_HEADER_EXTENSION(t) BELLE_SIP_CAST(t,belle_sip_header_extension_t)
/******************************
*
* Max forward inherit from header
*
******************************/
typedef struct _belle_sip_header_max_forwards belle_sip_header_max_forwards_t;
belle_sip_header_max_forwards_t* belle_sip_header_max_forwards_new();
belle_sip_header_max_forwards_t* belle_sip_header_max_forwards_parse (const char* max_forwards) ;
int belle_sip_header_max_forwards_get_max_forwards(const belle_sip_header_max_forwards_t* max_forwards);
void belle_sip_header_max_forwards_set_max_forwards(belle_sip_header_max_forwards_t* max_forwards,int value);
int belle_sip_header_max_forwards_decrement_max_forwards(belle_sip_header_max_forwards_t* max_forwards);
#define BELLE_SIP_HEADER_MAX_FORWARDS(t) BELLE_SIP_CAST(t,belle_sip_header_max_forwards_t)
#endif /* HEADERS_H_ */
/*
belle-sdp - SDP (RFC) library.
belle-sdp - SDP (RFC4566) library.
Copyright (C) 2010 Belledonne Communications SARL
This program is free software: you can redistribute it and/or modify
......@@ -20,13 +20,219 @@ grammar belle_sdp;
options {
language = C;
output=AST;
}
@header {
#include "belle-sip/belle-sdp.h"
#include "belle_sip_internal.h"
}
titi: TOTO;
TOTO: .;
session_description: proto_version
origin_field
session_name_field
information_field?
uri_field?
email_field*
phone_field*
(connection CR LF)?
bandwidth_field*
time_fields
key_field
(attribute CR LF)*
media_descriptions;
proto_version: {IS_TOKEN(v)}?alpha_num EQUAL DIGIT+ CR LF;
// ;this memo describes version 0
origin_field: {IS_TOKEN(o)}?alpha_num EQUAL username SPACE
sess_id SPACE sess_version SPACE
nettype SPACE addrtype SPACE
addr CR LF;
session_name_field: {IS_TOKEN(s)}? alpha_num EQUAL text CR LF;
information_field: {IS_TOKEN(i)}? alpha_num EQUAL text CR LF;
uri_field: {IS_TOKEN(u)}?alpha_num EQUAL uri CR LF;
email_field: {IS_TOKEN(e)}?alpha_num EQUAL email_address CR LF;
phone_field: {IS_TOKEN(p)}?alpha_num EQUAL phone_number CR LF;
connection returns [belle_sdp_connection_t* ret]
scope { belle_sdp_connection_t* current; }
@init {$connection::current = belle_sdp_connection_new(); $ret=$connection::current; }
: 'c=' nettype { belle_sdp_connection_set_network_type($connection::current,(const char*)$nettype.text->chars);}
SPACE addrtype{ belle_sdp_connection_set_address_type($connection::current,(const char*)$addrtype.text->chars);}
SPACE connection_address {belle_sdp_connection_set_address($connection::current,(const char*)$connection_address.text->chars);}
;
//;a connection field must be present
//;in every media description or at the
//;session-level
bandwidth_field: {IS_TOKEN(b)}?alpha_num EQUAL bwtype COLON bandwidth CR LF;
time_fields: ( {IS_TOKEN(t)}?alpha_num EQUAL start_time SPACE stop_time
(CR LF repeat_fields)* CR LF)+
(zone_adjustments CR LF)?;
repeat_fields: {IS_TOKEN(r)}?alpha_num EQUAL repeat_interval (SPACE typed_time)+;
zone_adjustments: sdp_time SPACE '-'? typed_time
(SPACE sdp_time SPACE '-'? typed_time)*;
key_field: {IS_TOKEN(k)}?alpha_num EQUAL key_type CR LF;
key_type: {IS_TOKEN(prompt)}? alpha_num* /*'prompt'*/ |
{IS_TOKEN(clear)}? alpha_num* /*'clear'*/ COLON key_data |
{IS_TOKEN(base64)}? alpha_num* /*'base64*/ COLON key_data |
{IS_TOKEN(base64)}? alpha_num* /*'uri*/ COLON uri;
key_data: email_safe;
attribute returns [belle_sdp_attribute_t* ret]
scope { belle_sdp_attribute_t* current; }
@init {$attribute::current = belle_sdp_attribute_new(); $ret=$attribute::current; }: 'a=' attribute_value;
media_descriptions: media_description*;
media_description: media_field
information_field
connection*
bandwidth_field*
key_field
(attribute CR LF)*;
media_field: {IS_TOKEN(m)}?alpha_num EQUAL media SPACE port ('/' integer)? SPACE proto (SPACE fmt)?CR LF;
media: alpha_num*;
// ;typically "audio", "video", "application"
// ;or "data"
fmt: alpha_num*;
//;typically an RTP payload type for audio
//;and video media
proto: alpha_num*;
//;typically "RTP/AVP" or "udp" for IP4
port: DIGIT*;
// ;should in the range "1024" to "65535" inclusive
// ;for UDP based media
attribute_value: (att_field {belle_sdp_attribute_set_name($attribute::current,(const char*)$att_field.text->chars);}
COLON att_value {belle_sdp_attribute_set_value($attribute::current,(const char*)$att_value.text->chars);})
| att_field {belle_sdp_attribute_set_name($attribute::current,(const char*)$att_field.text->chars);};
att_field: alpha_num*;
att_value: byte_string;
sess_id: DIGIT*;
// ;should be unique for this originating username/host
sess_version: DIGIT*;
//;0 is a new session
connection_address: multicast_address
| addr;
multicast_address: (decimal_uchar decimal_uchar decimal_uchar DOT) decimal_uchar '/' ttl ( '/' integer )?;
//;multicast addresses may be in the range
//;224.0.0.0 to 239.255.255.255
ttl: decimal_uchar;
start_time: sdp_time | ZERO ;
stop_time: sdp_time | ZERO ;
sdp_time: POS_DIGIT DIGIT*;
// ;sufficient for 2 more centuries
repeat_interval: typed_time;
typed_time: DIGIT* fixed_len_time_unit?;
fixed_len_time_unit: {IS_TOKEN(d)}? alpha_num
| {IS_TOKEN(h)}? alpha_num
| {IS_TOKEN(m)}? alpha_num
| {IS_TOKEN(s)}? alpha_num;
bwtype: alpha_num+;
bandwidth: DIGIT+;
username: email_safe;
//;pretty wide definition, but doesn't include SPACE
email_address: email ; //| email '(' email_safe ')' |
//email_safe '<' email '>';
email: text ;//defined in RFC822
uri: text ;//defined in RFC1630
phone_number: phone;/*(phone '(') => (phone '(') email_safe ')'
| (phone) => phone
| email_safe LQUOTE phone RQUOTE;*/
phone: text;//'+' DIGIT*POS_DIGIT (SPACE | '-' | DIGIT)*;
//;there must be a SPACE or hyphen between the
//;international code and the rest of the number.
nettype: alpha_num+;//'IN';
// ;list to be extended
addrtype: alpha_num+; //'IP4' | 'IP6';
//;list to be extended
addr: (fqdn)=>fqdn | unicast_address ;
fqdn: (alpha_num |'-'|DOT)*;
// ;fully qualified domain name as specified in RFC1035
unicast_address: ipv4_address ;//| ipv6_address
ipv4_address : b1 DOT decimal_uchar DOT decimal_uchar DOT b4;
b1: decimal_uchar;
//;less than "224"; not "0" or "127"
b4: decimal_uchar;
//;not "0"
//ip6_address : ;//to be defined
text : byte_string;
//default is to interpret this as IS0-10646 UTF8
//ISO 8859-1 requires a "a=charset:ISO-8859-1"
//session-level attribute to be used
byte_string: ~(CR|LF)* ;
//any byte except NUL, CR or LF
decimal_uchar: d+=DIGIT+ {$d->count<=3}? ;
integer: POS_DIGIT DIGIT*;
email_safe
options { greedy = false; }: ~(LQUOTE|RQUOTE|CR|LF)* ;
alpha_num: ALPHA | DIGIT;
DIGIT: ZERO | POS_DIGIT;
fragment ZERO: '0';
fragment POS_DIGIT : '1'..'9';
ALPHA: 'a'..'z'|'A'..'Z';
SPACE: ' ';
//CRLF : CR LF { USER1 = (int)(ctx->pLexer->input->currentLine - ctx->pLexer->input->data);};
LQUOTE: '<';
RQUOTE: '>';
CR:'\r';
LF:'\n';
DOT: '.';
EQUAL: '=';
COLON: ':';
/*
belle-sdp - SIP (RFC4566) 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 <http://www.gnu.org/licenses/>.
*/
#include "belle-sip/belle-sdp.h"
#include "belle_sip_internal.h"
#include "belle_sdpParser.h"
#include "belle_sdpLexer.h"
/***************************************************************************************
* Attribute
*
**************************************************************************************/
struct _belle_sdp_attribute {
belle_sip_object_t base;
const char* name;
const char* value;
};
void belle_sdp_attribute_destroy(belle_sdp_attribute_t* attribute) {
}
void belle_sdp_attribute_clone(belle_sdp_attribute_t *attribute, const belle_sdp_attribute_t *orig){
}
int belle_sdp_attribute_marshal(belle_sdp_attribute_t* attribute, char* buff,unsigned int offset,unsigned int buff_size) {
unsigned int current_offset=offset;
current_offset+=snprintf( buff+current_offset
,buff_size-current_offset
,"a=%s"
,attribute->name);
if (attribute->value) {
current_offset+=snprintf( buff+current_offset
,buff_size-current_offset
,":%s"
,attribute->value);
}
return current_offset-offset;
}
BELLE_SDP_NEW(attribute,belle_sip_object)
BELLE_SDP_PARSE(attribute)
GET_SET_STRING(belle_sdp_attribute,name);
GET_SET_STRING(belle_sdp_attribute,value);
unsigned int belle_sdp_attribute_as_value(const belle_sdp_attribute_t* attribute) {
return attribute->value!=NULL;
}
/************************
* connection
***********************/
struct _belle_sdp_connection {
belle_sip_object_t base;
const char* network_type;
const char* address_type;
const char* address;
};
void belle_sdp_connection_destroy(belle_sdp_connection_t* connection) {
}
void belle_sdp_connection_clone(belle_sdp_connection_t *connection, const belle_sdp_connection_t *orig){
}
int belle_sdp_connection_marshal(belle_sdp_connection_t* connection, char* buff,unsigned int offset,unsigned int buff_size) {
unsigned int current_offset=offset;
current_offset+=snprintf( buff+current_offset
,buff_size-current_offset
,"c=%s %s %s"
,connection->network_type
,connection->address_type
,connection->address);
return current_offset-offset;
}
BELLE_SDP_NEW(connection,belle_sip_object)
BELLE_SDP_PARSE(connection)
GET_SET_STRING(belle_sdp_connection,network_type);
GET_SET_STRING(belle_sdp_connection,address_type);
GET_SET_STRING(belle_sdp_connection,address);
......@@ -690,3 +690,31 @@ GET_SET_STRING(belle_sip_header_www_authenticate,opaque);
GET_SET_STRING(belle_sip_header_www_authenticate,qop);
GET_SET_STRING(belle_sip_header_www_authenticate,domain)
GET_SET_BOOL(belle_sip_header_www_authenticate,stale,is)
/**************************
* max forwards header object inherent from header
****************************
*/
struct _belle_sip_header_max_forwards {
belle_sip_header_t header;
int max_forwards;
};
static void belle_sip_header_max_forwards_destroy(belle_sip_header_max_forwards_t* max_forwards) {
}
static void belle_sip_header_max_forwards_clone(belle_sip_header_max_forwards_t* max_forwards,
const belle_sip_header_max_forwards_t *orig ) {
}
int belle_sip_header_max_forwards_marshal(belle_sip_header_max_forwards_t* max_forwards, char* buff,unsigned int offset,unsigned int buff_size) {
unsigned int current_offset=offset;
current_offset+=belle_sip_header_marshal(BELLE_SIP_HEADER(max_forwards), buff,current_offset, buff_size);
current_offset+=snprintf(buff+current_offset,buff_size-current_offset,"%i",max_forwards->max_forwards);
return current_offset-offset;
}
BELLE_SIP_NEW_HEADER(header_max_forwards,header,"Max-Forwards")
BELLE_SIP_PARSE(header_max_forwards)
GET_SET_INT(belle_sip_header_max_forwards,max_forwards,int)
int belle_sip_header_max_forwards_decrement_max_forwards(belle_sip_header_max_forwards_t* max_forwards) {
return max_forwards->max_forwards--;
}
......@@ -522,10 +522,52 @@ void belle_sip_response_get_return_hop(belle_sip_response_t *msg, belle_sip_hop_
strcmp(#token,(const char*)(INPUT->toStringTT(INPUT,LT(1),LT(strlen(#token)))->chars)) == 0:0)
char* _belle_sip_str_dup_and_unquote_string(char* quoted_string);
/*********************************************************
* SDP
*/
#define BELLE_SDP_PARSE(object_type) \
belle_sdp_##object_type##_t* belle_sdp_##object_type##_parse (const char* value) { \
pANTLR3_INPUT_STREAM input; \
pbelle_sdpLexer lex; \
pANTLR3_COMMON_TOKEN_STREAM tokens; \
pbelle_sdpParser parser; \
input = antlr3NewAsciiStringCopyStream (\
(pANTLR3_UINT8)value,\
(ANTLR3_UINT32)strlen(value),\
NULL);\
lex = belle_sdpLexerNew (input);\
tokens = antlr3CommonTokenStreamSourceNew (ANTLR3_SIZE_HINT, TOKENSOURCE(lex));\
parser = belle_sdpParserNew (tokens);\
belle_sdp_##object_type##_t* l_parsed_object = parser->object_type(parser).ret;\
parser ->free(parser);\
tokens ->free(tokens);\
lex ->free(lex);\
input ->close(input);\
if (l_parsed_object == NULL) belle_sip_error(#object_type" parser error for [%s]",value);\
return l_parsed_object;\
}
#define BELLE_SDP_NEW(object_type,super_type) \
BELLE_SIP_INSTANCIATE_VPTR( belle_sdp_##object_type##_t\
, super_type##_t\
, belle_sdp_##object_type##_destroy\
, belle_sdp_##object_type##_clone\
, belle_sdp_##object_type##_marshal); \
belle_sdp_##object_type##_t* belle_sdp_##object_type##_new () { \
belle_sdp_##object_type##_t* l_object = belle_sip_object_new(belle_sdp_##object_type##_t);\
super_type##_init((super_type##_t*)l_object); \
return l_object;\
}
#ifdef __cplusplus
}
#endif
/*include private headers */
#include "belle_sip_resolver.h"
#include "sender_task.h"
......
......@@ -99,7 +99,12 @@ message_header [belle_sip_message_t* message]
// | header_via {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_via.ret));}/*
// | warning
// | www_authenticate*/
header_extension[TRUE] {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_extension.ret));}
header_extension[TRUE] {
belle_sip_header_t* lheader = BELLE_SIP_HEADER($header_extension.ret);
do {
belle_sip_message_add_header(message,lheader);
}
while(lheader=belle_sip_header_get_next(lheader) != NULL); }
) CRLF
;
......@@ -538,9 +543,14 @@ tag_param
/*
in_reply_to
: 'In-Reply-To' HCOLON callid (COMMA callid);
max_forwards : 'Max-Forwards' HCOLON DIGIT+;
*/
header_max_forwards returns [belle_sip_header_max_forwards_t* ret]
scope { belle_sip_header_max_forwards_t* current; }
@init { $header_max_forwards::current = belle_sip_header_max_forwards_new();$ret = $header_max_forwards::current; }
: {IS_TOKEN(Max-Forwards)}? token /*'Max-Forwards'*/ hcolon
max_forwards {belle_sip_header_max_forwards_set_max_forwards($header_max_forwards::current,atoi((const char*)$max_forwards.text->chars));};
max_forwards:DIGIT+;
/*
mime_version
: 'MIME-Version' HCOLON DIGIT+ '.' DIGIT+;
......@@ -839,6 +849,8 @@ header_extension[ANTLR3_BOOLEAN check_for_known_header] returns [belle_sip_head
$ret = BELLE_SIP_HEADER(belle_sip_header_proxy_authorization_parse((const char*)$header_extension.text->chars));
} else if (check_for_known_header && strcmp("WWW-Authenticate",(const char*)$header_name.text->chars) == 0) {
$ret = BELLE_SIP_HEADER(belle_sip_header_www_authenticate_parse((const char*)$header_extension.text->chars));
} else if (check_for_known_header && strcmp("Max-Forwards",(const char*)$header_name.text->chars) == 0) {
$ret = BELLE_SIP_HEADER(belle_sip_header_max_forwards_parse((const char*)$header_extension.text->chars));
}else {
$ret = BELLE_SIP_HEADER(belle_sip_header_extension_new());
belle_sip_header_extension_set_value($ret,(const char*)$header_value.text->chars);
......
......@@ -314,6 +314,20 @@ void test_header_www_authenticate(void) {
CU_ASSERT_EQUAL(belle_sip_header_www_authenticate_is_stale(L_authorization),1);
belle_sip_object_unref(BELLE_SIP_OBJECT(L_authorization));
}
void test_header_max_forwards(void) {
const char* l_header = "Max-Forwards: 6";
belle_sip_header_max_forwards_t* L_max_forwards = belle_sip_header_max_forwards_parse(l_header);
belle_sip_header_max_forwards_decrement_max_forwards(L_max_forwards);
char* 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_max_forwards = belle_sip_header_max_forwards_parse(l_raw_header);
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));
}
int belle_sip_headers_test_suite() {
......@@ -368,6 +382,8 @@ int belle_sip_headers_test_suite() {
if (NULL == CU_add_test(pSuite, "test of www authenticate", test_header_www_authenticate)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "test of max forwards", test_header_max_forwards)) {
return CU_get_error();
}
return 0;
}
......@@ -32,6 +32,9 @@ static int clean_suite_message(void) {
static void check_uri_and_headers(belle_sip_message_t* message) {
if (belle_sip_message_is_request(message)) {
CU_ASSERT_PTR_NOT_NULL(belle_sip_request_get_uri(BELLE_SIP_REQUEST(message)));
CU_ASSERT_PTR_NOT_NULL(belle_sip_message_get_header(message,"Max-Forwards"));
BELLE_SIP_HEADER_MAX_FORWARDS(belle_sip_message_get_header(message,"Max-Forwards"));
}
CU_ASSERT_PTR_NOT_NULL(belle_sip_message_get_header(message,"From"));
BELLE_SIP_HEADER_FROM(belle_sip_message_get_header(message,"From"));
......@@ -53,6 +56,8 @@ static void check_uri_and_headers(belle_sip_message_t* message) {
BELLE_SIP_HEADER_CONTENT_LENGTH(belle_sip_message_get_header(message,"Content-Length"));
}
static void testRegisterMessage(void) {
......
......@@ -21,7 +21,7 @@
extern int belle_sip_uri_test_suite ();
extern int belle_sip_headers_test_suite ();
extern int belle_sip_message_test_suite ();
extern int belle_sdp_test_suite();
int main (int argc, char *argv[]) {
......@@ -34,6 +34,8 @@ int main (int argc, char *argv[]) {
belle_sip_headers_test_suite ();
belle_sip_message_test_suite();
belle_sdp_test_suite();
/* Run all tests using the CUnit Basic interface */
CU_basic_set_mode(CU_BRM_VERBOSE);
CU_basic_run_tests();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment