Mercurial > hg > waaad
changeset 87:d09e0dbe90e6
Added more tests on the message module. All functions are at least called now
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Tue, 15 Jul 2008 12:06:27 +0900 |
parents | 7dce32fd436b |
children | 2f46f6491c04 |
files | waaad/tests/testmesg.c |
diffstat | 1 files changed, 206 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/waaad/tests/testmesg.c Tue Jul 15 10:46:32 2008 +0900 +++ b/waaad/tests/testmesg.c Tue Jul 15 12:06:27 2008 +0900 @@ -245,21 +245,21 @@ CHECK( 0, dict_new ( DICT_AVP, &avp_data , NULL, &gavp ) ); /* Macro to search AVP and create a rule */ - #define ADD_RULE( _parent, _vendor, _avpname, _pos, _min, _max, _tpl ) { \ + #define ADD_RULE( _parent, _vendor, _avpname, _pos, _min, _max, _tpl, _ord ) { \ dict_object_t * _avp = NULL; \ dict_avp_request_t _req = { (_vendor), 0, (_avpname) }; \ dict_rule_data_t _data; \ CHECK( 0, dict_search ( DICT_AVP, AVP_BY_NAME_AND_VENDOR, &_req, &_avp ) ); \ _data.rule_avp = _avp; \ _data.rule_position = (_pos); \ - _data.rule_order = 1; \ + _data.rule_order = (_ord); \ _data.rule_min = (_min); \ _data.rule_max = (_max); \ _data.rule_template = (_tpl); \ CHECK( 0, dict_new ( DICT_RULE, &_data , (_parent), NULL ) ); \ } - ADD_RULE(gavp, 73565, "AVP Test - os", RULE_OPTIONAL, -1, -1, 3); + ADD_RULE(gavp, 73565, "AVP Test - os", RULE_OPTIONAL, -1, -1, 3, 0); } @@ -270,12 +270,30 @@ CHECK( 0, dict_search ( DICT_APPLICATION, APPLICATION_BY_NAME, "Application test", &application ) ); CHECK( 0, dict_new ( DICT_COMMAND, &cmd_data , application, &command ) ); - ADD_RULE(command, 0, "AVP Test - no vendor - f32", RULE_FIXED_HEAD, -1, 1, 0); - ADD_RULE(command, 73565, "AVP Test - i64", RULE_REQUIRED, -1, -1, 0); - ADD_RULE(command, 73565, "AVP Test - enumi32", RULE_OPTIONAL, -1, -1, 0); - ADD_RULE(command, 73565, "AVP Test - os", RULE_OPTIONAL, -1, -1, 0); - ADD_RULE(command, 73565, "AVP Test - enumos", RULE_OPTIONAL, -1, -1, 0); - ADD_RULE(command, 73565, "AVP Test - grouped", RULE_OPTIONAL, -1, -1, 0); + ADD_RULE(command, 0, "AVP Test - no vendor - f32", RULE_FIXED_HEAD, -1, 1, 0, 1); + ADD_RULE(command, 73565, "AVP Test - i64", RULE_REQUIRED, -1, -1, 0, 0); + ADD_RULE(command, 73565, "AVP Test - enumi32", RULE_OPTIONAL, -1, -1, 0, 0); + ADD_RULE(command, 73565, "AVP Test - os", RULE_OPTIONAL, -1, -1, 0, 0); + ADD_RULE(command, 73565, "AVP Test - enumos", RULE_OPTIONAL, -1, -1, 0, 0); + ADD_RULE(command, 73565, "AVP Test - grouped", RULE_OPTIONAL, -1, -1, 0, 0); + } + + { + dict_object_t * gavp = NULL; + dict_avp_data_t avp_data = { 73574, 73565, "AVP Test - rules", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_GROUPED }; + + CHECK( 0, dict_new ( DICT_AVP, &avp_data , NULL, &gavp ) ); + + ADD_RULE(gavp, 0, "AVP Test - no vendor - f32", RULE_FIXED_HEAD, 0, 1, 0, 1); + ADD_RULE(gavp, 73565, "AVP Test - i64", RULE_FIXED_HEAD, -1, 1, 0, 2); + ADD_RULE(gavp, 73565, "AVP Test - enumi32", RULE_FIXED_HEAD, -1, 1, 0, 3); + ADD_RULE(gavp, 73565, "AVP Test - os", RULE_REQUIRED, 2, 3, 0, 0); + ADD_RULE(gavp, 73565, "AVP Test - enumos", RULE_OPTIONAL, 0, 1, 0, 0); + ADD_RULE(gavp, 73565, "AVP Test - grouped", RULE_FIXED_TAIL, -1, 1, 0, 1); + + #if 0 + dict_dump ( gavp, 0, 2 ); + #endif } #if 0 { @@ -603,12 +621,13 @@ } - /* Test the parsing of buffers */ + /* Test the parsing of buffers and messages */ { msg_t * msg; /* Test the msg_parse_buffer function */ { + CHECK( EBADMSG, msg_parse_buffer( buf, 340, &msg) ); CHECK( 0, msg_parse_buffer( buf, 343, &msg) ); #if 0 msg_dump_walk(msg); @@ -617,10 +636,72 @@ /* Test the msg_parse_dict function */ { + /* Test with an unknown command code */ + { + /* reinit the msg */ + CHECK( 0, msg_free ( msg, 1 ) ); + + /* Change the command-code */ + buf[5] = 0x11; + CHECK( 0, msg_parse_buffer( buf, 343, &msg) ); + CHECK( ENOTSUP, msg_parse_dict( msg ) ); + + /* reset */ + CHECK( 0, msg_free ( msg, 1 ) ); + buf[5] = 0x01; + } + + /* Test with an unknown Mandatory AVP */ + { + buf[20] = 0x11; /* New AVP code = 0x11011F5F, undefined */ + buf[24] = 0x40; /* Add the 'M' flag */ + + /* Check that we cannot support this message now */ + CHECK( 0, msg_parse_buffer( buf, 343, &msg) ); + CHECK( ENOTSUP, msg_parse_dict( msg ) ); + + /* reset */ + CHECK( 0, msg_free ( msg, 1 ) ); + buf[20] = 0x00; + buf[24] = 0x00; + } + + /* Test with an unknown optional AVP */ + { + buf[20] = 0x11; /* New AVP code = 0x11011F5F, undefined */ + + /* Check that we can support this message now */ + CHECK( 0, msg_parse_buffer( buf, 343, &msg) ); + CHECK( 0, msg_parse_dict( msg ) ); + + #if 0 + msg_dump_walk(msg); + #endif + + /* Now test the "getraw" function */ + { + msg_avp_t * avp; + unsigned char * raw; + + CHECK( 0, msg_browse( msg, MSG_BRW_FIRST_CHILD, &avp, NULL) ); + + CHECK( 0, msg_avp_getrawdata ( avp, &raw ) ); + + CHECK( 0, memcmp(raw, buf + 28, 4) ); /* This is the representation of "3.1415" */ + + } + + /* reset */ + CHECK( 0, msg_free ( msg, 1 ) ); + buf[20] = 0x00; + } + + CHECK( 0, msg_parse_buffer( buf, 343, &msg) ); CHECK( 0, msg_parse_dict( msg ) ); #if 0 msg_dump_walk(msg); #endif + /* Now we can free the buffer. */ memset(buf, 0, 343); free(buf); @@ -631,6 +712,121 @@ dict_object_t * rule; CHECK( 0, msg_parse_rules( msg, &rule ) ); + + /* Use the "AVP Test - rules" AVP to test the rules */ + { + msg_avp_t * tavp = NULL; + msg_avp_t * tempavp = NULL; + msg_avp_t * childavp = NULL; + + ADD_AVP( msg, MSG_BRW_LAST_CHILD, tavp, 73565, "AVP Test - rules" ); + + /* Create a conforming message first */ + ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 0, "AVP Test - no vendor - f32" ); + ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - i64" ); + ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - enumi32" ); + ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - os" ); + ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - os" ); + ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - grouped" ); + + /* Check the message is still conform */ + CHECK( 0, msg_parse_rules( msg, &rule ) ); + + /* The first avp is optional in fixed position, so remove it and check the message is still OK */ + CHECK( 0, msg_browse ( tavp, MSG_BRW_FIRST_CHILD, &childavp, NULL) ); + CHECK( 0, msg_free ( childavp, 0 ) ); + CHECK( 0, msg_parse_rules( msg, &rule ) ); + ADD_AVP( tavp, MSG_BRW_FIRST_CHILD, childavp, 0, "AVP Test - no vendor - f32" ); + + + /* Now break some rules and check it is detected */ + #define CHECK_CONFLICT( _msg, _ruleavp, _avpvendor ) { \ + dict_object_t * _rule; \ + CHECK( EBADMSG, msg_parse_rules( msg, &_rule ) ); \ + if ((_ruleavp) == NULL) { \ + CHECK( NULL, _rule); \ + } else { \ + dict_rule_data_t _ruledata; \ + dict_object_t * _avp; \ + dict_avp_request_t _req = { (_avpvendor), 0, (_ruleavp) }; \ + CHECK( 0, dict_search ( DICT_AVP, AVP_BY_NAME_AND_VENDOR, &_req, &_avp ) ); \ + CHECK( 0, dict_getval( _rule, &_ruledata ) ); \ + CHECK( _avp, _ruledata.rule_avp ); \ + } \ + } + + { + /* Test the FIXED_HEAD rules positions: add another AVP before the third */ + CHECK( 0, msg_browse ( tavp, MSG_BRW_FIRST_CHILD, &tempavp, NULL) ); /* tempavp is the novendor avp */ + CHECK( 0, msg_browse ( tempavp, MSG_BRW_NEXT, &tempavp, NULL) ); /* tempavp is the i64 avp */ + ADD_AVP( tempavp, MSG_BRW_NEXT, childavp, 73565, "AVP Test - os" ); + + CHECK_CONFLICT( msg, "AVP Test - enumi32", 73565 ); + + /* Now remove this AVP */ + CHECK( 0, msg_free ( childavp, 0 ) ); + } + { + /* Remove the third AVP, same rule must conflict */ + CHECK( 0, msg_browse ( tempavp, MSG_BRW_NEXT, &childavp, NULL) ); /* childavp is the enumi32 avp */ + CHECK( 0, msg_free ( childavp, 0 ) ); + + CHECK_CONFLICT( msg, "AVP Test - enumi32", 73565 ); + + /* Add the AVP back */ + ADD_AVP( tempavp, MSG_BRW_NEXT, childavp, 73565, "AVP Test - enumi32" ); + } + + { + /* Test the minimum value in the REQUIRED rule: delete one of the os AVPs */ + CHECK( 0, msg_browse ( childavp, MSG_BRW_NEXT, &tempavp, NULL) ); /* tempavp is the os avp */ + CHECK( 0, msg_free ( tempavp, 0 ) ); + + CHECK_CONFLICT( msg, "AVP Test - os", 73565 ); /* The rule requires at least 2 AVP, we have only 1 */ + + /* Now add this AVP */ + ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - os" ); + } + { + /* Test the maximum value in the REQUIRED rule: add more of the os AVPs */ + ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - os" ); + ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - os" ); + + CHECK_CONFLICT( msg, "AVP Test - os", 73565 ); /* The rule requires at most 3 AVP, we have 4 */ + + /* Now delete these AVP */ + CHECK( 0, msg_free ( tempavp, 0 ) ); + CHECK( 0, msg_browse ( childavp, MSG_BRW_NEXT, &tempavp, NULL) ); + CHECK( 0, msg_free ( tempavp, 0 ) ); + } + + { + /* Test the maximum value in the OPTIONAL rule: add 2 enumos AVPs */ + ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - enumos" ); + + /* The message is still conform */ + CHECK( 0, msg_parse_rules( msg, &rule ) ); + + /* Now break the rule */ + ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - enumos" ); + + CHECK_CONFLICT( msg, "AVP Test - enumos", 73565 ); /* The rule requires at most 3 AVP, we have 4 */ + + /* Now delete this AVP */ + CHECK( 0, msg_free ( tempavp, 0 ) ); + } + + { + /* Test the RULE_FIXED_TAIL rules positions: add another AVP at the end */ + ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - os" ); + + CHECK_CONFLICT( msg, "AVP Test - grouped", 73565 ); + + /* Now remove this AVP */ + CHECK( 0, msg_free ( childavp, 0 ) ); + } + + } } }